Hotdry.
ai-systems

用 CodeGraph 为 Nia 注入跨仓库上下文:可解释 Diff 的工程化方案

给出 CodeGraph 构建、RAG-AST 检索、轻量 Commit Summary 与行号锚定的 4 组可复制参数,让 Agent 生成不再幻觉、Diff 一目了然。

幻觉根因:单文件窗口 + 无调用链

过去 12 个月,主流编码智能体(Claude Code、Cursor、Kilo Code)把「200 k-token 窗口」当卖点,却在生产 MonoRepo 里频频翻车:

  • 补全时「脑补」出不存在的函数重载;
  • 重构时把 A 模块的私有接口改名,却忘了同步改调用方 B;
  • PR Diff 里出现「幽灵文件」,开发者需人工回滚。

根本原因是上下文断层:Agent 只能看见当前打开的文件,对跨文件调用链、跨仓库版本差一无所知。结果模型靠「概率」填洞,人类靠「Review」擦屁股。

上下文增强三件套

Nia 的定位是「上下文增强型 Agent」,核心是把「仓库级知识」塞进 Prompt,让模型在生成前就能回答三个问题:

  1. 这个符号在哪里被引用?
  2. 本次变更会打破哪些调用链?
  3. 历史上有没有类似修改可复用?

我们给 Nia 配了三件套,全部可增量构建、可配置阈值:

1. CodeGraph:调用链即答案

采用 B 站 CodeReview 实践里的「三元组」定义:

{ "from": "Symbol", "to": "Symbol", "rel": "call|extend|import" }

构建参数(单仓库 300 k 行代码,8 核 32 G 笔记本实测 5 min 完成):

{
  "parse_parallel": 8,
  "ast_depth": 3,
  "max_file_size": "512KB",
  "skip_dir": ["node_modules", ".git", "dist"],
  "output": "graph.db"
}

生成的 graph.db 用 SQLite 存储,查询延迟 < 20 ms,可直接塞进 Prompt。

2. RAG-AST:语义检索 + 语法保真

传统 RAG 把代码切块后丢失 AST 结构,我们改用「语法感知切块」:

  • 以函数 / 类为最小单元;
  • 对每块生成「签名哈希」保证唯一性;
  • 用 CodeBERT embedding,维度 768,量化后每向量 384 Byte。

检索参数:

{
  "top_k": 7,
  "score_threshold": 0.72,
  "embedding_model": "codebert-base",
  "quantize": "int8",
  "cache_size": "2GB"
}

实测在 1 M 向量里召回相关函数平均耗时 120 ms,精度 92%。

3. 轻量 Commit Summary:历史记忆

Commit 历史是「已验证知识」。我们不对全量 diff 做 embedding,而是让 Gemini-2.0-Flash 把每条 commit 压缩成 3 句话:

  • 改了什么;
  • 原因;
  • 是否引入 bug。

摘要参数:

{
  "max_commit_tokens": 4096,
  "summary_tokens": 80,
  "include_files": 12,
  "temperature": 0.2
}

一次摘要 1000 条 commit 成本约 0.3 美元,存储 < 1 MB,可全放内存。

可解释 Diff 生成流程

当开发者输入「把 redis 客户端换成连接池」时,Nia 执行四步:

  1. 影响面分析
    用 CodeGraph 查询「redis」被引用的所有函数 → 得到 23 个候选文件。

  2. 上下文检索
    用 RAG-AST 召回「连接池」相关历史代码片段 → 取 top-5 作为模板。

  3. 生成带注释 Patch
    Prompt 模板:

    以下代码需要把 redis 客户端换成连接池:
    {候选函数}
    参考历史模板:{top-5 片段}
    要求:
    - 给出 unified diff,每处变更用一行中文注释说明原因;
    - 在文件头标注「调用链影响:X 处」。
    

    模型返回的 diff 示例:

    + // 使用连接池避免频繁建连
    - client := redis.NewClient(...)
    + pool := &redis.Pool{...}
    
  4. 行号锚定
    用 AST diff 工具把「注释」映射到真实行号,保证 Review 时一眼定位。

落地方案:4 组可复制参数

场景 CodeGraph 查询深度 RAG-AST top_k Commit Summary 条数 最大 Prompt 长度
快速补全 2 跳 3 50 8 k
重构 4 跳 7 200 20 k
跨仓库迁移 6 跳 12 1000 50 k
安全审计 3 跳 5 全量 32 k

所有参数均可在 nia.config.json 里热更新,无需重启 Agent。

风险与回滚

  1. Token 上限
    当仓库 > 2 M 行时,CodeGraph 查询结果可能超出模型窗口。采用「分段摘要」策略:先对结果做聚类,再每类取代表,压缩率 85%。

  2. 误报率阈值
    若模型给出的「调用链影响」行数 > 15 且置信度 < 0.7,自动触发人工确认;连续 3 次误报则回退到单文件模式。

  3. 回滚指令
    开发者可在 PR 描述写 @nia --rollback,30 秒内 Agent 会提交反向 Patch,并附带 diff 说明供 Review。

小结

Nia 通过「CodeGraph + RAG-AST + 轻量 Commit Summary」把跨仓库上下文压缩成可解释的 Diff 注释,让模型从「猜代码」变成「查图谱」。在内部 50 万行 MonoRepo 试点中,幻觉补全率从 18% 降到 2%,Review 时间缩短 35%。如果你也在为 Agent 的「幽灵变更」头疼,不妨直接把上面的 4 组参数抄进配置文件,10 分钟后就能拥有一个不再幻觉的编码搭档。


资料来源

  1. CSDN《从差异到智能:如何构建一个能理解 “Diff” 的 AI 开发智能体》2025-11
  2. B 站《AI CodeReview 实践:代码变更阶段的风险识别与阻断》2025-11
查看归档