部署策略
模型替换策略
Shadow Testing
概念:新模型接收实际生产流量,但不向用户返回响应。仅返回旧模型的响应,新模型输出仅用于日志/评估。
何时使用:
- 想要在无风险的情况下验证新模型的延迟、错误率和输出质量时
- 可以承担成本(每个请求 2 倍成本)
实现示例(Python, LiteLLM):LiteLLM 没有原生 shadow 功能,需要直接实现:
import asyncio
from litellm import acompletion
async def shadow_call(user_request):
# 旧模型(production)
old_task = acompletion(model="gpt-4", messages=user_request)
# 新模型(shadow)
new_task = acompletion(model="claude-3-5-sonnet-20241022", messages=user_request)
old_resp, new_resp = await asyncio.gather(old_task, new_task, return_exceptions=True)
# 记录:比较两个响应
log_to_langfuse(user_request, old_resp, new_resp, shadow=True)
# 仅向用户返回旧模型响应
return old_resp
优点:
- 不影响用户体验
- 使用实际流量模式测试
缺点:
- 成本 2 倍
- 无法收集用户反馈(用户看不到 shadow 响应)
Canary Rollout
概念:从少量流量(5%)开始,逐步提高比例。
5% → 观察(24h) → 无问题则 25% → 50% → 100%
何时使用:
- 新模型已充分验证,但生产全量替换风险较大时
- 需要在回归检测时快速回滚
实现示例(LaunchDarkly):通过 Feature Flag 控制模型选择
from ldclient import LDClient, Context
ld_client = LDClient(sdk_key="your-key")
def get_model_for_user(user_id: str):
context = Context.builder(user_id).kind("user").build()
model = ld_client.variation("llm-model-selection", context, default="gpt-4")
return model
# 在 LaunchDarkly 控制台将 "llm-model-selection" flag 设置为 5% claude-3-5-sonnet, 95% gpt-4
监控标准:
- Canary 组 vs Control 组的成功率(200 响应比例)
- Latency P50/P99 差异
- 用户反馈(thumbs up/down) 比例
- 成本(token 使用量)
自动回滚触发器:
# 示例:Prometheus AlertManager 规则
- alert: CanaryRegressionDetected
expr: |
(rate(llm_success_total{model="claude-3-5-sonnet"}[5m])
/ rate(llm_requests_total{model="claude-3-5-sonnet"}[5m]))
< 0.95
for: 10m
annotations:
summary: "Canary 成功率低于 95%,需要回滚"
优点:
- 渐进式风险分散
- 可以收集实际用户反馈
缺点:
- 部署周期变长(数天~数周)