AI 应用的成本、延迟和可观测性
💰 可观测性让你在问题已影响用户前发现并修复。成本和延迟管控是 AI 产品生产化的必要条件。
成本结构
Token 计费模型
# 输入 token、输出 token 通常分开计费
cost_per_1m_tokens = {
"gpt-4o": {"input": 2.5, "output": 10.0},
"gpt-4o-mini": {"input": 0.15, "output": 0.6},
"claude-3-5-sonnet": {"input": 3.0, "output": 15.0},
}
def estimate_cost(input_tokens, output_tokens, model):
rates = cost_per_1m_tokens[model]
return (input_tokens * rates["input"] + output_tokens * rates["output"]) / 1_000_000
成本优化策略
| 策略 | 效果 | 限制 |
|---|---|---|
| 使用小模型 | 成本大幅降低 | 小模型能力少 |
| 缩短 Prompt | 减少输入 token | 可能影响质量 |
| 列表缓存 | 複用相同结果 | 适合不变的请求 |
| 预计算 Prompt | 减少重复 Token | 适合固定 Prompt |
| 流式输出 | 提升感知速度 | 实际延迟不变 |
延迟监控
延迟组成
总延迟 = 网络转发 + TTFT + 生成时间
TTFT:首 token 延迟(影响感知响应速度)
生成时间:输出 token 数 / TPS
延迟 SLA 示例
| 场景 | TTFT 目标 | P99 总延迟 |
|---|---|---|
| 实时对话 | < 500ms | < 5s |
| 文档分析 | < 2s | < 30s |
| 批量任务 | < 10s | < 5min |
可观测性体系
要记录的关键字段
@dataclass
class LLMTrace:
trace_id: str
timestamp: datetime
model: str
# 输入输出
input_messages: list[dict]
output_text: str
# 性能
ttft_ms: float
total_latency_ms: float
input_tokens: int
output_tokens: int
# 成本
cost_usd: float
# 追踪
user_id: str
session_id: str
tags: dict
# 错误
error: str | None
retry_count: int
关键监控评判标准
# Prometheus 指标示例
llm_request_duration = Histogram(
"llm_request_duration_seconds",
buckets=[0.1, 0.5, 1.0, 2.0, 5.0, 10.0, 30.0]
)
llm_tokens_total = Counter(
"llm_tokens_total",
labelnames=["model", "type"] # type: input/output
)
llm_cost_total = Counter(
"llm_cost_usd_total",
labelnames=["model", "feature"]
)
主流可观测工具
| 工具 | 特点 |
|---|---|
| Langfuse | 开源,可自部署,链路追踪完整 |
| LangSmith | LangChain 生态,易集成 |
| Helicone | 代理层模式,0 代码接入 |
| Arize Phoenix | ML 可观测,支持 RAG 评测 |
| OpenTelemetry | 通用标准,可与已有监控集成 |
常见误区
- 只监控平均延迟,忽略 P95/P99;长尾延迟才是用户体验最大杆手
- 只记录费用小计,没有按 feature 分拆,优化不知往哪切
- 没有记录完整 Prompt/Response,相同的 Bug 无法复现和分析