Agent能力边界量化评估与工程化扩展实践
大概从去年开始我们团队接的Agent相关项目越来越多让Agent帮用户查物流、自动整理周报、跑数据看板、甚至代为处理售后工单。项目多了之后有个现象特别扎心——同样的模型Demo里跑得飞起一上真实环境就拉胯。问题往往不在模型智商而在我们压根说不清这个Agent到底能摸到多远。后来我给这套摸底和扩边界的方法起了个内部代号叫Agent-Reach直译就是可触及范围。这套东西说白了就三件事怎么量化评估Agent的能力边界、怎么找到卡住边界的瓶颈、怎么用工程手段把边界稳着推出去。这篇文章把整套思路摊开讲适合正在做Agent落地的同学特别是刚被Demo跑通、生产翻车折磨过的人。1. Reach到底是什么别再拿单轮对话质量衡量Agent1.1 一个让我改观的最小案例先讲一个真实的最小案例。我们有个客服场景的Agent早期验收只看回答是否准确、语气是否友好所有评测都把这三项打得很高。可上线后发现用户真正会问的是我的订单显示已签收但我没收到帮我查一下。这个请求牵涉四步识别用户身份、调订单接口、调物流接口、根据签收异常生成处理方案。我们的Agent在对话评测里拿高分遇到这种多步操作却频繁断在第二步——因为它根本不知道该调哪个接口、参数从哪来。这个案例让我彻底意识到对话质量只是表层真正决定Agent价值的是它能不能独立把一件事从a走到z也就是Reach。1.2 Reach的三个构成维度后来我把Reach拆成三个维度方便团队对齐口径也方便逐个诊断横向Reach广度Agent能覆盖多少种不同类型的任务。常见问题是只能处理少数几个模板化请求换一种问法就听不懂。比如用户说帮我把这周销量拉个表能触发说我想看看最近一周卖得怎么样就触发不了。纵向Reach深度单个任务能走多深。一个任务最少需要几步工具调用中间出现异常能不能自行恢复用户诉求需要多轮澄清时能不能撑住不跑偏环境Reach韧性在不完美条件下还能不能干活。比如接口超时、字段缺失、用户描述含糊、上游数据临时改了格式这些生产环境的日常才是真正的试金石。这三个维度不是并列关系而是乘数关系。横向再广如果纵向只能做一层调用实际能办的事还是很少纵向再深如果对环境变化毫无容忍度放到生产环境几乎等于不能跑。我见过太多团队只盯横向Reach拼命给Agent加功能描述结果纵向和环境两个维度拖了后腿整体交付能力依然没法看。拿人来做类比最好懂一个人在职场上能不能办成事既看他认识多少人广度也看他能把一件复杂的事推进到什么程度深度还看他在突发状况下能不能稳住局面韧性。三个都到位才是真正的高Reach。单轮对话评测就像这个人会不会说话而Reach回答的是这个人靠不靠谱、能不能托付。2. 量化Reach的实操框架把感觉还行变成数字2.1 从任务空间出发而不是从模型出发大部分团队评估Agent的方式是拿几十个Prompt砸一遍看回答像不像样这其实是在评估模型不是评估Agent。评估Reach的第一步是回到真实的任务空间把一两个月内的真实用户请求全部捞出来去重、聚类得到一张任务清单。这张清单就是测试集的底本。我当时做了一个特别土的统计把客服系统的历史工单按请求类型和完成路径长度做成二维表。结果发现大量请求集中在六七种类型里但每种类型的完成路径差异极大——有的两步完事有的要跨五个系统。这直接决定了测试集该长什么样每种任务类型必须有简单路径和复杂路径两个档位的样例复杂路径里还必须埋上点异常。用这套办法生成的测试集比随手写的几十个Prompt有效得多因为它逼着Agent处理真实世界里那些不干净的情况。2.2 四档评分别用二值判断我的另一个教训是用成功/失败二值来判断Agent会掩盖大量有价值的信息。一个任务Agent可能自己完成了80%剩下20%需要人接手也可能每一步都对但用了五倍步骤还可能在用户追问下才把信息补全。这些都不是简单的成功或失败。我们最终定了四档评分档位定义处理方式S完全自主完成零人工介入作为自动化基线固化进生产流程A自主完成但过程有冗余或轻微偏差需要优化指令或固化工具调用路径B部分完成关键环节需要人工接手定位断点考虑加工具或改上下文结构C无法推进基本等于没帮上忙不在当前Reach范围内明确降级策略这里有个关键细节评分一定要基于过程轨迹而不是最终结果。我们后续开发了一个轻量的轨迹查看工具每次评测都把Agent的工具调用链、中间决策、异常处理过程完整记录下来评分员看着轨迹打档位而不是只看最后那个回复。没有轨迹的评分本质上是猜。2.3 一次完整评估跑下来的样子拿我们做的周报Agent举例。测试集有60条任务分布在拉数据、生成摘要、格式化排版、跨部门催办四类里每类各含简单和复杂两档。跑完一轮后我们拿到了一张表任务类型任务数S档A档B档C档人工介入率拉取数据18953122%生成摘要16762119%格式化排版11234255%跨部门催办15125780%一眼就能看出瓶颈不在模型理解而在格式化排版和跨部门催办这两块——前者卡在工具描述混乱导致选错模板后者卡在Agent拿不到相关部门的最新对接方式。这两类问题靠换模型根本解决不了。这就是量化Reach的价值把感觉不稳精确成哪类任务、哪个环节、什么原因不稳定。然后所有优化都从这张表出发改一处测一轮两周后同批测试集的S档比例从31%提到了67%。3. 把Reach撑大的三个工程杠杆3.1 工具层描述即文档文档即Prompt工具是Agent的四肢Reach的上限首先被工具层卡死。我见过太多团队急匆匆把API包装成function名字起得敷衍、描述直接抄接口文档还把大而全的方法塞成一个函数。结果就是Agent经常选错工具、填错参数、或者干脆不触发调用。工具的打磨其实有很明确的章法。首先每个工具只做一件事粒度宁可小一点。比如发送邮件和发送带附件的邮件如果合并成一个工具参数列表会爆炸Agent在众多可选参数里迷失方向拆开后每个工具的参数都很少选错的概率直线下降。其次工具描述要写清三个东西这个工具解决什么问题、什么时候不要用它、关键参数的取值逻辑和常见坑。比如一个查询库存的工具描述里要写明仅适用于自营仓商品第三方卖家的库存请走query_vendor_stock这两行描述能省掉后续无数错误调用。最后所有工具的描述文本要纳入版本管理工具变了描述必须同步变否则Agent会一直拿旧描述去猜新接口。我们内部有个不成文的规矩工具描述每句话都要能回答什么场景下该用它或者什么场景下不该用它中的至少一个不能写废话。实践证明花两周时间把所有工具描述重写一遍比换一个更强的模型带来的Reach提升更明显、更稳定。3.2 上下文工程系统提示、动态上下文和记忆的分工第二个杠杆是上下文。一个常见误区是把所有背景信息一股脑塞进系统提示觉得给Agent的信息越多它越聪明。实际上上下文一长Agent的注意力会被稀释关键指令被淹没在无关信息里这个现象我们内部叫假饱和——窗口没爆但有效信息密度已经低到模型抓不住重点。我的建议是把上下文分成三层。第一层是系统提示只放稳定、高优先级的规则比如任务边界、必须遵守的合规要求、输出格式。这段内容要短尽量控制在几百字内每句话都得是删掉就会出问题级别的。第二层是动态上下文每次请求实时组装只放跟当前任务相关的信息比如用户资料、订单状态、相关历史记录与本次任务无关的一律不放。第三层是记忆分短期和长期短期记忆记住当前对话里已经做过的事避免重复操作长期记忆沉淀用户的偏好和常见处理模式但注入时同样只抽取和当前任务强相关的部分。每一层都有明确的写入和读取规则上下文整体才可控不会越滚越脏。3.3 升级路径该出手时就出手的人工兜底很多团队把人工介入当成Agent失败的标志这是另一个误区。成熟的Agent系统一定要设计显式的人工兜底通道而且兜底不是事后补救它应该是流程的一部分。我们会在三个位置主动触发升级一是置信度过低时比如Agent对某个判断只有五成把握与其硬着头皮往下走不如直接问用户或转人工二是操作不可逆时比如删除数据、发送对外邮件之前强制走确认环节这个不能省三是连续重试超过两次仍失败时停止自动处理把完整轨迹转给人工不要让Agent在一个错误思路上反复打转。这样设计之后Agent的Reach反而变大了——因为它敢于尝试更多高价值任务反正有兜底翻车的代价可控。用户侧的感知也会更好一个遇到难题主动说这块我需要人工协助的Agent比一个硬编一个答案给你的Agent可信得多。4. 实测翻车现场三次完整排查链路4.1 工具张冠李戴为什么Agent老是选错工具有一阵我们的数据看板Agent频繁选错工具。用户说看一下华东区的销售趋势它不去调query_sales_trend反而去调了query_orders_raw结果返回一堆原始订单表Agent自己都看懵了。排查链路是这样的。第一步打开轨迹记录确认Agent在调用前确实读过两个工具的描述第二步对比两个工具的描述文本发现问题出在格式太像——两个工具开头都是查询销售相关数据连参数名都接近region和area混用第三步做了一个小实验把query_sales_trend的名字改成query_region_sales_summary描述改成按区域汇总销售额并返回趋势曲线适用于销售趋势类问题同时把另一个工具的描述改成仅返回订单级别的明细数据不适用于趋势分析字段多且未经聚合第四步重新跑同批测试选错率直接下降了一半以上。这个案例告诉我们Agent选工具的方式和人看按钮标签是一样的标签模糊就一定点错。描述文本里的每一个词都在影响Reach。工具描述不是写给人看的注释而是写给模型看的操作说明书两者文体完全不一样。4.2 假饱和导致的目标丢失另一个更隐蔽的翻车Agent在长任务中忘了最初目标。用户让Agent对比去年和今年的营销活动效果并给出三个优化建议Agent前两步都做得很好但第三步输出时只写了两条建议另一条被它自己脑补成了一个无关的运营观察。排查后发现问题不在模型在我们。系统提示里塞了一份三百多行的数据字典再加上用户历史偏好真正关于任务目标的文字被挤到了很靠后的位置。模型每一步生成时注意力更多落在靠前的数据字典字段名上而不是用户的目标。修复方式很粗暴也很有效把任务目标以当前任务区块的形式在每次调用前重新注入到上下文最顶部并且在每一步工具返回后追加一行记住你正在完成的任务是XXX。这个改动看起来笨但实测把长任务的目标保持率从61%拉到了89%。4.3 权限边界的两难管太死和放太开都是坑权限设计是Reach里最容易被忽略、出了问题也最被动的环节。我们早期吃过一次亏给Agent开了一个查询全部客户资料的接口权限本意是方便它处理售后结果有一次它在一个模糊请求下把一批不相关的客户资料也拉了出来虽然最后没有外发但合规团队脸色非常难看。痛定思痛之后我们不追求最小权限这种纸上谈兵的说法而是做了两件事。一是按任务-数据矩阵来配权限每个任务类型对应明确的数据字段白名单比如售后任务只能读写订单、物流、退款记录完全接触不到合同、结算、客户分层标签二是给关键操作加双保险——Agent调用高敏感接口时系统会检查这次调用的参数是否符合该任务类型的历史调用模式明显偏离时直接拦截并要求人工确认。这两种做法落地后权限越界事件降到了零而且Agent的Reach没受影响——因为它需要的权限本来就在白名单里。权限设计的核心不是给多少而是给得是否有结构、是否可审计。5. 三个最容易被忽视的Reach杀手5.1 指令噪声系统提示每多一句Agent就多一次跑偏的机会指令噪声是我在所有项目里看到的最普遍的问题。产品经理今天加一句回复要体现公司温度明天加一句遇到不确定的先反问后天再加一句注意合规——每句话单看都对合在一起就成了互相打架的指令集。Agent面对互相矛盾的指令往往会选择其中最响的那句而最响的往往不是你最在乎的那句。我的经验是系统提示里只保留四类内容——角色与边界、最高优先级规则、输出格式、升级条件。其他一切应该注意的内容要么沉淀到工具描述里要么放到动态上下文里按需注入要么干脆删掉。每隔两周还要做一次系统提示裁剪实验逐个删掉一句话跑测试集如果指标没变化这句话就是噪声删了就对了。5.2 中间状态不可观测Reach最大的隐形天花板Agent每走一步系统里就多了一个中间状态。问题是很多团队只在最终输出上做文章中间状态完全不可观测Agent出错时只能看到结果不对根本不知道错在哪一步。我们在Agent-Reach体系里加了一条硬性要求所有关键节点必须留痕。工具调用入参和出参、每一步的置信度、异常分支的触发原因、人工介入的位置和理由全部结构化记录。这不仅是为了排查问题更是为了建立持续优化的数据基础——没有轨迹你连Agent为什么Reach不够这个问题都回答不了。每次评审会我们看的不是成果展示而是轨迹回放。5.3 反馈回路延迟Agent在等一个永远不来的确认最后一个杀手是反馈回路的延迟。有些Agent设计成每走一步都要用户确认美其名曰稳妥实际上用户根本没有耐心一路点确认结果Agent卡在中间等待超时任务彻底中断。也有些Agent完全不要反馈闷头跑完一个长流程跑完了用户才发现方向和预期完全不符。合理的做法是分层确认低风险、可逆的步骤自动执行中风险步骤在执行前静默展示即将执行的提示用户不反对就继续高风险、不可逆的步骤才显式等待确认。这套分层让反馈回路的延迟感大大降低同时也保住了安全底线Agent的纵向Reach因此能往上提一大截。6. 推进这套方法的最小闭环6.1 从小规模任务清单起步先跑通再扩大如果你也想在自己团队里推这套方法我建议别一上来就搞大而全的评测平台而是从最小闭环开始先捞两百条真实请求人工搓出一张任务类型表再挑三类高频任务各写十条测试样例跑一轮四档评分。整个过程一周内能完成但你得到的不是一堆感觉而是具体的瓶颈清单。有了清单后面的优化就是按图索骥——该改工具描述就改工具描述该调上下文结构就调上下文结构该加兜底就加兜底每改一处重跑一轮两周就能看到S档比例的明显变化。6.2 关于指标口径的最后提醒推进过程中最容易踩的坑是不同的人对完成的理解不一致。所以四档评分的定义一定要落到具体例子上最好在团队里组织一次共同评分的校准会拿十条轨迹大家一起打档把分歧摊开讨论。档位口径统一之后Reach的量化才真正有参考价值不然你只是在用一个看似精确的数字记录一个实际上模糊的判断。6.3 我的个人体会Agent-Reach这套东西说到底不是为了给Agent打分而是帮助团队在模型能力之外找到真正可控的优化空间。我们内部现在有句糙话别问模型行不行先问系统让不让它行。工具描述写好了吗上下文结构理顺了吗中间状态能看清吗人工兜底在哪这些问题里的任何一个都比换个更大参数的模型更能决定Agent的实际表现。做Agent这一年多我最深的感受是Agent的边界从来不是模型画出来的而是你愿意在系统设计上花多少心思画出来的。Reach不是天赋是工程。