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>
This commit is contained in:
@@ -0,0 +1,389 @@
|
||||
# 笔临 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) │
|
||||
│ · 各 handler:AI_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 badge,i18n 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,范围 3–15
|
||||
```
|
||||
|
||||
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 | 使用完整 prompt(240s 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 超时执行
|
||||
Reference in New Issue
Block a user