假设电脑里有三份报名表,你想让 AI 帮忙:
把这三份表合在一起,按手机号去掉重复报名的人,再保存成一份 Excel。
先看最容易被忽略的一步。
模型收到任务后,可能提出:"读取 A.xlsx、B.xlsx 和 C.xlsx。"
这时,模型只是发出了一条操作请求,三个文件还没有因为这句话就被读取。
接下来,需要有一段程序接住请求,调用表格工具。工具真的打开文件,返回"已读取,共 100 条报名记录"。这段程序再把结果交给模型,让模型根据新信息决定下一步。
这段负责组织往返的外围程序,就是理解 Harness 的起点。

图 1:模型提出"读取文件",工具真正读取文件,Harness 程序把这两件事接起来。图中是教学假设。
这里有三个角色,先把它们分清:
| 角色 | 在这个任务里做什么 |
|---|---|
| 模型 | 根据任务和已有结果,提出下一步操作;最后组织给用户的回复。 |
| 工具 | 真正打开表格、处理数据、保存文件,返回执行结果。 |
| Harness 程序 | 调用模型,接收它的工具请求,安排执行,再把结果送回模型,让任务继续或结束。 |
这里把工具请求写成了人话;实际系统通常用程序能识别的格式来传递请求。
例如,模型发出了"按手机号去重"的请求,Harness 就调用相应的数据处理工具;工具返回"去掉了 8 条重复记录,剩 92 人",Harness 再把这条结果交给模型。
模型于是可以接着提出:"把这 92 人保存成汇总表。"
模型、工具和 Harness 配合起来,构成了这个例子中能操作文件的智能体。 Anthropic 的官方说明,也把 Harness 描述为调用模型、将模型的工具调用交给相应执行系统的循环。官方说明
把整项任务展开,就能看到这个循环一轮轮发生。下面的数字和文件名都是教学假设:
| 这一轮,模型提出什么 | Harness 安排工具执行 | 工具返回什么 |
|---|---|---|
| 读取三份报名表 | 调用表格读取工具 | 读到 100 条报名记录 |
| 按手机号合并、去重 | 调用数据处理工具 | 去掉 8 条重复记录,剩 92 人 |
| 保存为汇总表 | 调用文件写入工具 | 已生成"报名汇总.xlsx",返回文件位置 |
| 重新打开并核对 | 调用表格读取与检查工具 | 文件能打开,内容确实是 92 人 |
每一行结束后,工具结果都会经过 Harness 回到模型。最后,模型才根据这些执行结果告诉用户:"处理完成,共 92 人,文件保存在这里。"

图 2:同一个模型,在工具结果的反馈下连续工作。具体操作步骤可以随任务情况变化。
现在再看"长上下文",它和 Harness 的区别就容易理解了。
上下文,是这一轮交给模型看的材料。 比如用户的要求、文件信息、刚才读到的记录,以及"去重后剩 92 人"这个结果。
Harness,是组织这一轮、下一轮如何运行的程序。 它调用模型、接收工具请求、安排工具执行,再把结果送回去。
即使一次能给模型看很多资料,也仍然需要程序和工具完成真实的文件操作。反过来,上下文容量有限时,Harness 也可以配合摘要、文件记录等方式,分多轮推进任务。长任务中的进度与交接实践
所以,这个表格任务的核心不在于让模型"一次记住更多东西",而在于让它拿到执行结果后,还能继续采取下一步行动。
如果中途报错,这种往返仍然适用。工具返回"文件被占用,保存失败",Harness 就把失败结果交给模型,并按系统规则继续处理或暂停。模型可以据此提出另存文件、请求用户关闭表格等办法。系统也应设置重试次数、时间或成本限制,避免任务无休止地循环。
至于"自学习",还需要另外设计。如果每次任务结束后都没有保存可复用的经验,下次任务未必会受益。加入经验记录、检索和效果验证后,系统才有机会在后续任务中利用过去的做法;模型参数训练则需要专门的训练流程。
要理解这个例子里的 Harness,就去找组织"模型提出请求---工具执行---结果返回---模型继续"的那段程序。是否加入持久记忆或多个智能体,可以另行选择。
用这次表格任务记住它:模型提出动作,工具执行动作,Harness 组织往返;上下文是每一轮给模型看的材料。