Files
bilin/docs/superpowers/specs/2026-07-07-bilin-p6-ai-context-design.md
T
bing b5ae04af18 docs: add P6 AI knowledge context integration design spec for v0.7.0
Define semi-auto knowledge retrieval, unified AiContextBuilder injection across all four AI modes, and systemPrompt fix for writing flows.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-07 14:19:56 +08:00

390 lines
15 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 笔临 P6 AI 知识上下文整合 设计规格
**版本**1.0
**日期**2026-07-07
**范围**:P6 — 已审核知识库条目半自动推荐 + 用户确认 + 注入四种 AI 入口(对话 / 交互 / 自动 / 向导)
**前置**:P5 作家工作流 + 知识库 MVP 已交付(v0.6.0`b33d2e7`
**参考**`design/readme.md` v1.1 §6.1 / §6.5 / §6.7、`docs/superpowers/specs/2026-07-06-bilin-p5-workflow-knowledge-design.md`
**目标版本**v0.7.0
---
## 1. 背景与目标
### 1.1 阶段定位
v0.6.0 已交付知识库 MVP(手动 CRUD、审核、伏笔追踪)与作家工作流,但 `AiContextBuilder` 仍仅支持章节/大纲/设定/灵感四类手动勾选,**知识条目未参与任何 AI 调用**。交互/自动/向导写作流还存在技术债:`contextJson` 只存标题拼接的短摘要,而非完整 `systemPrompt`
本阶段(P6)交付 **知识上下文整合**:半自动检索推荐 + 用户勾选确认 + 统一注入四种 AI 模式,对齐 `design/readme.md` §6.1「在每轮对话前检索高重要度知识条目注入」与 §6.5 各写作模式的上下文确认步骤。
### 1.2 已确认决策(Brainstorming 2026-07-07
| 维度 | 决策 |
|------|------|
| 总范围 | **A AI 上下文整合**v0.7.0 单阶段交付 |
| 注入策略 | **半自动 + 确认**:系统推荐,用户勾选后注入 |
| AI 入口 | **四种全做**:对话、交互写作、自动写作、向导模式 |
| 检索排序 | **重要度 + 章节相关性 + 目标文本匹配**(方案 C |
| 对话 UX | **会话级确认 + 发送静默注入**(不在每条消息前弹窗) |
| 架构 | **方案 1**`KnowledgeRetrievalService` + 扩展 `AiContextBuilder` |
| schema | **无 v7 迁移**(纯服务层与 UI 扩展) |
| AI 测试 | 集成/E2E 含 AI 时禁止 Mock,走 LM Studio |
### 1.3 验收标准
用户能完成:
1.**AI 上下文编辑器** 看到系统推荐的知识条目(带推荐理由),默认勾选 Top 推荐,可手动增删
2. **对话模式**:保存上下文后发送消息,AI 回复能体现已选知识(如伏笔、角色状态)
3. **交互写作**`context_confirm` 步骤展示知识推荐列表;确认后剧情建议/场景生成使用完整上下文
4. **自动写作**:设定章节目标后确认知识上下文;场景规划与生成携带知识块
5. **向导模式**:第 4 步「确认知识条目与伏笔」展示推荐列表;策略预览列出将注入的知识标题
6.**`approved`** 知识条目参与推荐与注入;`pending`/`rejected` 不可选
### 1.4 本规格不实现(明确排除)
| 项 | 归属 |
|----|------|
| 注入历史 / 反向链接(§5.2「被 AI 用作上下文注入的轮次」) | P6.1+ |
| AI 语义检索 / embedding | 后续 |
| 知识自动抽取(§6.7 全自动) | P5.2+ |
| 文风学习 / 风格控制面板(§6.3) | 后续 |
| `writing_logs`、热力图(§8 | P5.2 |
| 角色关系图谱 Cytoscape(§7 | P6+ |
| schema v7 迁移 | 不需要 |
---
## 2. 架构
### 2.1 进程模型
```
┌──────────────────────────────────────────────────────────────┐
│ 主进程 │
│ · KnowledgeRetrievalService(打分 + 推荐) │
│ · AiContextBuilderService(扩展 knowledgeIds 块) │
│ · KnowledgeService(只读 list approved
│ · 各 handlerAI_CHAT / INTERACTIVE_* / AUTO_* / WIZARD_* │
│ confirmContext 时 build() → 存 systemPrompt 全文 │
└───────────────────────────┬──────────────────────────────────┘
│ IPC
│ knowledge.suggestContext
│ ai.buildContext(扩展 preview
┌───────────────────────────▼──────────────────────────────────┐
│ 渲染进程 │
│ · ContextEditorModal+知识 Tab + 推荐区) │
│ · KnowledgeSuggestList(共享勾选组件) │
│ · InteractivePanel context_confirm │
│ · AutoPanel goal 后知识确认区 │
│ · WizardPanel wizard_context 步骤 │
└──────────────────────────────────────────────────────────────┘
```
### 2.2 模块边界
| 模块 | 职责 | 依赖 |
|------|------|------|
| `KnowledgeRetrievalService` | 对 `approved` 条目综合打分,返回 `ScoredKnowledge[]` | `KnowledgeRepository`, `ChapterRepository` |
| `AiContextBuilderService` | 合并传统四类 + 知识块 → `systemPrompt` + `preview` | `BookRegistryService` |
| `KnowledgeSuggestList` | 推荐列表 UI、checkbox、reason badge | 无 IPC,由父组件传 props |
| `ContextEditorModal` | 五 Tab 编辑 binding;打开时拉 suggest | preload |
**原则**
- 推荐可忽略,注入以用户最终勾选为准
- 知识块与传统上下文共享总字符预算
- 写作流修复:`contextJson` 必须存 `systemPrompt` 全文,禁止仅存标题摘要
---
## 3. 检索算法
### 3.1 输入
```typescript
interface KnowledgeSuggestOptions {
currentChapterId?: string
goalText?: string // 章节目标、大纲描述拼接、用户备注
topN?: number // default 8
}
```
### 3.2 候选集
- `status = 'approved'` 的全部 `knowledge_entries`
- 无 approved 条目时返回 `[]`
### 3.3 打分公式
对每条 entry 计算 `score`(整数,越高越优先):
| 因子 | 计算 | 上限 |
|------|------|------|
| 重要度 | `importance × 20` | 100 |
| 章节接近度 | 取 `sourceChapterId``lastMentionChapterId` 中距当前章 `sortOrder` 差值的最小值 `d``d=0→30``d≤3→20``d≤10→10`,否则 0 | 30 |
| 伏笔加权 | `foreshadow``buried→25``partial→15``resolved→0`;非伏笔 0 | 25 |
| 目标匹配 | `goalText``title+content` 做简单分词重合(去停用词后),`overlapRatio × 30` | 30 |
`reasons` 数组(供 UI badgei18n key):
- `importance ≥ 4``knowledge.reason.highImportance`
- 章节接近度 > 0 → `knowledge.reason.chapterRelevant`
- `foreshadow``buried``knowledge.reason.foreshadowBuried`
- 目标匹配 > 0.2 → `knowledge.reason.goalMatch`
`score` 降序取 Top `topN`(默认 8)。
### 3.4 默认勾选策略
- 打开上下文编辑器时,推荐区 **默认全选** Top N
- 合并进 `binding.knowledgeIds`(与用户已有手动选择取并集,去重)
- 用户取消勾选后立即从 `knowledgeIds` 移除
---
## 4. 上下文构建
### 4.1 `AiContextBinding` 扩展
```typescript
export interface AiContextBinding {
chapterIds: string[]
outlineIds: string[]
settingIds: string[]
inspirationIds: string[]
knowledgeIds: string[] // 新增,默认 []
}
```
持久化位置:
- AI 会话:`ai_sessions.context` JSON
- 写作流:`interactive_flows.context_json``binding` 字段
### 4.2 知识块格式
```
【知识·{类型标签}】{title}
{content 截断至 500 字}
```
类型标签映射:`character→角色``foreshadow→伏笔``location→地点``relationship→关系``fact→事实`
### 4.3 字符预算
| 限制 | 值 |
|------|-----|
| 单条知识 content | 500 字 |
| 知识区合计 | 4000 字 |
| 章节块 | 2000 字(现有) |
| 其它块 | 500 字(现有) |
| **总 systemPrompt** | 16 × 1024 字(现有) |
裁剪顺序:候选块按 score(知识)或 sortKey(其它)排序,超出总预算时从低优先级移除。
### 4.4 `ContextPreviewItem` 扩展
```typescript
export type ContextPreviewKind =
| 'chapter' | 'outline' | 'setting' | 'inspiration' | 'knowledge'
export interface ContextPreviewItem {
kind: ContextPreviewKind
id: string
title: string
excerpt: string
charCount: number
knowledgeType?: KnowledgeType // kind=knowledge 时
}
```
### 4.5 写作流 `contextJson` 结构(统一)
```typescript
interface FlowContextPayload {
binding: AiContextBinding
systemPrompt: string // build() 完整输出,供 AI 调用
contextSummary: string // UI 短摘要,如「3章·2设定·5知识」
}
```
**修复范围**`InteractiveWritingService.readContextText()``auto.handler``readContextText()` 改为返回 `systemPrompt`,不再仅返回标题拼接。
---
## 5. IPC
### 5.1 新增通道
| 通道 | 参数 | 返回 |
|------|------|------|
| `knowledge:suggestContext` | `{ bookId, opts: KnowledgeSuggestOptions }` | `ScoredKnowledge[]` |
### 5.2 变更通道
| 通道 | 变更 |
|------|------|
| `ai:buildContext` | binding 含 `knowledgeIds`preview 含 knowledge 项 |
| `interactive:confirmContext` | 存 `FlowContextPayload``suggestPlots``systemPrompt` |
| `wizard:confirmContext` | 同上 |
| `auto:*`plan/generate | 读 `systemPrompt` |
preload / `electron-api.d.ts` 同步扩展。
---
## 6. UI 规格
### 6.1 共享组件 `KnowledgeSuggestList`
- `data-testid="knowledge-suggest-list"`
- 每行:`checkbox` + 标题 + 类型 + `reason` badge
- 单项 `data-testid={`knowledge-suggest-${id}`}`
### 6.2 `ContextEditorModal` 扩展
- 新增 Tab`knowledge``data-testid="context-tab-knowledge"`
- 顶部 **推荐区**:调用 `suggestContext`;展示 `KnowledgeSuggestList`
- 下方 **全部 approved 列表**:可手动搜索/勾选(简单 filter 即可)
- 「刷新推荐」按钮:`data-testid="context-refresh-suggest"`
- 保存时写入 `session.context``knowledgeIds`
**goalText 来源**(打开 Modal 时传入 props):
| 调用方 | goalText |
|--------|----------|
| AiPanel | 空(仅章节相关性) |
| InteractivePanel | 空 |
| AutoPanel | `chapterGoal` + 勾选大纲 `description` 拼接 |
| WizardPanel | `chapterGoal` + `styleNote` |
**currentChapterId**`useBookStore.selectedChapterId`
### 6.3 对话模式(AiPanel
- 上下文摘要行点击 → Modal(现有)
- 发送消息:不弹窗;`AI_CHAT` 用最新 binding build 的 `systemPrompt`
- 摘要行展示知识数量,如「2章·3知识」
### 6.4 交互写作(InteractivePanel
- `context_confirm` 步骤:
- 展示 `KnowledgeSuggestList`(内联,非必须开 Modal
- 「编辑完整上下文」→ Modal
- 「确认并开始」→ `confirmContext(binding)``suggestPlots`
- `data-testid="interactive-knowledge-suggest"`
### 6.5 自动写作(AutoPanel
- `goal_setup` 提交目标后,或 goal 区域下方展示折叠「知识上下文」
- 展示推荐 + 勾选;`planScenes` 前确保 `confirmContext` 已执行(可自动用 session binding + 推荐默认勾选)
- `data-testid="auto-knowledge-suggest"`
### 6.6 向导模式(WizardPanel
- `wizard_context` 步骤:展示推荐列表 + 「编辑上下文」
- `buildPreview` 返回的 preview 文本追加「将注入知识:…」列表
- `data-testid="wizard-knowledge-suggest"`
---
## 7. 全局设置(可选扩展)
```typescript
// GlobalSettings 新增,均有默认值
knowledgeAutoSuggest: boolean // default true
knowledgeSuggestTopN: number // default 8,范围 315
```
SettingsPage AI 分区或通用分区增加开关(本阶段可仅后端默认值,UI 设置项为 Nice-to-have;若时间紧可 Phase 2 补 UI)。
---
## 8. 测试
### 8.1 测试 ID
| ID | 层级 | 场景 | 预期 |
|----|------|------|------|
| UT-CTX-01 | 单元 | 打分:高重要度 + 近章 + 目标匹配 | 得分最高条目排第一 |
| UT-CTX-02 | 单元 | `build()` 含 knowledgeIds | preview 有 `kind=knowledge` |
| UT-CTX-03 | 单元 | 知识区超 4000 字 | 按 score 裁剪 |
| UT-CTX-04 | 单元 | resolved 伏笔 | 分数低于 buried 同重要度条目 |
| IT-CTX-01 | 集成 | `suggestContext` 有 approved 数据 | 返回 ≥1 条 |
| IT-CTX-02 | 集成 | `AI_CHAT` | systemPrompt 含 `【知识·` |
| IT-CTX-03 | 集成 | 交互 confirm → suggestPlots | 使用完整 prompt240s LM Studio |
| E2E-CTX-01 | E2E | 打开上下文编辑器知识 Tab | 推荐列表可见 |
| E2E-CTX-02 | E2E | 交互 context_confirm | 知识勾选区可见 |
| E2E-CTX-03 | E2E | 对话发送含知识上下文 | AI 回复非空(300s) |
### 8.2 超时
- IT-CTX-03**240s**
- E2E-CTX-03**300s**
---
## 9. i18n 键(节选)
```json
"context.tab.knowledge": "知识库",
"context.refreshSuggest": "刷新推荐",
"context.knowledgeCount": "{{count}} 条知识",
"knowledge.reason.highImportance": "高重要度",
"knowledge.reason.chapterRelevant": "与当前章相关",
"knowledge.reason.foreshadowBuried": "伏笔待回收",
"knowledge.reason.goalMatch": "匹配章节目标",
"interactive.confirmKnowledge": "确认知识上下文",
"wizard.knowledgeList": "将注入知识"
```
---
## 10. 文件映射
| 文件 | 职责 |
|------|------|
| `src/main/services/knowledge-retrieval.service.ts` | 检索打分 |
| `src/main/services/ai-context-builder.service.ts` | 扩展 knowledge 块 |
| `src/main/services/interactive-writing.service.ts` | readContextText 修复 |
| `src/main/ipc/handlers/knowledge.handler.ts` | suggestContext |
| `src/main/ipc/handlers/interactive.handler.ts` | FlowContextPayload |
| `src/main/ipc/handlers/auto.handler.ts` | systemPrompt 读取 |
| `src/main/ipc/handlers/wizard.handler.ts` | 同上 |
| `src/main/ipc/handlers/ai.handler.ts` | binding 默认 knowledgeIds |
| `src/shared/types.ts` | 类型扩展 |
| `src/shared/ipc-channels.ts` | KNOWLEDGE_SUGGEST_CONTEXT |
| `src/preload/index.ts` | knowledge.suggestContext |
| `src/renderer/components/ai/KnowledgeSuggestList.tsx` | 共享 UI |
| `src/renderer/components/ai/ContextEditorModal.tsx` | 知识 Tab + 推荐 |
| `src/renderer/components/ai/InteractivePanel.tsx` | context_confirm 知识区 |
| `src/renderer/components/ai/AutoPanel.tsx` | 知识确认区 |
| `src/renderer/components/ai/WizardPanel.tsx` | wizard_context 知识区 |
| `tests/main/knowledge-retrieval.test.ts` | UT-CTX-* |
| `tests/main/ai-context-builder.test.ts` | UT-CTX-02/03 |
| `e2e/ai-context.spec.ts` | E2E-CTX-* |
---
## 11. Spec Coverage Checklist
| design/readme 要求 | 本规格 |
|--------------------|--------|
| §6.1 知识条目按重要度检索注入 | §3 检索 + §4 构建 |
| §6.1 上下文预览可删减 | ContextEditorModal 勾选 |
| §6.5.1 交互上下文确认 | §6.4 |
| §6.5.3 向导确认知识条目 | §6.6 |
| §6.7 重要度影响注入优先级 | §3.3 打分 |
| P5 延后项「知识注入 AI 上下文」 | 本阶段交付 |
---
## 12. 版本与 DoD
- `package.json`**0.7.0**
- `README.md` 功能概览追加 P6 一行
- `npm run build && npm run test && npm run test:e2e` 全绿
- LM Studio 集成测试按 §8.2 超时执行