Anthropic 如何让 Agent 连续工作几天:真正难的不是模型能力

一个 Agent 工作十分钟并不难。真正麻烦的是,当任务跨过一个上下文窗口,下一轮 Agent 重新进入项目时,它还知不知道上一轮做到哪里、哪些功能真的可用、哪里出了问题,以及接下来应该做什么。
模型每次进入新的上下文,就像一位刚走进办公室的接班工程师。它不知道上一班做了什么,也不知道项目为什么变成现在这样。如果唯一的交接材料只是一段压缩过的聊天摘要,它很容易走向两个极端:要么试图一口气做完所有事情,做到一半上下文耗尽;要么看到项目已经有不少代码,就过早宣布“任务完成”。
Anthropic 在《Effective harnesses for long-running agents》中讨论的正是这个问题。当 Coding Agent 的任务从十分钟延长到几小时甚至几天,真正困难的已经不只是“会不会写代码”,还包括如何跨多个上下文窗口稳定接班。Anthropic 的做法没有试图造一个“永不失忆”的 Agent,而是把关键项目状态留在模型之外,让每一轮新的 Agent 都能够重新读取、验证,然后继续工作。
对于软件工程类任务来说,长周期运行能力,很大程度上取决于下一轮能不能接得上。
Anthropic 把整个过程拆成了两类会话。
在官方示例里,初始化 Agent 会根据项目需求生成至少 200 个详细的端到端测试项,每一项都包含功能描述、操作步骤和验证状态,并统一从“未通过”开始。这份清单不是普通的待办事项,它提前定义了项目怎样才算真正完成。
Anthropic 所说的初始化 Agent 和编码 Agent,并不是两套完全不同的系统。官方说明,两者使用相同的 system prompt、工具和整体 Harness,主要区别在于首次会话和后续会话采用了不同的初始任务提示。
模型不再需要承担“记住整个项目”的任务,而是按照一套固定协议重新建立项目认知,再继续推进。
设计长期 Agent 时,第一反应往往是给模型更多上下文、做更聪明的摘要,或者接入向量数据库。这些能力当然有用,但 Anthropic 的实践提醒了另一件事:对软件项目而言,很多最重要的信息,本来就不应该只存在于对话里。
需求和验收清单、可重复执行的测试、Git 提交记录、能一键恢复环境的启动脚本,以及简短而明确的交接日志,共同构成了一套外部项目状态。对话记忆告诉 Agent“上一轮大概想了什么”,工程状态则告诉它“项目现在究竟是什么样”。
假设上一轮 Agent 在对话中说登录功能已经完成,但真实用户路径仍然无法登录,那么下一轮更应该相信测试结果,而不是上一轮留下的文字结论。
上下文负责当前推理,工程环境负责保存长期事实。
这里并不是说 Memory 不重要。用户偏好、历史决策、长期目标等信息依然需要持续记忆。Anthropic 解决的是另一类问题:当 Agent 负责一个可以被文件、代码和测试描述的长期任务时,关键事实需要进入一个能够被重新读取、实际运行和再次验证的外部环境。
只要这些事实稳定地写进环境,即使下一轮换成一个完全没有前情的新 Agent,它也可以重新建立认知,而不是只能依赖上一轮留下的一段摘要继续猜。
长期 Agent 的另一个运行风险,是它有权自己判断什么时候算完成。
假设你只给它一句话:“做一个类似 的应用。”模型很可能在页面能打开、输入框能输入、按钮能点击时就认为主要任务已经完成。但真正的产品还包括会话列表、错误处理、响应状态、主题切换、布局细节,以及大量边界条件。
Anthropic 用一份结构化功能清单解决这个问题。每一项功能都包含明确的操作步骤和预期结果,并且默认处于未通过状态。后续 Agent 只有真正完成验证,才能修改对应的通过状态。
官方 Prompt 对这一点限制得很严格:后续 Agent 不能删除测试,不能修改测试描述,也不能调整验证步骤,只能在完成验证之后,把 passes: false 改成 passes: true。
这个限制看起来有些机械,却挡住了一个很现实的问题:如果 Agent 同时拥有执行任务和修改验收标准的权力,遇到困难时,就可能通过降低标准让项目看起来已经完成。
对于 Web 应用,Anthropic 还要求 Agent 使用浏览器自动化按照真实用户路径完成验证。接口返回成功、单元测试通过,并不能证明最终用户真的可以完成操作。Agent 需要真正打开页面、点击、输入、滚动,并检查最终结果。
一个功能不是“代码写过了”就算完成,而是“约定的用户路径验证过了”才算完成。
当任务跨越几十次甚至更多上下文窗口时,这种外部验收机制的重要性会越来越明显。否则,一个早期误判可能不断被后续 Agent 当作既定事实,最后形成一套看起来已经完成、实际上问题很多的项目状态。
Anthropic 要求编码 Agent 每次集中完成一个功能,并在结束前提交代码、更新进度、清理工作区。
这很像一次数据库事务:
开始时读取一个已经确认的状态; 中间完成一个有限、可验证的修改; 测试通过后提交; 出现问题时修复或回退; 不把难以判断的半成品留给下一轮。
这比“让 Agent 一次尽量多做一点”看起来慢,却更容易持续。一次写十个功能,如果上下文耗尽的时候留下的是一个无法启动的项目,下一轮就需要花大量时间“考古”:上一轮到底改了什么、哪里坏了、哪些已经完成、哪些只是做到一半?
一次只完成一个可以验证的单元,看似保守,却让每一个新的上下文都站在相对稳定的状态上继续前进。
Git 在这里也不只是版本管理工具。它为 Agent 提供了一套可追溯的变更记录:哪些变化已经保存、前后差异是什么、出现问题之后能够回到哪里,都有迹可循。
当然,Git 并不能恢复所有运行状态。外部系统有没有调用、浏览器停在哪里、审批进行到哪一步,都不属于 Git 能完整保存的范围。因此,它需要和任务清单、进度记录、环境恢复脚本以及测试机制一起工作。
所谓“让 Agent 连续工作几天”,也就不只是让一个 Agent 长时间保持运行。每一轮有限执行结束以后,都要留下一个下一轮能够继续工作的状态。
它没有让模型突然变聪明,而是减少了模型必须靠猜测解决的问题。
第一,减少状态歧义。新 Agent 不需要从零猜测项目进度,任务清单、进度记录和 Git 历史已经提供了基本事实。
第二,限制在制品数量。一次只推进一个可验证单元,降低上下文耗尽时留下大量半成品的概率。
第三,把回归检查放在新增功能之前。每轮先验证核心路径,可以更早发现上一轮造成的问题,防止错误在几十次会话里持续累积。
第四,用真实用户路径代替模型的“自我感觉”。对 Web 应用来说,代码写完或者接口返回成功,并不意味着用户真的能够完成操作。浏览器端到端测试迫使 Agent 面对最终体验。
第五,让失败可以恢复。有代码提交、有进度记录、有启动脚本,即使某一轮执行失败,下一轮也能找到一个相对明确的重新开始位置。
模型能力 × 工具质量 × 状态设计 × 验证机制 × 恢复能力
这不是 Anthropic 提出的量化公式,而是对这套工程实践的一种归纳。模型能力只是其中一部分。模型再强,如果不知道项目现在处于什么状态,或者缺少可靠的验收和恢复机制,长时间运行后依然可能逐渐失控。
同时也要看到这套方法的边界。Anthropic 当前展示的方案主要针对 full-stack Web 应用开发。官方也明确提出,怎样把这些经验推广到其他领域仍需要继续验证;另外,一个通用 Coding Agent 持续工作,是否优于测试 Agent、QA Agent、代码清理 Agent 等多个专业 Agent 分工,目前也没有确定答案。
更准确地说,这是一套已经被用于解决长周期编码任务的工程方法,还不是所有长期 Agent 的统一架构。
Anthropic 官方示例里,承担长期状态与交接作用的核心材料包括:
真正重要的并不是文件叫什么名字,而是这几个角色不能缺:任务规格、当前状态、环境恢复、交接记录和可验证的历史。
任务状态也不必只有“通过”和“未通过”。如果把这套方法迁移到真实企业 Agent 场景,还可能遇到进行中、阻塞、等待外部结果、等待人工审批、已经执行但尚未验证等状态。企业任务的状态也不一定全部存在于代码仓库里:审批有没有通过、外部系统有没有完成调用、人工是否已经确认,都可能决定下一轮 Agent 应该做什么。
这些内容已经超出 Anthropic 当前 Coding Agent 示例的范围。但它提供了一个可以继续往企业场景推演的方向:长周期 Agent 除了模型和工具,还需要一套能够保存状态、判断完成、验证结果并支持恢复的运行机制。
Anthropic 这项实践最有价值的地方,是把一个看起来很像“大模型记忆”的问题,重新拉回到了工程系统本身。
当 Agent 的工作从一次对话延伸到几小时甚至几天,它需要解决的已经不只是如何理解指令、调用工具和生成代码,还包括如何知道自己现在在哪里,哪些事情真的完成了,下一步应该做什么;如果中途失败,又该从哪里继续。
这些能力不会随着上下文窗口变长自动出现。
未来 Agent 的差距,也很可能越来越多地体现在模型之外:谁能为模型提供更清晰的工作环境、更明确的完成标准、更可靠的状态管理,以及更容易恢复的执行过程。
真正能持续工作几天的 Agent,不需要做到“永远不失忆”。
更现实的目标,是每一次进入新的上下文之后,它都能重新找到可信的事实,然后接着干下去。
1. Anthropic:Effective harnesses for long-running agents https://www.anthropic.com/engineering/effective-harnesses-for-long-running-agents
2. Anthropic Claude Quickstarts:Autonomous Coding Agent https://github.com/anthropics/claude-quickstarts/tree/main/autonomous-coding








