拓冰建站拓冰建站
首页 / 资讯中心 / 正文

Harness工程框架:如何让普通模型在评测中反超旗舰AI

这场对比最近在开发者圈子里讨论度很高某个价格贵出 57.1 倍的旗舰模型在五项评测任务中全部输给了一套由相对廉价模型驱动的自动化方案。看到这个结果大部分人第一反应是“怎么可能”第二反应是“它到底用了什么黑科技”。答案并不神秘也不在模型本身。真正扭转战局的是一层过去很多开发者并不太重视的工程外壳——Harness。如果你也在做 Agent 开发、模型选型、或者正在纠结要不要接入更贵的模型来提升效果这篇文章值得看完。我会先用一个大白话讲清楚 Harness 到底是什么再分析它为什么能在多项测试里反超更强的模型最后给出一套最小可运行的 Harness 示例代码并总结工程落地时的常见坑和最佳实践。1. 这场“贵 57.1 倍却全输”的对决究竟说明了什么1.1 单看结果非常反直觉按照这场对比的设定参战的双方并不是同一条赛道上各跑一次而是一方“裸跑”另一方被一套完整系统包裹着运行。前者使用的是目前市面上价格极高的旗舰模型每次调用的成本约为后者的 57.1 倍后者使用的是成熟但成本低得多的通用模型配合 Harness 工程框架最终在五项评测任务中全部胜出。这个结果确实有冲击力。它很容易让一部分人得出“旗舰模型不行”的结论但这个结论并不准确。更准确的说法是在只比较模型本身时旗舰模型的单点能力大概率仍然更强可一旦进入真实任务场景模型能力就不再是唯一决定因素模型周围的工程系统开始起主导作用。1.2 真正改变的变量是“模型外面的那层系统”很多评测基准的设计其实是静态的给模型一个问题模型直接输出答案然后比正确率。这种测试方式考察的是模型的“记忆”和“单次推理能力”。但现实世界的任务通常是动态的任务需要拆解成多步中间要查资料、调接口、读文件执行结果还要验证。如果只给模型一个对话框它相当于一台没有图纸、没有工具、也没有验收标准的发动机。而 Harness 正是负责把发动机装进整车的那套系统它提供方向盘、刹车、导航、仪表盘和安全气囊。所以这场对比的胜负手并不在“谁的发动机排量更大”而在于“谁真的上了路”。1.3 这不是模型无用论而是工程红利期需要明确一个判断这篇文章并不是在说模型不重要。恰恰相反模型是 Harness 发挥价值的基础。没有足够聪明的模型再好的 Harness 也没有意义。但模型能力的发展正在进入边际收益递减的阶段。旗舰模型每一次升级带来的单点能力提升可能从“天翻地覆”变成了“稳步向前”。与此同时Harness 工程带来的提升空间还远没有被榨干。同一个模型用不同的编排方式、不同的工具调用策略、不同的上下文管理方案最终效果可以差出一个量级。这意味着当前阶段的竞争逻辑正在发生变化从“谁家模型参数大”慢慢转向“谁家的 Harness 管线更会使用模型”。2. Harness 到底是什么从“缰绳”到 Agent 的工程外壳2.1 一个容易被误解的术语Harness 的英文原意是“马具、缰绳”在工程领域通常被翻译为“控制台”或“工程框架”。放在大模型语境下Harness 可以理解为一个包裹在模型外面的工程系统它负责调度模型、管理上下文、调用外部工具、校验输出结果并在出错时进行重试和修正。换句话说模型负责“思考”Harness 负责“让思考真正落地”。很多开发者第一次听到这个词会以为它又是一个新的提示词技巧或者某个框架的营销包装。实际上Harness 是一个比“提示词工程”更大的概念。提示词只是 Harness 中的一个环节Harness 还需要处理工具调用、循环控制、错误恢复、结果验证、日志追踪等一系列问题。2.2 Harness、Agent、提示词工程的区别为了把这几个概念理清楚我用一张表做对比概念核心关注点典型工作内容可以独立运行吗提示词工程如何让模型输出更符合预期设计 System Prompt、Few-shot 示例、输出格式约束可以但能力有限Agent让模型能够自主完成多步任务规划、行动、观察、再规划的循环通常需要工具支持Harness承载 Agent 的完整工程外壳上下文管理、工具注册、执行循环、校验、日志、权限控制需要模型和工具配合简单来说Agent 是一种应用形态而 Harness 是支撑这种形态的工程底座。你可以写一个非常简单的 Agent但要让 Agent 在高复杂度任务中稳定、可控、可观测就需要一套像样的 Harness。2.3 最直观的类比赛车与赛道很多初学者会把“模型测试”理解成两辆车比发动机马力。但真实比赛比的从来不只是马力还有赛道条件、轮胎选择、进站策略、车手对弯道的处理。模型 发动机决定车辆的动力上限。Harness 整车调校 车队策略决定动力能否有效转化为圈速。评测任务 某一条具体赛道。一个马力很大的赛车如果轮胎没选对、进站策略混乱、刹车点全错输给一辆马力更小但调校优秀的赛车其实并不稀奇。这场“贵 57.1 倍却全输”的对决本质就是“发动机排量优势”输给了“整车工程优势”。3. 为什么“便宜的模型 好的 Harness”能反超旗舰模型3.1 多轮交互比单轮智力更关键旗舰模型和普通模型之间的差距主要体现在单次推理的“聪明程度”上更复杂的逻辑推理、更难的长文本理解、更精准的代码生成。但真实任务往往是多轮的。Harness 把一个大任务拆成多个小步骤每一步都让模型只负责一个小问题并且把上一步的结果反馈给模型继续推理。这样一来模型的单点能力弱点可以通过多轮迭代来弥补。一个典型流程是模型先分析任务列出执行计划。执行第一步拿到中间结果。把中间结果反馈给模型判断结果是否正确。如果正确继续下一步如果不正确修改策略重新执行。完成全部步骤后汇总最终答案。在这种模式下普通模型每轮只回答一个简单问题出错的概率大幅下降而旗舰模型在没有 Harness 的情况下需要一口气完成任务任何一步出错都可能导致最终结果失败。3.2 工具调用与验证闭环可以“纠正”幻觉大模型的幻觉问题短期无法根治但 Harness 可以用“工具验证”来对冲。举个例子如果让模型回答“某个城市今天天气如何”模型可能直接编一个答案。但在 Harness 中模型不会被要求直接输出天气而是被要求调用一个天气查询工具。工具返回什么Harness 就采用什么。模型的任务从“编造答案”变成了“决定调用哪个工具、如何解析工具返回的结果”。这种“答案不从模型参数里来而从外部工具来”的设计能够显著降低幻觉影响。旗舰模型裸跑输给普通模型加 Harness很多时候不是输在智力上而是输在“没有工具可用只能硬答”。3.3 成本结构发生了转移价格差 57.1 倍听起来是一个不可逾越的鸿沟但 Harness 的出现让成本结构发生了转移。旗舰模型一次调用很贵但如果它一次就能给出正确答案总成本未必高。反过来普通模型一次调用很便宜如果它需要十次、二十次调用才能完成任务总成本也会上来。这场对比真正揭示的不是“便宜模型一定更划算”而是“总成本 单次调用价格 × 调用次数 × 成功率”。在一个设计良好的 Harness 中普通模型可以用多次廉价调用换取更高的成功率。当成功率足够高时即便调用次数增加总成本依然远低于一次性调用旗舰模型。这意味着模型的性价比不能只看单价还要看单位任务完成成本。3.4 评测闭环让 Harness 可以在任务上快速进化还有一点常被忽略Harness 本身是可以用评测任务来“调优”的。模型发布之后它的权重是固定的你无法用一场评测让模型变聪明。但 Harness 不同它的提示词、工具列表、执行策略、校验规则全部掌握在开发者手中。面对一项评测任务开发者可以持续迭代 Harness 的每一步直到任务通过。模型能力是静态的Harness 是动态的。这是“工程红利”的真正来源。4. 一个 Harness 系统的典型组成4.1 核心组件清单一个功能完整的 Harness 通常由以下组件组成组件职责关键点任务解析器把用户输入转为结构化任务明确目标、约束、输入参数规划器生成执行计划通常由模型动态生成也可以采用固定流程模板工具层注册并调度外部能力搜索、数据库、HTTP API、文件读写、代码执行器等执行循环控制多轮调用的主流程规划 - 执行 - 观察 - 再规划直到完成校验器检查每一步输出是否正确规则校验、类型校验、断言校验、人工确认上下文管理器管理历史消息和中间结果避免上下文过长必要时压缩或摘要日志与回放记录完整调用轨迹用于排查问题、评估 Harness 效果权限控制器限制工具和模型的执行范围防止高危操作、数据泄露和误操作4.2 一次任务在 Harness 中是怎么流动的文字流程如下内部结构一目了然用户任务输入 - 任务解析器拆解为结构化目标 - 规划器生成执行计划 - 执行循环逐条执行计划 - 模型决定调用哪个工具 - 工具执行并返回结果 - 校验器检查结果 - 结果反馈给模型继续下一步 - 所有步骤完成后汇总最终答案 - 写入日志与回放这里的关键是“校验器”。没有校验器的 Harness 只是把模型调用包了一层壳并不能真正保证输出质量。校验器可以是简单的格式检查也可以是“让工具执行一下看是否报错”的动态验证还可以是“把结果交给另一个模型做交叉评判”的复杂机制。5. 实战写一个最小可运行的 Harness理论讲再多不如动手写一个 Demo。下面我实现一个最简 Harness核心循环只有 80 行左右但已经包含规划、执行、校验、循环四个核心环节。5.1 环境准备推荐使用 Python 3.10 及以上版本不需要任何第三方框架只需要标准库即可。如果你要接入真实模型 API再额外安装requests。# 建议先创建虚拟环境 python -m venv venv source venv/bin/activate # 如果后续要接真实 API pip install requests5.2 定义工具层Harness 的工具层就是一组普通函数加上元信息# 文件路径tools.py import random def add(a: float, b: float) - float: 两个数字相加。 return a b def get_weather(city: str) - str: 模拟获取某个城市的天气。实际项目中这里应替换为真实 API 调用。 weather_list [晴, 多云, 小雨, 阴] return f{city}{random.choice(weather_list)}25℃ TOOL_REGISTRY [ { name: add, description: 计算两个数字之和, parameters: [a, b], func: add, }, { name: get_weather, description: 获取一个城市的天气情况, parameters: [city], func: get_weather, }, ]这段代码定义了两个示例工具。真实项目中工具层往往对应搜索服务、数据库客户端、内部 API、代码执行器等。工具层的设计原则是每个工具只做一件事输入输出尽量结构化。5.3 实现规划-执行-校验循环接下来是核心 Harness 类# 文件路径mini_harness.py import json class MiniHarness: def __init__(self, llm_func, tools, max_rounds6): self.llm_func llm_func self.tool_map {t[name]: t for t in tools} self.max_rounds max_rounds def _call_tool(self, tool_name: str, params: dict): tool self.tool_map.get(tool_name) if not tool: return {error: f工具 {tool_name} 不存在请从以下工具中选择{list(self.tool_map.keys())}} try: result tool[func](**params) return {result: result} except Exception as e: return {error: str(e)} def run(self, task: str) - str: messages [ { role: system, content: ( 你是一个任务执行助手。你必须以 JSON 格式输出你的下一步动作 JSON 格式为 {type: call_tool, tool: 工具名, params: {...}} 或 {type: finish, answer: 最终答案} ), }, {role: user, content: task}, ] for i in range(self.max_rounds): print(f------ 第 {i 1} 轮 ------) response self.llm_func(messages) print(f模型输出: {response}) try: action json.loads(response) except json.JSONDecodeError: messages.append({role: user, content: 你的输出不是合法 JSON请重新输出。}) continue if action[type] finish: return action.get(answer, ) if action[type] call_tool: tool_name action.get(tool, ) params action.get(params, {}) result self._call_tool(tool_name, params) print(f工具返回: {result}) messages.append( {role: user, content: f工具执行结果{json.dumps(result, ensure_asciiFalse)}} ) raise TimeoutError(超过最大轮次仍未完成任务)这段代码的核心在run方法里模型每轮输出一个 JSON 动作Harness 负责解析动作、执行工具、把结果返回给模型直到模型认为任务完成。5.4 接入真实模型DeepSeek 示例为了跑通完整流程我们需要一个llm_func。先用一个 Mock 函数验证循环逻辑再给出真实模型接入方式。Mock 函数# 文件路径main.py import json from mini_harness import MiniHarness from tools import TOOL_REGISTRY def mock_llm(messages): 模拟模型输出验证 Harness 循环是否正常。 last_user messages[-1][content] if 工具执行结果 in last_user: return json.dumps({type: finish, answer: 已根据工具结果完成计算。}) return json.dumps({type: call_tool, tool: add, params: {a: 1, b: 2}}) if __name__ __main__: harness MiniHarness(llm_funcmock_llm, toolsTOOL_REGISTRY, max_rounds6) answer harness.run(请计算 1 2 等于多少) print(最终答案, answer)运行方式python main.py预期输出大致如下------ 第 1 轮 ------ 模型输出: {type: call_tool, tool: add, params: {a: 1, b: 2}} 工具返回: {result: 3} ------ 第 2 轮 ------ 模型输出: {type: finish, answer: 已根据工具结果完成计算。} 最终答案 已根据工具结果完成计算。接入真实 DeepSeek 模型时只需要把llm_func换成真实 API 调用# 文件路径deepseek_client.py import requests def call_deepseek(messages, api_key: str) - str: 调用 DeepSeek Chat 接口返回模型文本。 headers { Authorization: fBearer {api_key}, Content-Type: application/json, } payload { model: deepseek-chat, messages: messages, temperature: 0.2, } resp requests.post( https://api.deepseek.com/chat/completions, headersheaders, jsonpayload, timeout60, ) resp.raise_for_status() return resp.json()[choices][0][message][content]这时只需要修改main.py中的llm_funcimport os from deepseek_client import call_deepseek API_KEY os.environ.get(DEEPSEEK_API_KEY, ) harness MiniHarness( llm_funclambda messages: call_deepseek(messages, API_KEY), toolsTOOL_REGISTRY, max_rounds6, )注意真实模型的输出不一定每次都严格符合 JSON 格式所以实际项目中还需要在 Harness 里加入输出修正和重试机制。6. 常见问题与排查思路在安装和使用 Harness 相关开源项目时开发者最常遇到的问题大致如下问题现象可能原因排查方式解决方案安装依赖时卡住例如pnpm dsh web长时间无响应网络源不稳定或 pnpm 版本过低查看 pnpm 日志检查 Node.js 版本切换国内镜像源升级 pnpm 到最新版本必要时清理 pnpm 缓存后重试模型输出经常不是合法 JSON导致 Harness 循环卡住Prompt 约束不够强模型频繁输出解释性文字查看日志中模型原始输出在 System Prompt 中强化格式要求增加输出修正函数使用response_format等结构化输出能力工具调用后结果没有反馈给模型上下文拼接逻辑写错缺少用户消息追加打印每次循环的 messages确认工具执行结果已经被 append 到 messages任务超过最大轮次仍未完成任务太复杂或模型一直重复错误动作查看执行轨迹定位循环点增加最大轮次改进规划器增加工具返回结果的校验规则API 调用成本比预期高Harness 中缺少终止条件模型反复调用工具观察日志中调用次数增加完成条件判断限制单任务最大调用次数对中间结果做缓存其中我要特别提醒pnpm dsh web这类安装坑。社区里一些 Harness 项目是 Node.js/TypeScript 技术栈安装时会执行pnpm dsh web来构建可视化管理界面。这一步卡住大多不是项目本身的问题而是环境问题。先确认 Node 版本是否满足项目要求再检查 pnpm 配置的镜像源通常就能解决。7. 工程化建议从“跑通 Demo”到“上生产”7.1 评测集先行很多团队接入 Harness 时跳过评测直接上生产这是风险最高的做法。正确的做法是先准备一个小规模评测集包含二三十个真实任务每个任务标注好预期结果。每次修改 Harness 代码都在评测集上跑一遍用通过率来量化改动效果。没有评测集的 Agent 开发等于闭着眼睛调参。7.2 可观测性必须内置Harness 比普通模型调用复杂得多日志不能再只记“传入什么、返回什么”。建议至少记录以下信息每次模型调用的完整输入输出。每个工具的执行参数和返回值。每轮循环的决策依据。任务整体耗时和调用成本。日志格式建议统一为 JSON便于后续检索和分析。7.3 安全边界要提前设计Harness 给了模型调用工具的能力也意味着模型获得了更大的破坏半径。生产环境必须做到最小权限数据库连接使用只读账号除非业务确实需要写操作。文件操作限定在指定目录禁止任意路径读写。代码执行类工具必须运行在沙箱或隔离容器中。高危操作默认禁止必须显式授权后才会执行。这里的底线是模型永远不应该拥有超出业务必要范围的权限。7.4 模型与 Harness 解耦在实际工程中不要把 Harness 绑定到某个具体模型上。模型接口应该抽象成统一的函数签名例如“接收消息列表返回模型文本”。这样切换模型时只需要替换底层调用不需要改动 Harness 核心逻辑。这套设计在模型快速迭代的当下尤其重要。今天你用 DeepSeek明天可能想换更新的模型如果 Harness 和模型强绑定迁移成本会非常高。8. 结语模型决定下限Harness 决定上限回到开头那场对比贵 57.1 倍的旗舰模型五项全输真正输在模型外面那层工程系统上。这给我们的启发其实很实际如果你觉得当前模型的效果不够好不一定非要等下一代旗舰模型降价也可以先检查一下自己的“模型用法”是不是太粗糙了。你是在用一个裸模型硬答所有问题还是把它放进了带工具、带校验、带循环的执行系统里模型能力决定效果的下限Harness 工程能力决定效果的上限。在模型能力普遍够用、价格持续下降的当下花时间打磨 Harness可能是比单纯追求更强模型更高性价比的选择。建议你先从本文的最小 Harness 跑起理解规划、执行、校验、循环这四件事再逐步加入工具层、评测集和日志系统。等这套工程骨架跑顺了再回头看各种 Agent 开源项目你会更容易看清它们的核心设计和真正的价值所在。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门