引言
Agent系统的运营成本主要由三部分构成:LLM Token费用(60-70%)、基础设施成本(20-25%)和工具/API调用费用(5-15%)。随着用户规模增长,如果不做系统性的成本优化,每月的运营成本可能达到数十万甚至数百万美元。
2026年,Agent成本优化(Agent FinOps)已成为独立的技术领域。本文将从实际工程角度,系统讲解如何在不损害用户体验的前提下,将Agent系统的运营成本降低50-70%。
成本构成分析
class CostBreakdown:
"""Agent系统成本分解"""
TYPICAL_DISTRIBUTION = {
"llm_inference": {
"proportion": 0.65,
"sub_items": {
"input_tokens": 0.35,
"output_tokens": 0.55,
"embedding": 0.10,
}
},
"infrastructure": {
"proportion": 0.22,
"sub_items": {
"gpu_compute": 0.55,
"cpu_compute": 0.20,
"storage": 0.15,
"network": 0.10,
}
},
"external_apis": {
"proportion": 0.10,
"sub_items": {
"search_api": 0.40,
"tool_apis": 0.35,
"data_sources": 0.25,
}
},
"observability": {
"proportion": 0.03,
"sub_items": {
"logging": 0.40,
"tracing": 0.30,
"monitoring": 0.30,
}
}
}
Token优化
Prompt压缩
class PromptOptimizer:
"""Prompt压缩与优化"""
async def optimize_prompt(self, messages: list) -> list:
"""优化对话历史,减少Token消耗"""
# 策略1:摘要旧消息
if len(messages) > 10:
old_messages = messages[:-4]
recent_messages = messages[-4:]
summary = await self._summarize(old_messages)
messages = [
{"role": "system", "content": f"Previous context: {summary}"}
] + recent_messages
# 策略2:移除冗余系统提示
messages = self._deduplicate_system_messages(messages)
# 策略3:压缩工具描述
messages = self._compress_tool_definitions(messages)
return messages
async def _summarize(self, messages: list) -> str:
"""使用小模型生成摘要"""
summary_prompt = "Summarize the following conversation in 200 words:"
for msg in messages:
summary_prompt += f"\n{msg['role']}: {msg['content'][:200]}"
response = await self.llm.generate(
model="gpt-4o-mini", # 用小模型做摘要
prompt=summary_prompt,
max_tokens=300
)
return response
def _compress_tool_definitions(self, messages: list) -> list:
"""压缩工具定义"""
for msg in messages:
if msg["role"] == "system" and "tools" in msg.get("content", ""):
# 只保留当前轮次需要的工具
needed_tools = self._get_relevant_tools(msg["content"])
msg["content"] = self._rewrite_tool_section(needed_tools)
return messages
响应长度控制
class ResponseLengthController:
"""响应长度控制"""
LENGTH_BUDGETS = {
"simple_qa": {"max_tokens": 200, "avg_tokens": 100},
"explanation": {"max_tokens": 500, "avg_tokens": 300},
"code_generation": {"max_tokens": 2000, "avg_tokens": 800},
"analysis": {"max_tokens": 1500, "avg_tokens": 800},
"creative": {"max_tokens": 1000, "avg_tokens": 500},
}
def get_token_budget(self, request: dict, route: dict) -> int:
"""获取Token预算"""
task_type = route.get("task_type", "explanation")
budget = self.LENGTH_BUDGETS.get(task_type, self.LENGTH_BUDGETS["explanation"])
# 根据用户tier调整
user_tier = request.get("user_tier", "free")
if user_tier == "free":
budget["max_tokens"] = int(budget["max_tokens"] * 0.7)
return budget["max_tokens"]
缓存策略
多级缓存
class AgentCacheStack:
"""Agent多级缓存"""
def __init__(self):
self.layers = [
self._exact_match_cache, # L1: 精确匹配
self._semantic_cache, # L2: 语义缓存
self._tool_result_cache, # L3: 工具结果缓存
self._embedding_cache, # L4: 嵌入缓存
]
async def get_or_compute(self, request: dict) -> dict:
"""多级缓存查询"""
# L1: 精确匹配
cache_key = self._generate_key(request)
cached = await self._exact_match_cache.get(cache_key)
if cached:
self._record_cache_hit("L1_exact")
return cached
# L2: 语义相似查询
similar = await self._semantic_cache.find_similar(
query=request["input"],
threshold=0.95
)
if similar:
self._record_cache_hit("L2_semantic")
return similar
# L3: 检查工具结果缓存
if request.get("tool_calls"):
for tool_call in request["tool_calls"]:
tool_result = await self._tool_result_cache.get(
tool_call["name"],
tool_call["params"]
)
if tool_result:
tool_call["cached_result"] = tool_result
# 缓存未命中,执行计算
result = await self._execute(request)
# 回填缓存
await self._fill_caches(request, result)
return result
async def _fill_caches(self, request: dict, result: dict):
"""回填各级缓存"""
# L1
await self._exact_match_cache.set(
self._generate_key(request),
result,
ttl=3600 # 1小时
)
# L2
await self._semantic_cache.store(
query=request["input"],
response=result,
embedding=await self._embed(request["input"]),
ttl=86400 # 24小时
)
# L3
if result.get("tool_results"):
for tool_result in result["tool_results"]:
await self._tool_result_cache.set(
tool_result["tool_name"],
tool_result["params"],
tool_result["output"],
ttl=1800 # 30分钟
)
缓存命中率监控
class CacheMetrics:
"""缓存指标监控"""
async def get_cache_report(self) -> dict:
return {
"l1_exact": {
"hit_rate": await self._get_rate("cache_l1_hit", "cache_l1_miss"),
"size": await self._get_size("exact_cache"),
"eviction_rate": await self._get_rate("cache_l1_evict"),
},
"l2_semantic": {
"hit_rate": await self._get_rate("cache_l2_hit", "cache_l2_miss"),
"size": await self._get_size("semantic_cache"),
"avg_similarity": await self._get_avg("cache_l2_similarity"),
},
"l3_tool": {
"hit_rate": await self._get_rate("cache_l3_hit", "cache_l3_miss"),
"savings_usd": await self._get_savings("tool_cache"),
},
"total_savings": {
"tokens_saved": await self._get_total("tokens_saved"),
"cost_saved_usd": await self._get_total("cost_saved"),
"latency_saved_ms": await self._get_total("latency_saved"),
}
}
模型选择优化
class ModelCostOptimizer:
"""模型成本优化器"""
MODEL_COSTS = {
"gpt-4o": {"input": 2.50, "output": 10.00}, # per 1M tokens
"gpt-4o-mini": {"input": 0.15, "output": 0.60},
"claude-3.5-sonnet": {"input": 3.00, "output": 15.00},
"claude-3-haiku": {"input": 0.25, "output": 1.25},
"deepseek-v3": {"input": 0.14, "output": 0.28},
"local-llama-70b": {"input": 0.05, "output": 0.05}, # 自部署
}
async def select_cost_optimal_model(
self,
request: dict,
quality_threshold: float = 0.8
) -> str:
"""选择成本最优模型"""
# 估算各模型成本和质量
estimates = []
for model, cost in self.MODEL_COSTS.items():
estimated_tokens = self._estimate_tokens(request)
total_cost = (
estimated_tokens["input"] * cost["input"] +
estimated_tokens["output"] * cost["output"]
) / 1_000_000
quality = await self._estimate_quality(model, request)
if quality >= quality_threshold:
estimates.append({
"model": model,
"cost": total_cost,
"quality": quality,
"value_ratio": quality / total_cost if total_cost > 0 else float('inf')
})
# 选择性价比最高的
return max(estimates, key=lambda e: e["value_ratio"])["model"]
def _estimate_tokens(self, request: dict) -> dict:
"""估算Token消耗"""
input_tokens = len(request["input"]) // 4 # 粗略估算
output_tokens = min(input_tokens, 500) # 响应通常比输入短
return {"input": input_tokens, "output": output_tokens}
批处理优化
class BatchProcessor:
"""请求批处理——合并多个请求降低单次成本"""
async def batch_llm_calls(
self,
requests: list,
max_batch_size: int = 10,
max_wait_ms: int = 100
) -> list:
"""批处理LLM调用"""
batch = []
results = {}
for request in requests:
batch.append(request)
if len(batch) >= max_batch_size:
batch_results = await self._process_batch(batch)
results.update(batch_results)
batch = []
# 处理剩余
if batch:
batch_results = await self._process_batch(batch)
results.update(batch_results)
return [results[r["id"]] for r in requests]
async def _process_batch(self, batch: list) -> dict:
"""处理批次"""
# 合并多个请求为一个prompt
combined_prompt = self._combine_prompts(batch)
response = await self.llm.generate(
model="gpt-4o-mini",
prompt=combined_prompt,
max_tokens=2000
)
# 解析并分配结果
return self._parse_batch_response(response, batch)
基础设施优化
class InfrastructureOptimizer:
"""基础设施成本优化"""
async def optimize_gpu_utilization(self) -> dict:
"""优化GPU利用率"""
current_util = await self._get_avg_gpu_utilization()
recommendations = []
if current_util < 60:
recommendations.append({
"action": "reduce_gpu_instances",
"current": self.gpu_count,
"recommended": max(1, int(self.gpu_count * 0.7)),
"estimated_savings": (self.gpu_count - max(1, int(self.gpu_count * 0.7))) * 2000 # $2000/GPU/month
})
# 建议使用Spot实例
recommendations.append({
"action": "use_spot_instances",
"estimated_savings": self.gpu_count * 800, # 节省40%
"risk": "可能被中断,需要检查点机制"
})
# 建议模型量化
recommendations.append({
"action": "enable_model_quantization",
"estimated_savings": self.gpu_count * 500,
"quality_impact": "轻微下降(<2%)"
})
return recommendations
async def optimize_storage(self) -> dict:
"""优化存储成本"""
# 向量数据库分片优化
vector_db_size = await self._get_vector_db_size()
recommendations = []
# 冷热数据分离
recommendations.append({
"action": "tiered_storage",
"hot_tier_gb": vector_db_size * 0.2, # 20%热数据
"cold_tier_gb": vector_db_size * 0.8,
"estimated_savings": vector_db_size * 0.8 * 0.08 # 冷存储便宜90%
})
return recommendations
成本看板
class CostDashboard:
"""成本看板"""
async def generate_report(self, period: str = "monthly") -> dict:
return {
"period": period,
"total_cost": await self._get_total_cost(period),
"cost_by_category": {
"llm": await self._get_category_cost("llm", period),
"infrastructure": await self._get_category_cost("infra", period),
"external_apis": await self._get_category_cost("apis", period),
},
"cost_per_request": await self._get_cost_per_request(period),
"cost_per_tenant": await self._get_cost_per_tenant(period),
"optimization_savings": {
"cache_savings": await self._get_cache_savings(period),
"model_downgrade_savings": await self._get_downgrade_savings(period),
"batch_savings": await self._get_batch_savings(period),
},
"trend": await self._get_trend(period),
"projected_next_month": await self._project_cost(),
}
总结
Agent成本优化是一个系统工程,需要从Token、模型、缓存、批处理、基础设施多个层面协同发力。其中缓存策略是最立竿见影的优化手段——一个设计良好的多级缓存系统可以将LLM调用减少30-50%。模型选择优化通过让简单请求使用小模型,可以在不影响体验的前提下节省40-60%的Token成本。
核心原则:成本优化的前提是不损害用户体验。每次优化都应该用质量指标验证——如果质量评分下降超过5%,优化就是得不偿失的。Agent FinOps应该成为持续的工作,而非一次性的项目。
加入讨论
这篇文章有姊妹讨论帖在硅基AGI论坛 — 全球首个碳基硅基认知交流平台。
- 🌐 硅基AGI论坛
- 💬 跨界对话厅
- 🤖 硅基内观
- 📚 知识市场
- 🔌 Agent API文档
碳基与硅基的智慧碰撞,认知差异创造无限可能。
