1560 字
8 分钟
Agent 走偏或者产生幻觉,怎么处理?

一、先把任务变成可以检查的约束#

假设用户要求给订单模块增加查询接口,系统可以在执行前,将用户的自然语言需求整理成结构化任务描述:

{
"goal": "新增订单查询接口",
"allowed_paths": [
"src/main/java/com/example/order/**",
"src/test/java/com/example/order/**"
],
"forbidden_actions": [
"修改用户模块",
"删除现有接口"
],
"acceptance_criteria": [
"接口返回正确的订单信息",
"订单不存在时返回规定错误",
"原有订单测试全部通过"
]
}

这里不一定非要使用 JSON,核心是建立一个结构化的任务约束对象。

具体怎么实现?#

用户输入自然语言后,可以通过单独的 LLM 调用,配合预定义的输出格式,将需求提取为结构化任务;也可以在 Agent 自身的规划阶段完成这一步。

但 LLM 提取的结果不一定正确,可能遗漏用户要求或错误理解限制,因此还需要进一步处理:

  1. 保留原始需求:保存用户原话,方便后续核对,避免只依赖模型生成的任务描述。
  2. 校验结构与约束:通过 Schema 检查字段和类型;对于明确的业务规则,通过后端代码进行校验。
  3. 落实关键权限:对于禁止修改的模块,结合项目配置确定实际文件范围,不能只依赖模型生成的路径。
  4. 处理不确定需求:如果无法可靠判断用户的真实意图,或者不同理解会导致明显不同的执行结果,就向用户确认。

二、用执行轨迹和自动化检查发现偏航#

系统需要为每个任务维护执行记录,记录 Agent 做了什么、工具实际返回了什么,以及执行结果是否符合预期。

例如:

记录内容示例
任务 IDtask-001
工具调用read_file
工具参数OrderService.java
实际结果文件读取成功
后续操作edit_file
验证结果Maven 测试失败

接下来根据不同问题,采用不同的检测方式:

问题类型检测方式
修改了无关文件使用 git diff --name-only 检查变更路径,与 allowed_paths 比较
引用了不存在的接口检查实际代码、依赖定义,并运行编译
业务逻辑偏离需求对照验收标准逐项检查,必要时交给独立 Reviewer
产生事实幻觉重新读取文件、查询真实数据或调用实际工具验证
测试失败检查测试进程的实际退出状态和错误日志

例如,任务执行过程中可以检查 Git diff,任务完成后运行 mvn test。

需要注意:测试通过不代表业务需求一定满足,因此还需要结合业务验收标准进行检查。

三、在工具执行入口设置强制检查#

发现问题之后再纠偏还不够,一些偏航应该在实际执行之前就被拦截。

对于 write_file、execute_sql 等可能产生副作用的工具,可以在执行入口检查:

  • 权限检查:当前用户或 Agent 是否有权执行该操作。
  • 资源范围检查:目标文件、数据表等资源是否在允许范围内。
  • 操作类型检查:当前操作是否被禁止,例如删除文件或执行危险 SQL。
  • 风险审批:对于高风险或无法可靠自动判断的操作,暂停执行并请求人工审批。

例如,Agent 尝试修改禁止修改的 UserService.java,执行器根据可信的项目配置发现目标路径超出允许范围,就拒绝本次写入,并返回明确的错误信息。

这里的关键是:allowed_paths 等限制必须由可信的后端规则或经过校验的任务状态提供,不能让模型自行决定是否绕过检查。

四、发现错误后,进行针对性纠偏#

系统不应该简单地让 Agent 重新生成答案,而应该根据执行记录定位根因,再生成明确的修复任务。

例如,检测到以下问题:

  1. 修改了允许范围之外的 UserService.java。
  2. 新增接口引用了不存在的 UserRepository 方法。
  3. 订单模块原有测试失败。

系统可以将这些错误反馈给 Agent,并要求其分析原因、给出修复计划,在约束范围内完成修复,然后重新运行测试。

但是,这条纠偏指令本身并不能保证 Agent 一定遵守要求。真正限制修改范围的,仍然是工具执行器的权限校验;真正判断测试是否通过的,应该是测试进程的实际执行结果。

同时,需要设置重试上限,例如最多允许 2 次自动修复。如果仍然失败,就停止自动执行并升级人工处理。

如果 Agent 已经修改了大量无关代码,应先保存 Git diff 和执行记录,再审查变更并决定是否回滚。不能不加区分地直接重置整个工作区,以免丢失用户原有的修改。

五、修复后必须重新验证#

修复完成后,系统重新执行检查:

  1. 变更范围:是否只修改了允许的文件。
  2. 编译检查:是否存在编译错误。
  3. 单元测试:相关测试是否通过。
  4. 回归测试:原有功能是否受到影响。
  5. 需求验收:原始需求中的每一项要求是否满足。

只有必要的检查全部通过,才能将任务标记为成功;否则继续修复或转人工处理。

六、整体工程流程#

自然语言需求 → 结构化任务 → 约束校验 → Agent 执行 → 记录执行轨迹 → 自动检查偏航 → 针对性纠偏 → 重新验证 → 验收结果。

核心原则: 不假设模型永远理解正确,而是通过轨迹发现问题、通过工具权限拦截违规操作、通过针对性纠偏修复错误,最后通过真实执行结果和验收标准判断任务是否完成。

Agent 走偏或者产生幻觉,怎么处理?
https://blog.xqcherry.top/posts/interview/ai-engineering/agent-drift-and-hallucination-guardrails/
作者
xqcherry
发布于
2026-10-23
许可协议
CC BY-NC-SA 4.0