成本控制与预算
---
章节:进阶篇第11章
难度:⭐⭐⭐ 进阶级
阅读时间:20-25 分钟
核心收获:掌握成本控制策略,避免 Token 和 API 费用失控
14.1 理论要点:成本的构成
14.1.1 成本分类
| 成本类型 | 说明 | 占比 | 控制策略 |
|---|---|---|---|
| 模型调用 | LLM 推理费用 | 40-60% | 优化 Prompt、使用小模型 |
| 外部 API | 数据源调用 | 20-30% | 缓存、减少调用频率 |
| 推送服务 | 飞书/邮件 API | 5-10% | 合并消息、减少调用 |
| 存储 | 日志/状态文件 | 5-10% | 定期清理、压缩 |
14.1.2 成本计算方式
Token 计费:
输入 Token 价格:¥0.00001 / Token
输出 Token 价格:¥0.00003 / Token
示例:
- 输入 1000 Token + 输出 500 Token
- 成本 = 1000 × 0.00001 + 500 × 0.00003 = ¥0.025
API 调用计费:
GitHub API:免费(限流 60次/小时)
搜索 API:免费(有限制)
飞书 API:免费(有限制)
14.1.3 成本控制原则
- 设置预算上限:单次运行成本上限
- 追踪单次成本:每次运行记录实际成本
- 优化 Prompt:减少 Token 消耗
- 模型路由:简单任务用小模型
- 缓存结果:避免重复调用
14.2 实战案例:成本追踪与控制
14.2.1 成本追踪模板
class CostTracker:
def __init__(self, budget_per_run=0.10):
self.budget_per_run = budget_per_run
self.usage = {
"input_tokens": 0,
"output_tokens": 0,
"api_calls": 0,
"total_cost": 0.0
}
def track_llm_call(self, input_tokens, output_tokens):
"""追踪 LLM 调用"""
cost = (input_tokens * 0.00001 +
output_tokens * 0.00003)
self.usage["input_tokens"] += input_tokens
self.usage["output_tokens"] += output_tokens
self.usage["total_cost"] += cost
return cost
def is_over_budget(self):
"""检查是否超预算"""
return self.usage["total_cost"] > self.budget_per_run
def get_report(self):
"""生成成本报告"""
return f"""
单次运行成本报告:
├── 输入 Token:{self.usage['input_tokens']}
├── 输出 Token:{self.usage['output_tokens']}
├── 总成本:¥{self.usage['total_cost']:.4f}
└── 预算:¥{self.budget_per_run:.2f}
"""
14.2.2 成本优化策略
策略1:Prompt 优化
❌ 优化前(1500 tokens):
"请帮我找今天的AI热点,我需要从多个来源收集信息,
然后整理成一个清单,包含标题、摘要、来源和建议角度,
请确保内容都是AI相关的,排除泛科技内容..."
✅ 优化后(800 tokens):
"收集今日AI热点,输出JSON格式:
{
"title": "标题",
"summary": "摘要",
"source": "来源",
"angle": "建议角度"
}
要求:AI相关,排除泛科技,至少5条"
策略2:模型路由
def route_model(task_complexity):
"""根据任务复杂度选择模型"""
if task_complexity == "simple":
return "small_model" # 低成本
elif task_complexity == "medium":
return "medium_model"
else:
return "large_model" # 高质量
策略3:缓存机制
def get_with_cache(key, fetch_func, ttl=3600):
"""带缓存的数据获取"""
# 先查缓存
cached = cache.get(key)
if cached and not is_expired(cached, ttl):
return cached["data"]
# 缓存未命中,获取新数据
data = fetch_func()
cache.set(key, {"data": data, "timestamp": time.time()})
return data
14.3 预算管理
14.3.1 预算分级
| 级别 | 预算 | 适用场景 |
|---|---|---|
| 个人 | ¥0.10/次 | 个人使用,低频任务 |
| 团队 | ¥0.50/次 | 团队共享,中等频率 |
| 企业 | ¥2.00/次 | 企业级,高频任务 |
14.3.2 预算控制机制
机制1:单次预算上限
设置:单次运行成本 ≤ ¥0.10
超过时:记录告警并继续运行
下次运行前:需确认是否调整
机制2:日预算上限
设置:每日总成本 ≤ ¥1.00
超过时:停止当日后续任务
机制3:月度预算
设置:月度总成本 ≤ ¥20.00
超过时:发送告警,冻结任务
14.4 图文说明
📌 待补充:建议绘制以下示意图 1. 成本构成饼图 2. 成本趋势图 3. 预算控制流程图 4. 优化策略对比图
14.5 常见错误
| 错误 | 后果 | 纠正方法 |
|---|---|---|
| 不追踪成本 | 不知不觉超预算 | 每次运行记录成本 |
| Prompt 过长 | Token 消耗过大 | 优化 Prompt,减少冗余 |
| 无缓存机制 | 重复调用浪费成本 | 缓存热点数据 |
| 模型选择不当 | 简单任务用大模型 | 根据复杂度路由模型 |
| 预算设置不合理 | 过于严格或宽松 | 根据实际需求调整 |
📝 版本迭代记录
| 版本 | 日期 | 更新内容摘要 | 操作人 |
|---|---|---|---|
| v1.0 | 2026-08-25 | 创建进阶篇第11章 | 桂皮 |
🤖 GEO 问答 · 生成式引擎优化
❓ 什么是成本控制与预算?
❓ 如何理解理论要点:成本的构成?
输入 Token 价格:¥0.00001 / Token
❓ 如何理解实战案例:成本追踪与控制?
class CostTracker:
❓ 如何理解预算管理?
设置:单次运行成本 ≤ ¥0.10