524 lines
17 KiB
Markdown
524 lines
17 KiB
Markdown
# 知识库检索与分块增强 User Stories
|
|
|
|
## 文档信息
|
|
|
|
| 项目 | 内容 |
|
|
| --- | --- |
|
|
| 状态 | 实施中 |
|
|
| 版本 | 0.1 |
|
|
| 日期 | 2026-08-11 |
|
|
| 关联 PRD | [知识库检索与分块增强 PRD](knowledge-rag-enhancement-prd.md) |
|
|
|
|
## 1. 角色
|
|
|
|
### 1.1 普通知识使用者
|
|
|
|
已经导入公司制度、产品手册或项目资料,希望直接提问并得到稳定、带来源的回答,
|
|
不需要理解向量、RRF 或分块算法。
|
|
|
|
### 1.2 知识库维护者
|
|
|
|
负责导入、同步和清理资料,需要知道哪些文档成功、哪些索引失败,以及如何修复
|
|
错误解析或错误分块。
|
|
|
|
### 1.3 RAG 调试者
|
|
|
|
需要用真实问题验证召回,比较不同参数和通道,定位“文档里有但没有命中”的
|
|
原因。
|
|
|
|
### 1.4 本地与内网用户
|
|
|
|
不能把资料上传到外部知识库服务,希望全文检索、分块、重排和诊断均在本机
|
|
完成,只在显式配置 Embeddings 后发送有界文本。
|
|
|
|
## 2. Epic A:明确控制是否检索
|
|
|
|
### US-A1 模型按需检索
|
|
|
|
作为普通知识使用者,我希望保留由模型判断是否需要检索的模式,以便一般闲聊
|
|
不会产生不必要的知识搜索。
|
|
|
|
验收:
|
|
|
|
- Given 当前启用了至少一个知识库并选择“模型按需检索”
|
|
- When 用户发送问题
|
|
- Then Main 只向本次请求开放已选知识库的只读搜索能力
|
|
- And 模型没有调用知识搜索时,不显示虚假的“已检索”
|
|
- And 未选中的知识库不可被工具参数扩大范围
|
|
|
|
### US-A2 每次先检索
|
|
|
|
作为普通知识使用者,我希望选择“每次先检索”,以便模型不能跳过已启用的
|
|
知识库。
|
|
|
|
验收:
|
|
|
|
- Given 当前启用了至少一个知识库并选择“每次先检索”
|
|
- When 用户发送文本问题
|
|
- Then Main 在 Runtime 启动前使用原始问题执行一次有界检索
|
|
- And 命中证据以不可信上下文进入 Runtime
|
|
- And 模型仍可通过只读工具执行后续改写检索
|
|
- And 页面明确显示“已预检索”“零结果”或“已降级”
|
|
- And 图片生成请求不执行知识预检索
|
|
|
|
### US-A3 请求级范围
|
|
|
|
作为普通知识使用者,我希望每次请求只使用我勾选的知识库,以免不相关资料
|
|
干扰回答。
|
|
|
|
验收:
|
|
|
|
- 新建知识库后只新增该知识库到当前选择,不自动重新启用已取消的知识库
|
|
- 删除知识库后从当前范围中移除对应 ID
|
|
- 同一请求最多启用 20 个知识库
|
|
- 对话输入区持续显示已选数量和检索方式
|
|
- 范围为空时检索方式不产生误导状态
|
|
|
|
## 3. Epic B:检索可见、可诊断
|
|
|
|
### US-B1 打开检索测试
|
|
|
|
作为 RAG 调试者,我希望在当前知识库直接输入问题并测试,以便不通过聊天模型
|
|
也能验证索引。
|
|
|
|
验收:
|
|
|
|
- 知识库标题区提供“测试检索”次操作
|
|
- 工作台打开后焦点进入查询输入框
|
|
- 查询最多 4,000 字符
|
|
- 测试不创建聊天消息、任务成果或模型调用
|
|
- 关闭工作台后焦点返回触发按钮
|
|
|
|
### US-B2 查看通道诊断
|
|
|
|
作为 RAG 调试者,我希望看到每种检索通道的结果和降级原因,以便判断问题来自
|
|
全文、向量还是图谱。
|
|
|
|
验收:
|
|
|
|
- 结果显示请求通道和实际使用通道
|
|
- 结果显示 FTS/CJK、向量和图谱候选数
|
|
- 结果显示总耗时和有界通道耗时
|
|
- 向量未配置、请求失败或索引不兼容时显示明确原因
|
|
- 不在错误或诊断中显示 API Key、Authorization 或完整文档
|
|
|
|
### US-B3 查看排名与上下文
|
|
|
|
作为 RAG 调试者,我希望看到候选排名、最终相关度和送入模型的上下文,以便
|
|
解释最终回答为什么使用这些资料。
|
|
|
|
验收:
|
|
|
|
- 每条结果显示文档、定位、片段和最终排名
|
|
- 可用时显示全文、向量、图谱独立排名和向量相似度
|
|
- 启用本地重排后显示重排前排名
|
|
- 展示相邻块或父块合并后的上下文
|
|
- 展示上下文字符数、预算和截断状态
|
|
|
|
### US-B4 零结果诊断
|
|
|
|
作为普通知识使用者,我希望零结果时获得具体原因,而不是只有空列表。
|
|
|
|
验收:
|
|
|
|
- 区分“知识库为空”“索引不可用”“查询无命中”“被阈值过滤”
|
|
- 提供修改关键词、检查状态或调整阈值的下一步说明
|
|
- 零结果不显示为首次使用空状态
|
|
- 检索测试保留原查询和设置,方便再次执行
|
|
|
|
## 4. Epic C:中文与混合检索
|
|
|
|
### US-C1 中文自然语言召回
|
|
|
|
作为中文用户,我希望不用输入原文中的连续短语,也能找到表达相同意思的内容。
|
|
|
|
验收:
|
|
|
|
- 中文索引生成连续二元词组
|
|
- 中文查询不会要求所有不同汉字同时出现
|
|
- 短查询具有有界单字回退
|
|
- 中英文、数字和产品标识混合查询仍能召回
|
|
- 相同查询和索引产生稳定排序
|
|
|
|
### US-C2 向量服务降级
|
|
|
|
作为本地与内网用户,我希望向量服务断开时仍可使用全文搜索,同时清楚知道
|
|
语义召回不可用。
|
|
|
|
验收:
|
|
|
|
- 查询向量失败不阻止 FTS/CJK 和图谱检索
|
|
- 检索响应包含向量降级原因
|
|
- 文档状态不把向量失败显示成全部完成
|
|
- 同名模型切换端点后,Fingerprint 不匹配的旧向量不得参与召回
|
|
- 重建失败时,上一版已就绪向量继续服务
|
|
- 修复配置并重建后,降级状态消失
|
|
- 故障信息经过脱敏
|
|
|
|
### US-C3 大知识库向量检索
|
|
|
|
作为知识库维护者,我希望超过 5,000 个分块后语义搜索仍然工作。
|
|
|
|
验收:
|
|
|
|
- 向量分批扫描没有固定 5,000 分块空结果
|
|
- 只保留所需最佳候选,内存不会随全库候选等比例增长
|
|
- 扫描支持取消和应用关闭
|
|
- 10,000 个以上分块的测试返回正确 Top K
|
|
- 诊断显示扫描数量与耗时
|
|
|
|
### US-C4 大目录完整同步
|
|
|
|
作为知识库维护者,我希望包含 2,000 个文件的目录也能完整增量同步,以免后半
|
|
部分文档长期保留旧内容。
|
|
|
|
验收:
|
|
|
|
- 第 501 至 2,000 个文档参与校验和比较
|
|
- 未变化文档不会重复解析和向量化
|
|
- 已删除文件对应文档会被移除
|
|
- 页面分页上限不影响后台同步完整性
|
|
|
|
### US-C5 调整召回参数
|
|
|
|
作为 RAG 调试者,我希望调整 Top K、最低相关度和通道权重,以便适配不同知识
|
|
类型。
|
|
|
|
验收:
|
|
|
|
- Top K、阈值、候选倍数和权重具有明确范围和默认值
|
|
- 至少一个召回通道权重大于 0
|
|
- 图谱关闭时图谱权重不可生效并说明原因
|
|
- 设置持久化到当前知识库,不影响其他知识库
|
|
- 非法输入不能跨 IPC
|
|
|
|
## 5. Epic D:真实索引状态
|
|
|
|
### US-D1 查看分阶段状态
|
|
|
|
作为知识库维护者,我希望分别看到解析、全文、向量和图谱状态,以便准确判断
|
|
文档能否使用。
|
|
|
|
验收:
|
|
|
|
- 文档不再用单个“ready”代表所有索引完成
|
|
- 全文完成但向量失败时,明确显示“全文可用、向量失败”
|
|
- 向量未启用与向量失败是不同状态
|
|
- 图谱按需、未启用和失败是不同状态
|
|
- 汇总显示全文可用数、向量完成数和失败数
|
|
|
|
### US-D2 修复失败文档
|
|
|
|
作为知识库维护者,我希望单独重建失败文档,而不是重新同步整个目录。
|
|
|
|
验收:
|
|
|
|
- 文档行提供“重建文档”
|
|
- 重建重新执行解析、分块、全文、向量和图谱
|
|
- 失败时保留上一版可用索引
|
|
- 完成后更新任务和状态
|
|
- 原文件不存在时保留可重试错误
|
|
|
|
### US-D3 修改设置后重建
|
|
|
|
作为知识库维护者,我希望分块设置修改后明确提示需要重建,以免误以为旧文档
|
|
已经使用新设置。
|
|
|
|
验收:
|
|
|
|
- 保存关键分块设置后显示“等待重建”
|
|
- 设置保存本身不删除现有索引
|
|
- 用户可选择全库重建
|
|
- 全库重建可取消
|
|
- 已成功替换的文档继续可用
|
|
|
|
## 6. Epic E:高级分块
|
|
|
|
### US-E1 固定分块
|
|
|
|
作为知识库维护者,我希望配置目标长度和重叠,以便处理日志、代码或简单文本。
|
|
|
|
验收:
|
|
|
|
- 目标长度为 400 至 8,000 字符
|
|
- 重叠不超过目标长度的 40%
|
|
- 优先在自然边界切分
|
|
- 每个块保留来源 section、定位和 ordinal
|
|
- 旧知识库迁移后不自动改变已有分块
|
|
|
|
### US-E2 结构分块
|
|
|
|
作为知识库维护者,我希望分块尽量保持标题和段落结构,以便命中片段保留语义。
|
|
|
|
验收:
|
|
|
|
- 优先保持解析 section
|
|
- Markdown 标题能够成为分块 heading
|
|
- 标题随子段落进入索引元数据
|
|
- 超长 section 仍按有界规则继续切分
|
|
- 空标题和空段落不创建分块
|
|
|
|
### US-E3 父子分块
|
|
|
|
作为 RAG 调试者,我希望小块负责准确召回、大块负责完整上下文,以便兼顾精度
|
|
和完整性。
|
|
|
|
验收:
|
|
|
|
- 父块和子块具有稳定关系
|
|
- 父块不直接进入 FTS/CJK/向量候选
|
|
- 子块命中后可返回父块上下文
|
|
- 引用突出实际命中的子块
|
|
- 父块输出仍受上下文预算和截断限制
|
|
|
|
## 7. Epic F:重排与上下文
|
|
|
|
### US-F1 本地重排
|
|
|
|
作为本地与内网用户,我希望在不调用外部模型的情况下改善候选排序。
|
|
|
|
验收:
|
|
|
|
- 本地重排默认关闭并可按知识库开启
|
|
- 使用 RRF、词覆盖、短语、标题、路径、向量和重复惩罚等确定性特征
|
|
- 结果相关度归一化到 0 至 1
|
|
- 检索测试显示重排前后排名
|
|
- 关闭时保持原 RRF 行为
|
|
- UI 不把本地算法描述为 AI Rerank 模型
|
|
|
|
### US-F1.1 学习型重排
|
|
|
|
作为需要更高排序质量的用户,我希望可选择兼容的学习型重排模型,并在服务
|
|
不可用时继续获得本地结果。
|
|
|
|
验收:
|
|
|
|
- 模式明确区分关闭、本地规则和学习型重排
|
|
- Main 最多发送 100 个候选,每个候选不超过 8,000 字符
|
|
- API Key 仅通过环境变量或 Main 加密存储使用,不进入 Renderer
|
|
- 超时、无效响应和服务错误回退本地重排,并显示脱敏诊断
|
|
- 用户取消和应用关闭必须终止请求,不得按普通降级吞掉
|
|
|
|
### US-F2 相邻分块合并
|
|
|
|
作为普通知识使用者,我希望命中片段包含必要的上下文,而不是孤立半句话。
|
|
|
|
验收:
|
|
|
|
- 可配置向前、向后相邻 0 至 2 个块
|
|
- 只合并同文档且 ordinal 连续的启用分块
|
|
- 同一块不会重复输出
|
|
- 每个原命中仍保留引用定位
|
|
- 合并结果遵守上下文预算
|
|
|
|
### US-F3 上下文预算
|
|
|
|
作为普通知识使用者,我希望低质量内容不会挤占模型上下文。
|
|
|
|
验收:
|
|
|
|
- 按最终相关度从高到低选择上下文
|
|
- 已选择的高排名证据不会被低排名证据替换
|
|
- 超预算时明确标记截断
|
|
- 预算范围为 2,000 至 48,000 字符
|
|
- IPC 和 Runtime 输入继续受总大小限制
|
|
|
|
### US-F4 上下文索引
|
|
|
|
作为知识库维护者,我希望检索可以利用文档结构,而引用仍忠于原文。
|
|
|
|
验收:
|
|
|
|
- 可按知识库启用上下文索引,并在修改后提示显式重建
|
|
- 标题、标题层级、页码和块类型使用有界确定性前缀进入 FTS、CJK 和向量文本
|
|
- 原始分块、引用、模型上下文和图谱证据不显示生成前缀
|
|
- FTS、CJK、向量和内容校验使用同一规范索引文本
|
|
|
|
## 7.1 Epic F+:受控本体与检索评估
|
|
|
|
### US-F5 每库受控本体
|
|
|
|
作为知识库维护者,我希望控制可用实体和关系类型,以便图谱保持一致。
|
|
|
|
验收:
|
|
|
|
- 每库保存实体类型、关系类型、双语名称、别名和可选端点约束
|
|
- 手工编辑使用受控选择器并拒绝未知类型或不兼容端点
|
|
- 图谱抽取按类型解析实体,保留人工锁定字段和跨类型边界
|
|
- 证据保存原文偏移、置信度、抽取来源和有界 provenance
|
|
- 本体或启用中的图谱策略变化标记需要重建
|
|
|
|
### US-F6 离线检索评估
|
|
|
|
作为 RAG 维护者,我希望用固定双语样本检测召回回归,而不读取用户数据或调用
|
|
网络服务。
|
|
|
|
验收:
|
|
|
|
- `npm run eval:retrieval` 使用临时 SQLite 和确定性内存 Provider
|
|
- 报告 Recall@5/10、MRR@10、nDCG@10、上下文精度/召回、无答案误报和延迟
|
|
- 提供词法、确定性向量、混合及本地重排消融
|
|
- 质量门槛按中英文分别检查,报告不包含原文、查询、端点、模型名或凭据
|
|
- 可选报告路径仅允许工作区内非符号链接文件
|
|
|
|
## 8. Epic G:分块维护
|
|
|
|
### US-G1 查看分块
|
|
|
|
作为知识库维护者,我希望查看某篇文档实际生成的分块,以便确认解析和切分质量。
|
|
|
|
验收:
|
|
|
|
- 文档行提供“查看分块”
|
|
- 列表显示序号、角色、标题、定位、字符数和启用状态
|
|
- 支持有界分页和文档内搜索
|
|
- 可查看完整单块内容
|
|
- 父子块关系可辨认但不只靠颜色表达
|
|
|
|
### US-G2 编辑分块
|
|
|
|
作为知识库维护者,我希望修正错误文本,以便问答使用正确内容。
|
|
|
|
验收:
|
|
|
|
- 编辑限制单块最大字符数
|
|
- 保存后同步更新全文和 CJK 索引
|
|
- 旧向量立即失效并触发当前文档重建
|
|
- 编辑块标记为人工修改
|
|
- UI 说明来源再次同步可能覆盖修改
|
|
- 保存失败保留用户草稿
|
|
|
|
### US-G3 启停分块
|
|
|
|
作为知识库维护者,我希望暂时停用有害或无关片段,而不永久删除它。
|
|
|
|
验收:
|
|
|
|
- 使用共享 Switch 和 `role="switch"`
|
|
- 停用块不参与任何召回通道
|
|
- 重新启用后恢复全文索引,并按需重建向量
|
|
- 状态更新失败时保留最后确认状态
|
|
- 引用已停用块时显示引用已失效
|
|
|
|
### US-G4 删除分块
|
|
|
|
作为知识库维护者,我希望删除确定无用的分块,以便避免错误召回。
|
|
|
|
验收:
|
|
|
|
- 删除前说明来源同步可能重新创建该块
|
|
- 删除使用具体动作和对象文案
|
|
- 删除联动清理全文、CJK、向量和图谱证据
|
|
- 删除最后一个可检索块后文档显示“无可检索内容”
|
|
- 不删除原始文件
|
|
|
|
## 9. Epic H:引用和来源
|
|
|
|
### US-H1 查看完整引用上下文
|
|
|
|
作为普通知识使用者,我希望从回答引用查看完整上下文,以便验证回答是否忠于
|
|
资料。
|
|
|
|
验收:
|
|
|
|
- 引用携带稳定 `libraryId`、`documentId` 和 `chunkId`
|
|
- 点击引用由 Main 重新校验对象归属
|
|
- 展示命中分块、相邻块或父块
|
|
- 展示知识库、文档、来源和定位
|
|
- 对已删除对象显示明确失效状态
|
|
|
|
### US-H2 打开原始来源
|
|
|
|
作为普通知识使用者,我希望从引用打开原文件或网页,以便继续阅读。
|
|
|
|
验收:
|
|
|
|
- 本地来源只通过数据库保存的普通文件路径打开
|
|
- 网页来源只允许数据库保存的 HTTP(S) URL
|
|
- Renderer 不能传入任意待打开路径或 URL
|
|
- 文件已移动时显示可恢复错误
|
|
- 不能跨平台精确跳页时仍显示原定位信息
|
|
|
|
### US-H3 引用与回答一致
|
|
|
|
作为普通知识使用者,我希望引用列表只显示本次实际检索到的内容。
|
|
|
|
验收:
|
|
|
|
- Main 只收集本次 capability token 产生的引用
|
|
- 预检索和模型后续检索引用去重
|
|
- 引用顺序遵循最终相关度和首次使用顺序
|
|
- 单消息引用数和序列化大小有明确上限
|
|
- 不把未检索文档显示为来源
|
|
|
|
## 10. Epic I:迁移、安全和兼容
|
|
|
|
### US-I1 无损迁移
|
|
|
|
作为现有用户,我希望升级后保留知识库、来源、分块、图谱和向量。
|
|
|
|
验收:
|
|
|
|
- SQLite 迁移在事务中执行
|
|
- 旧分块默认启用并视为 standalone
|
|
- 旧知识库获得兼容检索和分块设置
|
|
- CJK 索引回填失败时回滚迁移
|
|
- 升级不自动删除或重建原有内容
|
|
|
|
### US-I2 安全边界
|
|
|
|
作为本地用户,我希望新增功能不扩大 Renderer 和子 Runtime 权限。
|
|
|
|
验收:
|
|
|
|
- 新增 IPC 全部校验可信 sender 和共享 Schema
|
|
- Main 重新检查知识库、文档、分块和来源归属
|
|
- Renderer 不访问 SQLite、文件系统、Electron shell 或凭据
|
|
- 知识内容标记为不可信证据
|
|
- Ask 不获得写工具
|
|
- 错误和日志不包含密钥、授权头和未限制正文
|
|
|
|
### US-I3 取消和关闭
|
|
|
|
作为用户,我希望大库检索或重建可以停止,不留下损坏索引。
|
|
|
|
验收:
|
|
|
|
- 长向量扫描、单文档重建和全库重建响应 AbortSignal
|
|
- 应用关闭停止新批次并等待有界清理
|
|
- 文档级替换成功前继续使用上一版索引
|
|
- 取消状态区别于失败
|
|
- 取消不会删除原文件或用户维护的其他文档
|
|
|
|
## 11. 优先级映射
|
|
|
|
### 第一阶段
|
|
|
|
- US-A1、US-A2、US-A3
|
|
- US-B1、US-B2、US-B3、US-B4
|
|
- US-C1、US-C2、US-C3、US-C4、US-C5
|
|
- US-D1
|
|
- US-H1、US-H2、US-H3
|
|
- US-I1、US-I2
|
|
|
|
### 第二阶段
|
|
|
|
- US-D2、US-D3
|
|
- US-E1、US-E2、US-E3
|
|
- US-F1、US-F2、US-F3
|
|
- US-G1、US-G2、US-G3、US-G4
|
|
- US-I3
|
|
|
|
## 12. Definition of Done
|
|
|
|
每个 User Story 只有在以下条件全部满足时才完成:
|
|
|
|
1. Main、Preload、Renderer 和共享契约保持明确边界。
|
|
2. 行为有聚焦的单元、IPC 或组件回归测试。
|
|
3. 中英文文案同时更新。
|
|
4. 浅色、深色、键盘和窄窗口核心流程可用。
|
|
5. 失败、取消、空结果和降级状态均有独立表现。
|
|
6. 不覆盖用户现有未提交或未跟踪文件。
|
|
7. `npm test`、`npm run typecheck`、`npm run lint` 和 `npm run build`
|
|
全部通过。
|