AI Agent 上线后又慢又贵?一次生产环境优化复盘
AI Agent 性能优化教程|生产环境实测
面向已经上线或即将上线 AI Agent 的团队:本文从生产环境真实问题出发,系统讲解如何优化 AI Agent 的响应速度、稳定性、成本、工具调用效率与用户体验。内容覆盖架构设计、Prompt 优化、模型选择、缓存策略、RAG 优化、工具调用、并发控制、监控评估等关键环节。
一、为什么 AI Agent 在生产环境中容易“变慢、变贵、变不稳”?
很多团队在 Demo 阶段开发 AI Agent 时,体验往往非常顺滑:用户输入问题,Agent 调用大模型,必要时访问知识库或工具,然后返回答案。但一旦进入生产环境,问题会迅速暴露:
- 响应时间从几秒增加到十几秒甚至几十秒;
- 大模型 Token 消耗失控,单次请求成本过高;
- Agent 经常重复调用工具,产生无效链路;
- 多轮对话上下文越来越长,导致延迟和费用同步上升;
- RAG 检索结果不稳定,答案质量波动明显;
- 高并发下出现超时、排队、失败重试;
- 用户觉得“它会思考,但思考得太慢”。
AI Agent 与普通聊天机器人最大的区别在于:它不只是生成文本,还会规划任务、调用工具、检索知识、执行动作,并根据执行结果继续推理。这种能力越强,系统链路越复杂,性能问题也越突出。
因此,AI Agent 性能优化不能只看“大模型速度”,而要从完整链路出发:
用户请求
↓
意图识别
↓
上下文构建
↓
模型推理
↓
工具选择
↓
工具调用
↓
结果解析
↓
二次推理
↓
最终回复
任何一个环节耗时、失败或成本过高,都会影响整体体验。
二、生产环境实测:AI Agent 的主要性能瓶颈
在多个生产项目中,我们通常会把 AI Agent 的耗时拆分为以下几个部分:
| 环节 | 常见耗时 | 常见问题 |
|---|---|---|
| 请求接入与鉴权 | 10ms - 100ms | 通常不是主要瓶颈 |
| 上下文拼接 | 10ms - 300ms | 历史消息过长、重复内容过多 |
| RAG 检索 | 100ms - 1500ms | 向量库慢、召回过多、重排序耗时 |
| 模型首 Token 延迟 | 500ms - 5000ms | 模型负载、Prompt 太长 |
| 模型完整生成 | 2s - 30s | 输出过长、推理复杂 |
| 工具调用 | 100ms - 10s+ | 外部 API 慢、串行调用过多 |
| Agent 多步推理 | 3s - 60s+ | 循环规划、重复调用、无终止条件 |
| 后处理 | 10ms - 500ms | JSON 修复、格式化、内容过滤 |
实际项目中,最常见的性能瓶颈通常集中在四类:
- Prompt 和上下文过长
- 模型选择不合理
- 工具调用链路过多且串行
- 缺少缓存、监控和超时机制
尤其是 Agent 型应用,很多时候不是模型“不够快”,而是系统让模型做了太多不必要的事情。
三、优化目标:不只是快,还要稳、准、省
AI Agent 性能优化不能只追求响应速度。一个生产级 Agent 至少要同时关注四个指标:
1. 延迟 Latency
包括:
- 首 Token 时间;
- 完整响应时间;
- 工具调用耗时;
- 多轮推理总耗时。
对于在线客服、销售助手、办公助理等场景,用户通常可以接受 3-8 秒的响应。如果超过 15 秒,用户流失会明显增加。
2. 成本 Cost
成本主要来自:
- 输入 Token;
- 输出 Token;
- Embedding;
- Rerank;
- 工具 API;
- 数据库和向量库查询;
- 失败重试。
很多团队上线后才发现,成本不是随着用户数线性增长,而是被长上下文、多轮工具调用和重复请求放大。
3. 准确率 Accuracy
性能优化不能牺牲答案质量。比如一味减少上下文可能导致 Agent 缺少必要信息;降低模型规格可能导致工具选择错误。
4. 稳定性 Reliability
生产环境中必须关注:
- 超时率;
- 错误率;
- 工具调用失败率;
- JSON 解析失败率;
- Agent 死循环率;
- 降级成功率。
一个优秀的 AI Agent 不是永远不失败,而是在失败时能够可控地降级。
四、第一步:建立可观测性,否则无法优化
很多团队优化 AI Agent 的第一反应是“换更快的模型”或“改 Prompt”。但如果没有完整监控,就无法判断真正瓶颈在哪里。
建议对每次请求记录 Trace,至少包含:
{
"request_id": "req_123",
"user_id": "u_456",
"agent_name": "sales_agent",
"total_latency_ms": 6420,
"model_latency_ms": 3800,
"retrieval_latency_ms": 420,
"tool_latency_ms": 1500,
"input_tokens": 4200,
"output_tokens": 680,
"tool_calls": 3,
"model_name": "xxx",
"success": true
}
推荐监控指标
| 指标 | 说明 |
|---|---|
| P50/P90/P99 延迟 | 观察普通用户和极端用户体验 |
| 平均 Token 数 | 判断 Prompt 是否过长 |
| 工具调用次数 | 判断 Agent 是否过度行动 |
| 工具调用成功率 | 定位外部系统问题 |
| RAG 命中率 | 判断知识库是否有效 |
| 重试次数 | 判断稳定性问题 |
| 单次请求成本 | 控制商业化风险 |
| 用户满意度 | 最终业务指标 |
生产环境中,建议把每一次 Agent 执行拆成类似 OpenTelemetry 的 Span:
agent.run
├── context.build
├── retrieval.search
├── model.plan
├── tool.crm_query
├── tool.order_query
├── model.final_answer
└── response.format
这样一旦响应慢,就能明确知道慢在检索、模型还是工具。
五、Prompt 优化:减少无效 Token 是最直接的提速方式
Prompt 是 AI Agent 性能优化中收益最高的部分之一。因为输入越长:
- 模型首 Token 延迟越高;
- 推理成本越高;
- 模型越容易被无关信息干扰;
- 上下文窗口越容易被浪费。
1. 精简 System Prompt
很多 Agent 的 System Prompt 会写得非常长,包含大量规则、背景、示例和安全要求。上线后建议拆分为:
- 核心行为规则;
- 场景专用规则;
- 工具调用规则;
- 输出格式规则。
不要把所有规则都塞进每次请求。可以根据用户意图动态加载相关规则。
例如,低效写法:
你是一个企业级智能助手,你需要了解公司的全部产品、全部业务流程、全部售后政策……
优化后:
你是企业客服 Agent。
目标:准确回答用户问题,必要时调用工具查询订单或售后政策。
限制:不要编造订单状态;无数据时说明无法确认。
输出:使用简洁中文。
2. 压缩历史对话
多轮对话是 Token 增长最快的来源。生产环境中不要简单把所有历史消息塞给模型,而应采用以下策略:
- 最近 N 轮原文保留;
- 更早的对话进行摘要;
- 与当前问题无关的历史丢弃;
- 关键信息结构化保存。
示例:
{
"user_profile": {
"name": "张先生",
"member_level": "VIP"
},
"conversation_summary": "用户之前咨询过订单A123的物流延迟问题,并希望优先安排售后处理。",
"recent_messages": [
{"role": "user", "content": "现在能帮我查一下处理进度吗?"}
]
}
这样既保留了必要上下文,又减少了大量冗余 Token。
3. 工具描述要短而准确
Agent 选择工具时通常依赖工具名称、描述和参数说明。如果工具描述过长,不仅浪费 Token,还可能让模型混淆。
不推荐:
这个工具可以用来查询用户在我们公司系统中的所有订单信息,包括但不限于订单创建时间、支付状态、物流状态、售后状态……
推荐:
查询订单状态。适用场景:用户提供订单号并询问支付、物流或售后进度。
参数也应清晰:
{
"order_id": "订单号,必填"
}
六、模型选择:不是所有步骤都需要最强模型
很多团队把所有任务都交给同一个大模型处理,这是成本和延迟失控的重要原因。生产级 Agent 应采用“分层模型策略”。
1. 简单任务用小模型
适合小模型的任务包括:
- 意图分类;
- 敏感词判断;
- 简单 FAQ;
- 参数抽取;
- 标题生成;
- 结果格式化。
这些任务不需要复杂推理,用低成本、低延迟模型即可。
2. 复杂规划用强模型
适合强模型的任务包括:
- 多步骤任务规划;
- 复杂问题分析;
- 跨系统推理;
- 高风险决策;
- 长文本综合。
这样可以把强模型用在真正有价值的地方。
3. 推荐架构
用户输入
↓
小模型:意图识别 / 路由
↓
判断任务复杂度
├── 简单问题:FAQ / 小模型直接回答
├── 查询类问题:工具调用 + 小模型总结
└── 复杂问题:强模型规划 + 工具执行 + 强模型总结
在实测中,采用分层模型后,很多场景可以降低 30%-70% 的模型成本,同时延迟明显下降。
七、RAG 优化:不要把知识库内容一股脑塞给 Agent
RAG 是企业 AI Agent 中非常常见的能力,但也是性能和质量问题高发区。
1. 控制召回数量
很多系统默认召回 top 10 或 top 20 文档,然后全部放入 Prompt。这样很容易造成上下文膨胀。
建议策略:
- 初始召回 top 20;
- 使用 rerank 精排;
- 最终只注入 top 3-5;
- 对长文档片段进行压缩。
2. 优化 Chunk 切分
Chunk 太大,会浪费 Token;Chunk 太小,会丢失上下文。
常见建议:
- FAQ:每条问答作为一个 Chunk;
- 产品文档:按小节切分;
- 政策文档:按条款切分;
- 技术文档:按标题层级切分;
- Chunk 长度控制在 300-800 中文字之间。
3. 增加元数据过滤
如果用户询问的是“售后政策”,就不应该从“产品介绍”中召回大量无关内容。可以在检索前增加分类过滤:
{
"category": "after_sales",
"product_line": "phone",
"region": "cn"
}
这样既提高准确率,也减少后续模型处理成本。
4. 对检索结果进行摘要压缩
对于长文档,可以先由小模型做压缩,再交给主模型回答:
原始检索片段:3000 字
压缩后关键信息:500 字
在生产环境中,这种方式能显著减少输入 Token,尤其适合政策、合同、财报、说明书等长文本场景。
八、工具调用优化:减少不必要的行动
AI Agent 的强大之处在于能调用工具,但工具调用也是主要性能瓶颈之一。
1. 明确工具调用条件
不要让 Agent 在任何不确定时都调用工具。应该在 Prompt 中明确:
仅当用户问题需要实时数据、账户数据、订单数据或外部系统状态时,才调用工具。
如果用户询问通用知识,直接回答。
如果缺少必要参数,先向用户追问,不要调用工具。
例如用户问:“退货政策是什么?”
这通常不需要查订单,只需要查知识库。
用户问:“我的订单为什么还没发货?”
这就需要订单号和订单系统查询。
2. 工具调用前做参数完整性校验
常见低效链路是:
用户:帮我查订单
Agent:调用订单查询工具
工具:缺少订单号,失败
Agent:再问用户订单号
更合理的流程:
用户:帮我查订单
Agent:请提供订单号
用户:A123
Agent:调用订单查询工具
这可以减少一次无效工具调用。
3. 并行调用工具
如果多个工具之间没有依赖关系,应并行执行。
例如用户问:
帮我查一下这个客户的最近订单、售后记录和当前会员等级。
低效串行:
查订单 800ms
查售后 1200ms
查会员 500ms
总耗时约 2500ms
优化并行:
max(800ms, 1200ms, 500ms) = 1200ms
并行调用可以显著降低整体延迟。
4. 设置工具超时和降级
每个工具都必须配置:
- 超时时间;
- 最大重试次数;
- 失败后的降级策略;
- 错误信息标准化。
例如:
{
"tool": "order_query",
"timeout_ms": 2000,
"retry": 1,
"fallback": "提示用户稍后重试,或转人工客服"
}
没有超时控制的 Agent,在生产环境中非常危险。一个外部 API 卡住,就可能拖垮整个请求链路。
九、缓存策略:减少重复计算和重复调用
缓存是生产环境中最有效的优化手段之一。
1. FAQ 缓存
对于高频问题,如:
- 如何退货?
- 发票怎么开?
- 会员权益有哪些?
- 运费怎么算?
可以使用语义缓存。用户表达不同,但语义相同,则直接返回缓存答案。
用户A:怎么申请退款?
用户B:我想退钱怎么办?
用户C:退款流程是什么?
这些问题可以命中同一个缓存结果。
2. RAG 检索缓存
对于相同或相似查询,可以缓存:
- 向量检索结果;
- rerank 结果;
- 文档摘要结果。
这样可以减少向量库和模型调用成本。
3. 工具结果缓存
部分工具数据具有短时间稳定性,例如:
- 商品详情;
- 物流节点;
- 用户会员等级;
- 活动规则;
- 库存状态。
可以设置 TTL:
| 数据类型 | 建议 TTL |
|---|---|
| 商品详情 | 10-60 分钟 |
| 活动规则 | 5-30 分钟 |
| 物流状态 | 1-5 分钟 |
| 会员等级 | 5-30 分钟 |
| 订单支付状态 | 30 秒-2 分钟 |
注意,涉及资金、权限、强实时状态的数据要谨慎缓存。
4. 模型响应缓存
对于确定性较高的请求,可以缓存最终回答。建议配合:
- 低 temperature;
- 标准化 Prompt;
- 用户权限隔离;
- 业务版本号;
- 知识库版本号。
缓存 Key 可以包含:
hash(user_intent + normalized_query + knowledge_version + policy_version)
十、Agent 循环控制:防止无限思考和重复调用
Agent 经常会出现一种问题:它不断分析、调用工具、再分析、再调用工具,却迟迟不给最终答案。
生产环境中必须设置硬性限制:
{
"max_steps": 5,
"max_tool_calls": 4,
"max_total_latency_ms": 15000,
"max_tokens": 2000
}
推荐终止条件
- 已获取回答所需信息;
- 工具返回明确失败;
- 缺少必要参数;
- 达到最大步骤数;
- 达到最大耗时;
- 用户问题超出能力范围。
避免重复调用同一工具
可以记录工具调用历史:
[
{
"tool": "order_query",
"params": {"order_id": "A123"},
"result_hash": "xxx"
}
]
如果 Agent 再次准备以相同参数调用同一工具,应阻止并提示模型使用已有结果。
十一、流式输出:改善用户感知速度
即使总耗时无法大幅下降,也可以通过流式输出改善用户体验。
例如:
正在查询订单状态……
已查询到物流信息,正在核对售后记录……
根据查询结果,你的订单目前……
流式输出的价值在于:
- 降低用户等待焦虑;
- 让用户知道系统没有卡死;
- 提前展示中间进度;
- 提升对长任务的容忍度。
但要注意,工具调用前后的流式提示应真实,不要假装已经完成某个操作。
推荐结构:
1. 接收请求
2. 判断需要查询订单
3. 展示“正在查询订单”
4. 工具返回
5. 展示最终结果
十二、输出控制:减少冗长回答
很多 Agent 输出过长,是因为 Prompt 中没有明确要求。输出越长,延迟越高,成本越高,用户也未必愿意看。
可以在 Prompt 中加入:
默认回答不超过 300 字。
除非用户要求详细解释,否则优先给出结论。
使用项目符号展示关键信息。
对于客服类 Agent,推荐回答结构:
结论:
原因:
下一步建议:
对于数据分析类 Agent,推荐:
关键发现:
数据依据:
建议动作:
对于代码类 Agent,推荐:
问题原因:
修改方案:
示例代码:
注意事项:
十三、生产环境实测优化案例
下面以一个企业客服 Agent 为例。
优化前
该 Agent 具备以下能力:
- 查询知识库;
- 查询订单;
- 查询售后;
- 查询物流;
- 总结回答。
用户问题示例:
我的订单 A123 为什么还没收到?
优化前链路:
1. 加载完整 System Prompt:约 3000 tokens
2. 加载最近 20 轮对话:约 5000 tokens
3. RAG 召回 10 个片段:约 4000 tokens
4. 模型判断需要查订单
5. 调用订单工具:800ms
6. 模型判断需要查物流
7. 调用物流工具:1200ms
8. 模型生成最终回答:900 tokens
实测指标:
| 指标 | 优化前 |
|---|---|
| 平均总耗时 | 14.8s |
| P90 耗时 | 28.5s |
| 平均输入 Token | 12000+ |
| 平均输出 Token | 900 |
| 平均工具调用 | 2.7 次 |
| 单次成本 | 较高 |
| 用户满意度 | 一般 |
优化措施
我们做了以下调整:
- System Prompt 从 3000 tokens 压缩到 900 tokens;
- 历史对话只保留最近 5 轮,其余摘要;
- RAG 先按意图过滤,只召回物流和售后相关内容;
- RAG 最终注入 top 3 片段;
- 订单和物流工具在参数已知时并行调用;
- 对订单状态设置 60 秒缓存;
- Agent 最大步骤数限制为 4;
- 默认回答限制在 300 字内;
- 简单物流问题用小模型总结。
优化后
| 指标 | 优化前 | 优化后 |
|---|---|---|
| 平均总耗时 | 14.8s | 5.6s |
| P90 耗时 | 28.5s | 9.8s |
| 平均输入 Token | 12000+ | 3800 |
| 平均输出 Token | 900 | 280 |
| 平均工具调用 | 2.7 次 | 1.6 次 |
| 单次成本 | 100% | 约 38% |
| 用户满意度 | 一般 | 明显提升 |
这个案例说明:AI Agent 优化不是单点优化,而是链路优化。Prompt、RAG、工具、缓存、模型路由共同作用,才能获得明显收益。
十四、推荐的生产级 AI Agent 架构
一个较成熟的生产级 Agent 架构可以设计为:
用户请求
↓
请求预处理
├── 鉴权
├── 限流
├── 敏感信息处理
↓
意图识别与路由
├── FAQ
├── RAG
├── 工具调用
└── 人工转接
↓
上下文管理
├── 最近对话
├── 长期记忆
├── 用户画像
└── 会话摘要
↓
Agent 执行器
├── 规划
├── 工具选择
├── 工具调用
├── 结果检查
└── 最终回答
↓
后处理
├── 格式化
├── 安全检查
├── 引用来源
└── 日志记录
↓
响应用户
关键是不要让一个大模型承担所有职责,而是通过工程架构拆解任务。
十五、上线前性能压测清单
AI Agent 上线前建议做压测和回归测试。
1. 延迟测试
- 单用户连续对话;
- 多用户并发请求;
- 长上下文请求;
- 多工具调用请求;
- RAG 大文档请求。
2. 稳定性测试
- 工具 API 超时;
- 向量库不可用;
- 模型返回格式错误;
- 用户缺少参数;
- 用户输入异常内容;
- 高并发限流。
3. 成本测试
- 单次平均 Token;
- P90 Token;
- 每日请求量预估;
- 缓存命中率;
- 重试成本;
- 不同模型路由比例。
4. 质量测试
- FAQ 准确率;
- RAG 引用正确率;
- 工具调用正确率;
- 多轮上下文一致性;
- 拒答和转人工策略;
- 幻觉率。
十六、常见误区
误区一:只换更快的模型
换模型可能有效,但如果 Prompt 很长、工具调用混乱、RAG 注入过多,换模型只能缓解一部分问题。
误区二:上下文越多越好
上下文越多不代表答案越准。无关上下文会干扰模型判断,也会增加成本和延迟。
误区三:Agent 步骤越多越智能
在生产环境中,步骤越多意味着越慢、越贵、越不稳定。优秀的 Agent 应该尽量少走弯路。
误区四:所有问题都需要 Agent
很多问题用 FAQ、规则引擎或普通检索就能解决。不是所有请求都应该进入复杂 Agent 流程。
误区五:没有监控就凭感觉优化
没有 Trace 和指标,优化很容易变成猜测。生产环境必须数据驱动。
十七、性能优化最佳实践总结
最后给出一份简洁的优化清单:
- 压缩 System Prompt,动态加载规则;
- 历史对话摘要化,避免无限增长;
- 简单任务使用小模型;
- 复杂任务才调用强模型;
- RAG 先过滤、再召回、再重排、再压缩;
- 控制注入 Prompt 的文档数量;
- 明确工具调用条件;
- 工具调用前校验参数;
- 无依赖工具并行执行;
- 设置工具超时、重试和降级;
- 对 FAQ、RAG、工具结果做缓存;
- 限制 Agent 最大步骤数;
- 防止重复调用同一工具;
- 使用流式输出改善体验;
- 控制最终回答长度;
- 建立完整 Trace 监控;
- 持续评估延迟、成本、准确率和满意度。
结语
AI Agent 的生产环境优化,本质上是“大模型能力”和“工程系统能力”的结合。模型决定了 Agent 的智能上限,而工程优化决定了它能否稳定、快速、低成本地服务真实用户。
一个优秀的 AI Agent,不应该只是会回答问题,更应该具备以下特征:
- 该快的时候快;
- 该查的时候查;
- 不该查的时候不乱查;
- 知道自己什么时候不知道;
- 出错时能够降级;
- 成本可控;
- 指标可观测;
- 质量可持续改进。
如果你的 AI Agent 已经上线但体验不稳定,建议不要急着重构系统,而是先从监控入手,拆解每一次请求的耗时、Token、工具调用和错误率。通常只要完成 Prompt 压缩、上下文管理、模型分层、RAG 精简、工具并行和缓存策略,就能在不牺牲质量的前提下,显著提升性能并降低成本。