跳到正文
This is Oscar
返回

解析 Agent Harness:核心结构与设计

原文标题:The Anatomy of an Agent Harness
原文链接:https://blog.langchain.com/the-anatomy-of-an-agent-harness/

作者:Vivek Trivedy

TLDR:Agent = Model + Harness。Harness engineering 是我们围绕模型构建系统、把模型变成“工作引擎”的方式。模型提供智能,harness 让这种智能变得有用。我们定义了 harness 是什么,并推导出现今与未来智能体所需的核心组件。

谁能定义一下 “Harness”?

Agent = Model + Harness

如果你不是模型,那你就是 harness。

Harness 是除了模型本身之外的每一段代码、配置和执行逻辑。一个裸模型不是智能体;但当 harness 为它提供状态、工具执行、反馈循环和可强制执行的约束时,它就成为智能体。

具体来说,harness 包括这些内容:

在一个智能体系统里,模型和 harness 之间边界可以有很多种“混乱”的划分方式。但在我看来,这是最清晰的定义,因为它迫使我们去思考:如何围绕模型智能去设计系统。

本文剩余部分会从模型这个核心原语出发,逆向推导 harness 的核心组件,以及为什么每一部分都存在。

从模型视角看:我们为什么需要 Harness

有些事情我们希望智能体完成,但模型开箱即用做不到。这正是 harness 的作用。

模型(大多数情况下)接收文本、图像、音频、视频等数据,然后输出文本。就这些。开箱即用时,它们无法:

这些都属于 harness 层能力。LLM 的结构决定了:要做有用工作,就需要某种将其包裹起来的机制。

例如,要做出“聊天”这样的产品体验,我们会把模型包进一个 while 循环中,跟踪历史消息并追加新的用户消息。读到这里的每个人都已经使用过这种 harness。

核心思想是:把我们期望的智能体行为,转化为 harness 里的实际能力。

从期望行为逆推到 Harness Engineering

Harness Engineering 帮助人类注入有用先验,引导智能体行为。随着模型能力提升,harness 也被用于“外科手术式”扩展和校正模型,以完成此前不可能完成的任务。

我们不会穷举每一种 harness 功能。目标是从“帮助模型做有用工作”这个起点,推导出一组功能。

我们会遵循这样的模式:

我们想要(或想修正)的行为 → 帮助模型实现该行为的 Harness 设计。

用 Filesystem 实现持久存储与上下文管理

我们希望智能体拥有持久存储,以便对接真实数据、卸载装不进上下文的信息,并在会话间持续保存工作。

模型只能直接操作其上下文窗口里的知识。在 filesystem 出现之前,用户必须把内容直接复制粘贴给模型,这种体验笨拙,也不适用于自治智能体。现实世界早就在用 filesystem 工作,模型也在海量 token 上学到了如何使用它们。于是自然的方案是:

Harness 提供 filesystem 抽象和 fs-ops 工具。

Filesystem 可能是最基础的 harness 原语,因为它解锁了很多能力:

Git 为 filesystem 增加版本管理,使智能体能够追踪工作、回滚错误、分支实验。下面我们会再次回到 filesystem,因为它也是其他能力的关键原语。

Bash + 代码:通用工具

我们希望智能体能自治解决问题,而不需要人类预先设计每一个工具。

如今主流智能体执行模式是 ReAct loop:模型推理、通过工具调用采取行动、观察结果、再在 while 循环里重复。但 harness 只能执行它已经具备执行逻辑的工具。与其要求用户为每个可能动作都造工具,不如给智能体一个通用工具,比如 bash。

Harness 提供 bash 工具,让模型通过编写并执行代码来自治解决问题。

Bash + 代码执行,是把“给模型一台电脑”并让它自治解决问题向前推进的一大步。模型可以通过代码即时设计自己的工具,而不是被限制在一组预配置工具里。

Harness 仍会提供其他工具,但代码执行已经成为自治问题求解的默认通用策略。

Sandboxes 与工具:执行并验证工作

智能体需要一个默认配置合理的环境,才能安全行动、观察结果并持续推进。

我们已经给了模型存储与代码执行能力,但这些都必须在某处运行。在本地执行智能体生成代码有风险,单一本地环境也无法支撑大规模智能体负载。

Sandbox 为智能体提供安全运行环境。harness 可以连接 sandbox 来执行代码、检查文件、安装依赖、完成任务,而不是在本地直接执行。这实现了安全、隔离的代码执行。进一步提升安全性时,harness 可以做命令 allow-list 并强制网络隔离。

Sandbox 也带来扩展性:环境可按需创建、并行分发到大量任务,并在工作完成后销毁。

好的环境也应有好的默认工具链。配置这些工具是 harness 的职责,以便智能体能完成有价值工作。这包括预装语言运行时与包、git/testing CLI、以及用于 Web 交互和验证的 browser

browser、logs、screenshots、test runners 等工具,让智能体能够观察与分析自己的工作。这有助于它们形成自验证循环:写代码、跑测试、看日志、修错误。

模型开箱即用时不会配置自己的执行环境。智能体在哪运行、可用哪些工具、可访问什么、如何验证结果,都是 harness 层设计决策。

Memory 与 Search:持续学习

智能体应记住见过的信息,并访问训练时不存在的信息。

模型除参数权重与当前上下文外没有额外知识。在不能编辑模型权重的前提下,唯一“增加知识”的方式是上下文注入。

对 memory 来说,filesystem 再次是核心原语。harness 支持诸如 AGENTS.md 的 memory 文件标准,并在智能体启动时注入上下文。随着智能体新增和编辑该文件,harness 会把更新内容载入上下文。这是一种 continual learning:智能体跨会话持久存储知识,并在后续会话注入这些知识。

