#543. 为何 2026 是 Harness 之年?IBM 专家深度拆解

完整转录稿

Podcast 跨国串门儿计划 2026-05-19 12:12

目录

从安全带到Agent Harness

一凯:欢迎收听“跨国串门儿计划”。这是一档专注于让中文听众无障碍欣赏全球优质外语播客的节目。通过先进的 AI 声纹克隆技术,我们不仅将内容翻译成中文,还保留了原主持人和嘉宾的独特声音,为您呈现全球顶尖的 AI、财经、健康与科技领域精品内容。我是主播一凯,一位热衷于 AI 领域的产品经理,很荣幸能为您搭建这座跨越语言障碍的桥梁。接下来让我为您简单介绍本期我们克隆的这档节目,并分享几句非常精彩的原话。本期我们克隆的是全球 AI 开发者大会的一场精彩演讲录音,主讲人是 IBM 的 AI 开发者倡导者 Tejas Kumar。他职业生涯里在多家前沿科技团队工作过,现在专注于让 人工智能系统变得更可靠、更可控。在演讲中他打了一个非常形象的比方:如果你爬过山,或者看过别人爬山用的那个安全带,英文就叫 harness。登山者会把自己固定在山体上,因为山是稳定的,他们不会真的脱轨。他还有一句话让我印象很深:“我一次都没动过 prompt,我没改你的系统 prompt,我们仅仅是做了个 harness,结果就彻底变了。”对于未来,他也大胆给出了自己的判断:2025 年是 agent 之年,那么 2026 年就是 harness 之年。那我们就一起来完整听听这段分享。 [00:01:29]

