Agent = Model + Harness:深入剖析 Harness 的设计与未来

Agent并非只有模型!本文剖析Harness在Agent系统中的关键作用,以及如何利用Harness实现Agent的持久化、自主性和安全性。探索Harness的设计理念与未来趋势。

原文标题:Agent = Model + Harness!一文讲透 Harness 的设计与未来!

原文作者:图灵编辑部

冷月清谈:

本文深入探讨了 Agent Harness 的概念,指出 Harness 是所有不属于模型本身的代码、配置和执行逻辑的总和。文章从模型的基本功能出发,论述了 Harness 的必要性,因为它为模型提供了持久状态、工具调用、反馈循环和可执行约束等重要能力。通过分析文件系统、Bash、代码执行、沙箱等关键组件,解释了 Harness 如何帮助 Agent 实现持久存储、上下文管理、问题自主解决、安全执行、持续学习以及对抗上下文退化。文章还展望了 Harness 的未来,强调模型训练与 Harness 设计的耦合趋势,并指出 Harness 工程将长期存在,因为它不仅弥补了模型的不足,更是在围绕模型智能构建完整的系统。

怜星夜思:

1、文章提到Harness可以提供文件系统抽象,实现Agent的持久化存储和跨会话状态维持。那么,在实际应用中,如何设计一个高效的文件系统,才能更好地服务于Agent,避免成为性能瓶颈?
2、文章中提到Harness可以通过提供Bash和代码执行能力,让Agent自主解决问题。但是,如果Agent生成的代码存在安全漏洞,Harness应该如何应对?
3、文章提到了Context Rot(上下文退化)问题,以及Harness如何通过上下文压缩等方式来缓解。那么,除了文章中提到的方法,还有没有其他更有效的方式来解决Context Rot问题,提高Agent的长期性能?

原文内容

Harness 工程就是围绕模型构建系统,把它变成可以实际工作的引擎。模型本身提供智能,而 Harness 让这种智能变得可用。本文会先定义什么是 Harness,再从模型这一基本出发点,推导出现阶段以及未来 Agent 所需要的核心组成。

01

有没有人能把 Harness 说清楚?

Agent = Model + Harness。如果你不是在训练模型,那么你做的大多属于 Harness 的范畴。

所谓 Harness,是指:“即所有不属于模型本身的代码、配置以及执行逻辑。”

一个裸模型并不能算作 Agent;只有当 Harness 为其提供状态管理、工具调用能力、反馈循环以及可执行约束时,它才真正成为一个 Agent。

更具体地说,Harness 通常包括:系统提示词、工具与技能(以及 MCP)及其说明、封装好的基础设施(如文件系统、沙箱、浏览器)、编排逻辑(例如子 Agent 的生成与交接、模型路由),以及用于保证执行稳定性的 Hook(钩子机制)或中间件(如上下文压缩、续写机制、Lint 检查等)。

在实际系统中,模型与 Harness 的边界可以有多种划分方式,而且往往并不清晰。但从工程视角来看,这样的定义最具区分性,因为它迫使我们从“如何围绕模型智能设计系统”的角度来思考问题。

接下来,我们将从模型这一最基础的抽象出发,逐步推导这些 Harness 组件为什么存在。

02

为什么需要 Harness?

我们希望 Agent 能做到的许多事情,模型本身其实并不具备,这正是 Harness 存在的意义。

在大多数情况下,模型接收文本、图像、音频、视频等输入,然后输出文本(或结构化调用结果),仅此而已。默认情况下,它无法:

  • 在多次交互之间维持持久状态
  • 执行代码
  • 获取实时信息
  • 搭建运行环境并安装依赖

这些能力全部属于 Harness 层。LLM 的结构决定了,必须有一层外部机制包裹它,才能让它真正参与实际工作。

举个简单的例子,为了实现聊天这种产品体验,我们通常会使用一个 while 循环来维护历史消息,并不断追加新的用户输入。几乎所有人都已经用过这种形式的 Harness。本质上,我们所做的,就是将期望的 Agent 行为转化为 Harness 中的具体实现。

03

从目标行为反推 Harness 设计

Harness 工程的作用,是帮助人类注入有效的先验,从而引导 Agent 的行为。随着模型能力的提升,Harness 也逐渐被用来以更精细的方式扩展或修正模型,使其能够完成过去难以完成的任务。

我们不尝试穷举所有可能的 Harness 功能。这里的目标是,从“让模型能够完成实际工作”这一出发点,推导出一组关键能力。基本思路是:

我们想要(或需要修正)的行为 → 对应的 Harness 设计。

04

用文件系统实现持久存储与上下文管理

我们希望 Agent 拥有持久化存储能力,用来处理真实数据、转移无法容纳在上下文中的信息,并在不同会话之间延续工作。

