Mindket

长时间运行的智能体:让一个任务跨越多个会话持续推进

黑色横幅,标题是“Harness 工程”,下面是“智能体外围的循环、工具与护栏”。

长时间运行的智能体,是在一个任务上跨越多个上下文窗口工作的智能体,每个新会话开始时都不记得上一个会话做过什么。状态由 harness 保存:一份需求说明、一份每项带通过标记的功能清单、一个进度文件和 git 历史。每个会话先读这些文件,完成一个功能,做端到端检查,提交代码,再更新笔记。

本节内容

  • 动手写代码之前,先把整件工作拆成一条条可以检查的项目。
  • 每个新会话先读笔记、重跑一项核心测试,再碰新的工作。
  • 交给脚本去重启智能体,并给并行的智能体一个认领任务的文件。
  • 只在工作能干净拆开的地方加智能体,因为多智能体系统用掉的 token 约是一次对话的 15 倍。
全部课程
本页目录
  1. 智能体一连跑几个小时,会在哪里出问题
  2. 开始之前
  3. 布置第一个会话:需求说明、功能清单、初始化脚本和 git
  4. 之后的每个会话,都用同一套开场
  5. 用一个循环重启智能体
  6. 什么时候把工作拆给多个智能体
  7. 为什么每换一代模型,harness 就变小一些
  8. Claude Code 的作者怎样让长任务一直跑下去
  9. 常见错误
  10. 自己试一试
  11. 自测一下
  12. 常见问题
  13. 资料来源

智能体一连跑几个小时,会在哪里出问题

让一个编程智能体去做一个 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
  }
]
  1. 把需求说明放进 app_spec.txt,并让初始化智能体先读它。
  2. 让它根据需求说明写出 feature_list.json。快速入门要求写 200 个测试,按优先级排列,短的检查和十步以上的长测试都要有。它的 README 建议,想快点看到演示效果,可以减到 20 到 50 个。
  3. 用明确的话禁止修改清单。提示词用全大写写着,删除或修改功能是灾难性的,之后的会话只能改 passes 这一个字段。
  4. 让它写出 init.sh,负责安装依赖、启动开发服务器,这样之后的会话不必再花上下文去摸索怎么运行应用。
  5. 把清单、脚本和一份 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
出自 Anthropic 那篇长任务 harness 文章里的失败对照表,2026 年 11 月 6 日阅读。
出了什么问题第一个会话准备什么之后每个会话做什么
智能体宣布整个项目已完成根据需求说明写出的功能清单读清单,挑一个未通过的功能
缺陷和没记下的进展被带进下一轮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%。换作我们,编程任务会先用一个智能体加一套好笔记开始,只有彼此不相干的部分才另派工作者。原因文章里也写了:大多数编程任务里真正能并行的部分比研究少,所有智能体都需要同一份上下文的工作,目前也不适合多智能体系统。

一个任务用掉的 token,以一次对话为基准Anthropic 针对自家系统给出的大致倍数。
  • 一次对话1×
  • 一个智能体4×
  • 一个多智能体系统15×

来源: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 的长任务 harness 是怎么变的
  1. 主智能体加并行子智能体

    研究功能把一个问题拆给几个上下文干净的工作者。

    来源:Anthropic Engineering: How we built our multi-agent research system (2026年11月6日 查阅)

  2. 两套提示词,一个 harness

    初始化会话准备好功能清单、init.sh 和 git,之后每个编程会话添加一个功能。

    来源:Anthropic Engineering: Effective harnesses for long-running agents (2026年11月6日 查阅)

  3. 16 个智能体,一个仓库

    shell 循环里的智能体用锁文件认领任务,合力写出一个 C 编译器。

    来源:Anthropic Engineering: Building a C compiler with a team of parallel Claudes (2026年11月6日 查阅)

  4. 部件开始减少

    为 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 插件

Boris Cherny, Claude Code 作者,在 Anthropic 做 Claude,引文为译文 · X (2026年11月6日 查阅)
Boris Cherny(@bcherny)2026 年 1 月 2 日在 X 上的配置串第 12 条:遇到特别长的任务,他会在做完后让 Claude 用后台智能体核查自己的工作,或者用智能体 Stop 钩子更确定地做这件事,或者用最早由 Geoffrey Huntley 想出的 ralph-wiggum 插件。
Boris Cherny 在 X 上,2026 年 1 月 2 日
Anthropic(@AnthropicAI)2025 年 11 月 26 日在 X 上发帖:Anthropic 工程博客新文章。长时间运行的 AI 智能体在跨越多个上下文窗口工作时依然面临挑战,我们从人类工程师身上找灵感,做出了更有效的智能体 harness。
Anthropic 在 X 上,2025 年 11 月 26 日
AI Engineer 的 YouTube 频道上,Ash Prabaker 和 Andrew Wilson 主讲的 Anthropic 工作坊,标题是 Build Agents That Run for Hours。

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,比较改动前后一次失败的运行占用了多少上下文。

