什么是Harness Engineering?——最小的Agent Harness
Harness Engineering 背景介绍1. 概念起源Harness套具/挽具 这个词最早来自领域含义马具控制马的装备让马的力量被正确引导电气工程测试套具Test Harness- 连接被测系统与测试设备的中间层软件测试自动测试框架负责执行测试用例并收集结果在 AI Agent 领域Harness 沿用了同样的隐喻Harness 控制 AI 能力的挽具让 AI 的输出被正确引导和执行2. 发展脉络阶段一纯 API 调用2022-2023用户 → LLM API → 返回文本 → 结束模型直接输出结果无法执行真实操作应用场景有限阶段二工具调用 Function Calling2023用户 → LLM API → 决定调用工具 → Harness 执行 → 返回结果 → 结束模型开始具备调用工具的能力但缺乏循环和状态管理阶段三完整 Agent Harness2023-至今用户 → [模型思考 → Harness 执行 → 模型思考 → Harness 执行 → ...] → 完成循环直到任务完成完整的上下文管理多工具协作错误恢复机制为什么需要 Harness核心问题模型不是万能的模型能做的模型实际不能做的理解自然语言真正读取你的文件生成代码真正运行代码推理和规划真正访问互联网写回答真正修改数据库Harness 的价值 把说和做分离模型负责决策Harness 负责执行。模型只负责思考和决策Harness 负责真正执行、管理上下文、控制循环。┌─────────────────────────────────────────────────────────────┐ │ Harness │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ 工具注册表 (TOOL_FUNCTIONS) │ │ │ │ - read_file() - calculate() - ... │ │ │ └─────────────────────────────────────────────────────┘ │ │ ▲ │ │ │ 调用工具 │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ Agent Loop (循环) │ │ │ │ 1. 发消息给模型 │ │ │ │ 2. 模型决定: 调用工具 or 给出答案 │ │ │ │ 3. 如果调用工具 → Harness 执行 → 返回结果 │ │ │ │ 4. 循环回到第1步 │ │ │ └─────────────────────────────────────────────────────┘ │ └─────────────────────────────────────────────────────────────┘ │ ▼ ┌───────────────┐ │ AI Model │ │ (Claude) │ │ 思考和决策 │ └───────────────┘以下是代码示例 最小 Agent Harness 示例 核心思想:模型只负责思考和决定调用什么工具, harness 负责真正执行工具、管理上下文、控制循环。 import json from anthropic import Anthropic client Anthropic() # 需要设置 ANTHROPIC_API_KEY 环境变量 # ---------- 1. 工具定义 ---------- # harness 里真正干活的函数。模型自己不能读文件、不能算数, # 它只能请求harness 帮它做,这就是工具存在的意义。 def read_file(path: str) - str: 读取一个文本文件的内容。 try: with open(path, r, encodingutf-8) as f: return f.read() except Exception as e: return f读取失败: {e} def calculate(expression: str) - str: 计算一个数学表达式,比如 2 * (3 4)。 try: # 生产环境别用 eval,这里只是演示。用 ast 或专用库更安全。 result eval(expression, {__builtins__: {}}, {}) return str(result) except Exception as e: return f计算失败: {e} # 工具的注册表:把函数名映射到真正的 Python 函数 TOOL_FUNCTIONS { read_file: read_file, calculate: calculate, } # 工具的 schema:告诉模型有哪些工具、怎么调用、参数是什么。 # 这段描述写得好不好,直接影响模型用不用得对工具。 TOOL_SCHEMAS [ { name: read_file, description: 读取指定路径的文本文件内容, input_schema: { type: object, properties: { path: {type: string, description: 文件路径} }, required: [path], }, }, { name: calculate, description: 计算一个数学表达式并返回结果, input_schema: { type: object, properties: { expression: { type: string, description: 要计算的表达式,如 2 * (3 4), } }, required: [expression], }, }, ] # ---------- 2. Agent Loop ---------- # 这是 harness 的心脏。 def run_agent(user_task: str, max_turns: int 10) - str: # messages 就是上下文。harness 的核心工作之一 # 就是决定这个列表里放什么、怎么增长。 messages [{role: user, content: user_task}] for turn in range(max_turns): # (a) 把当前上下文 工具列表发给模型,让它决定下一步 response client.messages.create( modelclaude-sonnet-4-20250514, max_tokens1024, toolsTOOL_SCHEMAS, messagesmessages, ) # (b) 把模型这一轮的输出加回上下文(关键:保持对话连续) messages.append({role: assistant, content: response.content}) # (c) 判断模型是想调用工具,还是已经给出最终答案 if response.stop_reason ! tool_use: # 模型没有要求调工具 → 认为任务完成,返回文本 final_text .join( block.text for block in response.content if block.type text ) return final_text # (d) 模型要求调用一个或多个工具 → harness 真正执行它们 tool_results [] for block in response.content: if block.type tool_use: fn TOOL_FUNCTIONS[block.name] print(f [调用工具] {block.name}({block.input})) result fn(**block.input) # 真正执行 tool_results.append({ type: tool_result, tool_use_id: block.id, # 对应上模型的请求 id content: result, }) # (e) 把工具执行结果作为一条 user 消息喂回去,进入下一轮 messages.append({role: user, content: tool_results}) return 达到最大轮次,未完成任务。 # ---------- 3. 跑起来 ---------- if __name__ __main__: answer run_agent(帮我算一下 (128 256) * 3 等于多少) print(\n最终回答:, answer)1. 工具定义Lines 13-70TOOL_FUNCTIONS { read_file: read_file, calculate: calculate, }为什么需要工具模型本身不能真正读取文件、做计算它只能请求Harness 帮它做工具 模型与真实世界交互的桥梁TOOL_SCHEMAS [ { name: read_file, description: 读取指定路径的文本文件内容, input_schema: {...} }, ... ]Schema 的重要性 描述写得越好模型用工具越准确。2. Agent LoopLines 73-118这是 Harness 的心脏for turn in range(max_turns): # (a) 发消息给模型让它决定下一步 response client.messages.create(...) # (b) 把模型输出加回上下文 messages.append({role: assistant, content: response.content}) # (c) 判断是调用工具还是给出答案 if response.stop_reason ! tool_use: return final_text # 完成 # (d) Harness 真正执行工具 for block in response.content: if block.type tool_use: result fn(**block.input) # 执行 # (e) 把结果喂回去进入下一轮 messages.append({role: user, content: tool_results})3. 运行示例Lines 122-125answer run_agent(帮我算一下 (128 256) * 3 等于多少)执行流程 模型收到任务 → 我需要调用 calculate 工具 Harness 执行 → calculate((128 256) * 3) → 1152 模型收到结果 → 给出最终回答答案是 1152总结Harness Engineering 的兴起是 LLM 应用成熟的必然结果从玩具到生产力 - LLM 需要真正做事而不只是说话安全与可控 - 把危险操作隔离在 Harness 层可靠性保障 - 模型可能出错Harness 需要兜底工程化需求 - 可测试、可监控、可迭代

