--- name: kb-query tags: [knowledge-base, retrieval, routing, rag] creator: 传鹏 description: |- 知识库检索路由。按"索引 → 摘要 → 全文 → 原文"四级递进定位,用最少的读取回答用户问题,并给出出处与缺口。 触发词:库里有没有、查一下、找资料、关于XX的资料、知识库里怎么说、之前整理的、有没有写过 --- # 知识库检索 ## 铁律 **禁止一上来 `grep` 全库,更禁止把整个库读一遍。** 库的规模会长到几百页,暴力检索既慢又容易把不相干的内容混进答案。 按成本从低到高,命中即停: --- ## Level 0 · 业务地图(成本≈0) 读 `10-知识库/index.md` 的「业务地图」段。 用户的问题如果能映射到某个业务分区(市场/客户/内容/交付),直接跳去看那个分区的页面。 命中就停在 Level 1。 --- ## Level 1 · 目录索引(成本≈读 200 行) 读对应目录的 `_index.md`: ``` 10-知识库/topics/_index.md 主题结论 10-知识库/sources/_index.md 原始资料摘要 10-知识库/entities/_index.md 实体 10-知识库/modules/_index.md 课程模块 ``` 表格里每行有「一句话」和「标签」,扫一遍就知道该读哪几页。 --- ## Level 2 · 摘要与标签(成本≈读 frontmatter) 如果 Level 1 没命中,按关键词在 frontmatter 里找: ```bash grep -rn "关键词" 10-知识库/*/ --include="*.md" | grep -E "title|summary|tags|aliases" ``` `aliases` 字段是同义词的藏身处 —— 用户说"内训",页面可能叫"企业培训"。 --- ## Level 3 · 全文(成本≈读匹配行) ```bash grep -rn "关键词" 10-知识库/ --include="*.md" ``` 只读匹配行 + 前后 3 行,不要整篇读。 --- ## Level 4 · 逐页精读(成本最高) 只读 Level 1–3 挑出来的 1–5 页。读的时候注意: - `stale: true` 的页 → 先看 `stale_reason`,答案里必须提示"这条依据可能已过期" - `status: draft` 的页 → 标明"草稿,未经确认" - frontmatter 的 `sources` → 这是引用出处 --- ## Level 5 · 回原材料(兜底) 知识库是原材料的**加工品**,可能丢细节。如果用户要的是原文措辞、完整数据表、合同条款: 1. 从页面 frontmatter 的 `sources:` 拿到原材料路径 2. 去 `00-原材料/` 读原文件 3. 答案里注明"引自原始文件,知识库摘要未覆盖这一层细节" --- ## 库改了怎么办 用户问的东西如果**库里没有**,先别急着说"没有": ```bash python 90-工具/kb.py status ``` 如果 `待处理新增 > 0`,说明料在库里但还没整理 —— 这时候应该说: > "库里还没整理这块,但 `00-原材料/02-客户与需求/` 里有 3 个未入库文件看着相关,我现在同步一下再答?" 而不是"没有相关资料"。 --- ## 回答格式 ```md **结论** (先给答案,2–3 句,不要绕) **依据** - 2026 年市场规模 380 亿,增速 42% —— `topics/AI培训市场.md`(源:《2026 AI 培训白皮书》) - 客户普遍接受 3 天 2 晚 —— `sources/某银行内训需求.md` **置信度** 高 / 中 / 低 + 一句话理由 **缺口**(有才写) - 缺 2025 年的对比数据,建议补一份行业年报 ``` **没有出处的内容一律不写进「依据」。** 模型自己的常识如果非要用,单独放一段叫「补充(非库内资料)」。 --- ## 第 6 步 · 沉淀(把所有好答案变成库存) **这一步不做,这个库永远只是原材料的复印件。** RAG 和 wiki 的根本区别在这里:RAG 每次问都从零拼一遍,答完就没了;wiki 把答过的东西留下来,下次直接引用。 ### 什么值得写回 | 值得 | 判断标准 | |---|---| | 综合了 ≥3 个来源的分析 | 下次再问还要再翻 3 个源,不写就是浪费 | | 一次对比、选型、取舍 | 「A 方案还是 B 方案」这类结论最值得留 | | 发现了原本没记的关联 | 「原来这个客户和那门课是一回事」 | | 会被反复问的问题 | 销售、讲师、新人都会问的那种 | 不值得:一次性事实查询(「那个文件在哪」)、库外常识、还没结论的探索。 ### 怎么写回 新建或并入 `10-知识库/topics/<主题>.md`,frontmatter 加一个字段: ```yaml derived_from: "query" # 标记这页源自一次检索,不是从原文件直接整理 evidence: "C" # 取所引来源的最低级 —— 检索不会提高证据强度 ``` 正文开头注明来路: ```md > 本页由 2026-11-04 的一次检索整理而成,依据 `sources/白皮书.md`、`sources/客户访谈.md`。 > 不是原始结论,是综合判断,引用时请回溯来源。 ``` 然后 `kb.py mark` 不用跑(没有新源),但**必须 `kb.py graph`**,否则索引不知道多了这页。 ### 沉淀的复利 一个做了半年课的库,应该是:源文件 200 份,知识页 500+,其中至少三分之一是历次问答沉淀下来的。 **只有源、没有沉淀的库,用一年也还是那 200 份文件的目录。** --- ## 常见错误 | 错误 | 后果 | |---|---| | 把 `_index.md` 的摘要当正文答 | 丢细节,且可能引用过期摘要 | | 忽略 `stale` 标记 | 拿作废数据做决策 | | 库里没有就编一个 | 做出来的课站不住 | | 引用页面但不给出处 | 用户无法复核,失去信任 |