全部文档

AI 生成知识文档索引(规则)

「用 AI 重新生成索引」 指:在 当前智能体的知识文档目录 下,根据已有 Markdown 说明,自动生成或刷新 两层检索用的索引文件,让后续对话能 先锁定相关文档、再读原文 作答或执行。

来源 docs/core-mechanisms/AI重建知识索引规则.md

表述(产品侧)

「用 AI 重新生成索引」 指:在 当前智能体的知识文档目录 下,根据已有 Markdown 说明,自动生成或刷新 两层检索用的索引文件,让后续对话能 先锁定相关文档、再读原文 作答或执行。 用户侧不强调 index.jsonknowledge/ 等实现名;运维与对接可见 § 实现对照

机制目标

  1. 少漏召:索引里的主题、摘要与标签应能覆盖用户常见的说法,便于第一步就选对主题或文件。
  2. 路径可信:条目中的文档路径必须与磁盘上真实存在的 .md 一致禁止依赖模型「发明」不存在的路径。
  3. 细节在正文:索引只做 导航与粗匹配;具体条款、数字与操作步骤以 打开的 Markdown 正文 为准。
  4. 可演进:未来若增加 按块向量检索,文件级路径与索引结构应保持稳定,块级信息作为 增强层 挂载,而不破坏现有两层检索约定。

两层结构与文件约定

与「索引式说明/技能文档」方法论一致(见 索引式文档与反馈闭环.md),用户智能体知识目录 上采用:

层级文件(实现名)作用(用户能理解的说法)
第一层知识根下的 index.json总览:根目录下的说明文档 + 有哪些主题文件夹,每项有简短说明与关键词。
第二层每个一级主题文件夹 内的 index.json该主题下 各篇说明 的列表与摘要,用于精确到篇。

路径规则(实现契约)

  • 根索引里,直接在根下的 Markdown 在 documents 中;path 仅为文件名,不含 /
  • 根索引里 themesdir一级主题目录名(单层段、无 /)。
  • 子索引里 documents[].path 为相对于 该一级目录 的路径(可含子文件夹),须与扫描结果 完全一致

详细 JSON 字段与 Go 结构体见:backend/internal/skilldocs/index.goIndexThemeItemDocItem)。

扫描与输入(生成前准备)

  1. 范围:从该智能体知识根目录 递归遍历 整棵树(filepath.WalkDir 语义)。
  2. 纳入:仅 *.md;路径与内容须为合法 UTF-8。
  3. 排除:名字以 . 开头 的文件(与常见隐藏/配置约定一致)。
  4. 摘录:每文件进入模型前截取 前若干字符(按 rune 计),避免单次请求过大;子目录索引拼 prompt 时还可对单条摘录 再缩短(用于控制 token)。
  5. 分组

- 根下一层的 .md → 参与 根索引documents。 - 其余 .md路径第一段(一级目录名)归入对应主题,用于 该主题的子索引 生成;根索引的 themes 仅针对这些 确实存在 Markdown 的一级目录

模型调用顺序与职责

  1. 先根后子目录(按篇合并):先生成并落盘根 index.json,再对每个一级目录 逐篇 调用模型生成 DocItem,由程序合并写入 {dir}/index.json(避免整目录一次 prompt 过长导致超时)。
  2. 根索引提示职责:根据根下 .md 摘录 + 一级目录名单,产出 versionthemesdocumentsthemes 中每个给定的一级目录 至多一条,且 dir 与名单一致
  3. 子目录索引(单篇):每篇只输出一个 DocItem 对象;合并后 themes 固定为空数组;documentspath 必须来自实现侧给出的闭合列表,摘要与标签服务检索。

温度等超参以实现为准(当前根与按篇生成均使用较低温度以稳定 JSON)。

