资讯动态

Agent触达失效怎么办?一套量化评测与监控系统的设计与实践

发布时间:2026/10/9 3:55:48 来源:尧图企业网站定制
做Agent平台时间长了你会发现一个挺分裂的现象Demo演示的时候Agent什么都做得像模像样能规划、能调工具、能回答得滴水不漏可一旦丢进真实业务环境它就像换了个人——用户多问两句就答非所问稍微超出剧本就卡住甚至直接“假装成功”给你一个错误结论。我们在团队内部把这种问题叫“Agent触达失效”。为了解决它我折腾了一套名叫Agent-Reach的评测与监控系统。你可能也猜到了这个名字就是从“Agent”智能体和“Reach”触达/覆盖组合出来的核心就一句话量化Agent到底能触达多少真实业务场景以及触达的质量到底行不行。这篇文章不聊概念直接说清楚我为什么做它、指标怎么设计、部署接入要踩哪些坑以及在客服、办公自动化和内容生产三类场景下的实际调优经验。如果你也在做Agent落地这玩意儿大概率对你有用。1. 从“Demo能跑”到“真实触达”之间隔着一条河1.1 为什么通用的监控工具解决不了这个问题市面上常见的LLM应用监控工具比如LangSmith、Helicone这一类解决的是“模型调用层”的问题每次请求花了多少Token、耗时多少、调用链有没有报错。这些信息当然重要但当你把一个Agent真的放进业务环境问题往往不出在“模型是不是调通了”而出在“Agent最终有没有真的完成任务”。举个例子。我们的客服Agent上线后的第一周所有基础设施指标都正常API延迟平均300毫秒Token消耗在预算内没有一次超时。但人工抽检用户会话时发现大量用户跑去转人工的原因不是机器人答错了而是机器人根本没接住用户的问题——用户说“我的订单被拆分成了三笔有一笔一直不发货怎么办”Agent回答了一堆政策条款就是没有结合用户的具体订单状态去触发查询工具。从系统层面看这一次交互“成功”了但从业务层面看触达完全失败了。Agent-Reach做的事情就是把这层“业务触达结果”显性化。它不关心你用的是开源模型还是商业API也不绑定你用的是Coze、Dify还是自研的Agent框架它只回答三个问题用户这一轮请求Agent有没有正确理解并接住Agent有没有为了完成任务真的去调用该调用的工具、读该读的数据最终给用户的信息能不能解决用户当前的诉求这三个问题传统监控工具答不了人工抽检又答不全所以只能做一套专用的评测体系。1.2 Agent-Reach 的工作模式主动探测加旁路追踪我把Agent-Reach设计成两种工作模式分别对应“上线前”和“上线后”。主动探测模式Probe在Agent上线前或发版后用一批提前标注好的“业务探针请求”去反复打Agent。这些请求不是随机的而是从真实用户会话里抽样的、覆盖各类意图的长尾问题。探针跑完之后系统会根据预设的判定规则给出一份“触达报告”哪些类型的请求能稳定解决哪些类型一碰就碎。旁路追踪模式Recorder在Agent上线后通过SDK或网关旁路接入生产流量把真实用户的会话录制下来做结果校验。这里不干预线上请求只做异步分析发现触达失败案例后自动归档。这两个模式合起来才构成完整的闭环Probe负责帮你找出风险Recorder负责帮你抓现场。我后面会详细讲它们怎么落地先看核心指标怎么定义。2. 核心指标设计把“触达”拆成四个可以计算的维度2.1 覆盖度Coverage业务请求类型中有多少能被Agent真正处理覆盖率是最基础、也最容易被误读的指标。计算公式是Coverage Agent能有效响应的业务请求类型数 / 业务定义的总请求类型数注意关键词是“有效响应”。一个请求类型如果只是被Agent用兜底话术回了一遍不能算覆盖。比如“退款进度查询”这一类请求必须是通过查询订单接口、返回真实退款状态才算覆盖如果Agent回了一句“请您联系人工客服处理”这一类型就算未覆盖。确定总请求类型数的方法我建议直接从工单系统和客服对话记录里拉聚类结果而不是拍脑袋定义。我们当时从三个月的历史会话里聚类出137类用户请求第一版Agent只有效覆盖了51类覆盖率37%看着很吓人但这就是真实水平。这组数据后来成了产品改进的基准线。2.2 成功率Success Rate同样的问题连续测试稳定解决的比例覆盖率看“广度”成功率看“稳度”。同样一类请求今天能解决、明天解决不了线上的体验就是踩地雷。所以Agent-Reach的探针会对每一类请求构造至少10个不同表述的样本重复跑若干次统计稳定解决的比例。这里有个实操细节同义改写要自己做别完全依赖大模型生成。市面上有工具能批量扩写测试用例但如果你把原始问题丢给GPT去扩写它会倾向于生成“表述不同但结构高度相似”的句子导致测出来全是同一类难度。我后来是把历史真实用户原句按意图聚类后从每类里直接抽原句再人工改写成5到8个变体这样才贴近线上真实分布。成功率低于60%的请求类型在Agent-Reach里会被标记为“触达弱点”并自动关联最近的失败会话方便回溯是理解问题、工具调用问题还是知识缺失问题。2.3 时效性SLA达标率触达得快才算数触达不只是“有没有做到”还包括“多久做到”。我们用P95响应时间的达标率来刻画这个维度比如业务规定“简单咨询类请求必须在3秒内给出答案”“复杂任务类请求必须在30秒内完成”那么SLA达标率就是统计所有有效响应里耗时在阈值内的占比。这里有一个容易踩的坑Agent的“完成时间”到底怎么算。如果算到最后一条消息返回的时间那些需要多轮追问的场景会被严重低估因为Agent可能先返回了一个澄清问题用户又补充了信息最后才完成任务。我们把“任务完成时间”定义为“Agent完成核心工具调用后的响应时间”而不是“整个多轮会话的结束时间”并在SDK层面对工具调用完成事件做打点这样统计出来的数据才合理。2.4 深度Task Depth多步工具调用的完整执行率很多Agent场景不是一问一答而是需要连续调用多个工具才能完成的任务。比如“帮我对比这三款手机在京东和天猫的售价综合运费和服务算出最划算的一个”这个任务至少要经过解析商品名、检索两个平台的商品信息、提取价格、计算运费、汇总比较五步。深度指标衡量的就是这类复杂任务的完成情况我用的口径是Task Depth 完整执行全部必须步骤的任务数 / 尝试执行该复杂任务的总次数只要中间任何一步断掉比如只取了价格没取运费深度就算是失败。这个指标如果不能做到90%以上千万别上生产否则用户会觉得Agent“蠢且迟钝”——每步都对但最后给不了结论。四个指标合成后我会用一张总览表看健康度下面是我们内部周报的表头维度当前值目标值状态覆盖度68%≥80%待提升成功率82%≥90%良好SLA达标率91%≥95%良好任务深度74%≥85%待提升3. 本地部署和接入实操探针加录制两条腿走路3.1 环境的准备不复杂但版本别踩雷Agent-Reach我建议用Python 3.10以上版本跑当初在3.9上踩过pydantic v2不兼容的坑后来统一升级到3.11问题就消失了。主服务用FastAPI写数据存储用了SQLite加可选PostgreSQL队列用的Redis——如果你只是小规模试用SQLite加一个简单的任务队列就够了不必一上来就拆微服务。依赖文件大致长这样fastapi0.110 uvicorn0.29 pydantic2.6 requests2.31 redis5.0 sqlite-utils3.35服务启动后会暴露两个HTTP端口一个给管理端用来配置探针任务和查看报告一个给SDK上报数据用用来接收旁路录制的会话数据。3.2 接入方式一在Agent运行时里埋点Recorder模式旁路录制需要在你的Agent代码里加一层轻量SDK。我们当时是自研的Agent框架所以在Agent执行循环里加了两个埋点一个在用户请求进入时一个在Agent返回最终结果时。如果你用的Dify或Coze这类平台可以用它们的回调接口或者Webhook来实现类似的打点。埋点逻辑抽象出来就三个动作# 请求进入时 reach_recorder.start_session( session_iduser_session_id, user_queryuser_message, agent_idagent_name, channelonline_customer_service, ) # Agent 执行过程中每调用一次工具就记录一次 reach_recorder.record_tool_call( session_iduser_session_id, tool_namequery_order, tool_input{order_id: 20251101xx}, tool_result_statussuccess, elapsed_ms1200, ) # Agent 最终返回时 reach_recorder.end_session( session_iduser_session_id, final_responseassistant_message, is_tool_completedTrue, )这段代码看起来简单但它决定了后面所有指标能不能算得准。后来我们还做了个优化把Agent思维链中的关键节点也打成隐式事件这样当结果判定失败时能回溯到Agent到底是在“理解阶段”还是“工具调用阶段”断掉的。3.3 接入方式二配置探针任务跑主动评测Probe模式主动探测模式的配置是声明式的。你只需要准备两类文件一类是“探针请求集”包含请求文本、期望调用的工具、期望返回的关键信息另一类是“判定规则”告诉系统什么算成功。一个典型的探针请求集结构是这样{ intent_id: order_status_query, samples: [ { query: 帮我看看订单20251101001现在到哪了, trigger_tool: query_express, required_keywords: [已发货, 中转站, 签收] }, { query: 我昨天买的手机怎么还没发货啊, trigger_tool: query_order, required_keywords: [待发货, 预计发货时间] } ] }看到required_keywords你可能会有疑虑——如果Agent表述方式和关键词不完全一致是不是就会误判确实会。所以判定规则里我加了两层第一层强制校验工具调用的名称是否出现按你的Agent框架而定第二层用一个大模型作为评委判断最终回答是否“语义上解决了用户诉求”。关键词匹配只作为初筛条件不完全依赖它。这么做的好处是探针跑完你能立刻拿到一份按意图分组、按失败原因分类的清单不用再一条条人工翻日志。3.4 配置好探针后第一次跑就能发现问题我们第一次给一个文档问答类Agent配好探针跑了500条请求报告出来后有个数据让我印象很深覆盖率只有56%但是失败原因里“工具调用缺失”占了42%“回答错误但用了工具”占了31%真正“模型理解偏了”只占27%。这说明Agent意图识别还好问题出在“知道了用户要什么但不知道调用什么工具或者调用方式不对”。这个发现直接改变了团队的优化方向——之前大家一直死磕提示词后来转头去补工具描述和参数映射成功率两周内涨了18个百分点。4. 部署上线后我踩过的三个大坑和调优路线4.1 上下文截断导致成功率虚高得用“兜底话术识别”兜住第一个坑是上线跑Recorder模式时发现的。系统一开始上报的成功率有93%我们差点信了。后来我把成功率低的会话抽出来看发现Agent处理复杂任务时因为上下文超长被截断最后回了一句“这个问题我需要再确认一下您可以稍后点击这里查看结果”这句话结构完整、语气正常早期的判定逻辑把它当成了“有效响应”。这本质上是一个判定口径问题。Agent-Reach早期把“只要生成了回答”就算成功这完全不行。后来我加了一个“兜底话术识别层”收集团队内常见的放弃型表达比如“请您联系人工客服”“抱歉暂时无法处理”“这个问题比较复杂需要转交专员”每次做成功判定前先过一遍这个小模型命中就直接判失败。同时对大模型评委的提示词里也明确要求回答里如果存在推卸责任的表述即便后面给了部分信息也应判定为触达失败。加了这一层之后上报成功率从93%掉到81%但我敢拍胸脯说后者才是真实水平。4.2 冷启动时没有基线怎么办影子模式和人工标注配合第二个坑是冷启动。Agent-Reach默认需要有一批“已标注的请求类型”和“判定基准”但新项目通常啥都没有。我试过一次直接让大模型去聚类历史工单结果分出来的意图类别里有20%是“其他”基本没法用。后来采用的方法是“影子模式加小样本标注”上线前两周Agent照常服务用户但Agent-Reach只记录不判定每天收盘后人工标注前50个会话标注重点不是“这条回答好不好”而是“这个请求属于什么意图Agent有没有解决”。攒够300到500条标注再跑一次聚类和词频统计就能生成第一版可用的探针集。这个过程看着原始但比直接让模型凭空生成意图树要靠谱得多。我们第二版探针集的请求类型有90%是从这批人工标注的会话里抽出来的。有了基线之后每个新版本发版前我都会把探针集完整跑一遍用Agent-Reach的比对功能看覆盖度、成功率、任务深度的变化。跌了就直接卡发布这个流程坚持下来之后线上客服Agent的高危回归问题明显减少了。4.3 探针并发跑批时互相干扰队列隔离和结果缓存第三个坑发生在探针跑大批量任务时。有一次我配置了5000条探针请求直接并行去打Agent结果把模型服务的限流给触发了大量请求返回429错误。更隐蔽的问题是Agent如果内部有会话级缓存并发跑同类请求时先发的请求会把后发的整蒙产生一堆非典型结果。解决方案就两步。第一步在Agent-Reach里加一个简单的优先级队列把同一意图下的探针请求串行执行不同意图之间并行度控制在20左右避免把后端打爆。第二步对探针请求做结果缓存同一意图ID、同一文本变体24小时内只跑一次如果发版内容没有涉及对应模块就直接复用历史结果大幅节省模型调用成本。还有一个小细节探针请求必须用独立的测试账号或租户标识不要让探针流量和真实用户流量混在一个会话上下文里。我们有一次就是因为探针请求用了测试号但没加租户标签Agent的上下文记忆功能把不同用户的问题串在了一起导致好几个失败案例都是误报。5. Agent-Reach 在不同业务场景下的落地形态5.1 客服场景从周报指标变成值班告警客服场景是Agent-Reach最典型的使用地。跑通之后我们把成功率、SLA达标率接进了值班告警连续5分钟成功率低于75%或者任务深度低于60%自动触发告警并把最近15分钟失败的会话打包推给值班群。做告警时有一个容易犯的错——直接拿Agent-Reach的离线分析结果去告警延迟太高。我的做法是Agent-Reach只负责输出判定规则和指标口径线上实时计算用一套轻量的流式脚本去消费SDK上报数据命中失败条件立刻报警Agent-Reach负责离线归因。这样既保证了告警的实时性又保留了深度归因能力。5.2 办公自动化场景用任务深度指标抓“半途而废”办公自动化类的Agent比如“帮我整理本周所有未读邮件提取和项目相关的并按优先级回复”这类任务多步骤、跨系统最容易出问题的环节是“做一半就停”。用户问“整理邮件并回复”Agent可能把邮件列了出来但“回复”动作没做或者做了回复但忘记抄送相关人。对这种场景Agent-Reach的任务深度指标几乎是量身定做的。我们把每一步必须完成的动作定义成子任务序列比如读取邮件列表、过滤项目相关、生成回复草稿、执行发送、确认抄送人。探针判定时检查每一步是否都有对应的工具调用记录和结果状态。我曾经靠这个指标定位到一个特别诡异的问题Agent在“执行发送”一步连续三天成功率都是100%但任务深度却只有40%——后来发现很多任务根本没走到“执行发送”就断了而单独看发送接口成功率完全看不出来。5.3 内容生产场景用“事实一致率当触达标准”内容生产类Agent比如说“根据这周的数据报表生成一份周报摘要”触达的衡量标准不是工具调用而是“生成内容是否覆盖了原始材料中的关键信息点”。我们在这个场景里把探针的required_keywords换成了required_facts也就是从原始材料里抽取出的关键事实比如“DAU环比增长12%”“新增注册用户3.2万”然后判定最终生成内容是否包含这些事实、且没有臆造新数据。跑了几轮之后发现这类Agent的覆盖率通常不低但“事实遗漏率”很高有些甚至把反过来说。把事实一致率纳入触达指标后内容Agent的质量问题很快就量化了而且失败案例可以直接喂给数据清洗流程。5.4 从指标到改进闭环让失败案例反哺系统最后一条经验Agent-Reach的价值不止在“发现问题”更在“把问题转化成改进动作”。我会每周导出失败案例按失败原因打标签分成三类理解错误用户意图识别偏了优化方向是few-shot示例和意图清单工具缺失知道该干什么但没有可用工具优化方向是新增/调整API结果校验缺失工具调用成功但Agent没用结果优化方向是改Agent的后处理逻辑和提示词约束打标后的数据一部分进入下一版探针集持续提高评测精度一部分回到提示词工程里。这套“评测发现、归因定位、优化迭代、回归验证”的闭环跑顺之后团队对Agent的质量控制才真正从“靠感觉”变成了“靠数据”。实话说最开始做Agent-Reach只是为了不让客服Agent上线翻车。后来发现它更像一面镜子——当你可以量化触达能力时很多原本说不太清的问题比如“为什么用户总觉得机器人答非所问”“为什么演示效果好但线上没人用”都有了可以追下去的线索。如果你也在为Agent的效果不稳定、上线不放心而头疼不妨先别急着调提示词试着用探针把触达能力量化出来再对症下药。

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

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

免费获取报价 →
↑