代码知识库构建工具:KBC 结合 CodeGraph 让源码真正变成可维护的设计与故障知识

代码会不断变化,但团队对代码的理解不应该每次都从零开始。

我正在做一个开源项目 KBC,希望和更多开发者一起,把“让 AI 读懂代码”进一步变成“让团队持续拥有一套可信、可维护的代码知识库”。

项目地址:

https://github.com/HalfOfPoetry/knowledge-base-for-code

一、我为什么要做 KBC

在使用 AI 编程助手的过程中,我经常遇到一个问题:AI 可以很快回答某个函数“做了什么”,但当问题变成下面这些内容时,答案就容易变得不稳定:

  • 这个模块在整个系统中的位置是什么?
  • 某个配置项到底在哪里读取,又如何影响运行行为?
  • 一个错误是在哪里产生的,经过哪些调用链传播?
  • 修改一个核心符号,会影响哪些模块?
  • 新同事应该从哪里开始理解这个项目?

如果只是临时问一次 AI,答案通常会随着上下文、模型和提问方式变化。更麻烦的是,一些看起来合理的内容可能只是模型根据经验补出来的,并没有源码证据。

所以我想做的不是一个“问答机器人”,而是一套从源码持续构建设计知识库和故障排查知识库的工作流。

这就是 KBC:Knowledge Base Construction。

二、KBC 是什么

KBC 是一套面向 AI 编码助手的 Agent Skill 工作流平台。它把代码理解拆成多个阶段,让 AI 不只是回答问题,而是按照固定流程完成源码走读、证据记录和文档组织。

核心流程是:

扫描源码 -> 确认模块和业务术语 -> 提炼整体架构 -> 提取模块设计 -> 提取故障排查知识 -> 组装索引和交叉引用 -> 完成质量检查

对应的 Skills 包括:

/kbc-scan /kbc-arch-extract /kbc-design-extract /kbc-troubleshoot-extract /kbc-assemble /kbc-finish

另外还提供两个后处理 Skill:

/kbc-revise 增量修订已有知识 /kbc-recode 完全重建已有知识

三、Skills 在智能体中的作用

我希望特别说明一点:KBC 里的 Skill 不是普通的提示词集合,也不是把几段命令简单拼在一起。

在我的设计中,Skill 更像是给智能体提供的一套“工作方法”和“阶段合同”,它会告诉智能体:

  • 当前阶段要解决什么问题;
  • 需要先读取哪些状态和历史记录;
  • 哪些内容必须向用户确认;
  • 应该使用哪些工具和查询方式;
  • 产出哪些文档和结构化记录;
  • 什么条件满足后才能进入下一阶段;
  • 哪些内容没有证据时必须标记为“未确认”。

例如,/kbc-design-extract并不是简单地让 LLM “写一份设计文档”,而是约束智能体先读取模块名称、能力值字段和业务术语,再使用 CodeGraph 查询入口、组件协作、生命周期和配置读取路径,最后回到源码核验并生成文档。

所以,Skills 在智能体中的作用可以概括为:

Skill = 目标 + 流程 + 工具调用规则 + 证据要求 + 输出格式 + 阶段约束

它把一次性、容易漂移的自然语言对话,变成可以重复执行、可以中断恢复、可以检查结果的工程流程。

四、KBC、LLM、RAG 和 CodeGraph 如何分工

我把 KBC 看成连接 LLM、RAG 和代码工具的一层工作流系统,而不是试图替代其中任何一个组件。

组成部分主要职责在 KBC 中的定位
LLM理解自然语言、归纳证据、解释设计和故障负责在证据基础上形成可读知识
Agent规划步骤、调用工具、读写文件和推进流程执行 KBC Skills 定义的工作流
Skills提供任务目标、阶段规则、工具流程和输出要求约束 Agent 如何完成知识提取
CodeGraph建立代码索引,查询符号、调用链和影响范围提供代码结构证据
RAG从已有知识中检索相关上下文提供历史知识、术语和已确认记录
KBC Runtime管理状态、标签、守卫和阶段交接保证流程可恢复、可审计

这几个部分解决的问题并不相同:

RAG 解决“过去记录过什么” CodeGraph 解决“代码之间实际有什么关系” LLM 解决“如何理解和表达这些证据” Skills 解决“应该按什么流程理解,哪些结论允许写入” KBC Runtime 解决“流程走到哪里,是否满足进入下一阶段的条件”

