Code Agent 缓解代码幻觉,不能只在生成结束后运行一次测试。更稳妥的方案是多阶段组合:生成前检索当前仓库与 API 事实,生成时用语法和依赖约束缩小候选,生成后通过编译、分析和测试发现问题,再让模型依据独立证据修订。约束解码、model editing 和 post-editing 分属不同层次,混为一谈会导致系统设计和效果评估失真。
综述将代码幻觉概括为看似合理、甚至语法正确,但在事实、任务忠实度或环境兼容性上缺乏依据的输出。常见表现包括虚构 API、调用不存在的包、违反功能要求、使用错误依赖版本、引用不存在的资源路径,或生成与私有仓库约定不一致的代码。
它与普通 bug 的边界并不总是清楚。两个错误都可能表现为编译失败或测试失败;“幻觉”通常强调模型自信地生成未被输入、仓库或真实 API 支持的内容。工程系统不必先完美分类才能防护,可以先验证可观察约束。
若等模型输出完整代码后再修复,错误可能已经扩散到多个文件:虚构依赖进入 manifest,错误字段同时出现在后端和前端,错误 API 又被包装成工具函数。生成阶段阻止明显非法 token 或结构,可以减少后续搜索空间。
但过强约束也可能压制合理创新。新的局部符号在当前文件稍后定义,尚未登记的内部模块可能正是任务要求创建的对象。约束必须区分“确定不可能”和“当前证据不足”。
约束解码在模型逐 token 生成时调整允许集合或概率。最基础的做法用编程语言语法、JSON Schema 或工具调用 grammar 排除不合法序列。代码场景还可利用作用域内符号、类型、依赖图、API 清单和安全策略。
例如生成 import 时优先或只允许标准库、仓库模块和 manifest 中已声明包;生成方法调用时过滤不存在的成员;生成 SQL 工具参数时限制为允许 AST;生成 patch 时强制 Begin/End 标记与 hunk 行前缀。
这些限制能降低语法和事实型幻觉,却无法证明业务逻辑正确。一个真实 API 仍可能在错误时机被调用,类型兼容的字段也可能含义相反。
上下文无关 grammar 可以保证括号、关键字和结构闭合,JSON Schema 可以保证字段形状。它们不知道项目使用哪个框架版本,也不知道某个路由必须加认证中间件。语法合法只是可执行验证的起点。
Code Agent 应逐步叠加语义约束:当前作用域符号、语言服务器类型、真实依赖版本、配置键和仓库规则。无法确定时,允许模型生成候选,但把不确定引用标记给后续验证,而不是静默视为事实。
综述提到层次化依赖感知框架通过依赖挖掘和受约束解码减少 API 幻觉。工程上可先构建仓库模块、第三方包、版本与可用符号索引,再在生成 import、构造函数和调用表达式时提供候选。
索引必须来自当前工作树和锁文件,而不是模型训练记忆。私有 API、monorepo workspace 和代码生成类型尤其需要本地检索。索引过期会把正确新接口挡掉,所以 Agent 在修改声明后要增量更新。
论文中的 model editing 指不做完整重训,而是修改模型内部某项事实或行为。综述将其分为 local editing、global editing 和 memory-augmented editing,并用 efficacy、generalization、portability、locality 与 robustness 等维度评价。
局部编辑希望修正具体知识且尽量不影响其他行为;全局编辑处理更广范围关联;记忆增强把更新放入外部或附加记忆。它适合纠正长期存在的错误 API 知识或过时事实,但成本、可逆性和副作用都不同于在仓库里改一段源码。
综述引用的 HalluEditBench 包含九个领域的六千余个幻觉样例,结果显示没有一种知识编辑方法在所有维度普遍领先,表现依赖模型与领域。因此不能把一次 model edit 当作永久消除某类代码幻觉。
post-editing 指模型已经生成输出后,再通过自我修订、迭代反馈或外部验证修改结果。Code Agent 中常见流程是先产生 patch,运行编译、静态分析和测试,把错误返回模型,再生成更小的修复 patch。
Chain-of-Verification 的思想是先写草稿,再规划核验问题,独立回答这些问题,最后生成修订结果。对代码而言,核验问题可以转换为确定工具:这个 API 是否真实存在,字段是否在 Schema 中,所有返回路径是否符合类型,测试是否覆盖边界。
同一模型检查自己生成的代码,可能重复同一知识盲点。它虚构了 API,也可能在反思时继续确认该 API 存在。更可靠的 post-editing 使用独立来源:仓库搜索、官方类型定义、编译器、语言服务器、包注册表、静态分析和测试结果。
模型负责解释证据和规划修订,工具负责产生可复现事实。错误反馈应包含文件、行号、符号和失败约束,而不是只说“再检查一下”。
很多幻觉源于信息缺失。RAG 可以在生成前检索当前代码、文档和 API 声明,让模型从真实证据出发。检索结果应按来源和版本标注,防止旧文档与当前依赖混合。
检索也会失败:召回错误文件、上下文截断或被仓库中的恶意指令污染。系统应把检索内容当数据,不让它改变安全规则,并在关键引用处进行符号级验证。
解码器可以分硬约束和软约束。语法闭合、工具参数类型、工作区路径属于硬边界;符号候选和常见设计模式可作为软排序。任务明确要求新建模块时,应把计划中的新符号加入临时候选集。
如果约束导致无合法 token,不应随意关闭全部规则。系统应回退到更高层重新规划、请求更多上下文,或明确报告约束冲突。记录约束拒绝原因也有助于发现索引错误。
事实约束减少不存在 API 和依赖,安全约束限制即使真实也不应执行的行为。例如某个文件删除 API 确实存在,但 Agent 未获授权就不能调用。安全边界必须由工具执行器和沙箱强制,不能只靠解码时降低概率。
类似地,生成安全代码的约束不能替代 SAST、依赖扫描和权限测试。模型可能用允许 token 组合出新的危险逻辑。
只看 pass@k 会混合语法失败、API 幻觉、逻辑错误和环境不兼容。综述总结的指标还包括 API precision、兼容性、不一致率、编译与执行正确性,以及 token 或 statement repetition。
评测应做分阶段消融:仅 RAG、RAG 加约束解码、再加 post-editing,固定模型和任务,比较幻觉类别、最终测试、Token、延迟和误拒绝。model editing 还要测 locality 和 robustness,确认修正一个事实没有破坏无关能力。
模型训练中没有企业内部 API、配置和设计模式,更容易用公开框架惯例填空。私有代码又不能随意发给外部服务。解决方案通常是本地索引、权限感知检索、最小片段传输和受控执行。
对私有知识频繁变化的场景,外部检索或记忆比反复编辑基础模型更易更新和审计。model editing 是否适合,要看知识稳定性、隔离要求和回滚能力。
该论文系统筛选了 60 篇研究,归纳的是方法版图、挑战与机会,并非在同一模型和同一代码基准上重新比较所有技术。不能从类别列表推出某一组合必然最佳。
作者也指出统一评测协议仍不足,模型置信度不等于事实正确,幻觉与普通错误难以区分。工程决策应在自己的语言、仓库和风险场景中验证。
Code Agent 缓解代码幻觉,最有效的方向不是单一技术,而是把真实知识、生成约束和生成后验证串成闭环。约束解码减少明显非法候选,post-editing 用外部证据修正输出,model editing 则在更底层更新模型知识或行为。
三者作用位置和风险不同。可靠系统应让硬约束可解释、软约束可回退、验证证据可复现,并持续评估误拒绝与副作用。目标不是让模型永不出错,而是在错误进入仓库和运行环境前尽早发现并纠正。