代码 Agent 跑久了为什么会忘记目标

代码 Agent 忘记目标、重复失败修复怎么办?用任务状态记录、回归测试和重启提示找回原始要求,区分缓存与记忆,避免把测试变绿当成任务完成。

Fable 5.1 目标漂移封面,导航核心将偏离的长任务重新校正到目标方向

先说结论

代码 Agent 忘记目标后,只说“继续”往往不够。先找回原始要求、失败尝试和验收测试,再让它执行一个能检查结果的下一步。Fable 5.1 是本文讨论的模型背景,恢复方法则属于外层 Agent 程序的设计,并非该模型独有的功能。

  • 把用户确认的目标与不断变化的进度笔记分开保存。
  • 失败记录要写出原因和测试结果,不能只留一句“已经试过”。
  • 重启后先检查实际代码差异、重跑相关测试,再相信摘要。
  • Prompt Cache 降低重复输入费用,不会补回遗漏的需求,也不能证明任务完成。

让代码 Agent 改一个函数,它往往做得不错。让它连续工作几小时、调用几十次工具、跨多个文件修复错误,问题就会变成两类。

第一类是目标漂移。原任务是“重构模块并补回归测试”,Agent 却被某个依赖吸引,顺手清理了大量无关代码,测试反而没写。第二类是浅层修复:用 try-except 吞掉异常、硬编码返回值,或绕过失败检查,让任务表面上显示完成。

两类问题都来自同一个误区:把“看起来像正确代码”当成“已经验证的工程结果”。语言模型负责预测文本;代码 Agent 还必须保存最初目标、执行修改、读取真实结果,并在该停下时停下。Anthropic 的 2026 年 9 月 Fable 5.1 发布页为模型能力提供了新证据,但没有替代外层控制系统。

Anthropic 2026 年 9 月发布 Fable 5.1 与 Mythos 5.1 的官方页面

图:官方页面只标注 September 2026。下文模型背景来自厂商披露;恢复案例是演示,不是本站对 Fable 5.1 的实测。

“读、改、测、修”是外层流程,不是已公开的模型结构

官方没有公开 Fable 5.1 内部存在一条强制执行的模型机制:

读取仓库 → 拆任务 → 修改代码 → 运行测试 → 查看失败 → 修复 → 再测试

更准确的理解是:这是推荐的 Agent 外层流程。模型提出下一步、解释错误;Claude Code 或其他代码 Agent 程序提供仓库访问、命令执行、测试输出、权限和任务状态。

这个区别很重要。演示里“模型能分析报错”,不等于“模型自己运行了沙箱、记住早期指令并设置停止条件”。

每次工具执行后,系统至少应留下四项记录:最初目标与约束、改了哪些文件、哪个测试验证了修改、什么条件允许重试或完成。没有这些记录,再长的上下文也只是给 Agent 更多可能误解的材料。具体日志怎么设计,可参考站内的 Agent 可观测性与调试指南

Agent 忘记目标后,怎样找回任务

下面是演示案例,不是真实模型运行记录。任务原本是:“修复 CSV 导出,让带逗号的客户名称仍保留在同一列。列顺序不变,不升级依赖。”几十次工具调用后,Agent 把名称中的逗号替换成空格,又开始升级导出库,最后声称“问题已修复”。

原要求是保留数据,不是删掉逗号。如果测试只检查“导出结果里有没有客户名称”,这个错误就会漏过去。应使用 Acme, Ltd 作为测试数据:导出后用项目已有的 CSV 解析器读回来,确认第一列仍完整等于这个字符串,列顺序也没有改变。

先暂停新修改,检查工作区:

git status --short
git diff --stat
git diff -- src/export_csv.py tests/test_export_csv.py
git diff -- pyproject.toml requirements.txt

这些是演示 Python 项目的路径,实际使用时换成自己的导出、测试和依赖文件。命令只读,不会撤销修改。发现越界的依赖改动后,先确认是谁改的,再逐项处理,不要清空整个工作区。

1. 留下能接着做的任务记录

下面的 TASK_STATE.md 可以复制后按项目填写。它只是普通文件名,没有自动加载的特殊含义;必须让外层程序在启动、重启或上下文压缩后读取它。上下文压缩,就是把前面的对话总结成短摘要以腾出空间。