Skills 与 LLM

LLM 很擅长总结和解释,但如果没有流程约束,容易出现几个问题:

  • 跳过源码读取,直接根据文件名猜测职责;
  • 忽略已有模块名称,重新创造一套命名;
  • 把“可能的设计模式”写成确定事实;
  • 把一次调用关系误写成完整的运行时因果;
  • 忘记生成某些必需文档或更新状态。

KBC Skills 的作用,就是把这些容易被忽略的步骤显式化。LLM 仍然负责理解和归纳,但必须沿着 Skill 规定的路径工作,并遵守用户确认和证据核验规则。

Skills 与 RAG

RAG 通常解决的是上下文检索问题,例如从已有文档中找到某个模块的说明、业务术语或历史故障案例。

但 RAG 不能自动保证检索到的内容仍然适用于当前源码。旧文档可能已经过时,模块可能已经重构,术语也可能发生变化。

因此 KBC 将 RAG 能力拆成两部分来使用:

  1. 读取已有知识:读取kbc-state.json.kb/tags.json、架构文档、设计文档和历史故障记录。
  2. 回到当前源码核验:使用 CodeGraph 和源码阅读确认当前实现是否仍然一致。

这意味着 RAG 提供的是“历史上下文”,而不是无需验证的最终答案。

Skills 与 CodeGraph

Skill 会定义什么时候调用 CodeGraph、查询什么问题、如何保存证据,以及如何将结果和源码交叉核验。

例如故障提取阶段不会只问一次“这个模块有什么问题”,而是要求智能体分别查询:

错误处理入口 异常传播路径 错误类型或错误码的产生位置 调用方和被调用方 核心符号的影响范围

这样做的重点不是增加调用次数,而是让每个查询都对应一个明确的知识目标,减少大模型在宽泛问题中自行补全信息的空间。

五、KBC 为什么要结合 CodeGraph

传统的目录扫描和关键词搜索很适合做第一步发现,但它们很难回答真正的代码关系问题。

例如,某个函数可能:

  • 在另一个目录被间接调用;
  • 实现了某个接口,但文件名中没有明显提示;
  • 通过多层封装影响一个配置流程;
  • 在错误处理路径中被多个模块共同依赖。

因此,KBC 使用第三方 CodeGraph 建立代码索引,并辅助查询:

CodeGraph 能力在 KBC 中的用途
status检查项目索引是否存在和完整
query查询函数、类、接口和错误类型
explore查看相关源码、调用路径和依赖关系
node查看符号源码、调用者和被调用者
impact分析修改某个符号的影响范围

CodeGraph 的价值不在于替 AI 直接写结论,而在于给 AI 提供更可靠的结构化证据。

六、我如何降低 AI 的“幻觉”

这是 KBC 中我比较重视的一部分。

我没有让模型拿到一次explore输出后就直接生成最终文档,而是设计了证据优先的约束:

  1. 结论必须绑定源码文件、符号、配置键、测试或 CodeGraph 查询结果。
  2. CodeGraph 发现的关系必须回到源码核验。
  3. 静态调用关系不能直接被描述成确定的运行时因果。
  4. 无法确认的内容必须标记为“未确认”。
  5. 设计模式、根因、错误码、日志和修复步骤不能凭经验补写。

KBC 还提供了kbc-codegraph.mjs封装脚本,统一处理项目路径、索引检查、查询调用和原始证据保存:

KBC_ENV="$(find.-path'*/skills/kbc-workflows/scripts/kbc-env.mjs'-typef-print-quit)"KBC_SCRIPTS_DIR="$(node"$KBC_ENV")"KBC_CODEGRAPH="$KBC_SCRIPTS_DIR/kbc-codegraph.mjs"node"$KBC_CODEGRAPH"ensure-index--project"$SOURCE_DIR"node"$KBC_CODEGRAPH"explore\"模块入口和生命周期是什么?"\--project"$SOURCE_DIR"\--labeldesign-lifecycle

原始证据默认保存在:

knowledge-base/.evidence/codegraph/

证据记录会保留项目路径、命令、查询内容、原始输出、错误输出、状态码和采集时间。这样后续可以回头检查:AI 的结论到底有没有依据。