自测一下

  1. 为什么第一个会话要在写应用代码之前先写功能清单?

    查看答案

    A. 这样测试还没通过时,之后的会话就没法宣布完成 每一项的 passes 一开始都是 false,没做完的工作对每个新会话都一目了然。

  2. 编程会话在开始一个新功能之前要做什么?

    查看答案

    C. 读笔记和 git 日志,再重跑一项已通过的核心测试 上一个会话可能弄坏了什么,所以快速入门先检查一个核心功能,修好之后再做新工作。

  3. 在那个 C 编译器的 harness 里,16 个智能体中的一个怎样认领任务?

    查看答案

    B. 往 current_tasks/ 里写一个文本文件 像 current_tasks/parse_if_statement.txt 这样的文件,就是这项任务的锁。

  4. 按 Anthropic 那篇研究文章的说法,哪种工作最不适合多智能体系统?

    查看答案

    D. 每个智能体都需要同一份上下文的编程工作 大多数编程工作可并行的部分比研究少,需要共享同一份上下文的工作目前不适合多智能体系统。

常见问题

什么是长时间运行的智能体?

凡是为一个目标工作得比一个上下文窗口还久的智能体都算。做整个应用的编程智能体是,共用一个仓库的一组智能体也是。每次重启都会抹掉模型的记忆,能留下来的只有文件和提交。

只靠压缩,够不够让智能体做完一个长任务?

不一定够。在 Anthropic 的实验里,一个较早的 Claude 模型即使有压缩也还是会提前收尾,于是团队改用清空上下文加书面交接。磁盘上的文件不受任何重置影响,所以 harness 把状态放在那里。

功能清单该写多少项?

多到每一项都能在一个会话里完成就行。快速入门的数量是按一整个网页应用定的,它的 README 建议做演示时少写很多。智能体在一个上下文窗口里做不完、查不完的项,就再拆开。

进度文件里该写些什么?

这个会话做了什么、完成了哪些测试、发现或修好了哪些问题、下一步该做什么,以及总共有多少测试已经通过。这正是快速入门的编程提示词要求写的内容。

什么是 Ralph Wiggum 循环?

它在智能体每次停下时,把同一个提示词再喂给它一遍,这个点子出自 Geoffrey Huntley。在 Claude Code 里,ralph-loop 插件用 Stop 钩子来做这件事,遇到约定的完成短语就结束。它的 README 要求始终设置 --max-iterations 作为保险。

资料来源

  1. Anthropic Engineering: Effective harnesses for long-running agents (2026年11月6日 查阅)https://www.anthropic.com/research/effective-harnesses-for-long-running-agents
  2. GitHub: anthropics/claude-quickstarts, autonomous-coding README (2026年11月6日 查阅)https://github.com/anthropics/claude-quickstarts/tree/main/autonomous-coding
  3. GitHub: autonomous-coding initializer prompt (2026年11月6日 查阅)https://github.com/anthropics/claude-quickstarts/blob/main/autonomous-coding/prompts/initializer_prompt.md
  4. GitHub: autonomous-coding coding prompt (2026年11月6日 查阅)https://github.com/anthropics/claude-quickstarts/blob/main/autonomous-coding/prompts/coding_prompt.md
  5. GitHub: autonomous-coding agent.py session loop (2026年11月6日 查阅)https://github.com/anthropics/claude-quickstarts/blob/main/autonomous-coding/agent.py
  6. GitHub: anthropics/claude-agent-sdk-python README (2026年11月6日 查阅)https://github.com/anthropics/claude-agent-sdk-python
  7. Anthropic Engineering: How we built our multi-agent research system (2026年11月6日 查阅)https://www.anthropic.com/research/multi-agent-research-system
  8. Anthropic Engineering: Harness design for long-running application development (2026年11月6日 查阅)https://www.anthropic.com/research/harness-design-long-running-apps
  9. Anthropic Engineering: Building a C compiler with a team of parallel Claudes (2026年11月6日 查阅)https://www.anthropic.com/research/building-c-compiler
  10. Anthropic Research: Measuring AI agent autonomy in practice (2026年11月6日 查阅)https://www.anthropic.com/research/measuring-agent-autonomy
  11. OpenAI Developers: Run long horizon tasks with Codex (2026年11月6日 查阅)https://developers.openai.com/blog/run-long-horizon-tasks-with-codex
  12. GitHub: anthropics/claude-plugins-official, ralph-loop plugin (2026年11月6日 查阅)https://github.com/anthropics/claude-plugins-official/tree/main/plugins/ralph-loop
  13. X: Boris Cherny on long-running tasks (2026年11月6日 查阅)https://x.com/bcherny/status/2007179858435281082
  14. X: Anthropic shares its post on long-running agent harnesses (2026年11月6日 查阅)https://x.com/AnthropicAI/status/1993733817849303409
  15. YouTube (AI Engineer): Anthropic Workshop, Build Agents That Run for Hours (2026年11月6日 查阅)https://www.youtube.com/watch?v=mR-WAvEPRwE

分享本节课

看看为长任务做的智能体

在自己搭 harness 之前,先浏览 Mindket 上架的 AI 智能体和它们的设置说明。

浏览 AI 智能体

本节课的 Markdown 版本 · Harness 工程:搭建 AI 智能体外围的代码 · 全部课程