task_id: csv-comma-preservation
approved_goal: Preserve customer names containing commas in CSV exports.
constraints:
  - Keep the existing column order.
  - Do not add or upgrade dependencies.
  - Do not deploy or edit production data.
acceptance:
  - Export then parse Acme, Ltd; first column equals Acme, Ltd.
  - Plain names and names containing quotes round-trip unchanged.
  - Existing export regression tests pass without weaker assertions.
failed_attempts:
  - change: Replace commas in names with spaces.
    result: Parsed value becomes Acme  Ltd; customer data is altered.
    evidence: Review fixture assertion and retained test output.
current_status: Not complete; dependency diff needs human review.
next_step: Inspect existing CSV writer quoting before making one small fix.
stop_when:
  - The same fixture still fails after two new candidate fixes.
  - A solution appears to require a dependency change.

这份记录故意保留了失败方案。如果摘要只有“正在优化 CSV 导出”,下一个窗口仍可能再次尝试替换逗号。真实任务要把示例中的证据行换成实际测试命令、结果、时间及日志位置,不要把密钥或完整客户数据写进去。

目标和约束应由用户确认,并设为 Agent 只读,或者要求变更时人工审核。进度可以更新,但不能为了让最新补丁“合格”,顺手改掉最初要求。

如果记忆丢失发生在从 Hermes 换到 OpenClaw 之后,先检查导入文件与新会话能否召回,具体见 OpenClaw 的 Hermes 记忆迁移检查。这和同一个项目中的上下文压缩不是一回事。

2. 重启时不要只发“继续”

可以这样交代:

读取 TASK_STATE.md 和当前代码差异,先复述目标与限制。根据测试检查失败记录,不再替换逗号,不改变依赖。只提出一个给字段加引号的修复方案,修改后运行回归测试并报告实际结果。两次新方案仍失败就停止,交回剩余问题。

演示项目对应的检查命令是:

python -m unittest tests.test_export_csv
python -m unittest discover -s tests
git diff --check

第一条验证目标缺陷,第二条检查已有功能,第三条只检查空白格式错误,不证明代码正确。验收要求是两组测试退出码为 0,名称和列顺序未改变,依赖文件没有越界修改。这些是预期检查条件,不是本文已运行得到的输出。

3. 用结果决定继续还是交回

如果原有 CSV 写入器已经支持给字段加引号,可能只需小改动和回归测试。如果 Agent 认为必须升级依赖,就触发记录中的停下条件,交给用户决定。测试因缺少软件包而无法启动,也应写成环境问题,不能说补丁已经通过。

修复被接受后,更新实际修改文件和测试结果,保留原验收条件及“替换逗号失败”的记录。下次恢复既要知道什么有效,也要知道哪条路已被否定。

想了解“自动继续任务”和“保存任务记忆”的区别,可以看 Codex Persistent Mode 的公开代码与使用限制。那篇解释的是公开提示中的行为要求,不是保证永久记忆的开启教程。

Fable 5.1 的成绩放在什么位置理解

Anthropic 公布 Fable 5.1 的 CursorBench 3.2 为 73.4%,AutomationBench 为 31.4%。这些成绩解释了长时间编程与工具任务受到关注的原因,但没有单独测出“记住目标”的贡献,也没有验证上面的 CSV 恢复方案。

GPT Image 2 生成的 CursorBench、Terminal-Bench 与 AutomationBench 跑分报告图

图:GPT Image 2 根据 Anthropic 2026 年 9 月 BenchmarkGrid 生成的可视化。条形长度仅作示意,准确数值以数字标签及官方表格为准。不同测试的任务与计分方式不同,不能横向比较百分比;图中均为厂商公布结果,不是本站复测。

它们不代表同样比例的生产修改可以无人审核上线。完整发布信息和客户案例可读 Fable 5.1 与 Mythos 5.1 发布解析。这里更关心:重启后的 Agent 能否说清目标、避开失败方案,并拿出完成任务的测试结果。

Prompt Cache 不是任务记忆

