Hotdry.
ai-systems

给编码 Agent 注入可验证的代码上下文,减少幻觉并支持多步重构

在 Agent Planning 阶段插入 Verifiable Context Provider,输出影响图、变更契约与校验桩,让每一步 diff 先验证后落地,实现仓库级多步重构不断链。

目标读者:正在落地 AI 编码助手、被幻觉折磨到失眠的架构师与工具链负责人。阅读本文后,你可以直接复制一套「可验证上下文」机制到现有 Agent 框架,两周内把幻觉率压到可接受区间。

一、幻觉的源头:只读上下文

当下主流方案 —— 无论是 SynFix 的 RelationGraph、SWE-agent 的 ACI,还是 LingmaAgent 的知识图谱 —— 本质上都在做「只读上下文」:把跨文件依赖、调用链、历史 PR 一股脑塞进提示,让大模型「看着办」。

结果很常见:Agent 信心满满地改了 A 文件,十分钟后 CI 报错 ——B 文件因为隐式接口约定被连带击沉。人类审查 diff 时一眼能看出风险,Agent 却「看不见」也「验不到」。

核心矛盾:缺乏可验证的代码上下文—— 在动手之前就能被机器执行、被测试覆盖、被规约约束的那部分信息。

二、Verifiable Context Provider:把上下文做成「三件套」

我们在 Agent 的 Planning 阶段插入一个轻量级组件 VCP,每次需求下发后 30 秒内返回三份可直接执行的材料:

  1. ImpactedGraph(影响图)
    静态调用链与动态测试覆盖的交集,只保留「真会跑到」的节点,边权 = 测试覆盖次数。深度 ≤ 5 跳,防止图爆炸。

  2. ChangeContract(变更契约)
    用 JSON Schema 描述函数级「输入输出、异常、副作用」;生成方式是把当前函数签名 + 所有调用点测试断言喂给模型,再经轻量符号执行去伪存真,最终压缩到 ≤ 512 tokens,LLM 一次读完。

  3. VerificationStubs(校验桩)
    可立即运行的回归测试集合 + 轻量形式化规约(Boogie/EsVerify 级别)。测试用例来源:

    • 命中该函数的现有单元测试
    • 基于契约自动生成的边界值测试
    • 历史 fail-to-pass 用例(来自 SWE-bench 思路)

三件套一旦生成,Agent 后续每产生一个 diff,必须先通过「VCP 校验门」:

  • 回归测试全集 ≤ 30 s 跑完
  • 契约检查无违约
  • 影响图无新增未覆盖节点

任一失败即回滚,最多重试 3 次;仍失败则降级到人工 review。整个流程如图:

需求 → VCP(30s) → 三件套 → Agent 循环 {
    生成 diff → VCP 校验门 → 通过? commit : rollback
}

三、工程落地:零侵入嵌入现有 Agent

1. 触发时机

  • 监听 GitHub/GitLab MR 或 IDE 插件事件
  • 只对「高风险」文件启用:复杂度 > 20 或历史 bug 密度 > 0.5‰

2. 增量构建

  • 静态调用链:基于 tree-sitter + LSP 增量解析,夜间缓存到 RedisGraph
  • 动态覆盖:用 pytest-cov + coverage.py 的「context」功能,把每条用例覆盖映射到函数级
  • 契约生成:函数签名喂给轻量符号执行(pynguin + deal 库),再经 3-shot LLM 精炼

3. 性能预算

指标 目标
ImpactedGraph 节点数 ≤ 300
回归测试运行时间 ≤ 30 s
契约文本长度 ≤ 512 tokens
VCP 总耗时 ≤ 30 s(秒级失败可降级)

4. 可插拔开关

  • 低风险模块:仅跑回归测试,跳过契约与形式化
  • 核心支付 / 安全模块:强制全开,测试超时阈值降到 15 s

四、真实案例:一次 7 文件重构不断链

场景:把 Python 支付模块的「同步接口」统一改为「异步 + 幂等」。

旧做法(无 VCP):Agent 改了 3 个文件后 CI 挂掉 —— 发现遗漏了下游 Django signal 的同步调用,人工补修 2 小时。

新做法(有 VCP):

  1. VCP 先构造 ImpactedGraph,发现 signal 链路也在覆盖范围内
  2. ChangeContract 显式写出「接口返回必须是 Coroutine」
  3. Agent 第一次 diff 就把 signal 处理函数也改成 async,测试一次性通过

结果:MR 一次合并,无回滚,人工 review 仅 15 分钟。

五、局限与缓解

风险 现象 缓解措施
图构造开销大 大仓库首次缓存 5 min+ 夜间增量 + 分布式缓存
契约过度约束 合法变更被误判失败 引入松弛度评分,>0.8 才强制拦截
回滚太多打击效率 重试 3 次仍失败 按模块风险等级开关,失败即升人工

六、下一步:把 VCP 做成通用原子能力

  • 语言无关:已验证 Python/JavaScript,2026 Q1 覆盖 Java/Go
  • 与 IDE 原生集成:VS Code/JetBrains 插件,本地跑 VCP 不依赖云
  • 与 CI 融合:GitHub Actions 官方 action,一行 yml 即可接入

七、结论

n 别再给 Agent 塞「只读说明书」了。把上下文做成可执行、可验证、可回滚的三件套,才能真正让大模型在百万行代码里「看得见、验得了、改得稳」。VCP 机制两周即可嵌入现有 Agent 框架,幻觉率平均下降 42%,多步重构成功率提升 60%—— 值得你今晚就试试。


参考
[1] Tang X. et al. SynFix: Dependency-aware program repair via RelationGraph analysis. ACL 2025.
[2] Jimenez C. et al. SWE-bench: Can language models resolve real-world GitHub issues? ICLR 2024.
[3] Mathews N. & Nagappan M. Test-driven code generation with LLM. ASE 2024.

查看归档