目标读者:正在落地 AI 编码助手、被幻觉折磨到失眠的架构师与工具链负责人。阅读本文后,你可以直接复制一套「可验证上下文」机制到现有 Agent 框架,两周内把幻觉率压到可接受区间。
一、幻觉的源头:只读上下文
当下主流方案 —— 无论是 SynFix 的 RelationGraph、SWE-agent 的 ACI,还是 LingmaAgent 的知识图谱 —— 本质上都在做「只读上下文」:把跨文件依赖、调用链、历史 PR 一股脑塞进提示,让大模型「看着办」。
结果很常见:Agent 信心满满地改了 A 文件,十分钟后 CI 报错 ——B 文件因为隐式接口约定被连带击沉。人类审查 diff 时一眼能看出风险,Agent 却「看不见」也「验不到」。
核心矛盾:缺乏可验证的代码上下文—— 在动手之前就能被机器执行、被测试覆盖、被规约约束的那部分信息。
二、Verifiable Context Provider:把上下文做成「三件套」
我们在 Agent 的 Planning 阶段插入一个轻量级组件 VCP,每次需求下发后 30 秒内返回三份可直接执行的材料:
-
ImpactedGraph(影响图)
静态调用链与动态测试覆盖的交集,只保留「真会跑到」的节点,边权 = 测试覆盖次数。深度 ≤ 5 跳,防止图爆炸。 -
ChangeContract(变更契约)
用 JSON Schema 描述函数级「输入输出、异常、副作用」;生成方式是把当前函数签名 + 所有调用点测试断言喂给模型,再经轻量符号执行去伪存真,最终压缩到 ≤ 512 tokens,LLM 一次读完。 -
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):
- VCP 先构造 ImpactedGraph,发现 signal 链路也在覆盖范围内
- ChangeContract 显式写出「接口返回必须是 Coroutine」
- 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.