Claude Platform 的 Prompt Caching 文档描述的是复用已处理的提示词前缀。缓存命中能省钱,却不会补回下一轮提示词里漏掉的需求。任务记录要保存在文件或数据库中,恢复时再提供相关内容。

下图采用一个八轮调用示例:稳定前缀 17,000 Token,每轮新增输入 5,000 Token、输出 3,000 Token。按该示例采用的文档价格,5 分钟方案包含首次写入 $0.2125、七次读取 $0.02975、新增输入 $0.40、输出 $1.20;后续调用必须在缓存有效期内命中。

GPT Image 2 生成的八轮 Prompt Cache 成本拆解报告图

GPT Image 2 可视化:计入首次缓存写入后,5 分钟缓存方案的估算成本从 2.96 美元降至 1.84 美元。

这是费用算例,不是记忆保持率测试。具体价格与缓存断点另见 Prompt Cache 成本与实现指南

Claude Platform Docs 的 Prompt Caching 页面

图:官方文档展示自动或显式缓存断点,以及 5 分钟和 1 小时 TTL。跨天项目不能假设昨天的缓存仍存在。

在 CSV 案例里,可以复用稳定的仓库规范,但每次恢复都要加入最新任务记录。旧失败摘要不会因为读取便宜就变成正确记忆。

Agent 架构应该怎样分工

Fable 5.1 的长任务成绩提高,说明部分语义判断可以交给模型,但确定性控制不能删掉。

以下内容应留在模型外部:不可变的任务目标与验收条件;破坏性命令、生产权限和外部消息审批;重试次数、超时、预算和幂等键;原始工具输出、测试结果、提交记录与审计事件;最终上线决定。

模型更适合处理需要语义判断的工作:选择下一个文件、解释堆栈、提出根因假设,或挑选能区分两种原因的测试。

这种设计在某些项目里会减少手写状态转换,但没有证据支持“框架代码一定减少 60–70%”。它只是把一部分框架复杂度换成更多 Token、延迟、缓存管理和模型依赖,具体收益必须用自己的故障数据测量。

TDD(测试驱动开发)很适合这种分工:先把需求写成失败测试,再实现最小修改,随后跑回归测试。不过测试本身仍要审查;模型可能写出过弱的断言,让错误代码也显示绿色。

四个不会自动消失的边界

  1. 上下文有限。 大型仓库和跨周项目仍需要检索、摘要与外部持久记忆。
  2. 没有测试就没有硬标准。 反复修改也可能只得到“看起来合理”的错误补丁。
  3. 模糊需求会让 Agent 完美地做错事。 它可能优化错页面、错指标或错用户流程。
  4. 安全与法律责任不能交给模型。 反编译、使用凭据、写生产环境和披露漏洞都需要明确授权。

结语

Fable 5.1 提高的是模型在漫长、混乱调查中继续保持有效的概率,没有改变外层工程系统的责任。

更可靠的分工是:模型解释证据并提出下一步;Agent 外层程序保存目标、执行工具、记录结果、限制预算,并在高风险边界要求批准。做到这一点,代码 Agent 才不是“多写几段代码”的演示,而是一套可复核的工程过程。

FAQ

Fable 5.1 能彻底解决 Agent 失忆吗?

不能。官方结果表明长任务能力提高,但上下文仍然有限,早期指令仍可能被稀释。目标和验收条件应保存在外部持久状态中。

“读仓库→跑测试→修复”是模型内置机制吗?

官方没有这样公开。更稳妥的说法是:这是模型与仓库、Shell、测试、状态和权限工具组成的 Agent 外层流程。

Agent 重复失败方案时,该新开对话吗?

先保存代码差异、失败假设和测试结果。新对话可以减少无关上下文,但必须加载这份记录;空白重启仍可能重犯同一个错误。

TASK_STATE.md 会自动加载吗?

不会,它只是示例文件名。需要配置外层程序读取,或在每次恢复时明确要求 Agent 打开。用户确认的目标不能被 Agent 擅自修改。

跑分高了,可以无人值守上线吗?

不可以。基准测试不代表你的仓库安全性、测试质量、合规要求和部署风险,最终上线仍需人工审核。