但模型只能直接处理其上下文窗口中的信息。在引入文件系统之前,用户只能通过复制粘贴的方式将内容提供给模型,这既低效,也不适用于自动化 Agent。

现实世界本身就是通过文件系统来组织工作的,而模型在训练中也学习了这种模式。因此,一个自然的解决方案是:由 Harness 提供文件系统抽象及相关操作工具。

文件系统可以说是最基础的 Harness 原语之一,它带来了多项关键能力:

  • Agent 拥有一个工作空间,可以读取数据、代码和文档
  • 信息可以逐步写入或转移,而不必全部堆积在上下文中
  • 中间结果可以被保存,从而维持跨会话状态

文件系统同时也是一个天然的协作界面,多 Agent 或人与 Agent 可以通过共享文件进行协同,例如 Agent Teams 这样的架构就依赖这一点。

再结合 Git,文件系统获得了版本控制能力,Agent 可以跟踪进度、回滚错误并进行分支实验。后文还会再次提到文件系统,因为它实际上是许多其他能力的基础。

05

Bash 和代码执行作为通用工具

我们希望 Agent 能够自主解决问题,而不是在每一步都依赖预先定义好的工具。

目前主流的 Agent 执行模式是 ReAct 循环:模型先进行推理(reasoning),然后通过工具调用执行动作,观察结果,再进入下一轮循环。

问题在于,Harness 只能执行事先定义好的工具。与其为每一种可能的操作编写专用工具,不如提供一个通用工具,例如 Bash。

因此,Harness 通常会提供 Bash 能力,让模型通过编写和执行代码来解决问题。

Bash 加上代码执行,相当于为模型提供了一台“通用计算机”。模型可以通过编写代码临时构建工具,而不再受限于固定的一组预配置工具。

当然,Harness 仍然会提供其他专用工具,但代码执行正在逐渐成为自主问题求解的默认策略。

06

用沙箱和工具完成执行与验证


Agent 需要一个合适的环境,才能安全地执行操作、观察结果并持续推进任务。

我们已经为模型提供了存储能力和代码执行能力,但这些都必须在具体环境中发生。直接在本地运行模型生成的代码存在较高风险,同时单一环境也难以支持大规模任务。

沙箱提供了一种隔离且安全的执行环境。Harness 可以将执行过程放入沙箱中,让 Agent 在其中运行代码、访问文件、安装依赖并完成任务。

为了进一步提高安全性,可以引入命令白名单机制,并限制网络访问。与此同时,沙箱也带来了良好的可扩展性:环境可以按需创建、并行运行多个任务,并在完成后销毁。

一个完善的环境通常还需要预配置常用工具,例如语言运行时、依赖包、Git、测试工具,以及用于网页交互的浏览器。

浏览器、日志、截图、测试运行器等能力,使 Agent 能够观察并分析自身行为,从而形成自验证循环:编写代码 → 运行测试 → 分析结果 → 修复问题。

需要注意的是,模型本身并不会配置这些环境。Agent 在何处运行、拥有哪些工具、可以访问哪些资源、如何验证结果,全部属于 Harness 层的设计决策。

07

用记忆与搜索实现持续学习

我们希望 Agent 能记住其经历,并获取训练之后才出现的信息。

模型本身只有权重和当前上下文,并不具备额外记忆。在不修改权重的前提下,增加知识的主要方式是通过上下文注入。

在记忆方面,文件系统再次成为核心。Harness 可以支持类似 AGENTS.md 的记忆文件,并在 Agent 启动时加载到上下文中。随着 Agent 持续更新这些文件,系统会不断注入最新内容,从而形成一种“持续学习”机制。

另一方面,模型存在知识截止问题,无法直接获取训练之后的数据,例如更新的库版本。因此,需要借助 Web 搜索以及 MCP 工具(如 Context7),让 Agent 获取超出训练范围的信息。

因此,Web 搜索以及动态获取最新上下文的能力,也是 Harness 中非常关键的一类基础能力。

08

对抗 Context Rot(上下文退化)

我们不希望 Agent 在执行过程中性能逐渐下降。

所谓 Context Rot(上下文退化),是指随着上下文窗口不断被填满,模型在推理和任务完成上的表现逐渐变差。上下文是一种有限且宝贵的资源,因此 Harness 必须对其进行有效管理。

从某种意义上说,当前大量 Harness 工作,本质上是在进行“上下文工程”。

当上下文接近上限时,需要进行压缩(compaction)。如果不处理,一旦超过上下文限制,API 可能直接报错,这在工程上是不可接受的。因此 Harness 通常会通过总结与转移机制,让 Agent 能够持续运行。

对于工具调用产生的大量输出,如果全部放入上下文,会引入大量噪声。常见做法是仅保留开头和结尾的一部分内容,其余写入文件系统,必要时再读取。

