Anthropic、OpenAI、Perplexity 和 LangChain 到底在构建什么它涉及编排循环、工具、记忆、上下文管理以及一切把“无状态 LLM”变成“可用 Agent”的基础设施。你可能已经做过一个聊天机器人。也许你还接过几个工具跑了一个 ReAct 循环。Demo 看起来很顺演示时也能工作。可是一旦你想把它做成生产级系统问题马上就来了模型忘了三步前自己做过什么工具调用悄悄失败上下文窗口里塞满了没用的信息。问题不一定出在模型上。真正的问题往往出在模型周围的那一整套东西上。LangChain 就证明过这一点他们没有换模型也没有改权重只是调整了包裹 LLM 的基础设施结果在 TerminalBench 2.0 上从前 30 名之外直接冲到了第 5 名。另一个独立研究项目则让 LLM 自己优化基础设施最终达到了 76.4% 的通过率甚至超过了人工设计的系统。现在这套基础设施有了一个名字Agent Harness。分享一个正版GPT5.5 目前 0.2 倍率, 关注公众号后在后台回复airealy 即可自动获取兑换码及使用方式。什么是 Agent Harness这个术语是在 2026 年初被正式提出的但它对应的概念其实早就存在了。所谓 Harness就是包裹在 LLM 外围的完整软件基础设施编排循环、工具、记忆、上下文管理、状态持久化、错误处理和安全护栏。Anthropic 在 Claude Code 文档里说得很直接SDK 就是“驱动 Claude Code 的 agent harness”。OpenAI 的 Codex 团队也使用了类似说法他们明确把“agent”和“harness”放在同一个语境里用来指代那些让 LLM 真正可用的非模型基础设施。我很喜欢 LangChain 的 Vivek Trivedy 给出的那句经典定义如果你不是模型那你就是 harness。这里最容易让人混淆的是“Agent”和“Harness”不是一回事。Agent 是用户感知到的行为一个有目标、会调用工具、能自我修正的智能体。Harness 则是制造这种行为的机器。也就是说当一个人说“我做了一个 Agent”更准确地讲他其实是做了一套 Harness然后把它接到了一个模型上。Beren Millidge 在 2023 年的文章《Scaffolded LLMs as Natural Language Computers》中把这个类比讲得非常精准。一个原始 LLM 就像一颗 CPU没有内存没有磁盘也没有输入输出能力。上下文窗口像 RAM速度快但容量有限外部数据库像磁盘容量大但访问更慢工具集成像设备驱动而 Harness就是操作系统。正如 Millidge 所说“我们重新发明了冯·诺依曼架构。”因为对于任何计算系统来说这都是一种非常自然的抽象方式。三层工程能力围绕模型实际上有三层同心圆式的工程能力。第一层是 Prompt Engineering也就是提示词工程。它负责设计模型接收到的指令。第二层是 Context Engineering也就是上下文工程。它负责管理模型什么时候看到什么内容。第三层是 Harness Engineering也就是 Harness 工程。它包含前两者但远不止于此。它还包括工具编排、状态持久化、错误恢复、验证循环、安全执行和生命周期管理。所以Harness 不是一个包在 prompt 外面的薄壳。它是让自主 Agent 行为真正发生的完整系统。生产级 Harness 的 12 个组件综合 Anthropic、OpenAI、LangChain 以及大量实践者社区的经验来看一个生产级 Agent Harness 通常包含 12 个关键组件。我们一个个看。1. 编排循环这是整个系统的心跳。它实现的是 Thought-Action-Observation也就是 TAO 循环也经常被叫作 ReAct 循环。循环过程大概是组装 prompt调用 LLM解析输出执行工具调用把结果塞回上下文然后继续重复直到任务完成。从机械实现上看它往往只是一个 while 循环。真正复杂的地方不在循环本身而在这个循环要管理的所有东西。Anthropic 把自己的运行时描述为一个“dumb loop”。意思是Harness 本身不负责聪明所有智能都在模型里Harness 只负责管理回合。2. 工具工具是 Agent 的手。工具通常会以 schema 的形式定义包括名称、描述、参数类型然后被注入到 LLM 的上下文里让模型知道自己能用什么能力。工具层要负责的事情很多注册工具、校验 schema、提取参数、沙箱执行、捕获结果并把执行结果格式化成 LLM 能理解的 observation。Claude Code 提供了六类工具文件操作、搜索、执行、Web 访问、代码智能以及子 Agent 创建。OpenAI 的 Agents SDK 支持 function tools、hosted tools比如 WebSearch、CodeInterpreter、FileSearch也支持 MCP server tools。3. 记忆记忆不是一个单点能力而是分时间尺度运行的。短期记忆就是单次会话中的对话历史。长期记忆则跨会话保存。Anthropic 使用 CLAUDE.md 项目文件和自动生成的 MEMORY.md 文件LangGraph 使用按命名空间组织的 JSON StoresOpenAI 支持基于 SQLite 或 Redis 的 Sessions。Claude Code 还实现了三层记忆结构第一层是轻量索引每条大约 150 个字符会一直加载第二层是按需拉取的详细主题文件第三层是原始 transcript只能通过搜索访问。这里有一个非常关键的设计原则Agent 会把自己的记忆当作“提示”而不是绝对事实。行动之前它仍然要去验证真实状态。4. 上下文管理很多 Agent 都是在这里悄悄失败的。核心问题叫 context rot也就是上下文腐烂。当关键信息落在上下文窗口中间位置时模型表现会下降 30% 以上。Chroma 的研究指出了这一点Stanford 的 “Lost in the Middle” 也给出了类似结论。即使上下文窗口扩大到百万 token随着内容变长模型的指令遵循能力依然会变差。生产系统常用的策略包括Compaction也就是压缩。当上下文接近限制时总结历史对话。Claude Code 会保留架构决策和未解决 bug同时丢掉重复的工具输出。Observation masking也就是观察结果遮罩。JetBrains 的 Junie 会隐藏旧工具输出但保留工具调用记录。Just-in-time retrieval也就是即时检索。系统保留轻量标识符需要时动态加载数据。Claude Code 会使用 grep、glob、head、tail而不是把完整文件直接塞进上下文。Sub-agent delegation也就是子 Agent 委托。每个子 Agent 可以广泛探索但最后只返回 1000 到 2000 token 的压缩摘要。Anthropic 的上下文工程指南说得很清楚目标是找到尽可能小、但信号密度最高的一组 token让模型最有可能完成你想要的结果。5. Prompt 构造Prompt 构造决定了模型在每一步到底能看到什么。它通常是分层的system prompt、工具定义、记忆文件、对话历史以及当前用户消息。OpenAI 的 Codex 使用非常严格的优先级栈最高优先级是服务端控制的 system message其次是工具定义然后是 developer instructions再往下是 user instructions包括级联的 AGENTS.md 文件限制为 32 KiB最后才是对话历史。6. 输出解析现代 Harness 越来越依赖原生 tool calling。也就是说模型不再输出一段需要你从文本里硬解析的内容而是直接返回结构化的 tool_calls 对象。Harness 只需要判断有没有工具调用有就执行并继续循环没有那就是最终答案。对于结构化输出OpenAI 和 LangChain 都支持通过 Pydantic models 做 schema 约束响应。当然一些传统方法仍然存在。比如 RetryWithErrorOutputParser会把原始 prompt、失败输出和解析错误重新喂给模型让它自己修正。这类方法在边缘场景里仍然有价值。7. 状态管理LangGraph 把状态建模为 typed dictionaries让它们在图节点之间流动并通过 reducers 合并更新。Checkpoint 会发生在 super-step 边界这让系统可以在中断后恢复也能做 time-travel debugging。OpenAI 提供了四种互斥策略应用内存、SDK sessions、服务端 Conversations API或者轻量级 previous_response_id 链接。Claude Code 则走了另一条路用 git commits 作为 checkpoint用 progress files 作为结构化草稿纸。8. 错误处理为什么错误处理这么重要因为一个 10 步流程如果每一步成功率都是 99%端到端成功率也只有大约 90.4%。错误会叠得很快。LangGraph 把错误分成四类 transient也就是暂时性错误可以用 backoff 重试 LLM-recoverable也就是模型可恢复错误可以作为 ToolMessage 返回给模型让它调整 user-fixable也就是需要用户修正的错误可以中断等待人工输入 unexpected也就是未知错误应该向上抛出方便调试。Anthropic 会在工具处理器内部捕获失败并把它们作为错误结果返回从而让循环继续跑下去。Stripe 的生产 Harness 则把重试次数限制在两次。9. 护栏与安全OpenAI 的 SDK 实现了三层护栏input guardrails、output guardrails 和 tool guardrails。input guardrails 会在第一个 Agent 上运行output guardrails 会在最终输出时运行tool guardrails 则会在每次工具调用时运行。其中还有一个 tripwire 机制一旦触发Agent 会立刻停止。Anthropic 在架构上把权限执行和模型推理分开。模型决定自己想做什么但工具系统决定它被不被允许做。Claude Code 会对大约 40 个离散工具能力单独设限并分成三个阶段项目加载时建立信任每次工具调用前做权限检查对高风险操作要求用户明确确认。10. 验证循环这就是玩具 Demo 和生产 Agent 的分水岭。Anthropic 推荐三类验证方式。第一类是基于规则的反馈比如测试、lint、类型检查。第二类是视觉反馈比如通过 Playwright 截图来验证 UI 任务。第三类是 LLM-as-judge也就是让另一个子 Agent 来评估输出。Claude Code 的创造者 Boris Cherny 提到过给模型一种验证自己工作的方式质量通常能提升 2 到 3 倍。11. 子 Agent 编排Claude Code 支持三种执行模型。第一种是 Fork它会复制一份和父上下文字节级一致的上下文。第二种是 Teammate它在独立终端 pane 中运行并通过基于文件的 mailbox 进行通信。第三种是 Worktree它拥有自己的 git worktree每个 Agent 有隔离分支。OpenAI 的 SDK 支持 agents-as-tools也就是让专家 Agent 处理边界明确的子任务也支持 handoffs也就是把控制权完整交给专家 Agent。LangGraph 则把子 Agent 实现为嵌套状态图。循环如何真正运转知道组件还不够。我们还要看它们在一次真实循环里是怎么配合的。Step 1Prompt 组装Harness 会构造完整输入system prompt、工具 schema、记忆文件、对话历史以及当前用户消息。重要上下文通常会被放在 prompt 的开头和结尾以避开 “Lost in the Middle” 问题。Step 2LLM 推理组装好的 prompt 被发送到模型 API。模型生成输出 token可能是普通文本也可能是工具调用请求或者两者都有。Step 3输出分类如果模型只生成文本没有工具调用循环结束。如果模型请求工具调用就进入执行阶段。如果模型请求 handoff就更新当前 Agent然后重新开始循环。Step 4工具执行对于每一个工具调用Harness 会校验参数、检查权限、在沙箱环境中执行并捕获结果。只读操作可以并发执行会修改状态的操作则通常需要串行执行。Step 5结果打包工具结果会被格式化成 LLM 可读的消息。错误会被捕获并作为错误结果返回给模型让模型有机会自我修正。Step 6上下文更新结果会被追加到对话历史里。如果系统接近上下文窗口限制Harness 就会触发压缩。Step 7回到循环然后回到 Step 1。如此反复直到满足终止条件。终止条件通常是多层的模型输出了没有工具调用的回答超过最大轮数token 预算耗尽护栏 tripwire 被触发用户中断或者系统返回安全拒绝。一个简单问题可能只需要 1 到 2 轮。一个复杂重构任务可能会跨越很多轮串起几十次工具调用。对于跨多个上下文窗口的长任务Anthropic 设计了一种两阶段的 “Ralph Loop” 模式。第一阶段由 Initializer Agent 设置环境包括 init script、progress file、feature list 和初始 git commit。第二阶段在后续每个 session 中Coding Agent 会读取 git logs 和 progress files 来重新定位自己选择最高优先级的未完成 feature开始工作提交代码并写下总结。在这种设计里文件系统提供了跨上下文窗口的连续性。真实框架如何实现这套模式Anthropic 的 Claude Agent SDK 通过一个 query() 函数暴露 Harness。这个函数会创建 agentic loop并返回一个异步迭代器用于流式输出消息。它的运行时本质上是一个 “dumb loop”。所有智能都在模型里。Claude Code 使用 Gather-Act-Verify 循环先收集上下文搜索文件、阅读代码再采取行动编辑文件、运行命令最后验证结果跑测试、检查输出然后继续重复。OpenAI 的 Agents SDK 则通过 Runner class 实现 Harness并提供三种模式async、sync 和 streamed。这个 SDK 是 code-first 的工作流逻辑用原生 Python 表达而不是依赖图 DSL。Codex Harness 在此基础上扩展出了三层架构Codex Core也就是 Agent 代码和运行时App Server也就是双向 JSON-RPC API以及客户端界面包括 CLI、VS Code 和 Web App。所有界面共享同一套 Harness所以“Codex 模型在 Codex 界面上比普通聊天窗口更好用”并不是错觉。LangGraph 把 Harness 建模成显式状态图。两个节点llm_call 和 tool_node。它们之间通过条件边连接如果存在工具调用就路由到 tool_node如果没有就进入 END。LangGraph 是从 LangChain 的 AgentExecutor 演进而来的。AgentExecutor 在 v0.2 中被弃用因为它很难扩展也缺少多 Agent 支持。LangChain 的 Deep Agents 明确使用了 “agent harness” 这个术语并内置了工具、规划能力也就是 write_todos tool、用于上下文管理的文件系统、子 Agent 创建能力和持久记忆。CrewAI 实现的是基于角色的多 Agent 架构Agent 是包裹 LLM 的 Harness由角色、目标、背景故事和工具定义Task 是工作单元Crew 是 Agent 集合。CrewAI 的 Flows 层则增加了一个“确定性骨架”只在关键位置加入智能用来管理路由和验证而 Crews 则负责自主协作。AutoGen也就是后来逐渐演进为 Microsoft Agent Framework 的系统最早推动了对话驱动的编排方式。它的三层架构包括 Core、AgentChat 和 Extensions支持五种编排模式顺序、并发也就是 fan-out/fan-in、群聊、handoff以及 magentic也就是由一个 manager agent 维护动态任务账本协调多个专家。脚手架这个比喻不是随便说的Scaffolding也就是脚手架这个比喻并不是装饰性的而是非常精确。建筑脚手架是一种临时基础设施它能让工人够到原本够不到的位置从而建造更高的结构。它本身不负责盖楼但没有它工人根本上不了高层。关键点在于当建筑完成后脚手架会被拆掉。模型也是一样。随着模型变强Harness 的复杂度应该下降。Manus 在六个月里重构了五次每一次重写都在移除复杂性。复杂的工具定义被通用 shell execution 替代“管理 Agent” 被更简单的结构化 handoff 替代。这指向一个共同进化原则模型现在会在特定 Harness 中被后训练。Claude Code 的模型学会了使用它训练时配套的那套 Harness。也因此随便更换工具实现反而可能让性能下降因为模型和 Harness 已经高度耦合。一个 Harness 设计是否面向未来可以用这个测试判断当模型能力增强时如果系统性能也随之提升而不需要继续增加 Harness 复杂度那这个设计就是健康的。定义每个 Harness 的七个决策每个 Harness 架构师都会面对七个选择。单 Agent 还是多 AgentAnthropic 和 OpenAI 都建议先把单 Agent 做到极致。多 Agent 系统会带来额外开销比如更多 LLM 调用用于路由handoff 时还可能丢失上下文。只有当工具过载比如超过大约 10 个相互重叠的工具或者任务领域确实清晰分离时才值得拆成多 Agent。ReAct 还是 Plan-and-ExecuteReAct 会在每一步交错执行推理和行动。它很灵活但每一步成本更高。Plan-and-Execute 则把规划和执行分开。LLMCompiler 报告称相比顺序 ReAct它实现了 3.6 倍提速。上下文窗口如何管理生产环境里常见五种方式按时间清理、对话总结、observation masking、结构化笔记以及子 Agent 委托。ACON 研究显示通过优先保留推理轨迹而不是原始工具输出可以减少 26% 到 54% 的 token同时保持 95% 以上准确率。验证循环怎么设计计算型验证比如测试、lint可以提供确定性的事实依据。推理型验证比如 LLM-as-judge可以发现语义问题但会增加延迟。Martin Fowler 的 Thoughtworks 团队把它分成两类guides 和 sensors。guides 是前馈控制在行动前引导模型sensors 是反馈控制在行动后观察结果。权限和安全架构怎么取舍一种是宽松模式速度快但风险更高很多操作会自动批准。另一种是严格模式更安全但更慢每一步都可能需要用户确认。这个选择取决于系统部署的上下文。工具范围怎么控制工具越多表现不一定越好甚至经常更差。Vercel 从 v0 中移除了 80% 的工具结果表现反而更好了。Claude Code 通过 lazy loading 实现了 95% 的上下文减少。核心原则很简单当前步骤需要什么就暴露什么。不要把整个工具箱都塞给模型。Harness 应该多厚也就是多少逻辑放在 Harness 里多少交给模型。Anthropic 押注薄 Harness 和模型能力提升。图式框架则押注明确控制。Anthropic 会随着新模型版本内化某些能力不断从 Claude Code 的 Harness 中删除规划步骤。Harness 才是真正的产品两个产品即使用完全相同的模型也可能因为 Harness 设计不同表现天差地别。TerminalBench 的证据已经很清楚只改 Harness就能让 Agent 排名移动 20 多个位置。所以Harness 不是一个已经被解决的问题也不是一个普通商品层。真正难的工程都在这里把上下文当成稀缺资源来管理设计验证循环在错误叠加之前把它抓出来构建记忆系统让系统既有连续性又不靠幻觉行动同时还要做架构取舍决定哪些脚手架应该搭起来哪些能力应该留给模型。随着模型变强整个行业确实在走向更薄的 Harness。但 Harness 本身不会消失。哪怕最强的模型也仍然需要有东西来管理它的上下文窗口执行它的工具调用持久化它的状态并验证它的工作结果。所以下次你的 Agent 失败时先别急着怪模型。去看看 Harness。最后精通 React 面试从零到中高级(针对面试回答)CSS终极指南Vue 设计模式实战指南20个前端开发者必备的响应式布局深入React:从基础到最佳实践完整攻略python 技巧精讲React Hook 深入浅出CSS技巧与案例详解vue2与vue3技巧合集