知识截止意味着模型无法直接访问新数据(例如库的新版本),除非用户显式提供。要获得最新知识,Web Search 与像 Context7 这样的 MCP 工具可以帮助智能体访问知识截止之后的信息,比如新版本库或训练结束后才出现的实时数据。

Web Search 及查询最新上下文的工具,是适合内建进 harness 的有用原语。

对抗 Context Rot

智能体性能不应随着工作推进而下降。

Context Rot 描述的是:随着上下文窗口被填满,模型推理和完成任务的能力会变差。上下文是稀缺而宝贵的资源,因此 harness 需要管理策略。

今天的 harness 在很大程度上是“优质上下文工程”的交付机制。

Compaction 解决的是:上下文窗口快满时怎么办?如果不 compaction,当会话超出窗口怎么办?一种可能是 API 报错——这显然不好。harness 必须为此制定策略。于是 compaction 会智能卸载并摘要既有上下文,让智能体继续工作。

Tool call offloading 用于降低大型工具输出对上下文的冲击。这些输出可能制造噪声、占据窗口,却不提供有用信息。harness 会在输出超过阈值时仅保留头尾 token,把完整输出卸载到 filesystem,以便模型在需要时读取。

Skills 解决的是:启动时加载过多工具或 MCP server 到上下文,导致还没开始工作性能就下降。Skills 是 harness 层原语,通过渐进式披露来处理这个问题。模型并没有主动要求在启动时加载 Skill front-matter,但 harness 可以这样做,以保护模型免受 context rot 影响。

长时程自治执行

我们希望智能体在长时间范围内自治、正确地完成复杂工作。

自治式软件创建是编码智能体的“圣杯”。但今天的模型仍会早停、难以分解复杂问题,且当工作跨越多个上下文窗口时容易失去连贯性。优秀 harness 必须围绕这些问题进行设计。

此处,前面介绍的 harness 原语开始叠加。长时程工作需要持久状态、规划、观测和验证,才能跨多个上下文窗口继续推进。

使用 filesystem 和 git 跨会话追踪工作。智能体在长任务中会生成数百万 token,filesystem 可以持久捕获工作并追踪长期进度。加入 git 后,新智能体可以快速了解最新工作与项目历史。对于多智能体协作,filesystem 还是共享工作账本。

使用 Ralph Loops 持续推进工作。Ralph Loop 是一种 harness 模式:通过 hook 拦截模型的退出尝试,并在干净上下文窗口里重新注入原始提示,迫使智能体围绕完成目标继续工作。filesystem 让这成为可能,因为每轮迭代都能在新上下文中读取上一轮状态。

规划与自验证用于保持方向。规划是模型把目标拆解成步骤序列。harness 通过更好的提示,以及注入“如何使用 filesystem 中 plan 文件”的提醒来支持规划。每完成一步后,智能体可通过自验证检查正确性。harness 中的 hooks 可运行预定义测试套件,并在失败时把错误消息回传给模型形成循环;也可以提示模型独立自评代码。验证将解法锚定在测试上,并提供自改进反馈信号。

Harness 的未来

模型训练与 Harness 设计的耦合

今天的智能体产品,如 Claude Code 与 Codex,都是在模型和 harness 联动中后训练出来的。这帮助模型提升在 harness 设计者认为其应原生擅长的行为上表现,例如 filesystem 操作、bash 执行、规划、或通过 subagents 并行化工作。

这会形成一个反馈循环:有用原语被发现、加入 harness,再用于训练下一代模型。随着循环重复,模型在其训练所处 harness 中会变得更强。

但这种共同进化对泛化有有趣副作用。一个体现是:改变工具逻辑会导致模型性能变差。一个很好的例子是 Codex-5.3 prompting guide 中提到的 apply_patch 文件编辑逻辑。真正智能的模型本应能轻松在不同 patch 方法间切换,但联动训练会造成这种过拟合。

这并不意味着:最适合你任务的 harness 一定是模型后训练时使用的那个。Terminal Bench 2.0 Leaderboard 就是例子。Claude Code 中的 Opus 4.6 分数,明显低于它在其他 harness 里的分数。在 之前一篇博客 中,我们展示了:只改 harness,就把我们的 coding agent 从 Terminal Bench 2.0 Top 30 提升到 Top 5。针对任务优化 harness 仍有巨大空间。

Harness Engineering 正在走向何方

随着模型越来越强,今天 harness 承担的一部分能力会被模型吸收。模型会原生地更擅长规划、自验证、长时程连贯性,例如需要更少上下文注入。

这似乎意味着 harness 随时间会变得不那么重要。但正如 prompt engineering 到今天仍有价值,harness engineering 很可能也会继续对构建优秀智能体有用。

确实,今天的 harness 在弥补模型短板;但它们也在围绕模型智能做系统工程,使模型更高效。配置良好的环境、合适工具、持久状态与验证循环,不论模型基础智能如何,都会提升效率。

Harness engineering 是一个非常活跃的研究方向,我们也用它来改进 LangChain 的 harness 构建库 deepagents。下面是我们目前在探索的一些开放且有趣的问题:

这篇博客是一次关于 harness 定义及其如何被“我们希望模型完成的工作”所塑造的练习。

模型承载智能,harness 是让这种智能变得有用的系统。

为更多 harness 构建、更好的系统、以及更好的智能体。

引用


分享到:

上一篇
设计可抵御 Prompt Injection 的 AI Agent
下一篇
自主式 Context Compression:上下文压缩实践