智东西6月3日报道,AI Agent圈子有个很尴尬的问题:大家在聊同一件事,用的却是不同的词;用同一个词,指的却是不同的东西。
ICLR 2026结束之后,Hugging Face工程师Aritra Roy Gosthipaty发了一条帖子,精准戳中了这个问题:“在Agent语境下,harness和scaffold到底是什么意思?我在ICLR听到过很多种解释,但始终不明白为什么没有收敛到一个统一的定义。”
这个问题很快引起共鸣,Hugging Face的两位工程师Sergio Paniego和Aritra,联手发布了一篇博客,这是一份专门解读最容易被混用的那些概念的手册,我通读并编译了全文,把其中最核心的框架拎了出来。
一、Model、Scaffolding和Harness,Agent的三层骨架
先把三个最容易搞混的概念区分开:
Model,就是那个裸的大语言模型。Claude、GPT、Qwen、DeepSeek、Kimi,文本进去,文本出来。没有记忆,没有循环,不会主动做任何事。它可以“表达”调用工具的意图,但真正去执行,需要别人帮它。
Scaffolding,是模型所“看到”的一切。系统提示词怎么写、工具怎么描述、输出按什么格式解析、跨步骤记住什么,这些构成模型眼里的世界,它塑造了模型的行为边界,但本身不负责运行。
Harness,是真正让模型“跑起来”的东西。调用模型、处理它返回的工具请求、判断什么时候停止,这个循环的引擎就是Harness。
对于Scaffolding和Harness的区别,文章给了一句极其简洁的区分:Scaffolding是模型可感知的部分(提示词、工具定义、输出格式),Harness是驱动模型运行的部分(调用循环、工具执行、停止判断)。
所以,精确定义下,Agent由三层构成:Agent=Model+Scaffolding+Harness。
不过在社区日常讨论中,有一个更简化的说法:Agent=Model+Harness。Claude Code官方自己也说“Claude Code is the agentic harness around Claude”,这里的Harness被当成了“除了模型以外的一切”来用。
两位作者也坦率表示,日常聊天这么讲无伤大雅。但一旦进入训练,把Scaffolding和Harness拆开审视就变得至关重要,训练时,Scaffolding决定了模型学到什么;推理时,Harness决定了模型怎么跑。
Agent这个词本身源自强化学习,在RL里,Agent就是一个函数:接收观察,返回动作。环境接收动作去执行,返还观察结果,循环继续。这个循环,就是今天所有LLM Agent的底层逻辑。
用编程Agent当例子最直观:系统提示词和工具描述是Scaffolding,真正完成调用模型、执行git diff、运行测试、判断何时停止那个循环的,是Harness。训练的时候,Harness还要并行跑成百上千个这样的循环,把结果喂回去更新模型权重。
Sergio和Aritra特别点出了一件事:当人们聊Claude Code、Codex、Cursor这些产品时,他们说的是“一个特定的Harness+一个特定的模型”,两者被一起设计、一起优化。
两个产品就算底层用的是同一个模型,体感可以完全不同,因为它们的Harness做了不同选择。反过来,同一个Harness换一个更强的模型,体验也会变。
模型、Harness、产品,三个东西,不是一回事。
在这个框架之上,还有一个更高的概念叫Orchestrator。它是把多个Agent当作单元来调度,每个Agent跑自己的Harness,这对应到现在很火的多Agent协作模式。
二、Context Engineering决定Agent看什么,Policy定义Agent的行为
Context Engineering(上下文工程)的核心问题是,Agent每一步看到什么。除了写系统提示词,还要动态管理整个上下文窗口:系统提示词、工具描述、对话历史、检索到的知识,每一步都可能不一样。
它和Prompt Engineering的关键区别在于:不是一次性写好就完了。随着Agent运行,前几轮的输出会影响在后续调用中放入什么,Harness需要在整个运行过程中主动管理上下文,包括删什么、留什么、从哪里检索补充,不是写个prompt而已。
对于上下文工程,训练和推理的出错代价天差地别,训练时搞错上下文,模型学到错误的东西,代价是重新训练,推理时搞错,可以修改提示词然后重新开始即可。
记忆体系也被纳入了上下文工程的框架。短期记忆是单次运行中留在上下文窗口里的内容:对话历史、工具返回结果、之前的推理链。长期记忆跨会话持久化,存在外部,需要时检索回来注入上下文。两者由Harness在同一套上下文管理逻辑中统一调度。
Policy是另一个容易被当成Agent同义词的概念,文章明确做了切割,Policy是行为概率分布,定义了Agent采取每种动作的概率。
Policy部分受模型权重影响,但最终行为也取决于Scaffolding和Harness,同一个模型,换一套提示词、工具或执行循环,行为可以截然不同,Policy不是Agent,Policy定义行为。
三、Tool、Skills、Sub-agent层层递进,以及训练Agent的四个关键词
Agent的能力体系是按层级递进的,这三个词虽然容易被混用,但代表了三个层级。
Tool Use是最底层。诸如API、代码解释器、数据库、网络搜索、文件系统等等,Agent通过这些接口触及外部世界。模型只会以结构化的格式表达调用工具的意图,API将其作为一等对象呈现,Harness接收调用并路由到正确的位置,返回结果进上下文,然后继续循环。
Skills高一层。如果说Tool是最原始的一个动作,Skill就是一套可行的完整方案,比如研究这个bug、写修复方案等。Skill可以跨Agent移植,按需加载。
Sub-agent是最高层。很多人把它当高级工具来用,但文章给了明确区分:Sub-agent有自己单独的模型和Scaffold,能独立推理、自己调工具,甚至能再调用新的Sub-agent,这是它和Tool以及Skill的本质差异。
文章也坦率承认:Tool、Skills、Sub-agent之间的边界,在不同框架里不太一样。
如果切换到训练视角,还有四个概念是训练Agent过程的关键所在:
RL Environment,指Agent在训练时可以与之交互的任何系统。它的工作方式是:Agent向它发出一个动作(比如执行一条命令),它执行这个动作、更新自身状态,然后把新的状态信息返回给Agent。
一个文件系统就是最直观的例子:Agent发出touch foo.txt这个动作,环境执行它、创建了文件,然后把更新后的文件列表作为反馈返回。
Trainer,负责让Agent的能力逐步提升。它做的事情分三步:第一,让Agent反复执行完整任务,跑很多轮;第二,对每一轮的结果打分;第三,用这些分数来更新Agent内部模型的权重参数,让下一次执行更接近正确答案。整个过程是自动循环的。
Rollout,指Agent完成一次完整任务的全程记录。里面包含三个部分:Agent在每一步看到了什么信息、它据此做出了什么动作、每一步得到了多少分。这份记录也被称为trajectory或trace,本质上就是算法通过分析大量这样的记录,找到让分数变高的行为模式。
Reward,一个数值分数,用来告诉训练算法“这次做得怎么样”。它有好几种形式。
可验证奖励:有标准答案,比如代码测试跑通了就是1,跑不通就是0。
学习型奖励:没有标准答案,需要人来打分或让另一个LLM来评判。
稀疏奖励:整个任务做完才给一个总分。
密集奖励:任务过程中每一步都给一个分数。
结语:Agent爆火的时代,讲清楚基础概念尤为重要
这篇文章不是什么颠覆性研究,它是那种早就该有人做,但一直没人做的基础工作。
Sergio和Aritra在文章中写道:“这篇文章的目标不是推行唯一正确的词汇,而是提供一个实用的思维模式。”当一个领域快速发展时,其术语的演变速度往往超过其共识的形成速度。
在Claude Code、Codex、Hermes Agent、Cursor等等,用各自的词说各自的事的时候,一份中立的术语手册的价值就凸显出来了。
热门跟贴