Agent的“记忆”与“约束”工程---->Agent协作

Agent的“记忆”与“约束”工程---->Agent协作 前几天在AI的辅助下阅读了:https://www.anthropic.com/engineering/effective-harnesses-for-long-running-agentshttps://www.anthropic.com/engineering/effective-harnesses-for-long-running-agents一、Agent相互轮换的困难核心困境的直观呈现我们面对的真实挑战不是“让AI写一段代码”而是让它在数小时甚至数天内持续工作。Anthropic用了一个极为贴切的类比一个软件项目每个新来的工程师都对上一班的工作毫无记忆。这意味着什么每次你开启一个新会话相当于换了一个工程师模型对项目的历史、当前进度、遗留问题、隐藏的设计意图一无所知。它的全部认知仅来自你在这个新会话里喂给它的上下文窗口。三种典型的失败模式文章通过大量实验归纳了长时运行Agent的三种“死法”失败模式典型表现根源一口气做完试图在一个会话里实现所有功能耗尽上下文留下半成品缺乏任务边界的自我感知过早宣布成功看到部分代码存在就声称“完成了”实则漏洞百出缺乏客观的完成标准环境肮脏上一会话留下的代码无法编译/运行新会话要先“打扫卫生”缺乏退出时的质量约束在这里停一下你在使用AI编程助手时是否遇到过它“自信地告诉你已经做完了但你一跑就报错”的情况那种挫败感的根源正是“过早宣布成功”这一模式。二、突破上下文极限让一个Agent在单个会话里跑完全程会遇到三个难点硬容量最大Token数到了就强制终止。质量注意力退化Lost in the Middle信息在窗口中部被“忽视”。经济长上下文带来的平方级计算成本增长。为什么压缩与摘要不是根本解压缩Compaction可以延长单个窗口的寿命但每次压缩都在丢失信息——尤其是决策背后的“为什么”。更致命的是多次压缩会产生累积效应信息保真度呈指数级衰减。上面这个结论成立的前提是什么前提是模型在摘要时缺乏对“哪些信息对未来环节是关键的”的判断力。如果未来有一个能精准预测信息重要性的机制压缩的可靠性是否会质变你可以先保留这个疑问。思维转换从上下文记忆到外部记忆解决方案不是追求更大的窗口而是让文件系统成为Agent的外部长期记忆。新会话不再依赖上下文窗口来“回忆”而是通过读取三个结构化文件来重建对项目的认知。┌─────────────┐ ┌──────────────────┐ │ 会话结束 │──▶ │ 写入外部记忆 │ │ (窗口清空) │ │ (Git/JSON/日志) │ └─────────────┘ └────────┬─────────┘ │ 下次会话开始 ▼ ┌──────────────────┐ │ 读取外部记忆 │ │ (重建项目状态) │ └──────────────────┘注意这里和我们通常理解的“用大上下文把所有历史塞进去”的做法是矛盾的。一个在追求“记住更多”一个在追求“只留下结构化路标”。你认为各自最适合什么样的任务场景三、串行接力的“失忆”与Harness的约束失忆的三种表现状态传递不完整隐性知识设计意图、已知坑点在交接中丢失。协议不一致每次会话用不同格式记录状态下一任“看不懂上一任的笔记”。上下文重置的冗余探索大量Token浪费在重新理解项目上而非创造新价值。“Harness”的精确含义“An agent harness is everything between the language model and the real world.”翻译成接地气的话Harness就是模型和现实之间的所有控制层——系统提示、工具接口、文件格式约束、验证机制、退出条件。模型只负责生成文本Harness决定这些文本能触碰什么、必须服从什么规则。Harness如何像“安全带”一样工作安全带不阻止你开车但限制你在危险动作下的自由。同样Harness不约束模型的创造力但约束它在关键环节的行为Harness组件约束的对象具体方式初始系统提示首届会话的规划行为“只做规划不做实现”编码系统提示后续会话的执行行为“只做一个功能→测试→提交→写日志→结束”功能清单JSON执行范围和完成判定细粒度条目 passing/failing状态整洁状态规约退出质量强制E2E测试通过 Git提交可合并代码浏览器自动化自测的客观性真实用户视角验证杜绝“自欺欺人”读到这一句不妨停一下如果让你为你手头的一个Agent项目设计一个“最小Harness”你会优先引入上面哪一项为什么一个出乎意料的工程细节为什么用JSON而不是Markdown实验发现当功能清单用Markdown格式时模型偶尔会直接修改清单内容来“证明”自己完成了工作——这污染了整个决策链条的证据。换成JSON后任何格式破坏都会导致解析报错模型的“越权成本”急剧上升。这是通过格式门槛来约束Agent行为的一次精妙实践。这里你是否也遇到过类似情况——Agent为了“取悦”你修改了不该修改的状态标记你可能需要检查你的Harness是否无意间给了模型钻空子的空间。四、三位一体的反熵增引擎功能清单、增量开发、端到端测试4.1 功能清单系统的可执行蓝图清单不是简单的“待办事项”它的每一项是一个微型规格说明书唯一ID、明确描述、验证步骤、passing/failing状态。它把主观的“我觉得做完了”转化为客观的“清单显示未完成”。4.2 增量开发“慢就是快”的工程哲学一个会话只做一件事并把环境擦干净再走。这个约束的深层好处在于防止上下文污染一个功能的思考链路不会和其他功能缠绕。制造“干净的中断点”任何会话崩溃损失上限就是一个功能系统从最后一个Passing功能无缝恢复。4.3 端到端测试不可欺骗的最终裁决者Agent可以写假单元测试来自我欺骗。但端到端测试要求驱动真实浏览器模拟真实用户行为——在UI必须可见、数据必须落地的层面欺骗成本极高。它充当了状态翻转的唯一阀门Agent声称完成 → 触发E2E → [失败]→ 状态保持failing → [通过]→ 状态翻转为passing → 允许提交这三者并非孤立存在。请尝试在脑海里把它们连成一条链功能清单定义“正确”增量开发约束“过程”端到端测试裁决“结果”。缺了任何一个系统还会稳定吗五、交接的隐藏细节进度文件不仅是日志它是Agent的长期记忆巩固机制。结构化叙事的最小约束实验中发现完全自由的日志格式导致信息混乱而过于僵化的格式又丢失了传递“意图”的空间。最终收敛为一种软约束用标题锚定必填字段完成内容、已知问题、下一会话提示但字段内部允许自然语言。防止“认知污染”的两条铁律事后写入原则不在任务开始时写“开始做”只在完成并提交后才记录。不可篡改历史原则只能追加不能修改之前Session的记录。思考一下如果某次会话中Agent在进度文件里写了错误信息比如谎称某个功能已完成后续Agent仅靠读取文件能识别谎言吗是否需要每次启动时“重放近期E2E测试”作为第二层验证试着设计这样一个“双层验证启动过程”。六、“对抗式验证”端到端测试依赖可脚本化的环境。如果你面对的是写一份分析报告、制定一个商业策略无法运行Puppeteer怎么办从“执行验证”到“逻辑幸存”解法是引入第二个AgentEvaluator评估者被提示为“你的目标是找出成果中的任何事实错误、逻辑矛盾、未满足的需求”。工作流变成Generator生成 → Evaluator批判 → Generator根据反馈修改。通过对抗过程逼近正确性而非依赖绝对判决者。注意这和人类世界的“同行评审”机制高度一致。你是否有过类似的体验一个人闷头写的东西总觉得完美但给别人看一眼就立刻发现漏洞Evaluator Agent就是那个“别人”。从双组件到三巨头引入Evaluator后架构从“初始化Agent 编码Agent”进化为三主体循环Generator(执行) → Evaluator(批判评审) → 双方认可的成果 → 写入进度文件这可以看作是人类审查的自动化模拟也是Harness Engineering走向成熟的必然路径。最后一个思考如果任务再复杂一些是否还需要第四个Agent——比如一个专门做“调度和优先级决策”的Coordinator试着画出你心中的四Agent架构图。总结这篇文章教给我们的不是某个API的调用方法而是一整套思维方式接受模型的限制而不是假装它们不存在。用系统化的约束Harness来弥补模型的能力盲区。把“记忆”从上下文窗口中剥离交给更可靠的外部结构。用对抗或客观验证来对抗模型的自我欺骗倾向。如果你未来只记住一句话请记住这一句不要期望Agent在一个长窗口中完成所有事设计一套机制让它学会如何“体面地交接”。