首页/文章/ 详情

什么是 Harness?

1天前浏览71

 

本文是对博客《What is a Harness?》的总结,用攀岩安全带作比喻,向非专业人士解释 AI 圈常说的 Agent Harness 到底是什么。核心可以浓缩成一句话:Agent = Model + Harness,模型负责“思考”,Harness 负责让思考沿着想要的方向。

https://earendil.com/posts/what-is-a-harness/

一、用攀岩比喻

  • • 攀岩 Harness:不直接攀爬,但把人连到绳索/锁扣上,挂粉袋和工具,保命、控速、可换山头、可改装。
  • • Agent Harness:不直接推理,但把 AI 模型连到工具、指令、循环和模型接口上,保住用户控制权,可跨模型、可自定义。

  •  

二、Agent Harness 的定义

一段运行环境软件,套在 AI 大模型外面。和模型最大的区别:用户可以自己拥有、本地运行、改系统提示、加扩展

三、Harness 要做的四件事

  1. 1. System Prompt(系统提示)
    像新员工入职手册,每次对话注入,规定“在这个环境里你该怎么答”。不写死在模型权重里,可改。
  2. 2. Tools(工具集)
    提供搜索、写代码、发邮件等可调用能力,只描述、不规定调用时机,让模型自己判断用不用、何时用。
  3. 3. Agentic Loop(代理循环)
    理解任务 → 调工具 → 看结果 → 不满意再循环 → 满意则交付。文章举例:比本地小学排名,搜索不够再搜、用代码做表、再核对、最后发邮件附表,模型自己判断“做完了”。这是 Chatbot 和 Agent 的分水岭。
  4. 4. Translation Layer(翻译层)
    屏蔽 Anthropic / OpenAI / 开源权重的接口差异,同一套 Harness 换模型不换工作流,用户掌握选型权和会话记录。

四、为什么它关乎“人的主动权”

  • • 模型归企业,Harness 可以开源本地跑(如 Pi、OpenClaw、Lefos)。
  • • Pi 极简:短系统提示、小工具集、可改 prompt/加扩展,用户间共享 5000+ 扩展。
  • • 早期 Claude Code 不算中立,后来开源 Harness 兴起,Earendil 做 Pi 的初衷就是把“换锤子还是被锤子挥”的选择权交回用户。

五、总结


     
攀岩 Harness      
Agent Harness      
基础定位
不直接攀爬,而是连接人与绳索、锁扣      
不直接推理,而是连接 AI 模型与工具、指令      
核心作用
保命、控速、防坠落      
保控制权、防模型失控、规范行为边界      
可替换性
换不同山头只需换绳,Harness 通用      
换不同模型只需换接口,Harness 不变      
可定制性
挂粉袋、快挂、按体型调节      
改系统提示、增减工具、加自定义扩展      
谁拥有它
你自己买的,不是岩馆专属      
你可以本地部署,不是大厂专有      
运作方式
人动→绳动→Harness 传力      
模型思考→调工具→Harness 协调循环      
对应产物
一套完整的安全攀登系统      
一套完整的、你可掌控的 Agent 系统      

攀岩 Harness 让你安全地挂在岩壁上干活,Agent Harness 让你安全地挂着模型干活。
模型是发动机,Harness 是车架、方向盘和安全带;没有 Harness,LLM 只是答题机,有了 Harness,它才成了你能管得住的 Agent。

六、应用

以一个具体的真实场景为例:帮用户完成「调研三家 SaaS 竞品并生成对比报告」。以下是完整的工作流程,每一步都对应 Harness 的四个核心组件(System Prompt、Tools、Agent Loop、Translation Layer)。

场景设定

• 用户输入:「帮我调研 Asana、Monday.com、ClickUp 这三家项目管理工具的定价、核心功能和用户评价,做成表格给我」

• Harness 配置:System Prompt 设定为「你是专业 SaaS 分析师,所有数据必须标注来源和时间,不做推测」

• 可用工具:search_web(query)、read_url(url)、write_file(filename, content)、confirm_with_user(message)

完整执行流程

Step 1:接收任务,注入 System Prompt

  用户消息 → Harness 收到
