Agent Token 优化进阶:生产环境的成本控制实战
Token 优化不是省钱这么简单。在生产环境里,Token 成本直接影响 Agent 的可用性——单次调用贵了,你就舍不得让 Agent 多跑;上下文长了,延迟就上去;缓存命中率低,同样的问题反复花钱。
这篇聊生产环境里真正管用的 Token 优化手段,从 prompt 压缩到分级推理,都是踩过坑的。
先搞清楚钱花在哪
优化之前先量。大多数团队连自己的 Token 消耗分布都不知道,上来就优化,往往优化错地方。
1 | # token_profiler.py |
跑一周,你就知道哪个 Agent 吃 Token 最狠。通常 80% 的成本来自 20% 的调用——这些才是优化目标。
Prompt 压缩:砍掉废话
Agent 的 prompt 里有很多”废话”——重复的系统指令、过长的工具描述、不需要的示例。砍掉这些不影响效果,但能省 30-50% 的 prompt tokens。
手动压缩
几个立竿见影的做法:
1. 工具描述精简。 大部分 Agent 框架会把所有工具的完整描述塞进 prompt。但一次对话通常只用 2-3 个工具。
1 | # 不要这样:把所有工具描述都放进去 |
2. 示例精简。 Few-shot 示例是好东西,但 5 个示例太多了。3 个足够,而且只放和当前任务最相关的。
3. 系统指令去重。 如果你在多个地方说了类似的话(比如 system prompt 和 tool description 都强调了”安全”),只保留一处。
自动压缩
手动压缩有上限,自动压缩能做得更彻底:
1 | # prompt_compressor.py |
更激进的方案可以用 LLM 做压缩——用一个便宜模型把长 prompt 压成短 prompt,再用贵模型处理。两步加起来比直接用贵模型处理长 prompt 便宜。
缓存策略:同样的钱不花两次
缓存是 Token 优化的重头戏。OpenAI 从 2024 年开始支持 prompt caching,相同前缀的 prompt 只收半价。
1. 固定前缀缓存
把 prompt 分成两部分:不变的(系统指令、工具定义)+ 变化的(用户输入、对话历史)。不变的放前面,这样每次请求都能命中缓存。
1 | # 缓存友好:固定前缀 + 变量后缀 |
2. 语义缓存
同样的用户意图,换了个说法,缓存就miss了。语义缓存解决这个问题:
1 | import hashlib |
语义缓存在客服场景特别有效——“我的快递到哪了”和”物流信息是什么”是同一个问题,缓存命中直接返回,不调 LLM。
3. 对话历史压缩
Agent 跑久了,对话历史越来越长,Token 消耗线性增长。解决办法:定期压缩历史。
1 | def compress_history(history: list, llm_client) -> list: |
10 轮对话压缩后,从 ~5000 tokens 降到 ~1500 tokens,后续每轮都能省 3500 tokens。
分级推理:该快的快,该省的省
不是每次调用都需要最强模型。分级推理根据任务复杂度选模型:
1 | class TieredRouter: |
实际效果:客服 Agent 大约 70% 的请求可以走 fast tier,成本降到 1/15。
一个完整的优化检查清单
| 手段 | 预期节省 | 实施难度 | 优先级 |
|---|---|---|---|
| 工具描述精简 | 20-30% prompt | 低 | P0 |
| 固定前缀缓存 | 50% prompt (缓存命中时) | 低 | P0 |
| 对话历史压缩 | 40-60% prompt (长对话) | 中 | P1 |
| 分级推理 | 60-80% (fast tier) | 中 | P1 |
| 语义缓存 | 10-30% (高频场景) | 中 | P2 |
| Prompt 自动压缩 | 30% prompt | 高 | P2 |
P0 先做,一周就能上。P1 需要一些开发量但回报大。P2 是锦上添花。
别为了省 Token 牺牲效果
最后说一句:Token 优化的前提是不影响 Agent 的输出质量。省了 Token 但答案变差了,那是本末倒置。
判断标准:A/B 测试。优化前后各跑 100 个相同请求,比较输出质量。如果质量下降超过 5%,这个优化就不值得。
Token 优化是个持续过程。模型在变,定价在变,你的 Agent 也在变。每月看一次 profile 报告,哪里的成本涨了,就优化哪里。
相关阅读:
- OpenAI Prompt Caching 文档
- LangChain ConversationSummaryMemory
-《Designing Machine Learning Systems》Chapter 9 - Serving ML Systems