相关新闻

博容安可4G定位室内实测:地下车库、电梯、隧道求救信号能发出吗?

博容安可4G定位室内实测:地下车库、电梯、隧道求救信号能发出吗?

摘要:卫星定位在室内、地下车库等场景常失效。本文解析博容安可多模定位技术的补盲机制,验证其在卫星信号盲区内的求救可靠性。一、卫星定位的物理局限GPS与北斗卫星信号强度仅为手机信号的万分之一,无法穿透钢筋混凝土建筑、金属电梯轿厢与山…

2026/7/20 5:30:51 阅读更多 →
山西人做阳光房,别再拿南方货凑数了!

山西人做阳光房,别再拿南方货凑数了!

你是不是也曾憧憬过一个阳光房? 冬日暖阳洒满全身,夏夜抬头就是星空,喝茶、养花、发呆,好不惬意。 可真装完才发现,理想有多丰满,现实就有多骨感 —— 冬天,冰得像露天阳台,型材凉得…

2026/7/20 13:13:47 阅读更多 →
ChatGPT写单元测试,从入门到上线:覆盖Spring Boot/React/Python三大生态,附13个生产级可复用测试片段

ChatGPT写单元测试,从入门到上线:覆盖Spring Boot/React/Python三大生态,附13个生产级可复用测试片段

更多请点击: https://kaifayun.com 第一章:ChatGPT写单元测试:认知跃迁与工程价值重定义 传统单元测试编写长期被视作“必要但低效”的负担——开发者需在功能实现后回溯设计用例、构造边界条件、维护断言逻辑,耗时且易遗漏。而当…

