Shannon 提供全面的成本控制功能,以防止意外的 LLM 费用并优化支出。通过内置的预算执行和智能路由,与简单实现相比,通常可实现 显著的成本降低(60–90%) (取决于工作负载)。
设置预算
预算在平台级别配置(不是通过 REST 每个请求)。在 .env 中使用环境变量:
# LLM 服务预算保护
MAX_TOKENS_PER_REQUEST = 10000 # 每次请求的最大令牌数
MAX_COST_PER_REQUEST = 0.50 # 每次请求的最大成本(美元)
# 应用更改
docker compose restart
Shannon 在执行过程中强制预算限制。当达到限制时,系统会停止进一步支出,并根据上下文返回最佳可用结果或错误。
模型层级
Shannon 根据能力和成本将模型分为不同层级:
层级 模型 每百万令牌成本 用例
SMALL gpt-5-mini claude-haiku 0.15 − 0.15 - 0.15 − 0.25简单查询、高容量 MEDIUM gpt-5 claude-sonnet 3.00 − 3.00 - 3.00 − 15.00通用任务 LARGE gpt-5-thinking claude-opus 15.00 − 15.00 - 15.00 − 75.00复杂推理、关键任务
显式层级偏好
通过环境变量设置首选的默认层级:
DEFAULT_MODEL_TIER = small # small | medium | large
智能路由器
Shannon 的学习路由器自动选择能够处理每个任务的最便宜模型。
工作原理
任务分析 :分析复杂度和所需能力
模型选择 :从最小可行模型开始
质量检查 :验证输出质量
学习 :记住成功的模型-任务配对
成本节省
# 没有智能路由
传统:始终使用 GPT - 5 → 每个任务 $ 0.50
# 使用 Shannon 的路由
Shannon:
- 70 % 路由到 gpt - 5 - mini → $ 0.01
- 25 % 路由到 gpt - 5 → $ 0.15
- 5 % 路由到 gpt - 5 - thinking → $ 0.50
示例平均:每个任务 $ 0.05 (约 90 % 节省)
监控路由器决策
使用仪表板或 SDK 状态查看成本:
status = client.wait(handle.task_id)
if status.metrics:
print ( f "成本(USD): { status.metrics.cost_usd :.4f} " )
响应缓存
Shannon 缓存 LLM 响应以消除冗余 API 调用:
缓存策略
键 :(messages + model + parameters) 的 SHA256 哈希
TTL :可配置(通常约 1 小时,通过 Redis TTL)
存储 :内存 LRU + 可选 Redis 用于分布式缓存
命中率 :生产工作负载通常为 30-50%
缓存优势
# 第一次调用:缓存未命中
任务 1:"什么是 Python?" → $0 .002(LLM 调用)
# 第二次调用:缓存命中
任务 2:"什么是 Python?" → $0 .000(已缓存)
监控缓存性能
status = client.wait(handle.task_id)
if status.metrics:
if status.metrics.cost_usd == 0 :
print ( "很可能来自缓存(无 LLM 成本)" )
else :
print ( f "成本:$ { status.metrics.cost_usd :.4f} " )
提供商速率限制
Shannon 自动遵守提供商速率限制:
配置的限制
来自 config/models.yaml:
providers :
openai :
rpm : 10000 # 每分钟请求数
tpm : 2000000 # 每分钟令牌数
anthropic :
rpm : 4000
tpm : 400000
自动节流
当接近限制时:
对请求进行排队
随时间分散负载
如果可用,回退到替代提供商
成本监控
跟踪每个任务的支出
status = client.wait(handle.task_id)
if status.metrics:
print ( f "使用的令牌: { status.metrics.tokens_used } " )
print ( f "成本:$ { status.metrics.cost_usd :.4f} " )
聚合指标
Shannon 在仪表板中跟踪累计成本:
按天/周/月的总支出
按用户/团队的成本
按认知模式的成本
令牌使用趋势
访问 http://localhost:2111 查看实时成本分析。
最佳实践
1. 始终设置预算
永远不要在没有预算限制的情况下运行生产任务:
# ❌ 不好:无预算限制
client.submit_task( query = "..." )
# ✅ 好:预算保护
client.submit_task(
query = "..." ,
# 通过 .env 配置预算}
)
2. 尽可能使用简单模式
复杂模式成本更高:
# 简单查询:使用简单模式
client.submit_task(
query = "法国的首都是什么?" ,
# 自动选择模式 # 单智能体,最少令牌
)
# 复杂查询:使用标准/复杂模式
client.submit_task(
query = "研究并比较 5 种数据库技术" ,
# 自动选择模式 # 任务分解是合理的
)
3. 利用缓存
对于重复查询,使用一致的措辞以最大化缓存命中:
# ❌ 不好:不同措辞阻止缓存命中
client.submit_task( query = "什么是 Python?" )
client.submit_task( query = "告诉我关于 Python 的事" )
client.submit_task( query = "解释 Python" )
# ✅ 好:一致的查询命中缓存
standard_query = "什么是 Python?"
client.submit_task( query = standard_query) # 缓存未命中
client.submit_task( query = standard_query) # 缓存命中
client.submit_task( query = standard_query) # 缓存命中
4. 监控和优化
定期查看成本指标:
# 启用详细日志
import logging
logging.basicConfig( level = logging. INFO )
total_cost = 0.0
for t in tasks:
st = client.wait(t.task_id)
if st.metrics:
total_cost += st.metrics.cost_usd
print ( f "任务:$ { st.metrics.cost_usd :.4f} ,累计:$ { total_cost :.4f} " )
5. 首先使用较小的模型
让智能路由器证明何时需要更大的模型:
# 让 Shannon 选择
client.submit_task( query = "..." ) # 自动选择层级
# 模型层级由平台路由器选择。SDK 不接受每个请求的模型层级或预算参数。
成本优化清单
示例:成本优化工作流
from shannon import ShannonClient
client = ShannonClient()
# 高容量、简单查询
simple_tasks = [
"分类情感:很棒的产品!" ,
"分类情感:糟糕的体验" ,
"分类情感:还可以"
]
total_cost = 0
for query in simple_tasks:
handle = client.submit_task( query = query)
status = client.wait(handle.task_id)
if status.metrics:
total_cost += status.metrics.cost_usd
print ( f "3 个任务的总成本:$ { total_cost :.4f} " )
# 示例:约 $0.006(与始终使用 GPT-5 相比约 90% 节省)
下一步