输出与校验规则

  1. 只接受一个顶层 JSON 对象;若模型在 JSON 后追加自然语言说明,解析时 只取第一个平衡的 { ... } 对象(字符串内需正确处理引号与转义),避免解析失败。
  2. 根索引白名单

- documents:仅保留 扫描到的根下 .md 文件名;丢弃含 ../ 或非 .md 的项。 - themes:仅保留 dir 在扫描到的一级目录集合中 的项;规范 index_file 等默认值。 - 若某应有的一级目录缺少主题项,实现可 按约定补默认主题项(避免检索链路断档)。

  1. 子索引白名单documents 中的 path 必须在生成该文件时给定的列表中;否则丢弃或判失败(以实现为准)。
  2. 落盘:写入 index.json 时应保证 读者不会读到半截文件(例如先写临时文件再替换;具体见实现)。

检索侧如何用它(与索引规则的一致性)

检索时 先读根索引 → 按问题匹配主题 → 读对应子目录索引 → 选中若干 documents再按路径打开 Markdown 原文 构建上下文(见 skilldocs.BuildContext 一类逻辑)。

因此索引中的 summary / tags 应优先服务 「这句话像哪篇文档」 的匹配,而不是复述全文。

可选 paths(条件加载)documents / themes 可增 paths 字符串数组(glob,如 ["/*.tsx"])。仅当用户消息或附件路径命中 glob 时才注入该篇;通用 onboarding/总则类文档不要填。无路径上下文时,带 paths 的条目 不会** 进入对话(见 skilldocs/itemMatchesScope)。

中文问句:检索会对连续汉字做单字/双字切分(避免无空格整句无法命中);若无任何命中,会回退注入 导读.md00-总则与功能导航.md 等优先篇(见 skilldocs/tokenizefallbackDocs)。

演进(非当前必做)

  • 超大主题目录:若单次提示仍过长,可按 子文件夹 分批生成再 合并(合并可以是确定性规则 + 可选轻量模型),不必强制「每叶目录一次调用」。
  • 块级向量:未来可在每条索引或块元数据中增加 source_pathchunk_id;文件级索引仍可作为 第一层过滤。向量库选型(如 LanceDB 等)属部署与实现阶段决策,不改变 两层索引 + 读原文 的产品语义。

分步生成与进度(实现)

产品界面可按 扫描预览 → 根索引 → 各主题子索引 顺序多次请求,以便展示 当前步骤 / 总步骤

方法路径作用
GET.../knowledge/reindex/preview仅扫描磁盘;返回 steps_totaltop_dirsllm_configured(不调模型)
POST.../knowledge/reindex/root只写根目录 index.json;响应含 progress.completed/total
POST.../knowledge/reindex/subBody {"dir":"<单层主题文件夹名>"}一次写完该主题下全部篇目的 index.json(内部仍按篇调用模型)
POST.../knowledge/reindex/sub/docBody {"dir","path","clear_dir"?};仅为该主题下 一篇 生成条目并合并进 index.jsonclear_dir:true 表示本主题第一篇(清空该目录旧 documents 再写)
POST.../knowledge/reindex一键完成上述流水线(与分步二选一即可)

预览 GET .../reindex/previewsteps_total = 1(根)+ 各主题目录下 Markdown 篇数top_dir_docs 给出各主题下待索引的相对路径列表。

实现对照(供工程与契约)

环节代码入口(参考)
HTTP 触发见上一节表;入口 RebuildKnowledgeIndexesKnowledgeReindexPreviewKnowledgeReindexRootKnowledgeReindexSub
扫描与摘录collectMarkdownForReindexexcerptSanitize
根/子 LLM 与解析generateRootKnowledgeIndexJSONgenerateSingleDocKnowledgeIndexJSONwriteKnowledgeSubIndexwriteKnowledgeSubIndexDocstripLLMJSONObject
校验与对齐sanitizeAndAlignRootIndexsanitizeSubIndex
检索消费skilldocs.BuildContextIndex 结构体

相关文档