资讯动态

OpenWorkBuddy拆解:Agent Harness如何让LLM输出可验收

发布时间:2026/10/27 1:28:47 来源:尧图企业网站定制
1. 为什么调通API和交付一份产物之间隔着一条河过去大半年我一直在折腾各种LLM落地项目最深的感受是让模型吐出一段话很容易但让它稳定地产出一份能直接交给上级、发给客户、归档入系统的办公文档完全是另一回事。GPT类模型在对话框里聊得头头是道一旦放进真实业务流程问题立刻暴露格式漂移、数据幻觉、中途断掉、参数满天飞。这时候我才真正理解了为什么圈子里开始频繁讨论Agent Harness这个词——它不是什么新模型也不是某个炫酷的UI框架而是一层把LLM的自由发挥和业务流程的确定性要求隔开的工程骨架。我最近在研究一个叫OpenWorkBuddy的开源项目它的定位非常有意思一个专门把LLM调用收拾成可验收办公产物的Agent Harness。所谓办公产物就是周报、会议纪要、客户跟进邮件、数据汇总表、项目复盘文档这类东西。OpenWorkBuddy做的事简单说就是你给我一个任务描述我负责调度模型、调工具、查数据、反复校验最后交付一份格式正确、内容有据可查、可以被人事后审计的东西。这套思路对正在做LLM工程化、想把模型能力塞进OA系统或内部工作流的人特别有参考价值。这篇文章不是官方文档翻译而是我从为什么需要Harness它到底怎么把不可控的模型输出变成可控产物这两个问题出发结合OpenWorkBuddy的设计思路和我的实践踩坑做一次完整的拆解。项目本身的代码在GitHub上可以找到但更值得消化的是它背后那套工程思想——理解了它你甚至可以用自己的框架复刻出同样的效果。先把我理解的核心结论放在前面Agent Harness不是给模型加限制的镣铐而是给模型修了一条从生成文本通往完成工作的轨道。镣铐只会让模型变得更笨轨道则让模型的智力能真正作用到目标上。2. 裸调LLM和Agent Harness的本质区别控制面与执行面的分离2.1 裸调LLM的真实困境先说一个我自己的翻车案例。之前做一个内部项目需要让LLM根据销售团队的聊天记录生成每日跟进摘要。最初方案非常简单把聊天记录拼进Prompt调一次API让模型输出摘要。Demo阶段效果惊艳摘要写得比人还清楚。但真正跑起来之后稳定性的问题一个个冒出来。第一个问题是格式漂移。我明明在System Prompt里写了以JSON格式输出包含summary、next_action、priority三个字段结果模型偶尔多出几个字段偶尔把JSON包在Markdown代码块里偶尔直接输出好的以下是摘要……这类废话。第二个问题是事实性错误。模型会把我给的数据里的数字张冠李戴日期算错甚至把某个客户的名字写成另一个客户的。第三个问题是工具脱节。我本来希望模型在不确定的时候去查一下客户管理系统但裸API调用里模型只能干巴巴地输出建议人工核实。这些问题的根源在于裸调LLM的代码里模型的输出是直接进入业务流程的中间没有任何缓冲和校验地带。模型说错话系统就把错话当成真话用。而人类员工犯错至少还有复核机制模型犯错是瞬间的、无意识的、批量发生的。2.2 Harness到底是个什么概念Harness这个词在英文里有缰绳挽具的意思用在AI领域它指的是模型与外部世界之间那层工程装置。它不给模型下命令那是Prompt的事也不替模型做决定那是流程的事它做的是三件事约束模型的行为边界、提供模型完成任务所需的能力、检查模型输出是否符合预期。这里要强调一个经常被混淆的点Harness和Agent本身不是一回事。Agent是那个有目标、能推理、会调用工具的智能体它负责思考和决策Harness是包裹在Agent外面的那层骨架负责把Agent的决策变成安全的、可追踪的、可回滚的行动。Agent犯错是能力问题Harness兜不住错就是工程质量问题。OpenWorkBuddy选择把自己定位成Harness而非Agent框架是非常清醒的设计决策。用开车来类比Agent是司机Harness是车辆本身。司机技术好不好决定了能不能到目的地但车辆的安全带、刹车、仪表盘决定了司机犯迷糊的时候会发生什么。很多团队都在拼命调校司机换更大的模型、写更复杂的Prompt却忽略了给车装上刹车和仪表盘。2.3 OpenWorkBuddy的架构思路三明治式分层OpenWorkBuddy的架构如果剥开来看其实是三层标准的三明治任务编排层、工具执行层、产物校验层。模型本身被夹在中间只负责它最擅长的事——理解意图和生成内容而下一步该做什么这个数据对不对这份文档能不能交出去全部由Harness来决定。任务编排层接收到的是一个类似把上周项目进度整理成周报的自然语言目标。OpenWorkBuddy会先把它解析成一个结构化任务树需要收集哪些数据、按什么模板组织、谁来写初稿、谁来校验。这一步相当于项目经理在开工前把活拆解成工作包。工具执行层负责让模型能真正触达业务系统——OA审批记录、项目管理工具、数据库、文件系统都通过预定义的工具接口暴露给模型。产物校验层则是OpenWorkBuddy最有价值的创新点每一份输出在交付前都会经过多道校验包括格式schema校验、数据交叉核对、逻辑一致性检查甚至调用另一个模型实例反向审校。校验不通过就返回给生成层打回重写不是简单报错完事。这个分层的核心价值在于它把不可控的模型输出挡在了业务系统之外。模型生成的永远只是一份草稿真正的产物是Harness在草稿基础上经过校验、修正、加固之后产生的。这样即使模型偶尔抽风最终落到业务系统里的东西依然是干净的。3. 核心机制拆解OpenWorkBuddy如何让LLM输出变得可验收3.1 关键设计一结构化输出约束与Schema校验很多团队做LLM应用时最喜欢在Prompt里写请严格按照JSON格式输出。OpenWorkBuddy的做法更硬核它在模型调用层直接注入严格的结构化输出约束同时在后端接了一道Schema校验器。模型的原始输出先过校验器不符合要求的直接判定为无效输出并触发重试。这套设计我实测下来最大的价值不是防格式错误而是把模型的输出从对话文本变成了程序可处理的数据。只有输出是结构化的后续的校验、修正、入库、审计才有可能自动完成。如果模型输出的是散文任何自动化处理都是空谈。OpenWorkBuddy在配置里允许你定义输出Schema比如一份会议纪要必须有attendees、decisions、action_items、risks四个顶级字段每个字段有类型约束和必填标记校验器负责强制执行。这里有个实操细节容易被忽略Schema不要设计得过细。我们最初给每个action_item都定义了owner、deadline、status三个子字段结果模型频繁生成失败因为一旦某个字段它拿不准整个输出都作废。后来学到的经验是Schema只需要约束到业务必须拿到的最小字段集合那些锦上添花的信息让模型自由发挥反而效果更好。3.2 关键设计二工具调用闭环让模型不再凭空编造办公产物的核心要求是有据可查。LLM凭空生成一段看起来很有道理的数据很容易但OpenWorkBuddy做了个聪明的事把模型的生成路径强制和工具调用绑定在一起。比如生成周报时模型被要求先从项目管理工具里拉取本周完成的任务列表而不是凭记忆写。工具返回的数据会直接注入上下文模型只能基于这些实际数据做归纳和表述。更关键的是OpenWorkBuddy在输出里保留了数据引用标记——生成文档时每个核心结论后面对应着它在哪条原始记录里有依据。这样人在验收产物时可以点开追溯链看到这句话是从哪条任务记录、哪条沟通记录里概括出来的。这类设计的工程难度不在调用工具本身而在让模型学会为了引用而调用工具。OpenWorkBuddy采用的方法是先让模型输出一份信息需求清单Harness根据清单去拉数据再把数据拼接回Prompt让模型生成正文。这个模式的好处是拉数据和写文档两件事分开每件事都简单可控不会出现模型为了写一段话中途停下来调工具导致流程卡死的情况。3.3 关键设计三LLM-as-Judge校验回路这是OpenWorkBuddy最体现可验收精髓的地方。第一轮生成的草稿会交给一个独立的模型实例或者同一模型的高温度设置进行反向审校。审校模型不写内容只做判断格式是否符合要求、数据是否和原料匹配、逻辑是否连贯、有没有明显的幻觉。我第一次看到这个设计时觉得有点脱裤子放屁——用一个模型检查另一个模型的输出靠谱吗但实际用下来发现这恰恰是工程上极其有效的手法。因为生成模型和审校模型的角色不同、Prompt不同、注意力焦点不同审校模型能发现生成模型陷入惯性时的疏漏。很多幻觉错误不是模型不知道正确答案而是它在生成长文本的过程中迷失了方向另一个视角重新审一遍就能揪出来。审校结果会生成一个问题列表带着问题反馈回生成层做针对性修订。OpenWorkBuddy还允许配置审校轮次上限防止模型在自我检查和重写的循环里无限打转。默认配置是两轮第一轮修格式和数据错误第二轮修逻辑和表达问题。超过两轮仍然不合格就直接挂起转人工介入绝不自动放行。3.4 关键设计四容错与状态管理失败不是听天由命构建可靠AI系统有一个绕不开的问题模型一定会犯错工具一定会超时外部系统一定会偶尔不可用。之前看到一些AI Agent相关的讨论标题是识的LLM智能体自主容错控制构建可靠AI系统的工程实践这个词条直指核心——容错不是让系统不出错而是让系统在出错之后还能给出可接受的交付。OpenWorkBuddy的容错机制有四个层次。第一层是重试工具调用失败就换个参数重试模型生成失败就调整温度或换模型实例重试。第二层是降级某个工具不可用时切换到备用数据源实在没有备用源就在产物里明确标注数据截至XX时间来自缓存宁可降低信息新鲜度也不假装数据存在。第三层是隔离某个任务的失败不会阻塞整个任务链失败节点会被标记并记录上下文其他节点继续执行。第四层是人工介入兜底出了无法自动修复的错误系统生成一份完整的失败报告包含出错的环节、当时的上下文、已经尝试过的修复动作转给人来处理。我最喜欢的是它的活跃度概念。OpenWorkBuddy在执行过程中会持续跟踪每个节点的状态如果一个节点的重试次数超过阈值它会主动缩小任务的执行范围。比如原本要生成一份包含五个章节的行业分析报告如果数据收集阶段反复失败系统会先交付一个只有三个章节的部分产物并在报告开头显著标注数据完整度而不是让整个任务卡死。4. 实战复盘基于OpenWorkBuddy思路搭建一个最小可用的会议纪要Agent4.1 选型与准备我实际用OpenWorkBuddy做了个最小验证目标是让一个Agent根据会议录音转写文本生成结构化的会议纪要。选这个场景是因为它充分体现办公产物的典型要求格式要统一、决策要清晰、待办要可追踪而且录音转写本身就容易产生噪音和模糊表达很适合验证Harness的兜底能力。准备阶段需要三样东西一个LLM推理服务我用了OpenAI兼容接口的本地部署方便调试一个转写服务把录音变成带时间戳的文本还有一个放产物的目录结构。OpenWorkBuddy支持通过配置文件声明这些外部依赖格式类似下面这样# buddy_config.yaml基于OpenWorkBuddy的常见配置格式 provider: type: openai_compatible base_url: http://localhost:8080/v1 model: qwen2.5-14b-instruct temperature: 0.3 transcription: type: local_file path: ./inputs/meeting_transcript.txt output: type: markdown_file directory: ./outputs/ naming: {date}_{topic}_minutes.md schema: - name: meeting_topic type: string required: true - name: attendees type: array item_type: string - name: decisions type: array item_type: object - name: action_items type: array item_type: object item_fields: - name: owner type: string required: true - name: deadline type: string format: date - name: description type: string required: true这种配置方式的价值在于改一行代码就能换模型、换存储、换Schema工具层和业务层完全解耦。4.2 任务编排与工具注册OpenWorkBuddy的核心概念是Buddy——一份把目标、能力、边界绑在一起的运行时定义。一个会议纪要Buddy需要注册三个工具读取转写文本、提取人名、查询会议日历确认时间。工具注册的代码逻辑不复杂但有一个关键点值得展开工具描述要写清楚什么时候用、输出什么格式。模型靠工具描述来判断是否调用描述写得含糊模型就会乱调。我的做法是给每个工具写三句话第一句说明用途第二句说明输入来源第三句说明输出结构。比如register_tool( nameextract_attendees, # 工具名要短且准确 description从会议转写文本中识别所有参会人员名字。 输入是raw_text字符串。 输出是JSON数组元素为人员名字字符串。, handlerextract_attendees_handler )这一步用到的工程技巧是工具输入由Harness决定不由模型决定。模型只表达我需要知道参会人名单Harness从上下文里找到原始转写文本传给工具而不是等着模型在参数里手动拼文本。这样模型不需要具备处理长文本上下文的能力工具也永远不会因为参数错误而调用失败。4.3 校验规则的编写让可验收落地成代码会议纪要比普通文本生成更讲究的地方在于它承载了后续行动校验逻辑必须非常具体。我给Buddy写了五条校验规则第一所有决策条目必须对应转写文本中的明确表态对应不上的要标记为推断而非决定。第二所有action_item必须有owner和deadline缺失任何一项就判定不合格并要求重写。第三dealine日期必须在会议日期之后出现早于会议日期的时间直接判幻觉。第四参会人数与转写文本中实际出现的发言人数目偏差不能超过两个防止模型编造出没来参会的人。第五markdown格式必须包含标题、表格、分级列表不能是一坨纯文本。这些规则看起来琐碎但正是它们构成了可验收的技术含义。验收就是有一组客观的、可编程判断的标准不依赖人的感觉。模型输出的草稿到底行不行跑一遍校验器就知道不用人逐字去读——人只需要在机器判定通过之后做最后抽查。4.4 实测过程中遇到的意外与处理跑通第一版之后我遇到了几个很有意思的翻车场景。第一个是模型把张伟和王伟搞混了在action_items里把本该分给张伟的任务写到了王伟名下。这个错误Schema校验完全查不出来因为格式、字段、日期全部合法最后是审校模型发现上下文里张伟负责的模块和该任务完全无关才揪出来的。这个案例让我认识到只做格式校验远远不够一定要加一层基于语义的交叉验证——把产物里的关键实体和上下文源里的关联逻辑做比对。第二个翻车是日期幻觉。转写文本里提到下周三必须交付而转写发生的实际日期是周二那么deadline被模型推断成了明天结果写成了当天的日期触发了校验规则的第三条。但有趣的是如果会议恰好在周三开模型就会把deadline推断成下周三对应的真实日期成功率大幅提升。这说明模型的日期推断能力非常依赖上文中的锚点清晰度。我的处理办法是用工具把会议实际日期显式注入系统提示明确告诉模型今天是X月X日会议在X月X日举行模型再推断相对时间就靠谱得多。第三个翻车是最典型的模型输出整体没问题但中间夹了一段它自己编的未定事宜读起来极其像一个真实存在的讨论实际上原文里根本没有提过。审校模型给出的理由是这段内容与前文讨论的颗粒度不一致且无法在转写文本中找到对应的信息密度锚点。信息密度锚点这个概念我后来一直用——模型生成的每个核心段落在源文本中都应该有足够的信息支撑找不到支撑就大概率是幻觉。5. 实操中的边界条件与踩坑总结这些坑比功能本身更值得记5.1 工具调用不是越频繁越好但也不是越少越好用过Agent框架的人大概率见过两种极端要么模型死活用不上工具所有答案都靠我觉得要么模型把每个简单查询都拆成对工具的调用一个两句话能答完的问题绕了六次工具。OpenWorkBuddy在工具调度上的处理方式是任务级工具计划。它不让模型每一步都决定是否调用工具而是在任务开始时先让模型列出完成这个任务我需要获取哪些信息Harness把信息需求转换成实际工具调用等数据齐了再让模型写正文。这种批量式调度比逐步决策式调度稳定性高得多因为模型的精力是稀缺资源每做一次决策就可能产生一次错误。把决策次数压缩到最小就是提高整体成功率。5.2 Provider rejected the request schema这类报错的真实含义和处理开发过程中遇到过好几次provider rejected the request schema or tool payload错误。一开始以为是配置问题后来排查发现是给模型注入的工具定义里某个参数类型声明得不严谨。比如声明了一个枚举类型字段但实际运行时有可能会传入枚举范围之外的值。处理方式很简单但也容易被忽略工具定义的严谨程度要和模型的成熟度匹配。越小的模型对复杂工具定义的理解能力越弱工具参数一多就崩。OpenWorkBuddy的做法是根据选择模型的参数量自动调整工具描述长度小模型用短描述大模型用长描述。我在实践里参照这个思路给14B模型注册工具时尽量把参数压到三个以内给70B以上模型注册工具时才上复杂参数。5.3 什么时候不该用Agent Harness所有工具都有适用范围OpenWorkBuddy也不例外。如果你只是做一个简单的问答机器人或者只需要LLM生成一段不进入业务流程的创意文本那套校验、编排、工具绑定机制不仅帮不上忙反而会拖慢速度、增加复杂度。Harness的适用场景有一个明显特征产物会进入业务流程、会被后续系统消费、需要有人对它负责。我的建议是先问自己三个问题。第一这份产物如果出错会造成什么后果如果后果只是重写一次那就不需要Harness。第二这份产物是否要长期存档或者被审计如果需要Harness的数据引用和来源追溯就是刚需。第三产物的格式是否要稳定地被程序解析如果需要稳定格式和Schema校验Harness就是必需品。5.4 轻量部署的可能性从云端到本地最后说一个和轻量部署相关的观察。在搜索相关话题时我注意到安卓本地运行GGUF格式LLM这类需求热度不低这说明很多人希望把LLM能力放到更私密、更低成本的环境里跑。OpenWorkBuddy这套架构的设计有一个好处模型推理服务和Harness本体是解耦的推理层可以接云端大模型也可以接本地的GGUF量化模型。我自己试过把模型换成7B级别的量化模型之后会议纪要这个场景整体可以跑到勉强可用的水平。格式校验、工具调用、规则引擎这些环节完全不依赖模型智商纯粹是工程逻辑所以即便模型碎嘴一点、偶尔犯傻Harness的兜底依然能保证产物的基本质量。这给我一个启发伴随着边缘算力的提升Agent Harness的价值会越来越大因为模型能力越弱越需要外部的工程骨架来弥补。反过来讲如果一个团队手上只有小模型但又想做出靠谱的LLM应用把精力花在Harness上远比反复调Prompt更值。6. 最后分享一点我的个人体会OpenWorkBuddy让我想清楚了过去一年一直模糊的一个问题LLM应用工程的本质不是让模型变得更聪明而是让模型的不确定性不传导到最终产物里。模型可以在中间环节犯一百次错但只要Harness在边界处守住了交付物就依然是合格的。这很像成熟的软件工程里编译器报错不影响最终产物的逻辑——LLM就是那个经常闹脾气的编译器Harness则是包裹在它周围的那套构建系统和测试管线。我现在的做法是接到任何LLM落地需求先不急着选模型写Prompt而是先问一句这份产物由谁来验收验收标准是什么如果模型出错系统怎么感知到这三个问题一旦有了答案架构基本上就浮出水面了。模型选型反而成了最靠后的事。如果你也在做类似的LLM工程化项目建议把可验收三个字刻在项目的第一行需求里然后找个Harness框架拆开研究一下哪怕只是照搬它那套Schema校验加LLM-as-Judge的回环也足够让你的应用质感和可交付性上一个台阶。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