Tejas Kumar:大家好,大家注意这边。Hello,午餐怎么样?好吃吗?好吃。你不喜欢的话,有点像英国菜。好,我是 Tejas,今天下午第一个演讲者。Tejas 发音有点像 contagious,不过放心,我没有传染性;我希望我对 AI 的热情是有感染力的。我有幸在职业生涯中在很多地方工作过,从最优秀的人那里学习,真的非常享受。现在我是 IBM 的 AI 开发者倡导者,我们在那边做 AI 的事情。信不信由你,我们训练前沿模型,构建 harness,那是个很有趣的实验室。但今天我不是来聊这些的,今天我要讲的是 AI harness。AI harness。在继续之前,我想请大家举一下手:有多少人觉得自己对 AI harness 的理解很有信心,有信心到可以今天上台讲这个?大家四处看看,真的看看周围。这就是我们做这个演讲的原因。这是我的期望:等演讲结束,我再问的时候,大家会说“我现在明白了”。这就是全部意义。我做这个演讲,除了分享知识,别的什么都得不到,好吧?而且这个词现在到处都是,你们今天可能已经听到它被用了大概五万两千次了,并且它对不同的人意思不同。在机器学习领域,它指的是一个美化版的机器学习模型测试套件;但在 AI 领域,它的意思不一样。所以今天我们要详细了解它。这是一个深入探讨,但只有 18 分钟。我们继续。我想先聊聊为什么需要 harness。为什么我们要使用 harness?原因是,我们向那些给我们提供算力、推理 token 的公司付租金。你们中有些人可能就在有前沿模型的公司工作,比如 Anthropic 或 Google 之类的。你们可能,那个词怎么说来着,token 亿万富翁。对,我不是那种,也许在 Watson 模型上算是,但我们绝大多数人都不是 token 亿万富翁。我们付租金,我们每月花 20 美元买 Claude Pro,然后你得到一个有限的 context window;你得不到全部,可以这么说。而且你租的模型是一个黑箱。他们随时可以,我不是说他们真的这么做,但他们可以,比如如果 Opus 因为某种原因用不了,他们可能给你提供 Sonnet,即使显示的是 Opus,你根本就不会知道,对吧?所以这里面有太多我们无法控制的变量。那么为什么需要 harness?因为 harness 的核心就是可靠性。我真的希望,我不该站在这个白线前面,反正我也不在镜头里,随便了。它就是可靠性。它确保我们构建的 agent 能够完成它们的任务,句号。不管背后的黑箱模型怎样,不管我们租的是什么,都不受影响。好,既然我们明白了为什么需要 harness,下面我们来聊聊 harness 到底是什么,从最根本的原理讲起。我们先回到大家所熟悉的 harness。如果你爬过山,或者看过别人爬山用的那个安全带,英文就叫 harness。登山者会把自己固定在哪里?固定在山体上。因为山是稳定的,他们不会真的脱轨。他们把自己锚定在一个稳定的东西上,这样就不会跑太远,明白了吗?这就是 harness 的本意。在座有养狗的吗?你遛狗用的那个背带也叫 harness。为什么呢?因为这样你的狗就不会乱跑,不会让你花光 token 破产,对吧?这就是 harness。但问题是,我们说到 harness,其实有两种。一种来自机器学习领域,就像我刚才说的,类似于一个测试套件和测试运行器。你给模型一些输入,然后看输出的质量。但那不是今天要讲的,我们也不是 ML 工程师大会。我们今天要讲的是 AI 工程里常见的 agent harness。那么什么是 agent harness?这里就是最关键的点了。我这么说可不是为了赚钱,只是个说法。Agent harness 就是模型周围的一切,为它提供现实接地。它就是那个把模型和稳定环境绑在一起的东西。比如 Claude Code 就可以看作是一个 agent harness。你们周围有人可能会说,不对,它是个 coding agent。没错,它确实是个 coding agent,但它是一个被 harness 了的 coding agent。一个 agent harness 多多少少包含以下几个典型的部分:第一,它有一个工具注册表。比如 Claude Code、Cursor、Codex,它们都有工具来读取文件系统、写入、执行 Bash 命令,对吧?它们有工具注册表。它们有一个模型,有些允许你选择模型,有些不让你选。它们有模型,还有管理上下文的原语。几乎现在所有 harness agent 运行时,都会自己压缩上下文,对吧?这就是 harness 的职责。护栏是 harness 的另一部分,比如 max steps。如果谁设置了 max steps,就不能执行超过五次工具调用,这就是一个护栏;如果你超过了,运行就会被终止。Agent 循环是 agent harness 的另一个部分。这点很有意思。我在准备这个演讲时跟一些人聊过,他们会说,等等,harness 不就是 agent loop 本身吗?不,它其实是围绕 agent loop 的那些东西。事实上,它可以是套在你 agent loop 外面的一个循环,也可以是一个内层 loop。我们稍后看代码的时候,会稍微看一下。最后还有一个验证步骤。比方说一个 AI coding agent 在工作完成之后,验证步骤就是我们跑一下 lint,跑一下测试,确保没有搞坏任何东西,对吧?所以几乎每个,我就拿 coding agent 来举例,但你可以为任何东西构建 harness。这真的很厉害,因为它把黑箱模型牢牢锚定在你能控制的稳定环境里。好了,接下来我想给大家看一个 demo。我们要一起动手构建一个 harness,一个最简版本,可以说是“宝宝的第一个 harness”。我们就叫它乞丐版 AI harness 吧,这样我们就能从第一性原理理解它是怎么工作的。我们要构建一个 computer use agent,给它一个任务,去 Hacker News 给第一个帖子点赞,可以吧?这就是一个 computer use,也是 browser use agent。我们故意用一个非常差的模型,GPT-3.5 Turbo,差不多是 2023 年的玩意儿了,对吧?但我们要为它套上 harness,让它真的能完成任务,同时还能省钱。好,我话太多了,我们直接进入 demo。欢迎大家来看我的项目。这就是我的项目。大家好,这是入口文件,你们能看清吗?是不是太小了?好,我们放大一点。其实这个房间太亮了,我们切到亮色模式吧。这不太符合我的本性,不过有时候这样更好。好,现在我们有一个模型,我们再尝试一个旧的。抱歉,我们不该看到那个文件,无所谓。我们就是要用一个旧模型。这是 prompt,也就是任务描述。我直接写了 upvote story,就是刚才说的任务。为了这个 demo,我们不会动这个 prompt,一点都不会改。因为很多人觉得,我的 agent 没做它该做的事,那一定是 prompt 写得不够狠,对吧?但这不总是对的。我可能需要改的是系统提示,而我们这里完全不动任何 prompt,只通过构建 harness 来改变结果。我们会往控制台打一些日志,然后启动一个浏览器会话。什么是浏览器会话呢?它其实就是 Playwright,不是 Playwright MCP,就是 Playwright 本身。这里我写了一个类,里面有个 open 方法,它会启动 Chromium,获取一个浏览器上下文,创建一个页面,然后导航。我们就是在直接调用 Playwright 的函数。这完全就是传统的软件工程。于是我们创建一个会话,打开这个会话,也就是在一个上下文里打开一个浏览器窗口,然后我们创建工具,把浏览器会话传给这些工具。然后我们创建一个上下文,再把任务,也就是这里的 prompt,传给这个上下文。create tools 看名字就知道是干什么的。这里有一些类型定义,然后 create tools 是一个函数,接收一个浏览器会话,返回一些工具。这批工具并不是我自己发明的,它们来自 OpenAI 的 SDK。所以你会看到,有名称、描述、参数,还有一个 execute。当你在运行时真正调用这个工具时,执行的部分。我做的这些工具非常简单。好了,这就是我的工具。然后是 create context。你可能心想,哇,上下文工程,绝对不是。看,这就是我的上下文,里面什么花头都没有,就是一个系统提示,真的就是最基础的那种系统提示,再加上用户任务,基础到不能再基础。 [00:09:53]