2026/7/20 13:13:51 阅读更多 →

最新新闻

5分钟快速搭建Mindustry服务器:从零到联机的完整指南

5分钟快速搭建Mindustry服务器:从零到联机的完整指南

5分钟快速搭建Mindustry服务器:从零到联机的完整指南 【免费下载链接】Mindustry The automation tower defense RTS 项目地址: https://gitcode.com/GitHub_Trending/min/Mindustry 还在为找不到稳定的Mindustry联机服务器而烦恼吗?想和好友一起…

2026/7/21 15:35:34 阅读更多 →
16X16点阵模块驱动与优化实战

16X16点阵模块驱动与优化实战

1. 项目概述:16X16点阵模块的硬核玩法 这个16X16点阵模块项目,本质上是用256个LED组成的微型显示屏,通过单片机控制实现文字、图案的动态显示。我选择STC8G1K08A这款国产单片机作为主控,配合经典的74HC595移位寄存器来扩展IO口——…

2026/7/21 15:35:34 阅读更多 →
Unity集成讯飞语音SDK实战:从ASR、TTS到完整语音交互闭环

Unity集成讯飞语音SDK实战:从ASR、TTS到完整语音交互闭环

1. 项目概述:为什么要在Unity里集成语音交互?如果你正在用Unity开发一款需要“开口说话”的应用,比如智能语音助手、教育类App、游戏内的语音指令,或者为视障人士提供便利的交互工具,那么集成一个稳定、高效的语音交互…

2026/7/21 15:35:34 阅读更多 →
基于QT(C++)实现Windows 自启动项查看和分析

基于QT(C++)实现Windows 自启动项查看和分析

♻️ 资源 大小: 3.47MB ➡️ 资源下载:https://download.csdn.net/download/s1t16/87453199 Windows 自启动项查看和分析 简介 此时实验中,我们主要需要掌握下面的内容 注册表读取 注册表的读写是本次实验的重点内容,主要的…

2026/7/21 15:35:34 阅读更多 →
手机应用权限管理:风险与防护指南

手机应用权限管理:风险与防护指南

1. 手机应用权限管理的现状与风险上周三早上,我像往常一样打开手机相册准备查看前几天拍摄的照片,却发现整个相册空空如也。那一刻的恐慌感至今记忆犹新——孩子出生以来的所有照片、工作重要文档的扫描件、积累多年的设计素材,全都不翼而飞。…

2026/7/21 15:35:34 阅读更多 →
魔兽争霸3终极优化指南:用WarcraftHelper解锁完美游戏体验

魔兽争霸3终极优化指南:用WarcraftHelper解锁完美游戏体验

魔兽争霸3终极优化指南:用WarcraftHelper解锁完美游戏体验 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为魔兽争霸3在现代电脑上的…

2026/7/21 15:34:33 阅读更多 →

日新闻

Octane Render与C4D汉化版安装与优化指南

Octane Render与C4D汉化版安装与优化指南

1. Octane Render与C4D的黄金组合:为什么选择这个方案?在三维创作领域,渲染器的选择往往决定了作品的最终呈现质量和工作效率。作为Cinema 4D(C4D)用户,Octane Render的GPU加速特性与实时预览功能&#xff…

2026/7/21 0:00:19 阅读更多 →
GPMC接口设计:异步/同步模式与多路复用配置实战

GPMC接口设计:异步/同步模式与多路复用配置实战

1. GPMC接口设计:从硬件连接到软件配置的全局视角在嵌入式系统开发中,尤其是基于TI Sitara系列如AM263x这类高性能微控制器的项目里,外部存储器的扩展几乎是绕不开的一环。无论是存放大量非易失性代码的NOR Flash,还是作为高速数据…

2026/7/21 0:00:19 阅读更多 →
UE5 GAS框架下RPG被动技能系统:从核心原理到实战实现

UE5 GAS框架下RPG被动技能系统:从核心原理到实战实现

1. 项目概述:UE5 GAS RPG被动技能的核心价值在UE5里用GAS(Gameplay Ability System)做RPG游戏,主动技能像是你手里的武器,按一下打一下,逻辑直接,反馈也快。但被动技能,它更像是你身…

2026/7/21 0:00:19 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/21 8:48:31 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/21 5:34:47 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/21 8:25:39 阅读更多 →

月新闻