1. 项目定位:什么是 Agent-Reach,它到底解决了什么痛点
先直接说结论:Agent-Reach 是我在团队内部搭的一套智能体(Agent)触达能力评估系统。名字拆开看就是 Agent + Reach,核心回答一个问题——我们做出来的智能体,到底能在多大范围内、多深地“够到”目标对象,是用户、业务系统还是外部工具,而不是只看它跑起来没有、答没答上来。
这可能听着有点绕。举个例子:我们团队之前做了好几个 Agent 场景,有电商客服的,有内部运维告警处置的,有营销脚本生成的。每个场景上线前都做过功能测试,跑通率、成功率都很好看,但只要一放开真实流量,就会发现各种奇奇怪怪的问题。比如客服 Agent 面对售后咨询时表现很好,可一旦用户提到“退款到账时间”这个跨系统问题,它就答非所问;运维 Agent 在分配工单时能覆盖常见告警,但遇到边缘机房的上联链路抖动,根本就不会触发处置动作。单独看每个 Agent,日志里都是“调用成功”,没有一个统一的指标体系告诉你“这个 Agent 的能力边界在哪儿、触达不到的地方是什么、被哪一层卡住了”。
Agent-Reach 解决的就是这件事:把智能体的触达能力拆成可量化的指标,覆盖、深度、效率一起看,让研发、产品和运维能在一个大盘子里发现 Agent 在哪条链路上没够到目标,以及为什么没够到。
这套系统不是给某一个 Agent 用的,而是面向多个 Agent 场景的统一观测评估层。我实现它的核心手段可以概括为三块:标准化触达埋点、分层指标计算、场景化报告输出。如果你正在做 Agent 类项目,或者需要向老板证明“这个 Agent 到底行不行”,这套思路能直接套用。
代价也有,不是什么大成本的重型平台,而是在现有 Agent 调用链里加了几个探针,再用一套离线任务算指标。我后面会完整讲清楚设计思路和踩过的坑,包括我自己迭代了三版之后才稳定下来的指标口径。
2. 为什么必须要做触达评估:三个真实场景把我逼到了墙角
说实话,Agent-Reach 一开始不是我的立项,是被生产事故逼出来的。
第一个事故来自电商客服 Agent。这个 Agent 接入了订单查询、物流查询、退款申请三个工具。当时指标只统计“调用成功”,三个工具的调用成功率都在 98% 以上,看起来很完美。但运营反映用户满意度下降了,翻聊天记录才发现,系统在“退款到账时间”这个高频问题上接的是另一个团队的财务系统接口,那个接口频繁超时,Agent 每次超时后都返回话术“这边暂时无法查询,请稍后再试,或联系人工客服”。用户当然不满意。
也就是说,工具调用从 Agent 自身角度看是成功的——它调了、超时了、兜底了——但从业务目标角度看,它没够到用户真正需要的“到账时间信息”。这就是个触达失败。
第二个事故来自运维告警处置 Agent。它有十几个剧本,覆盖 CPU、内存、磁盘、网络等常见告警。有一次线上发生拨号线路瞬断,然而 Agent 没有触发任何处置,原因是这个告警类型不在剧本列表里。从 Agent 自身的成功率看,参数没问题,没有报错,业务上却是完全漏检。这说明 Agent 的实际覆盖范围远远小于我们以为的覆盖范围。
第三个事故来自营销内容生成 Agent。这玩意儿生成了大量种草文案,内容质量没问题,但发给用户之后,用户要求的“纯文本版本”和“含商品卡片的版本”系统没区分,统一用了富文本。结果触达渠道解析失败,一大半内容在部分 App 版本里渲染不出来。又是 Agent 自身“执行成功”但“触达失败”的典型案例。
这三个事故共同暴露了一个结构性缺陷:我们一直在验证“Agent 执行得怎么样”,却从来没有量化过“Agent 触达得够不够”。Agent 的价值不在“跑通了”,而在“目标对象正确地接收到了它该收到的结果”。围绕这个认知,我拿一个周末画出了 Agent-Reach 的第一版指标框架,然后花了一个多月迭代到能稳定跑线上数据。
这在业内也不是孤例。如果你去看那些把大模型应用真正落地到生产环境的团队,早期踩的坑高度一致:模型能力没问题、工具接口没问题,但链路中间的触达能力没人盯。Agent-Reach 这类补位观测工具,在目前这个阶段非常需要。
3. 核心设计:Agent-Reach 的四层架构与三个触达域
3.1 架构分层:采集、归一化、计算、展示
Agent-Reach 整体分四层:采集层、归一化层、计算层、展示层。
采集层负责在 Agent 的每个关键节点埋点。我选了三个固定埋点位置:用户请求输入端、每轮 Agent 思考结束后的工具调用帧、最终输出端。每个埋点都记录 agentId、sceneId、traceId、timestamp、userId、原始输入/输出摘要、工具名、参数摘要、返回码、耗时、是否触发重试等字段。
归一化层做的是把各场景的异构数据拉成同一套 schema。比如电商客服场景的“退款查询失败”和运维场景的“告警剧本未命中”,归一化后都是触达失败事件,只是附带不同的业务标签。
计算层是核心,跑三类指标:场景覆盖度、链路触达度、任务影响度。展示层就是一个看板加一份周报,我把关键指标按 agentId 和场景维度汇总,出四条曲线和一张缺口列表。
实际落地时你会发现,归一化层比想象的重要。不同团队对“失败”的定义千差万别:有的把超时重试当失败,有的把重试成功当成功,有的只看最终用户是否收到结果。不统一口径,指标就是数字游戏,没有可比性。
3.2 三个触达域:我为什么这样拆
我在设计之初就没有走传统的“准确率、召回率、F1”路线,因为那是模型评估的思维,不是生产系统触达评估的思维。生产环境里,模型输出质量只是触达链路的一环。我怎么拆的?
- 场景覆盖域:Agent 的输入是否属于它支持的意图/剧本范围。衡量的是“够没够到问题本身”。
- 链路触达域:Agent 是否正确调用了所需工具、工具是否成功返回、返回结果是否被正确消化。衡量的是“够没够到系统和数据”。
- 任务影响域:Agent 的输出是否真正使目标对象的状态发生了预期改变。衡量的是“够到了之后有没有用”。
这三个域是递进关系。覆盖都没进去,链路和影响无从谈起;覆盖进去了,但链路断了,影响为零;链路通了,但输出未被目标对象接受,影响仍然为零。Agent-Reach 的核心就是把这三级全部量化。
为了让你能直观理解,下面是我给运维告警 Agent 计算的最小示例。
假设一天内共有 1200 条告警进入系统,Agent 能处理的意图/剧本覆盖 870 条,剩余 330 条因为剧本未匹配导向人工。场景覆盖度 = 870 / 1200 = 72.5%。在 870 条已覆盖告警中,有 760 条成功调用了对应的处置工具,另 110 条因参数缺失或接口超时失败,链路触达度 = 760 / 870 = 87.4%。在 760 条成功处置中,有 705 条最终让告警自动关闭或触发后续流程,任务影响度 = 705 / 760 = 92.8%。
这三个数字叠在一起,你就可以快速判断 Agent 病的哪一层。72.5% 的覆盖说明意图识别还有 27.5% 的盲区;87.4% 的链路说明代码要查工具调用的参数准备和网络层;92.8% 的影响度说明需要检查处置动作是否真的产生业务效果。
Agent-Reach 的看板把这三个数字按天展示,异常波动一眼就能看到。
3.3 为什么不做单一综合评分
我最初的设计其实是想算一个“Agent-Reach 指数”出来的,就是把三个域揉成一个 0-100 的分。实验两周后我放弃了。
原因是单一综合分没法指导排查。举例,两个 Agent 的综合分可能都是 71 分,但一个是覆盖度低,一个是链路差。如果排名驱动考核,两个 Agent 看起来一样“菜”,但改进动作完全不同。而且综合分容易掩盖极端短板的触目惊心程度——链路触达度如果只有 50%,综合分还能有 70 多分,这太具有迷惑性了。
所以我最终采用的做法是三个域分开展示,再另算一个“短板标记”:只要任一个域连续 3 天低于 85%,就在看板里打一个红点,自动生成一条缺口描述。85% 这个阈值不是拍脑袋,是我们团队根据历史数据定的初始值,后面我会讲到怎么从数据反推这个阈值。
这个设计思路可以迁移到很多场景。只要是评估复杂链路,把“结果好不好”拆成几个独立的、能指导改进的环节,通常比一个综合分更有价值。
4. 实操细节:埋点字段、指标口径与计算流程
4.1 埋点字段清单与最小化原则
埋点是 Agent-Reach 的数据源头。我踩过的第一个坑就是过度采集——一开始我想把 Agent 每轮思考的完整 prompt 和完整 response 都存下来,很快发现数据量爆炸,且严重拖慢线上请求。后来改为只存摘要和关键字段。
每一跳埋点统一记录以下字段:
- agentId:Agent 唯一标识,比如 customer_service_v3。
- sceneId:场景标识,区分电商、运维、营销等业务线。
- traceId:一次完整会话的链路 ID,贯穿所有子调用。
- nodeType:节点类型,枚举值为 input / tool / output。
- eventType:事件类型,例如 intent_match_success、intent_miss、tool_call_start、tool_call_fail、tool_call_retry、output_sent、output_render_fail。
- toolName:工具调用时记录工具名。
- paramsDigest:参数摘要,不存全部参数,取关键参数拼接后截断。
- returnCode:工具或模型的返回码,自定义枚举。
- durationMs:该节点耗时毫秒数。
- retryCount:到该节点为止的累计重试次数。
- userId:用户标识,用于后续影响域分析。
- extra:JSON 扩展字段,各场景自行补充。
这个清单看着不长,但覆盖了三个域所需的所有信号。采集层技术上采用同步旁路日志,写入本地文件,由日志采集器异步转发到分析端。同步旁路的意思是主流程在关键节点做一次 console 日志输出,但输出本身不影响主流程返回。
4.2 三个触达域的计算口径:最容易吵起来的环节
指标计算里最容易吵架的就是口径定义。我花了大量时间把口径写成明确公式,并同步给所有相关团队。
场景覆盖度 = 意图命中数 / 总请求数。这里的“命中数”指 Agent 识别出用户意图并进入对应剧本/流程的数量。在实现上我取自 input 节点的 eventType:intent_match_success 计为命中,intent_miss 计为未命中。
链路触达度 = 关键工具调用成功数 / 需调工具总次数。这个指标的关键在于“关键工具”和“需调工具”怎么定义。我的规则是:某轮次的 Agent 决策中,凡被选中要调用的工具都算“需调工具”,工具返回成功且被正常解析的算“成功”。如果一个步骤是人工兜底而不是工具完成,则本步不计入链路触达度,但会生成一条“触达缺口”记录。
任务影响度 = 业务目标达成数 / 链路成功数。这是最贴近业务的一层,计算依赖各场景自定义的“目标达成”事件。电商场景是用户成功获得有效信息或完成操作,运维场景是告警被正确处置并关闭,营销场景是内容在目标渠道正确渲染并被阅读。
这三个公式在口径文档里写清楚之后,团队内吵架概率下降了大概百分之八十。我强烈建议你在自己的体系里也把每一层口径用白纸黑字固定下来,不要靠口头对齐,否则做半年的指标都可能是垃圾。
4.3 计算流程与时间窗口设置
Agent-Reach 的计算任务是一个 cron 定时任务,每天凌晨两点跑前一天的离线数据。流程如下:
- 从日志库拉取昨日所有 traceId 集合,按 agentId + sceneId 分组。
- 对每个 trace,解析事件序列,重构出“输入→决策→工具调用→输出”的链路。
- 按 trace 维度计算三个域的结果,标记缺口位置。
- 聚合到 agentId + sceneId + 日期粒度,写指标结果表。
- 与历史基线对比,计算波动幅度,超过阈值则生成报警事件。
时间窗口我设的是自然日 00:00-23:59:59。有人会问为什么不用滚动 24 小时窗口,原因是自然日和业务周报对齐,排查问题时方便人工核对。滚动窗口虽热实时性更好,但会让“昨天”“前天”的概念变得模糊。
计算全部用离线框架跑批,没有用流式计算。原因也很简单:指标是给复盘用的,不是给实时干预用的,离线足够。如果你需要实时告警,可以在展示层另接一条轻量流式链路。
5. 效果评估:把失真的“假成功”一个个揪出来
5.1 三个事故序列在 Agent-Reach 上的复盘结果
Agent-Reach 接入线上数据后,我做的第一件事就是复盘之前三个生产事故。
电商客服 Agent 在事故那天的链路触达度只有 63%,而三个月内的均值是 94%。看板直接标红。点进去后发现 37% 的缺口集中在同一个工具——财务结算接口。进一步查看,该接口内部平均响应需要 4 秒多,而 Agent 侧的调用超时被设成 3 秒,导致大量调用实际成功但客户端断言失败。
这个分析比看日志快太多了。日志里的表现只是零散的超时错误,看板则清晰展示了小概率故障在哪个环节里突然高频化。
运维告警 Agent 在事故那天的场景覆盖度是 71%,低于 85% 阈值,标红。缺口几乎全部集中在“非剧本化告警类型”标签下。修复时我们并没有让模型变得更聪明,而是把常见的分支告警类型做了一层归一化映射到已有剧本,覆盖度直接解决了。
营销内容的 Agent 事故则体现在任务影响度上。那一周任务影响度只有 58%,远低于基线均值 91%。原因是目标渠道解析富文本时渲染失败,但这个渲染动作发生在外部的推送网关层,Agent 的输出是成功的,链路触达度依然很高。如果不看任务影响度,这个问题会一直沉在水底。
三个复盘案例,每一个都指向一个我曾经以为“没问题”的盲区。
5.2 后端效果对比:周报从“拍脑袋”变成“翻数据”
系统上线前的评估周报基本是各团队自己报数字,经常出现“都很好但业务不满意”的矛盾局面。Agent-Reach 之后,周报结构变成了统一的表格:
| 场景 | 总请求量 | 场景覆盖度 | 链路触达度 | 任务影响度 | 主要缺口 |
|---|---|---|---|---|---|
| 电商客服 | 18652 | 81.2% | 91.5% | 88.3% | 财务接口超时 |
| 运维告警 | 3240 | 74.8% | 89.7% | 85.2% | 非剧本化告警 |
| 营销触达 | 2761 | 92.1% | 97.3% | 61.4% | 渠道渲染失败 |
这个表格让团队第一次能清楚地看到各 Agent 的短板在哪个环节。原来不同场景的 Agent 短板差异非常大,没有统一框架时大家各说各话,很难横向比较。
效果评估后,团队直接按表格缺口排序分配了修复任务。电商场景优化接口超时配置,运维场景补归一化规则,营销场景改输出格式模板。下一次周报的数字连续回升,整个过程都清晰可见。
这里我要强调一点:评估体系本身不会直接修 bug,但它让修复优先权变得不可争议。Agent-Reach 真正的价值是让人人在同一套事实面前对齐,不再争论谁的 Agent 更好,而是讨论各自缺在哪里、什么时候补齐。
6. 实操中的高频问题与排查技巧实录
6.1 埋点丢失,指标出现“过山车”
Agent-Reach 上线第一周,电商客服场景的场景覆盖度某天突然从 85% 掉到 55%,隔天又恢复成 84%。这显然不是业务突变,而是数据采集问题。排查后发现是日志采集器所在容器在高峰期出现了日志积压丢弃,丢失的恰好是大量 intent_match_success 事件,导致分母不变分子变小。
修复手段有三个:一是给采集器加了背压控制,宁可丢弃单一埋点事件也不阻塞主流程;二是在计算层增加每 trace 的事件完整性校验,如果一个 trace 缺少 input 节点或 output 节点,直接标记为“数据不完整”,不计入覆盖度分母;三是增加一个 scheduled 健康检查,每小时统计事件流入量,与历史同时段对比,低于 30% 就告警。
这类问题的根源是采集层不可靠时,下游指标全是噪音。所以 Agent-Reach 的采集层健壮性优先级高于指标计算本身。
6.2 指标口径不统一,多方数据打架
早期接入营销场景时,他们的研发在链路触达度上和我们产生了巨大分歧。我们算出来 73%,他们自己算出来 95%。核对后才发现,他们把“工具返回成功”定义为 HTTP 200,而我们把“工具返回并且参数被 Agent 正确解析”算作成功。营销侧很多工具返回了 200,但内容是空 JSON 或格式错误,Agent 根本解析不出有效字段。
这个分歧暴露了口径文档过于简单的问题。后来我把链路触达度的成功定义细化成三个条件同时满足:工具返回非错误码、返回内容通过 schema 校验、Agent 成功将字段写入下一步决策上下文。三条全满足才算一次链路成功。
同时我在口径文档里增加了“判定示例”,每个条件配上真例子和假例子,这样第一眼就能看懂。建议各位在做此类指标系统时,把“粒度细到可评审”当成硬性要求。
6.3 冷启动时没有基线,观察波动很困难
新接入的 Agent 头两周没有历史数据,基线阈值无法自动计算。我选择的做法是人工介入:前三天的数据只看参考,不触发告警;第四天起,把前三天设为临时基线;两周后自动切换成滚动 14 天 P90 和 P10 作为包络线。
在基线形成前不要急着做自动告警,否则你只会收到大量噪音,团队会很快对系统失去信心。我建议冷启动期重点做两件事:人工核对指标是否符合真实业务感知、补全调试埋点。
6.4 多 Agent 编排场景下父子链路追踪
这是目前遇到的最复杂问题。有的 Agent 会调用另一个子 Agent 完成子任务,传统处理会让每个 Agent 自己打点,但数据进来后找不到关联关系。
我的方案是 traceId 透传:父 Agent 在调用子 Agent 时把 traceId 传给子 Agent,子 Agent 所有埋点都继承该 traceId,再增加颁发一个 spanId 用于标识自己的节点。计算层在重构链路时,以 traceId 为根,按 spanId 构建树结构,父子关系一目了然。
这套透传实现起来不难,难的是保证所有 SDK 都遵守规则。我为此写了一个小测试,每次发版后自动验证 traceId 透传率必须≥99.99%,否则发布阻断。
6.5 动态阈值调整策略
我最初写死 85% 作为短板阈值,后来发现不同场景差异很大。链路触达度在运维场景稳定在 92% 以上,在营销场景却受第三方网关影响大,经常在 80% 上下波动。如果统一用 85% 阈值,营销场景会整天报警,运维场景又显得过于迟钝。
调整方案是每个场景单独算基线:用过去 14 天数据的 P25 作为下限阈值,低于 P25 且持续 3 天触发报警。这样能自动适应场景特性。阈值建议每 30 天重算一次,业务结构变化大时重算周期要更短。
7. 沿用与扩展:Agent-Reach 之后还能往哪走
Agent-Reach 这套系统在自有场景里跑稳之后,我陆续接到一些坦诚的询问,都是关于怎么迁移、怎么扩展的。
最直接的可扩展方向是触达域的细化。现在的三个域是纵切,如果再按横切维度——用户设备类型、地域网络、使用时长、内容形态——叠加透视,就能发现更深层的盲区。比如营销场景渲染失败集中在某些旧版本客户端,普通趋势里看不出来,一旦叠加渠道版本维度就能精准定位。
另一个方向是触达质量分层。目前的任务影响度只区分“达成”和“未达成”,其实可以再细化为“高质量达成、部分达成、完全未达成”。用文案生成场景举例,高质量达成意味着用户阅读后主动点了链接,部分达成指用户读了但未点击,完全未达成是渲染失败根本没看到。分层后,模型质量的差异也能被纳入观测体系。
还有一个我一直在考虑但还没动手的是预测能力。触达链路出现的波动往往在业务恶化之前就有前兆,比如某个工具调用失败率连续上升。如果能把历史数据训练一个预测模型,将触达度变化趋势前移为预警信号,Agent-Reach 就能从评估工具变成主动防御工具。
不过这些都是锦上添花的部分。对你正在做的 Agent 项目来说,我认为最有价值的是先把三个触达域建起来,哪怕只用表格手动记录,也比完全不清不楚要强得多。先把缺口的分布摸清楚,再谈优化和自动化。
根据我自己的实操体会,做这套东西最忌讳一上来追求完美。先让数据流动起来,比任何精巧的算法都重要。我现在回头看第一版 Agent-Reach 的代码,相当粗糙,但它已经解决了当时最痛的问题。后面每迭代一步,都是被真实数据推着走的。
最后再分享一个小技巧:如果团队资源紧张,没必要一开始就做全量埋点。挑一个高价值 Agent 场景先做透,让指标快速反映出真实短板,用战绩说服团队和决策者,比一次性铺开所有场景更稳妥。我也犯过想一口吃成胖子的毛病,推倒重来成本太高,不如小步快跑。