LangChain:只调 harness 不换模型,让 Nemotron 3 Ultra 跑分逼近 Opus 4.8,成本约 1/10,证明企业无需花重金购买闭源 API
- LangChain 固定 Nemotron 3 Ultra 权重,只改 harness(系统提示、工具描述、中间件),不改模型、不改温度等生成参数。
- 方法是评测驱动闭环:评测 → 读失败轨迹 → 聚类行为 → 改一处外壳 → 再评测;先小样本筛,再上全套。
- 提示词用短的单目标指令块;中间件做强制执行 + 在出错点塞信号。
- 关键机制:同一句规则写在工具描述里无效,塞进工具返回结果就有效;对话中途注入比系统提示常驻更稳。
- 典型 ~0.80→0.84,最佳 0.86 对 Opus 4.8 最佳 0.87;整套约 $4.48 vs $43.48,中位延迟都约 10 秒/题。
他们做了一件什么事
LangChain 发了一份 Nemotron 3 Ultra 的 harness 调优手册:模型不动,只改它外面那层脚手架,看开源模型在 agent 任务上能被抬到多高。
一句话:同一个开源模型,换一套合身的外壳,最佳跑分逼近 Claude Opus 4.8,全套评测成本大约低一个数量级。
为什么值得看:同一套权重、不同脚手架,分数可以差一截。他们此前把 gpt-5.2-codex 在 Terminal-Bench 2.0 从 52.8 提到 66.5,没动模型。这次把同一思路用在开源模型上,并给出接近 Opus 的成本对照。
生成参数保持厂商推荐默认。文中的提升,不是靠把 temperature 拧一下「碰运气」得来的。
外壳不合身时,马力去哪了
开源模型已经能扛真实 agent 活,价格是前沿 API 的零头。但再能干的模型,丢进不是为它建的 harness,也会发挥失常。
模型像发动机,harness 像底盘和挡位。发动机再好,挡位和传动对不上,马力也会浪费在空转和打滑上。调 harness,是在改挡位和传动,不是换发动机。
他们选 Nemotron 3 Ultra,是因为 NVIDIA 后训练时就让它跨多种 agent harness 表现稳定,而不是只练单轮聊天。无 profile 基线约 0.80,地板已经不低,外壳才有得加。
调优靠闭环,不靠猜
没有评测信号就是在猜。Agent 的输入空间大、可接受输出多,改一处可能修好 A 又弄坏 B。所以工作形态是闭环,以 LangSmith 轨迹为真相源。
聚类的是失败模式(比如「读文件半截就答」),不是某道题的措辞。蹭单题短语涨分的改动会被扔掉。
候选先过有代表性的小样本;过了再上全套。筛的样本要覆盖不同行为类型,避免筛里没碰到的任务全线回退。
提示词:别整页重写,对着失败写一小块
系统提示最便宜,也最容易高估。大段重写和「做个更好的 agent」常常被冲淡,因为能干模型真正的失败点通常不是措辞问题。
任务跑完却不报具体结果时,只加这一块,不塞别的:
<final_answer_completeness> After tool calls succeed, the final answer must report the concrete result, not just that the task is done. Include the key entity, action, identifier, title, recipient, service, status, or value that answers the user's request. If the user asked multiple questions, answer each one from its matching tool output. </final_answer_completeness>
同一句话,放的位置不同,结果完全相反
这是全文最值得盯的机制。他们想要一条规则:文件读取返回刚好满一页时,默认后面还有内容,继续读。
把这句话写进 read_file 的工具描述,模型读第一页就收工。一字不动,挪到工具返回结果旁边,模型开始继续读。
模型真正在处理的是「当前眼前的那段内容」。规则离那段内容越远,越像没写;贴在那段内容旁边,才会被读到。
中间件在干什么:两种钩子
有些行为必须「次次发生」,靠提示词不够。中间件挂在模型调用和工具调用周围:
对话中途注入:比系统提示更稳
Nemotron 对「进行到需要时出现的一条消息」比系统提示里的常驻规则更听话。中间件于是按这个节奏注两针:
什么留下,什么扔掉
试过的东西大多数没活下来。只报成功的调优循环,通常已经在过拟合。
调完数字怎么变
一个总分只告诉你更好或更差。他们按 agent 常干的活分项打分:文件、工具、检索、多轮对话、长上下文摘要。
无 profile 时没给压缩指引:该压不压,或只凭摘要对话答、不去读卸出的历史文件。补上显式指引后几乎拉满。
很多工具失败来自怎么描述、怎么重试、怎么收口,而不只是模型「不会用工具」。
开箱已强(后训练痕迹),外壳微调仍再挖一点。
长程保持后端状态一类问题几乎不动。他们不为此去扭曲 profile 刷榜。
外壳拧到哪一层就拧不动了
调 harness 有天花板。认清边界和认清收益一样重要。
第二道线画在 harness 内部:什么该进「所有 agent 共用的核心」,什么只是「某一个模型的 profile」。
项目里最值得反复问的一句:这个改动,能不能诚实往「核心」推一点?
When a failure doesn't respond to anything you change around the model, that's the signal it lives in the weights, and the fix is post-training, not another hook. LangChain · Tuning the harness, not the model
让开源 AI 逼近顶级模型:不用换更强的模型 → 只把它外面那层「外壳」调合身
LangChain 只动外壳、不碰模型,把开源的 Nemotron 3 Ultra 调到最佳跑分逼近 Claude Opus 4.8,一页带图讲清怎么做到、便宜多少。
↓ 一页读完 · 有一张会动的图
AI agent(能自己调用工具、一步步把活干完的 AI,不是只会聊天的那种),大家想让它更能干,第一反应是换更强的模型。这份手册走的是另一条路:模型外面还有一层「外壳」(harness),给它的开场指令、每个工具的说明书、夹在中间每一步都跑的处理逻辑。这层外壳,才是这次动刀的地方。
✘ 可只要把它丢进不是为它设计的外壳,它就发挥失常:重复追问、活没干完就收工、原地打转
为什么:外壳给的指令和工具说明跟这个模型的脾气对不上,力气全花在跟脚手架较劲,没花在任务上
思路很简单:模型权重一个字节都不改,只拧外壳三块,开场指令、工具说明书、中间处理逻辑。靠一个闭环一处处调:跑一遍评测(用固定题目打分)→ 翻出 AI 每一步的完整记录(trace)→ 找出它老在哪栽跟头 → 只改外壳一小处 → 再跑评测看分数动没动。先用小样本便宜地筛,过了才上全套。
最基本的一招:系统提示(开场那段定规矩的话)别整页重写,越写越长反而被淹没;对着失败只补一个单目标的小块。
仔细规划,注意各种边界……"
→ 太长太泛,被冲淡
工具成功后,答案要报出
具体结果,别只说"完成了"
</final_answer_completeness>
完整可抄的原文块在正文。但整份手册里最反直觉的一条,不是该写什么,而是该写在哪。
他们想让 AI 遵守一条规则:读文件时如果返回的内容刚好满一页,就默认后面还有,继续往下读。同一句话,写进工具的说明书里,AI 读完第一页就收工;一个字不改,挪到工具返回结果的旁边,AI 就乖乖继续翻。
同理,中间处理逻辑还会在 AI 正要动手前,往对话里现塞一句"先规划再执行",这种"到点才出现"的提醒,比开场就写死的常驻规则更管用。
跑同一套 Deep Agents 评测(LangChain 自家一套给 agent 打分的固定题库),质量几乎追平的前提下,两边的账单差一个数量级。
- × 重复追问
- × 没干完就收工
- × 原地打转
只拧它外面那层「外壳」。
定规矩的话
怎么用
都跑的逻辑
AI 读第 1 页就收工
AI 一路往下翻