Harness 拼接:System Prompt + 用户请求 → 发给 LLM
LLM 返回:思考后的第一步计划

LLM 实际返回(内部思维):

我需要分别搜索三家产品的定价页面和 G2/Capterra 评分。先搜 Asana。

Step 2:第一轮工具调用

  LLM 输出:tool_call → search_web("Asana pricing 2026")
Harness 的 Agent Loop 拦截到 tool_call
→ 经过 Tool Registry 匹配到 search_web
→ 执行搜索,拿到结果
→ 将结果追加到 messages 列表(role: tool)
→ 再次发给 LLM

此时 messages 结构:

  [
  {role: "system", content: "你是专业SaaS分析师..."},
  {role: "user", content: "帮我调研三家..."},
  {role: "assistant", content: "我先搜索Asana定价", tool_calls: [...]},
  {role: "tool", tool_call_id: "call_xxx", content: "Asana Starter $10.99/月..."}
]

Step 3:第二轮 —— 读取详情页

  LLM 看到搜索结果后判断:需要读取具体定价页面
→ 输出 tool_call → read_url("asana.com/pricing")
→ Harness 执行,拿到 HTML 正文
→ 追加到 messages,继续循环

Step 4:第三轮 —— 发现需要用户确认

  LLM 读完 Asana 定价后发现:三家价格区间接近,要不要深入对比功能?
→ 输出 tool_call → confirm_with_user("Asana定价已获取,是否继续对比Monday和ClickUp的功能差异?")
→ Harness 暂停循环,等待用户回复
→ 用户回复「继续」
→ Harness 将用户确认追加到 messages,继续

Step 5:重复搜索 + 读取 Monday.com、ClickUp

  LLM 依次调用:
  search_web("Monday.com pricing 2026") → read_url(...)
  search_web("ClickUp pricing 2026") → read_url(...)
  search_web("G2 Asana vs Monday vs ClickUp reviews 2026") → read_url(...)
每步都由 Harness 的 Agent Loop 接管:执行 → 追加结果 → 重新发给 LLM

Step 6:生成最终产出

  LLM 收集完所有数据后判断:信息足够,不需要再调工具
→ 输出纯文本(无 tool_call)
→ Harness 检测到无 tool_call → 跳出循环
→ 将 LLM 的回答返回给用户

LLM 最终输出(由 Harness 原样传递给用户):

维度      
Asana      
Monday.com      
ClickUp      
起售价      
10.99/月      
12/月      
10/月      
核心功能      
时间线、工作流自动化      
看板、仪表盘      
Docs、目标追踪      
G2 评分      
4.4 (2000+条)      
4.5 (1800+条)      
4.6 (1500+条)      
最佳场景      
中型团队项目管理      
营销团队      
初创公司全能      

这个过程中 Harness 做了哪些幕后工作

Harness 组件      
在本例中的具体行为      
System Prompt      
确保 LLM 不会瞎编数据,所有结论都标注了来源      
Tool Registry      
识别 search_web、read_url 等调用,路由到正确执行函数      
Agent Loop      
管理 6 轮工具调用 + 1 次用户确认暂停 + 最终跳出循环      
Translation Layer      
无论底层是 Claude / GPT / 开源模型,messages 格式统一转换      
权限控制      
write_file 没被调用(本例未要求保存),confirm_with_user 触发了人工确认      
上下文管理      
6 轮交互 + 搜索结果塞满窗口时,自动对旧工具输出做摘要压缩      

关键设计决策点

  1. 1. 为什么不是一次把所有搜索全扔出去?
    • LLM 每次只能看到当前结果来决定下一步。先搜 Asana 发现价格,再决定要不要对比功能——这是 Agent Loop 的价值,不是简单批处理。
  2. 2. 为什么要有 confirm_with_user?
    • 防止 LLM 自作主张跑偏方向。用户可能只想看价格,不想看功能对比。Harness 提供了「暂停→问人→继续」的机制。
  3. 3. 如果 API 超时怎么办?
    • Harness 的 Translation Layer 会捕获超时异常,自动重试一次,若失败则降级换模型(比如从 Claude Sonnet 降到 Haiku),保证任务不中断。

 