现场Demo构建可靠Harness

Tejas Kumar:再加上用户任务,基础到不能再基础。接着我们有一个 run loop,就是在一个循环里跑 agent。它的逻辑,我们可以直接看看这里:一个 while true 循环,这就是 agent loop。我们从 agent 那里拿到一个响应,然后检查这个响应是不是说停止,也就是 LLM 说“我做完了”。如果是,我们就返回值;如果拿到其他任何响应,我们除了把这些事件加到一个 trace 里之外,什么额外的事都不做。所以我们只是把历史不断追加到一个大列表里。这样讲清楚吗?好,我们做的全部事情就是这些。这只是一个不断收集事件直到结束的循环,超级基础。现在我们来看看它跑起来是什么效果。我切到这边。你还好吗,先生?要喝水吗?我运行 npm run agent,它会打开 Chromium。好,Hacker News 出来了,到目前为止还行。点击 upvote。不,我们碰到了一个登录界面,然后它好像慌了,直接崩了。但注意看,它在说谎,看到了吗?这是一个问题。那解决方案是什么呢?更很低调的 prompt?不行。改系统提示,在里面写上“始终用这些凭据登录”,也不行。那我们到底怎么解决?而且注意,因为我已经登录了,我们能实际看到它只是点了 upvote 按钮,然后就觉得自己成功了。它压根没去验证,而这正是 harness 的职责所在。好,那我们现在就一步一步来慢慢开始构建一个 harness。我不会现场写代码,因为我们现在早就不手写代码了,我们都是在看 diff,对吧?还有人会亲手写代码吗?也许你真的不该待在这里。开个玩笑。好,这是我们要做的第一个改动。这是原来的 index 文件,里面有我给你们看过的 run loop。现在我们要往里面加一样东西,就是默认护栏。我们要创建一些护栏。那我们的护栏长什么样呢?我们到编辑器里看看。这边是带护栏的版本。这里有一些类型定义,但核心是这一个最大迭代次数的护栏,意思是如果你超过六步,我就直接杀掉你。然后是 max messages,意思是如果消息数量超过这个值,我就会压缩上下文。这些其实就是一些 guardrails,一个小工具来组合它们。我们可以在这里随意组合,想加多少加多少。好,现在回到我们的改动,那就是 guardrails。如果我们回到 agent loop,在这个 diff 里,我们实际使用了 guardrails。我们包含了 guardrail 函数。可以看到我们在检查累积了多少消息,如果太多就直接修剪上下文。我还想让你看,这里最后我们 push 了上下文大小,还有一些关于我们做了什么的元数据。我们的上下文压缩器非常基础,也非常幼稚。这就是它做的事情。我打开带语法高亮的来看,免得你们看得难受。它的逻辑是,我们总是保留 system prompt、user prompt 和最近的两条消息。所以如果 guardrail 被触发,我们就删除 system prompt 和 user prompt 之后的所有中间内容,只保留最后两条消息。这非常初级,别这么做,有更好的方法。但这是起步阶段,我们正在前进。所以我们开始有了一个 harness,虽然还没叫 harness,但实际上就像一个孕育中的 harness,快要诞生了,对吧?所以接下来我们干脆就叫它 harness。现在给你看另一个 diff。我们看看这里 index 文件里,我们几乎删掉了所有东西,然后移到了这个叫 harness 的文件里。现在我们看入口点,index 里已经什么都不剩了。prompt 还在,但整个文件大概就十几行代码,只有 run harness。我们把所有逻辑都从 index 拿出来,藏进了一个叫 run harness 的函数。就如你预期的,run harness 做的事情和之前在 index 里做的一模一样,好吗?没什么新东西,可能就加了一个 print 函数,就是 console.log。到现在为止清楚吗?我们只是移动了代码。现在我们有了 harness,就可以真正用它了。我们先解决它撒谎的问题,然后再解决以我的身份登录的问题。因为它说它 upvote 了,但实际上没有。我想知道真相,所以我们接下来要加一些 guardrails,让它说实话。比如,如果你失败了,就告诉我。失败怎么做呢?我们来看这里,很多地方都改变了。哦不,等等,我看看是不是真的改了很多。好,真的改了很多吗?我们运行 harness 时,添加了第三个参数,是一个验证步骤。还有 max attempts,这个参数传给 guardrail,意思是如果你试了超过三次还没成功,就直接放弃。如果我们看 harness 文件,我们加了很多东西,都是些手动代码。这不是不同的 prompt,是我的逻辑。主要逻辑是 run harness 不再包着之前移动的代码,而是把那些代码移到了一个叫 run harness attempt 的函数里。所以如果我们看 run harness,等等,我需要切到那个分支,抱歉。现在看 run harness attempt,我把这些都折叠起来。run harness attempt 里面其实就是我们之前在 index 里的东西,我们只是把它移到了一个函数里。因为主 run harness 就是一个循环,最多运行三次,明白吗?所以我们只是在 harness 层面强制了最大步数,为了安全,然后我们有 run harness attempt 来实际调用它。另外还有一个函数叫 verify successful upvote,这是我写的,是确定性的。这就是我想展示的。它做什么呢?我们检查一下。记得我们在 agent loop 里做过追踪,添加了历史事件。所以我们回顾那些记录,看看是否有浏览器点击了 upvote。如果点击成功,真正成功了,我们就返回 true。但这里有一个重要的分支,就是我们增加了登录失败的情况处理。如果有一个工具叫 harness auto login,并且消息以 failed 开头,那么我们就提前返回,判定为失败。我们消除了谎言。类似地,对于未恢复的登录重定向,我们会检查 agent loop 里 push 的工具。如果看到 harness auto login 没有运行,并且当前页面是登录 URL,那么我们也直接判定失败。所以我们做的只是添加这些判断。如果发生了这种情况,就立即返回失败,明白了吗?这就是 harness 做的事情。现在让我们用这个 harness 运行一下。npm run agent。它会去 Hacker News,重复同样的流程。它会来到这里,现在它还是失败了,但是看,它不再撒谎了,因为我们的 harness 检查了工具历史,看到了实际发生的情况。这就是 harness 应该做的事情。太好了,这已经是赢了一半的仗了,因为解决问题的第一步就是承认你存在问题,对吧?有点测试驱动开发的感觉。现在既然我们能够正确地失败了,我们就可以成功了。我想在最后一个 diff 里展示给你看,然后我们就结束演讲。接下来第四点,我们有一个全新的函数,叫做 login handler。我会在这里加一点语法高亮,免得看花眼。看这里,create login handler,这就是它的全部功能。它在每个 agent 循环里运行,就在我们把 traces 推上去之前。它会检查浏览器会话的当前 URL。如果我们不在登录页面,它就直接说好,我什么都没给你。这在计算上毫无开销,对吧?如果你不在登录页面。但如果你在登录页面,那我们就填一个临时的凭证。这可以是个环境变量,可以很安全,你懂我意思吧。但我们是程序化地从 harness 填入凭证、提交按钮,而不是从 agent。这样既确定又安全,因为这个文件可以访问我想要的任何机密信息,对吧?那么这个文件是怎么被调用的呢?它是在 agent 循环里被调用的。如果我们回到 agent 循环,注意我们正在 push traces,对,这里就是我们之前 push traces 的地方。如果我们有 login handler,就在 agent 的循环中,在这之前调用它。login handler 做什么呢?如果我们不在登录页面,它什么也不做;如果我们在登录页面,它会快速注入凭证、提交表单,然后把你带回去。它还会,正如我们这里看到的,往队列里推一条消息说,嘿,我是 harness,我登录了,你没问题了。现在清楚了吗?好,所以 harness 就是字面意思上的,把 agent 套到一个稳定、确定的东西上。这就是它的目的。好,我们现在运行一下,看看会发生什么。npm run agent 会打开 Hacker News。当它到达登录页面,那个 harness 标签页就登录了,然后给第一条点了赞,然后关闭了。太棒了,成功点赞了,给 Nix 的一个叫 Snitch 的小东西,排名第二。经过六次迭代成功了。我可以点开进入 Hacker News,实际看到确实它被点赞了。我现在可以取消点赞,这就说明它之前被点了赞,对吧?所以 agent 用我的电脑,以我的身份登录,用我刚刚在台上做的 harness。这就是它的目的。到目前为止清楚了吗?明白了吗?不?那 harness 的作用,看你们在点头了,这对我来说简直是悦耳的音乐。太棒了。对眼睛来说呢?我不知道,说悦眼好像有点怪,我们没有对应的表达。让我们收尾吧。我讲完了,我觉得我的任务完成了。这个在实践中是什么样的?我为什么这么关心 harness 呢?因为它们运行整个世界,模型是不确定的,而你想用更少的资源做更多的事。你想用便宜的模型,比如 Qwen 或者类似的东西,甚至更小的,用 GPT-OSS,它是免费的。而有了一个好的 harness,你可以走得很远。这就是为什么在 IBM,我们建了一个开源项目,部署在企业的生产中,能让大公司、超大公司,在他们内部数据敏感的区域,对各种东西执行 RAG 操作:Teams 通话、PDF,还有发票。我们做的这个项目叫 OpenRAG,它就是做 RAG 的。我不知道 RAG 现在还酷不酷了,但 OpenRAG 有一个超级厉害的 harness,能为基于极度隔离的内部数据的提问提供企业级安全,而这正是 harness 工程发挥作用的地方。 [00:19:53]