七、一次 KBC 初始化会做什么

首先安装 KBC:

npminstall-g@halfofpeotry/kbc

然后进入目标项目:

cdyour-project kbc init

KBC 会自动检测项目中已有的 AI 编程平台,再由用户选择实际要配置的平台,而不是默认把所有平台都写入项目。

非交互模式可以使用:

kbc init--yes--json

也可以明确指定平台:

kbc init--platformclaude,cursor,github-copilot

初始化后,可以使用:

kbc status kbc status--jsonkbc resolve-probe--json

如果选择安装 CodeGraph,project scope 下会执行:

codegraphinstall--yescodegraph init-i

目前 KBC 已支持多类 AI 编程平台,包括 Claude Code、Cursor、Codex、OpenCode、Windsurf、Cline、RooCode、Continue、GitHub Copilot、Gemini CLI、Amazon Q、Qwen Code、Kiro、Pi、Qoder、Trae 等。

八、最终会生成什么

默认知识库输出目录是项目下的knowledge-base/

knowledge-base/ index.md # 知识库总入口 kbc-state.json # 工作流状态和模块注册信息 .kb/ # 标签、守卫和阶段交接记录 .evidence/codegraph/ # CodeGraph 原始查询证据 architecture/ # 整体架构知识 design/ # 模块设计知识 troubleshooting/ # 故障排查知识

设计知识库重点记录:

  • 模块职责和边界;
  • 组件划分;
  • 数据流和生命周期;
  • 对外接口和依赖关系;
  • 配置项和能力值字段;
  • 关键流程和设计依据。

故障知识库重点记录:

  • 常见错误和触发条件;
  • 错误产生、传播和处理路径;
  • 日志与调试入口;
  • 配置、权限、容量相关问题;
  • 可执行的排查清单;
  • 已验证的解决方案和证据。

九、我希望和大家一起共创什么

KBC 还处在持续迭代阶段,我不希望它只是一个“我自己定义好的工具”,更希望它能吸收真实项目和真实开发流程中的反馈。

我目前最欢迎以下方向的贡献:

共创方向可以参与的内容
新平台适配增加 AI 编程平台目录、检测路径和安装验证
Skill 优化改进扫描、架构、设计和故障提取流程
CodeGraph 集成优化查询模板、证据归档和不同语言项目的分析方式
知识库质量完善阶段守卫、交叉引用和完整性检查
测试兼容性验证不同 Node.js、操作系统和 AI 编辑器环境
文档示例增加真实项目、迁移指南和中英文使用示例

特别欢迎三类反馈:

  1. 你在使用 AI 阅读大型项目时遇到过什么问题?
  2. 哪些设计知识或故障知识最值得自动沉淀?
  3. CodeGraph 在你的语言或项目类型中,哪些查询最有价值?

十、如何参与

项目 GitHub 地址:

https://github.com/HalfOfPoetry/knowledge-base-for-code

欢迎大家:

  • Star 项目,帮助更多人发现 KBC;
  • 提交 Issue,分享问题和使用场景;
  • 提交 Pull Request,贡献代码、Skill、测试或文档;
  • 分享不同语言、不同规模项目中的验证结果。

参与开发前,可以先运行:

gitclone git@github.com:HalfOfPoetry/knowledge-base-for-code.gitcdknowledge-base-for-codenpminstallnpmrun build

提交变更前建议执行:

npmrun buildnpmtestnpmrun lint

如果是平台适配或 CodeGraph 相关变更,请在 Pull Request 中说明:

  • 测试的平台和版本;
  • Node.js 版本;
  • CodeGraph 版本;
  • 实际生成的目录;
  • 是否有原始查询证据;
  • 是否改变了现有知识库格式。

十一、写在最后

我做 KBC 的初衷很简单:我希望 AI 不只是“看过代码”,而是能帮助团队把代码背后的设计、依赖、风险和排查经验真正沉淀下来。

AI 可以提高理解代码的速度,但可信的知识仍然需要证据、复核和持续维护。

如果你也在思考如何让 AI 更可靠地参与大型项目理解,欢迎来 GitHub 和我一起共创 KBC:

HalfOfPoetry/knowledge-base-for-code

让 AI 帮我们更快读懂代码,也让团队真正留下可以复用的知识。