来源:数值分析与有限元编程
System通用控制
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2026-09-08
最近编辑:1天前
太白金星
本科 慢慢来
获赞 14粉丝 32文章 399课程 0
点赞
收藏
作者推荐

离散随机变量及其概率分布

随机变量的本质在大多数工程和科学应用中,随机事件的结果是非数值型。为方便进一步研究,将结果用实数轴 上的数值表示是必要的。建立这种映射或转换的函数称为随机变量。形式上讲,随机变量被定义为一个函数,函数的本质就是一种映射,它为随机事件的每个可能结果分配一个实数值。随机变量通常分为两类:离散型和连续型。离散型随机变量只能取不同的、通常是整数的值;例如,掷一枚骰 子,出现的结果只能是1到6之间的整数,因此它是离散型随机变量。某一河流某点每年洪水次数的取值也只能是整数,所以它也是离散型随机变量。连续型随机变量的取值则在连续的数值范围内;例如,机器零件的寿命理论上取值是 ,是一个连续型随机变量。由于这两类随机变量的概率计算方式不同,所以要对它们加以区分。如上所述,一个离散的随机变量是一个函数,它将样本空间的所有结果映射到一个离散的实数集 合,称状态空间( ),对于结果 ,以及 , 是随机变量的一个状态。如图1所示,投掷一枚均匀硬币两次,考察正面向上的数量。由四个可能的结果组成样本空间: 。 ▲图1令 为“正面出现的次数”。这是一个可能取值为 的随机变量。作为函数, 给结果 赋值为2,给 和 赋值为1,给 赋值为0。即 , , 。令 为“反面出现的次数”。用 表示的话, 。换句话说, 和 是同一个随机变量: 对所有 成立。 因此,随机变量 为实验的每个可能结果 赋予一个数值 。离散型随机变量的分布给定一个随机变量,我们希望能用概率的语言来描述它的行为。例如,我们可能想回答关于该随机变量落入给定范围的概率问题:如果 是随机选择的市民的年收入,那么 超过十万元的概率是多少?离散型随机变量的概率由概率质量函数(probability mass function, PMF)给出,它指定了离散型随机变量 等于某个状态值 的概率,记为:对于所有的状态变量 , ,且 在写 时,我们用 来表示一个事件(event),它由所有被 赋予数值 的结果 组成。这个事件也写作 ;形式上, 定义为 ,但写作 更简短直观。回到上面抛硬币的问题,如果 是正面朝上的次数,那么 由样本结果 和 组成,这是 赋予数值1的两个结果。由于 是样本空间的子集,它是一个事件。因此讨论 是有意义的,更一般地讲,谈论 也是有意义的。如果 不是事件,那么计算其概率就没有意义!写 " " 是没有意义的;我们只能取一个事件的概率,而不能取随机变量的概率。继续抛硬币的问题。在这个例子中,我们接下来将求出PMF。以下是我们定义的随机变量及其PMF:定义 为正面朝上的次数。由于 发生时 等于0, 或 发生时等于1, 发生时等于2, 的PMF是函数 ,由下式给出显然, 。且对所有其他 值, 。定义 为反面朝上的次数。如上推理,或利用 的PMF是且对所有其他 值, 。累积质量函数(cumulative mass function)用于表示随机变量 小于或等于 的概率。根据定义,对于所有小于状态空间中最小值 的值,累积概率定义为零;对于所有大于状态空间中最大值 的值,累积概率定义为1。投掷一枚均匀硬币三次,记随机变量 表示记录的正面(H)数量。X的可能取值为 。该实验的样本空间是三次抛硬币所有可能结果的集 合。由于每次抛掷的结果要么是正面(H),要么是反面(T),因此通过直接枚举,样本空间是由8个元素组成的集 合 。 的概率质量函数(PMF)和累积分布函数(CDF)如图2所示。 状态空间中的最大值为3,那么 . ▲图2来源:数值分析与有限元编程

未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习计划 福利任务
下载APP
联系我们
帮助与反馈