智能体一连跑几个小时,会在哪里出问题
让一个编程智能体去做一个 claude.ai 的克隆版,然后放手让它跑,会出现两种失败。Anthropic 用 Claude Agent SDK 上的 Opus 4.5 做过这个实验,并把两种失败都写进了一篇讲长时间运行智能体的工程文章。第一种出现在开头:智能体想一口气把整个应用做完,做到一半上下文用光了,留给下一个会话的是一个做了一半、没有任何说明的功能。第二种出现在后期:一个新会话看了一圈,发现已经有不少能跑的代码,就宣布任务完成了,其实并没有。
较早的模型还有第三种失败。Anthropic 的 Labs 团队发现,Claude Sonnet 4.5 在接近它以为的上下文上限时会提前收尾,他们把这叫作“上下文焦虑”。单靠压缩治不好它,所以那套 harness 改成清空上下文,再把一份写好的交接说明交给一个新的智能体。
Anthropic 对 Claude Code 会话的研究看了最长的那些回合(第 99.9 百分位)。它们在 2025 年 10 月到 2026 年 1 月之间几乎翻了一倍,从不到 25 分钟变成超过 45 分钟。文章还写道,从 1 月中旬起,极端的回合时长已有所下降。上下文窗口是模型一次调用能看到的全部文字,而长时间运行的智能体就是为跨越许多个窗口而设计的:一个任务,许多个会话,每个会话都从空白开始。
开始之前
这一课接着什么是智能体 harness里的循环,以及第 2 课的工具设计往下讲。压缩、记忆文件和上下文编辑能让一个会话撑得更久,智能体记忆那一课专门讲它们。这一课要解决的,是会话与会话之间的断档。
示例用的是 Anthropic 在 GitHub 上的 autonomous-coding 快速入门,一个用 Python 写、基于 Claude Agent SDK 的智能体 harness,也就是模型外围的那层代码。
运行它需要 Claude Code CLI、Python 和 ANTHROPIC_API_KEY,它的 README 也提醒,做完一个完整应用要跨很多个会话、花上好几个小时。
这个快速入门仍然导入旧的 claude_code_sdk 包。现在这个 SDK 的包名是 claude-agent-sdk,它的 README 写明了 ClaudeCodeOptions 已改名为 ClaudeAgentOptions。
布置第一个会话:需求说明、功能清单、初始化脚本和 git
第一个会话几乎不写应用代码,这是有意为之。Anthropic 把它叫作初始化智能体。它和之后的每个会话用同一套系统提示词、工具和 harness,只有第一条用户消息不同。它的任务,是把需求说明变成一套陌生人也能接手的文件。
防止过早宣布完成的,就是这份功能清单。清单里每一项都是一个端到端测试,带一个 passes 标记,所有标记一开始都是 false。下面的格式原样摘自快速入门的初始化提示词。Anthropic 选 JSON 的原因是,和 Markdown 文件相比,模型更不容易乱改或覆盖 JSON 文件。
[
{
"category": "functional",
"description": "Brief description of the feature and what this test verifies",
"steps": [
"Step 1: Navigate to relevant page",
"Step 2: Perform action",
"Step 3: Verify expected result"
],
"passes": false
},
{
"category": "style",
"description": "Brief description of UI/UX requirement",
"steps": [
"Step 1: Navigate to page",
"Step 2: Take screenshot",
"Step 3: Verify visual requirements"
],
"passes": false
}
]- 把需求说明放进
app_spec.txt,并让初始化智能体先读它。 - 让它根据需求说明写出
feature_list.json。快速入门要求写 200 个测试,按优先级排列,短的检查和十步以上的长测试都要有。它的 README 建议,想快点看到演示效果,可以减到 20 到 50 个。 - 用明确的话禁止修改清单。提示词用全大写写着,删除或修改功能是灾难性的,之后的会话只能改
passes这一个字段。 - 让它写出
init.sh,负责安装依赖、启动开发服务器,这样之后的会话不必再花上下文去摸索怎么运行应用。 - 把清单、脚本和一份 README 做成第一次 git 提交,再在上下文用满之前写好
claude-progress.txt。
之后的每个会话,都用同一套开场
第一个会话之后的每个会话,都是一个毫无记忆的编程智能体。它的提示词以一套固定流程开头,用七条命令从文件里重新拼出全貌。下面这段原样摘自快速入门的编程提示词。
接下来流程就变得严格了。开始新工作之前,智能体要重跑一两项已经标为通过的核心测试,因为上一个会话可能把它们弄坏了,发现问题先修。然后它挑出优先级最高的未通过功能,只做这一个,并像用户那样在浏览器里点一遍、截图检查。只有到这一步,它才能把 passes 改成 true、提交代码,并在进度文件里写下这次做了什么、下一步该做什么。
Anthropic 发现,让模型用写清楚的提交说明提交到 git,再把进展写进一个摘要文件,是让它每次都把代码留在干净状态的最好办法,git 还让它能撤回坏的改动。下表把每种失败和对应的做法一一对上。
# 1. See your working directory
pwd
# 2. List files to understand project structure
ls -la
# 3. Read the project specification to understand what you're building
cat app_spec.txt
# 4. Read the feature list to see all work
cat feature_list.json | head -50
# 5. Read progress notes from previous sessions
cat claude-progress.txt
# 6. Check recent git history
git log --oneline -20
# 7. Count remaining tests
cat feature_list.json | grep '"passes": false' | wc -l| 出了什么问题 | 第一个会话准备什么 | 之后每个会话做什么 |
|---|---|---|
| 智能体宣布整个项目已完成 | 根据需求说明写出的功能清单 | 读清单,挑一个未通过的功能 |
| 缺陷和没记下的进展被带进下一轮 | git 仓库和进度文件 | 读笔记和 git 日志,重跑一项基础测试,再提交并更新笔记 |
| 功能过早被标为完成 | 功能清单 | 自己核查每个功能,仔细测试过才标为通过 |
| 时间都花在弄清怎么运行应用上 | 一个 init.sh 脚本 | 一开始先读 init.sh |
端到端检查也有盲区。文章提到,Claude 通过 Puppeteer MCP 服务器看不到浏览器原生的弹窗提示,依赖这类弹窗的功能问题也更多。
用一个循环重启智能体
一个会话结束时,总得有东西启动下一个。在快速入门里,这是一个 Python 循环。它为每个会话新建一个客户端,第一次发初始化提示词,之后都发编程提示词,等三秒再来一轮。它自己永远不会停下。--max-iterations 参数限制会话的数量,按 Ctrl+C 会暂停,再运行同一条命令就能接着跑。
Anthropic 安全防护团队的研究员 Nicholas Carlini 只用一个简单的 shell 循环,就让 16 个智能体在将近 2,000 个 Claude Code 会话里用 Rust 写出了一个 C 编译器。这个编译器约 100,000 行,能在 x86、ARM 和 RISC-V 上构建 Linux 6.9。
下面的循环原样摘自他的文章,文章在它正上方写了一句:在容器里运行,不要在你自己的机器上运行。循环里那个参数会关掉所有权限确认,下一课智能体护栏讲的,就是该在它外面加些什么。
多个智能体共用一个仓库之后,他的 harness 还有几条经验:
#!/bin/bash
while true; do
COMMIT=$(git rev-parse --short=6 HEAD)
LOGFILE="agent_logs/agent_${COMMIT}.log"
claude --dangerously-skip-permissions \
-p "$(cat AGENT_PROMPT.md)" \
--model claude-opus-X-Y &> "$LOGFILE"
done- 智能体认领任务的方式,是往
current_tasks/里写一个文本文件,比如current_tasks/parse_if_statement.txt。如果两个智能体认领了同一项任务,git 的同步会让后到的那个另挑一项。 - 测试输出是写给模型看的。测试 harness 不该打印成千上万字节没用的内容,失败的那一行以 ERROR 开头,原因写在同一行,这样 grep 就能找到。
- 慢的测试集只抽样跑。默认的
--fast选项会随机跑 1% 或 10% 的测试。 - 每个智能体都在一个全新的容器里启动,所以提示词要求它随时更新 README 和进度文件。
什么时候把工作拆给多个智能体
多加智能体,换来的是并行的工作和每个工作者各自干净的上下文,代价是 token。Claude 的研究功能做的就是这笔交易。一个主智能体先规划研究,把计划存进记忆,因为上下文窗口超过 200,000 个 token 就会被截断。然后它启动几个子智能体并行搜索。
每个子智能体把发现交回给主智能体。文章末尾的建议里还说,子智能体可以把工作成果存进外部系统,只交回一个轻量的引用,这样长结果在层层转述中损失更少。在 Anthropic 内部的研究评估里,由 Claude Opus 4 带领 Claude Sonnet 4 子智能体的系统,比单个 Claude Opus 4 智能体高出 90.2%。
token 消耗涨得很快,见下图:Anthropic 说,智能体通常用掉的 token 约是一次对话的 4 倍,多智能体系统约是 15 倍。在 BrowseComp 这项测试浏览智能体能否找到冷僻信息的评估里,光是 token 用量一项,就解释了得分差异的 80%。换作我们,编程任务会先用一个智能体加一套好笔记开始,只有彼此不相干的部分才另派工作者。原因文章里也写了:大多数编程任务里真正能并行的部分比研究少,所有智能体都需要同一份上下文的工作,目前也不适合多智能体系统。
来源:Anthropic Engineering: How we built our multi-agent research system (2026年11月6日 查阅)
为什么每换一代模型,harness 就变小一些
harness 里写着我们对“模型自己做不到什么”的猜测,而新模型会让其中一些猜测过时。Anthropic 的 Labs 团队为要花几个小时才能做完的应用搭了一套三智能体 harness。规划者把一到四句话的提示扩写成完整的需求说明,生成者按功能逐个实现。评估者用 Playwright MCP 服务器在运行中的应用里点来点去,只要有一项评分低于门槛,这一轮冲刺就判为失败。同样一个做 2D 复古游戏制作器的提示,单个智能体跑了 20 分钟,三个智能体齐上的 harness 跑了六个小时。
OpenAI 的 Codex 团队把同样的部件放进了文件,而不是交给多个智能体。在一次运行里,GPT-5.3-Codex 在 Extra High 推理档位上,从一个空仓库开始做一个设计工具,持续了大约 25 小时,用了大约 13M 个 token,写了大约 30k 行代码。它遵循四个 Markdown 文件:一份带 “Done when” 小节的需求说明、一份带验证命令的里程碑计划、一份操作手册和一份状态日志。检查一旦失败,就先修好再往下走。
换模型时,就重新审视你的 harness。一次只拿掉一个部件,在同一批任务上比较结果,怎么衡量可以看 AI 评估课程。
主智能体加并行子智能体
研究功能把一个问题拆给几个上下文干净的工作者。
来源:Anthropic Engineering: How we built our multi-agent research system (2026年11月6日 查阅)
两套提示词,一个 harness
初始化会话准备好功能清单、init.sh 和 git,之后每个编程会话添加一个功能。
来源:Anthropic Engineering: Effective harnesses for long-running agents (2026年11月6日 查阅)
16 个智能体,一个仓库
shell 循环里的智能体用锁文件认领任务,合力写出一个 C 编译器。
来源:Anthropic Engineering: Building a C compiler with a team of parallel Claudes (2026年11月6日 查阅)
部件开始减少
为 Sonnet 4.5 准备的上下文重置,到 Opus 4.5 就去掉了。到 Opus 4.6,冲刺也去掉了,评估改为最后统一做一次。
来源:Anthropic Engineering: Harness design for long-running application development (2026年11月6日 查阅)
Claude Code 的作者怎样让长任务一直跑下去
Boris Cherny 是 Claude Code 的作者,在 Anthropic 做 Claude。2026 年 1 月 2 日,他在 X 上一个讲自己配置的帖子串里,第 12 条列了三种让 Claude 坚持做完长任务的办法,引文见下。第二种最值得搬进你自己的 harness:Claude 想结束时会触发 Stop 钩子,由代码里的检查来决定工作是否真的做完了。
第三种是 ralph-wiggum 插件,他说这个点子最早出自 Geoffrey Huntley,现在它以 ralph-loop 的名字放在 Anthropic 的插件仓库里。
Anthropic 在 2025 年 11 月 26 日发帖介绍那篇 harness 文章,说的正是这一课开头的问题:智能体跨越多个上下文窗口时依然吃力。它的答案借鉴了人类工程师交接班的方式,所以上面的步骤靠的是文件和提交,而不是更聪明的提示词。下面的工作坊来自 AI Engineer 频道,由 Anthropic 的工程师主讲。
我会选下面三种做法之一:(a)在它做完后,提示 Claude 用一个后台智能体来核查自己的工作;(b)用智能体的 Stop 钩子,更确定地做这件事;(c)用 ralph-wiggum 插件

