Agent 的可靠性工程:如何把成功率从 60% 拉到 95%
1. 引入:所有做 LLM 应用的团队都在头疼的问题
2023 年下半年我帮一家国内头部电商做售后客服 Agent 的落地,项目上线第一周的数据出来的时候,整个项目组的人都傻了:任务成功率只有 61.8%。也就是说100个用户的售后请求,只有62个能被Agent完全自动处理,剩下38个全部要转人工,和之前预期的90%+成功率差了十万八千里。老板下了死命令:3个月内必须把成功率拉到95%以上,否则项目直接下线。
相信所有做过 LLM Agent 落地的团队都有过类似的经历:演示的时候样样都行,一上线就各种掉链子:要么把用户的「退货」需求理解成「换货」,要么调用退款接口的时候填错了金额,要么凭空捏造不存在的售后政策,要么卡在某一步无限循环。根据2024年大模型应用落地报告,全球范围内上线的 LLM Agent 平均成功率只有 62%,远达不到生产级系统 95% 以上的可用性要求。
这篇文章我会把我们用3个月把客服Agent成功率从61.8%拉到95.7%的全套方法论毫无保留地分享出来,从底层原理、技术框架、落地步骤、代码实现到最佳实践,看完你就能直接套用到自己的Agent项目里,最快2周就能把成功率提升20%以上。
2. 概念地图:Agent 可靠性工程的整体框架
在动手优化之前,我们首先要搞清楚几个核心概念,建立整体的认知框架:
2.1 核心概念定义
| 概念 | 定义 | 计算方式 |
|---|---|---|
| Agent 成功率 | 单位时间内,Agent 无需人工介入即可完全正确完成用户任务的比例 | SuccessRate=Count(SuccessTasks)Count(TotalTasks)×100%SuccessRate = \frac{Count(SuccessTasks)}{Count(TotalTasks)} \times 100\%SuccessRate=Count(TotalTasks)Count(SuccessTasks)×100% |
| 错误归因 | 对Agent失败的任务进行分类,定位根因的过程 | 按错误类型分为四大类:意图理解错误、推理决策错误、工具执行错误、结果输出错误 |
| 可靠性边际成本 | 每提升1%的成功率需要投入的额外资源 | MarginalCost=Delta(OptimizationCost)Delta(SuccessRate)MarginalCost = \frac{Delta(OptimizationCost)}{Delta(SuccessRate)}MarginalCost=Delta(SuccessRate)Delta(OptimizationCost) |
| 容错半径 | Agent 出现错误后可以自动修复而不影响最终结果的最大范围 | 由重试次数、反思机制、兜底规则共同决定 |
2.2 可靠性工程整体架构
整个系统是一个闭环:监控层负责发现问题,优化层负责解决问题,执行层负责落地优化策略,兜底层负责接住所有漏网的错误,最后兜底的结果再反馈回监控层,不断迭代优化。
3. 基础理解:为什么你的Agent成功率只有60%?
很多人第一反应是Agent成功率低是因为模型不够好,只要换成 GPT-4 就能解决问题,这是最大的误解。我们做过对比实验:把基座模型从 gpt-3.5-turbo 换成 gpt-4,成功率只提升了7%,从61.8%到68.9%,离95%还差得远。
Agent 就像一个刚入职的实习生,你让他帮你处理售后请求,他成功率低的原因从来不是他不够聪明,而是:
- 你没给他讲清楚规则,他不知道什么能做什么不能做
- 你没给他足够的信息,他不知道公司的售后政策是什么
- 你没给他检查的机制,他做完就直接发给用户,错了也不知道
- 你没给他犯错后的补救方案,他做错了就卡在那里不知道怎么办
我们对几千个失败case做了统计,错误分布如下:
| 错误类型 | 占比 | 典型场景 | 优化ROI |
|---|---|---|---|
| 意图理解错误 | 32% | 把用户的「我要退掉买的衣服」理解成「我要换尺码」 | 极高 |
| 工具执行错误 | 28% | 调用退款接口的时候填错了订单号、退款金额超过上限 | 极高 |
| 推理决策错误(幻觉) | 22% | 告诉用户不支持7天无理由的商品可以退货,凭空捏造不存在的优惠 | 高 |
| 上下文丢失错误 | 10% | 用户之前说过是学生,后面推荐的时候又忘了给学生优惠 | 高 |
| 其他错误(网络、系统) | 8% | 调用工具超时、系统宕机 | 中 |
可以看到90%以上的错误都不是模型能力的问题,是流程和机制的问题,这也是为什么我们可以通过可靠性工程把成功率拉到95%以上的核心原因。
4. 层层深入:四步把成功率从60%拉到95%
4.1 第一步:7天基线排查期,把成功率从60%拉到70%
核心目标:搞清楚你的Agent到底在什么地方出错,先把最容易拿的分拿到手。
4.1.1 全链路埋点,把每一步都记录下来
优化的前提是知道哪里错了,所以第一步必须做全链路埋点,把Agent执行任务的每一步都记录下来,包括:
- 用户的原始输入
- 意图识别的结果
- 调用的每一个工具、参数、返回值
- 每一步的推理过程
- 最终输出给用户的内容
- 用户的反馈(是否满意、是否转人工)
埋点的代码非常简单,我们用 Python 实现的装饰器埋点示例:
importfunctoolsimporttimefromdatetimeimportdatetimefromtypingimportAny,Callabledeftrace_step(step_name:str):"""全链路埋点装饰器"""defdecorator(func:Callable)->Callable:@functools.wraps(func)asyncdefwrapper(*args,**kwargs)->Any:start_time=time.time()trace_id=kwargs.get("trace_id","")try:result=awaitfunc(*args,**kwargs)status="success"error_msg=""returnresultexceptExceptionase:status="failed"error_msg=str(e)raiseefinally:duration=time.time()-start_time# 写入埋点数据库trace_data={"trace_id":trace_id,"step_name":step_name,"status":status,"error_msg":error_msg,"duration":duration,"timestamp":datetime.now().isoformat(),"args":str(args),"kwargs":str(kwargs)}# 异步写入,不影响主流程asyncio.create_task(write_trace_to_db(trace_data)