Harness之年与动态护栏

Tejas Kumar:总结一下,我们讲了很多内容。我想这算是个深度探讨吧,不过是在大概 18 分钟里的深度探讨。我们走得相当远了。有一点你们应当注意:我一次都没动过 prompt。我没改你的系统 prompt,我们仅仅是做了个 harness,结果就彻底变了。当然,我们还可以加机密信息、加 token,我们做了很多。最终我希望大家理解了什么是 harness,它能带来什么价值,以及怎么使用它。下一步是什么?听着,我跟在座各位一样,没有水晶球,但我注意到 2025 年是 agent 之年,没错,那么 2026 年就是 harness 之年。我非常确定这个词在这里用了多少次。我希望,我觉得如果 2027 年能成为动态即时生成 harness 的一年,那该多酷啊。你会让一个 agent 说:嘿,替我办这个,给我买个飞机票,什么都行。然后在动手之前,agent 会先创建一个 harness。这有点像 plan mode,你们可能有人在用 plan mode,但这是加强版的。Agent 会真正创建一个 harness。它有自我意识,知道我这里可能会产生幻觉,我可以创建一个 harness,把活干了,再回到你这里,全程都有护栏。动态、即时 harness,这太酷了。老实说,我认为这是通往 通用人工智能 的下一个合乎逻辑的步骤。我很想看到它。我不知道这是不是只是我那个满脑子点子的怪家伙的想法,但我觉得这大致就是方向。那么我时间快到了,如果我不花最后大概 30 秒说声非常感谢,我会很过意不去的。换灯片。在 GitHub 上我也是,欢迎大家来找我多聊。谢谢。 [00:21:47]

返回该播客 打开原文