在构建AI智能体系统时,推理调用费用常常成为项目能否持续运营的隐形门槛。一个具备多轮对话、工具调用与记忆能力的Agent,每次交互都可能涉及数次大模型请求,若不加控制,月度开销会随用户量线性甚至指数增长。本文从工程实践角度,系统梳理三类已被验证的成本优化手段:缓存复用、模型降级路由、以及Prompt压缩,并给出可落地的代码与设计思路。

缓存机制:用空间换推理成本
缓存是降低Agent成本最直接的方式。其核心思想是识别可复用的计算结果,将请求特征映射为键,将模型输出或中间状态存为值。常见维度包括用户问题的语义哈希、工具调用的参数组合、以及特定知识库查询的返回。当相同或者高度相似请求再次出现,系统直接读取缓存,完全跳过模型推理环节。
在工程实现中,应避免简单字符串相等判断,因为用户提问常有措辞差异。可采用embedding向量近似检索,设定相似度阈值。例如将用户问题向量化后,在Redis中查询最近邻,若余弦相似度大于0.92则命中缓存。下面示例展示基于语义的缓存读写逻辑:
import hashlib
import numpy as np
from redis import Redis
r = Redis(host='127.0.0.1', port=6379, db=0)
def get_cache(query_vec):
# 遍历缓存集,计算相似度
for key in r.scan_iter('agent_cache:*'):
cached_vec = np.frombuffer(r.get(key), dtype=np.float32)
sim = np.dot(query_vec, cached_vec) / (np.linalg.norm(query_vec) * np.linalg.norm(cached_vec))
if sim > 0.92:
return r.get(key.decode().split(':')[1])
return None
def set_cache(query_vec, answer_text):
key = 'agent_cache:' + hashlib.md5(query_vec.tobytes()).hexdigest()
r.set(key, query_vec.tobytes())
r.set('agent_cache_val:' + hashlib.md5(query_vec.tobytes()).hexdigest(), answer_text)
缓存策略也有明显边界。首先,涉及实时数据或用户私有信息的请求不能缓存,否则会引发数据泄露。其次,模型版本升级后旧缓存可能语义偏移,需要带版本号命名空间。最后,缓存命中率低于两成时,维护成本可能超过收益,此时应优先优化其他路径。
为提升命中率,可对输入做归一化:去掉语气词、统一同义词、截取实体。这样不同表述能映射到同一缓存键。实践中,FAQ类、工具说明类、系统角色设定类的响应最适合缓存,通常可覆盖智能体四成以上的调用量。
模型降级:按任务复杂度动态路由
并非所有Agent步骤都需要顶级大模型。意图识别、格式校验、关键词抽取等轻量任务,使用小参数模型甚至传统NLP库就能达到可接受准确率。模型降级指构建一个路由器,依据任务类型与历史表现,将请求分派给不同价位模型,从而拉低平均单价。
路由判断可基于规则也可基于分类器。规则方式适合边界清晰的系统,例如检测到用户输入长度小于二十且不含问号,则判为指令确认,转交小模型。更鲁棒的做法是用一个极小的文本分类模型,在网关层预测任务标签。以下代码演示简单路由逻辑:
def route_model(user_text):
# 简单启发式规则
if len(user_text) < 15 and ('是' in user_text or '否' in user_text):
return 'mini-model'
if user_text.startswith('提取') or user_text.startswith('总结'):
return 'small-model'
return 'pro-model'
def call_llm(text):
model = route_model(text)
if model == 'mini-model':
return mini_generate(text)
elif model == 'small-model':
return small_generate(text)
else:
return pro_generate(text)
降级带来的风险是质量波动。若关键决策误判给小模型,可能产生错误动作。因此需设置回退机制:当小模型输出置信度低或触发校验失败,自动升级到高级模型重算。同时,应对外暴露配置项,允许运维按业务期调整路由阈值。
从成本结构看,顶级模型每千token价格可能是小模型的二十倍。将三成流量切到小模型,整体费用可降四成左右。需要注意的是,频繁切换模型会增加系统复杂度,团队应建立效果监控面板,持续比对各模型在真实场景的准确率与用户满意度。
Prompt压缩:缩短上下文以省token
大模型按token计费,而Agent多轮对话会不断累积历史,导致单次输入越来越长。Prompt压缩通过抽取关键信息、删除冗余、合并相邻轮次,在保留语义前提下大幅缩减长度。常见技术包括摘要式压缩、实体保留、以及结构化裁剪。
摘要式压缩利用模型自身将早期对话浓缩成三句话;实体保留则只提取人名、订单号等字段形成JSON;结构化裁剪直接丢弃低权重记忆。下面示例展示如何把对话列表压缩为精简上下文:
def compress_history(dialog_list):
# dialog_list为[{role, content}]结构
if len(dialog_list) <= 4:
return dialog_list
early = dialog_list[:-4]
late = dialog_list[-4:]
summary = small_model_summarize(early)
compressed = [{'role': 'system', 'content': '历史摘要:' + summary}]
compressed.extend(late)
return compressed
def small_model_summarize(texts):
joined = ';'.join([t['content'] for t in texts])
return '用户咨询过退款与物流,已提供订单号A100。'
压缩比例需权衡信息损失。过度压缩会让模型遗忘用户偏好,造成答非所问。建议采用分层存储:原始明细入向量库,上下文只放压缩版加检索指针。当用户追问细节,再从库里拉取。这样既控制主上下文长度,又不丢失可回溯性。
结合缓存与降级,Prompt压缩能形成闭环优化。压缩后的输入更小,缓存命中概率提升;小模型处理压缩文本也更稳定。三者协同,可使智能体在高峰期单日成本下降六成以上,而终端用户几乎感知不到后端变化。落地时建议先度量各环节基线开销,再分阶段注入策略,用AB测试验证体验无劣化后再全量。
Agent_cost_optimizationmodel_degradationprompt_compression修改时间:2026-08-17 01:04:18