此外,如果在启动阶段加载过多工具或 MCP 服务,也会在一开始拖慢模型表现。Skills(按需加载的能力模块)通过渐进式加载来缓解这一问题。模型本身不会主动选择加载哪些能力,但 Harness 可以通过这种方式保护上下文,避免过早退化。

09

长时间尺度上的自主执行

我们希望 Agent 能够在较长时间内,自动且稳定地完成复杂任务。

自动化软件开发可以视为编码类 Agent 的重要目标。但当前模型仍存在一些限制,例如容易提前停止、难以拆解复杂任务,以及在跨多个上下文窗口时表现不稳定。

因此,一个良好的 Harness 必须围绕这些问题进行设计。

在这里,前面提到的能力开始协同发挥作用。长时任务需要持久状态、规划能力以及观察与验证机制,才能跨多个上下文持续推进。

文件系统和 Git 用于跨会话跟踪工作。长期任务可能产生数百万 token,文件系统可以稳定记录这些过程,而 Git 则让新的 Agent 能快速理解当前状态与历史。

对于多 Agent 协作而言,文件系统也是一个共享“账本”。

Ralph Loop 用于让任务持续执行。这是一种 Harness 模式:通过 Hook 拦截模型的“结束”行为,并在新的上下文窗口中重新注入原始目标,从而强制任务继续推进。文件系统在其中起到关键作用,因为每一轮都可以在新的上下文中读取之前的状态。

规划与自验证用于保持方向。规划是指将目标拆解为多个步骤,Harness 可以通过提示词与文件机制支持这一过程。每完成一步后,通过测试或自评进行验证;如果失败,则通过 Hook 将错误反馈给模型,进入下一轮迭代。

验证不仅提升结果可靠性,也为模型提供持续改进的信号。

10

Harness 的未来

模型训练与 Harness 设计正在逐渐耦合

一些 Agent 产品(如 Claude Code、Codex)已经在训练阶段将 Harness 纳入闭环,使模型在文件系统操作、Bash 执行、规划以及多 Agent 协作方面表现更优。

这形成了一个反馈循环:先在 Harness 中发现有效模式,再将其纳入训练,从而进一步增强模型能力。

但这种共同演化也带来问题,例如泛化能力下降。当工具逻辑发生变化时,模型性能可能显著下降,这表明模型在一定程度上“过拟合”了训练时的 Harness。

不过,这并不意味着某个模型对应的 Harness 就是最佳选择。实际上,在不同 Harness 下,同一模型的表现可能差异很大。例如在 Terminal Bench 2.0 上,我们观察到显著性能波动;甚至仅通过调整 Harness,就可以将一个编码 Agent 从 Top 30 提升到 Top 5。

这说明 Harness 仍然具有巨大的优化空间。

Harness 工程会走向哪里?

随着模型能力不断增强,一些当前属于 Harness 的能力,可能会逐渐被模型吸收,例如规划、自验证以及长程一致性,从而减少对上下文注入的依赖。

这看起来似乎意味着 Harness 会变得不那么重要。但正如 Prompt 工程至今仍然重要一样,Harness 工程很可能也会长期存在。

因为它不仅是在弥补模型的不足,更是在围绕模型智能构建完整系统。良好的环境配置、合适的工具、持久状态以及验证机制,都能让模型在任何智能水平下更加高效。

目前,Harness 工程仍然是一个非常活跃的研究方向。例如在 LangChain 的 deepagents 项目中,人们正在探索:

  • 如何让上百个 Agent 在同一代码库上并行协作
  • 如何让 Agent 分析自身执行轨迹,从而发现并修复 Harness 层问题
  • 如何根据具体任务动态组装工具与上下文,而不是预先配置一切

本文本质上是在回答两个问题:什么是 Harness,以及它如何被我们对模型能力的期待所塑造。

模型提供智能,而 Harness 让这种智能真正发挥作用。

愿我们构建出更好的 Harness、更完善的系统,以及更强大的 Agent。

如果你已经看到这里,其实你已经在门槛内了。剩下的,就是把这些“理解”,变成“能做出来”。推荐这个好评如潮的 Agent 实战营,带你一点点上手智能体。

原文链接:https://blog.langchain.com/the-anatomy-of-an-agent-harness/

另一个挑战是可移植性。如果模型和 Harness 紧密耦合,就很难将模型迁移到不同的平台上。这就像软件开发中的“vendor lock-in”。我们需要设计一种标准化的 Harness 接口,让模型能够方便地在不同的 Harness 环境中运行。

我觉得可以加入一些更高级的知识库或专家系统,比如针对特定领域的规则、最佳实践等。相当于给 Agent 配备一个“外脑”,让它在特定领域表现更出色。比如,法律领域的 Agent,就可以内置法律法规和判例数据库,直接提升专业性。