X 官方嵌入卡片的截图,拍摄于 2026-11-06,时间为 UTC。点击截图可到 X 上打开原帖。Boris Cherny 的那条帖子被 X 用“Show more”截短了。
常见错误
- 功能清单还没写,就开始写应用代码。
- 把任务清单放在 Markdown 文件里,任由之后的会话随意改写。
- 代码能编译、curl 返回 200,就把功能标为完成。快速入门要求在界面上截图检查。
- 没有先重跑核心测试就开始新工作,让上一个会话留下的缺陷扩散开。
- 在容器之外跑跳过权限确认的循环。
- 把成千上万行测试输出倒进智能体的上下文,让它自己去读。
- 给一个没什么可并行部分的编程任务加子智能体,白白多付几倍的 token。
自己试一试
- 为一个你熟悉的小应用写一份五项的
feature_list.json,每项的步骤都能在浏览器里照着做。 - 把快速入门的初始化提示词减到十个功能,用
--max-iterations 3运行,每个会话结束后读一读claude-progress.txt和git log。 - 在两个会话之间,亲手把一个已通过的功能弄坏。下一个会话会在开始新工作之前发现它吗?
- 让你的测试程序每个失败只打印一行 ERROR,比较改动前后一次失败的运行占用了多少上下文。
自测一下
为什么第一个会话要在写应用代码之前先写功能清单?
查看答案
A. 这样测试还没通过时,之后的会话就没法宣布完成 每一项的 passes 一开始都是 false,没做完的工作对每个新会话都一目了然。
编程会话在开始一个新功能之前要做什么?
查看答案
C. 读笔记和 git 日志,再重跑一项已通过的核心测试 上一个会话可能弄坏了什么,所以快速入门先检查一个核心功能,修好之后再做新工作。
在那个 C 编译器的 harness 里,16 个智能体中的一个怎样认领任务?
查看答案
B. 往 current_tasks/ 里写一个文本文件 像 current_tasks/parse_if_statement.txt 这样的文件,就是这项任务的锁。
按 Anthropic 那篇研究文章的说法,哪种工作最不适合多智能体系统?
查看答案
D. 每个智能体都需要同一份上下文的编程工作 大多数编程工作可并行的部分比研究少,需要共享同一份上下文的工作目前不适合多智能体系统。
常见问题
什么是长时间运行的智能体?
凡是为一个目标工作得比一个上下文窗口还久的智能体都算。做整个应用的编程智能体是,共用一个仓库的一组智能体也是。每次重启都会抹掉模型的记忆,能留下来的只有文件和提交。
只靠压缩,够不够让智能体做完一个长任务?
不一定够。在 Anthropic 的实验里,一个较早的 Claude 模型即使有压缩也还是会提前收尾,于是团队改用清空上下文加书面交接。磁盘上的文件不受任何重置影响,所以 harness 把状态放在那里。
功能清单该写多少项?
多到每一项都能在一个会话里完成就行。快速入门的数量是按一整个网页应用定的,它的 README 建议做演示时少写很多。智能体在一个上下文窗口里做不完、查不完的项,就再拆开。
进度文件里该写些什么?
这个会话做了什么、完成了哪些测试、发现或修好了哪些问题、下一步该做什么,以及总共有多少测试已经通过。这正是快速入门的编程提示词要求写的内容。
什么是 Ralph Wiggum 循环?
它在智能体每次停下时,把同一个提示词再喂给它一遍,这个点子出自 Geoffrey Huntley。在 Claude Code 里,ralph-loop 插件用 Stop 钩子来做这件事,遇到约定的完成短语就结束。它的 README 要求始终设置 --max-iterations 作为保险。
资料来源
- Anthropic Engineering: Effective harnesses for long-running agents https://www.anthropic.com/research/effective-harnesses-for-long-running-agents
- GitHub: anthropics/claude-quickstarts, autonomous-coding README https://github.com/anthropics/claude-quickstarts/tree/main/autonomous-coding
- GitHub: autonomous-coding initializer prompt https://github.com/anthropics/claude-quickstarts/blob/main/autonomous-coding/prompts/initializer_prompt.md
- GitHub: autonomous-coding coding prompt https://github.com/anthropics/claude-quickstarts/blob/main/autonomous-coding/prompts/coding_prompt.md
- GitHub: autonomous-coding agent.py session loop https://github.com/anthropics/claude-quickstarts/blob/main/autonomous-coding/agent.py
- GitHub: anthropics/claude-agent-sdk-python README https://github.com/anthropics/claude-agent-sdk-python
- Anthropic Engineering: How we built our multi-agent research system https://www.anthropic.com/research/multi-agent-research-system
- Anthropic Engineering: Harness design for long-running application development https://www.anthropic.com/research/harness-design-long-running-apps
- Anthropic Engineering: Building a C compiler with a team of parallel Claudes https://www.anthropic.com/research/building-c-compiler
- Anthropic Research: Measuring AI agent autonomy in practice https://www.anthropic.com/research/measuring-agent-autonomy
- OpenAI Developers: Run long horizon tasks with Codex https://developers.openai.com/blog/run-long-horizon-tasks-with-codex
- GitHub: anthropics/claude-plugins-official, ralph-loop plugin https://github.com/anthropics/claude-plugins-official/tree/main/plugins/ralph-loop
- X: Boris Cherny on long-running tasks https://x.com/bcherny/status/2007179858435281082
- X: Anthropic shares its post on long-running agent harnesses https://x.com/AnthropicAI/status/1993733817849303409
- YouTube (AI Engineer): Anthropic Workshop, Build Agents That Run for Hours https://www.youtube.com/watch?v=mR-WAvEPRwE