我更倾向于从 Agent 的学习能力入手。可以设计一个 Harness,让 Agent 能够记录它解决问题的过程,并从中学习,不断优化自己的策略,避免重复犯错。这就需要一个复杂的反馈循环和知识管理机制,有点像强化学习。

从工程角度来说,我认为可以加强监控和调试功能。Harness 应该能够记录 Agent 的每一步操作和决策过程,方便我们分析问题、发现瓶颈。有点像软件开发中的 tracing 工具。毕竟,再聪明的 Agent 也需要调试,不是吗?

我认为伦理风险也不容忽视。如果 Harness 中包含一些有偏见或歧视性的设计,模型可能会学习并放大这些偏见。我们需要对 Harness 进行严格的审查和测试,确保其符合伦理规范。毕竟,技术本身没有好坏,关键在于如何使用。

我会设计一个智能摘要模块,能够自动识别上下文中的关键信息,并进行精简和概括。这样既能保留重要信息,又能减少上下文的长度,缓解 Context Rot 问题。关键是要找到一个好的摘要算法,既准确又高效。

我觉得最大的风险是“过拟合”到特定的 Harness。如果模型在训练过程中过度依赖特定的 Harness 组件,一旦 Harness 发生变化,模型性能可能大幅下降。这就像运动员过度依赖某种器材,一旦器材损坏就无法发挥正常水平。所以,训练时需要加入一些随机性,让模型学会适应不同的 Harness 环境。

我想从 Prompt 提示工程的角度来解决。好的 Prompt 应该能够引导模型关注重要信息,忽略不重要的信息。可以设计一个 Prompt 模板,根据任务类型和上下文内容动态调整提示词,提高模型对关键信息的敏感度。相当于给模型带上一个“聚焦眼镜”。

我的思路是把上下文信息分层管理。一部分是核心信息,始终保留在上下文中;另一部分是辅助信息,可以暂时存储在外部,需要时再加载。这样可以避免所有信息都堆积在上下文中导致退化。类似于操作系统的内存管理。

其实可以考虑引入一些“遗忘”机制。就像人脑一样,Agent也需要定期清理不重要的信息,释放上下文空间。当然,这个“遗忘”不能随便进行,需要Agent能够判断哪些信息是冗余的,哪些信息是未来可能需要的。这有点像Prompt Engineering中的“少样本学习”,让Agent学习如何更好地利用有限的上下文。

Context Rot确实是个大问题,我觉得可以从两个方面入手:一是优化模型本身,提升其处理长上下文的能力。二是改进Harness的记忆机制,让Agent能够更有效地提取和利用历史信息,减少对当前上下文的依赖。比如,可以使用向量数据库来存储和检索知识,或者引入更复杂的注意力机制。

从技术角度看,Agent的自主性确实在提高。但从社会伦理角度看,完全依赖Agent自主解决问题可能带来意想不到的风险。想象一下,如果Agent在金融领域自主决策,可能会导致市场崩溃;在医疗领域自主诊断,可能会误诊。所以,在追求Agent自主性的同时,必须建立起完善的监管和伦理框架。

从计算机架构的角度看,文件系统提供了一种层次化的命名空间,方便 Agent 组织和管理数据。这种结构化的存储方式,比简单的键值对存储更适合复杂任务。当然,也可以考虑使用图数据库来表示知识之间的关联,但实现起来可能更复杂,需要权衡。

从形式化方法的角度考虑,我们可以尝试验证Agent生成的代码是否满足预定义的安全规范。这需要建立一套完整的安全模型,并开发相应的验证工具。更进一步,可以使用符号执行技术,对Agent可能执行的路径进行分析,发现潜在的安全问题。但这在计算上可能非常昂贵。

这不就是 CTF 比赛的套路吗?给 Agent 准备一个牢笼(沙箱),把能用的工具都限制住,就算它写出恶意代码,也跑不出去。还可以学习黑客,搞个“蜜罐”,放一些假的文件,如果 Agent 试图访问,立刻报警!

安全问题绝对是重点!我觉得可以从两方面入手:一是静态代码分析,在代码执行前扫描潜在的安全漏洞;二是沙箱隔离,即使代码存在漏洞,也能限制其影响范围。此外,还可以引入“最小权限原则”,只允许Agent访问必要的资源,从而减少攻击面。

从理论角度看,关键在于设计一种能够适应Agent动态数据访问模式的文件系统。这可能涉及自适应缓存策略、预取机制以及智能数据分片。此外,考虑到Agent可能涉及大量小文件的读写,优化文件系统的元数据管理也是一个重要方向。甚至可以探索使用内存数据库作为Agent的文件系统,但这需要权衡成本和持久性。