AI 应用性能优化
问题
AI 应用有哪些关键性能指标?如何优化延迟和成本?
答案
一、核心性能指标
| 指标 | 定义 | 目标值 |
|---|---|---|
| TTFT | Time to First Token,首 Token 延迟 | < 1s |
| TPS | Tokens Per Second,生成速度 | > 30 TPS |
| E2E Latency | 端到端延迟(完整响应) | 取决于长度 |
| 成本/请求 | 每次 API 调用的费用 | 越低越好 |
二、延迟优化
1. 流式输出
// ❌ 非流式:用户等待完整响应
const response = await openai.chat.completions.create({
model: "gpt-4o",
messages,
});
// ✅ 流式:用户立即看到输出
const stream = await openai.chat.completions.create({
model: "gpt-4o",
messages,
stream: true,
});
2. Prompt 精简
// ❌ 冗长的 system prompt(消耗大量 input token)
const system = "你是一个非常专业的助手,你需要...(2000字)";
// ✅ 精简 + 结构化
const system = `角色:技术助手
规则:
1. 回答简洁准确
2. 代码附注释
3. 不确定时说明`;
3. 模型选择
| 场景 | 推荐模型 | 理由 |
|---|---|---|
| 简单问答 | gpt-4o-mini / claude-3.5-haiku | 快、便宜 |
| 复杂推理 | gpt-4o / claude-sonnet | 效果好 |
| 代码生成 | claude-sonnet / gpt-4o | 代码能力强 |
三、缓存策略
语义缓存
import { generateEmbedding } from "./embedding";
async function getCachedResponse(query: string, redis: Redis) {
// 1. 计算查询的 Embedding
const queryEmb = await generateEmbedding(query);
// 2. 在缓存中查找相似查询(余弦相似度 > 0.95)
const cached = await redis.call(
"FT.SEARCH", "cache_idx",
`@embedding:[VECTOR_RANGE 0.05 $vec]`,
"PARAMS", "2", "vec", Buffer.from(new Float32Array(queryEmb).buffer),
"LIMIT", "0", "1"
);
if (cached.length > 0) {
return cached[0].response; // 缓存命中
}
// 3. 缓存未命中,调用 LLM
const response = await callLLM(query);
// 4. 存入缓存
await redis.hset(`cache:${Date.now()}`, {
query, response, embedding: queryEmb
});
return response;
}
OpenAI Prompt Caching
OpenAI 自动缓存长 prompt 的前缀部分:
// 长 system prompt 会被自动缓存
// 相同前缀的后续请求享受 50% 折扣
const response = await openai.chat.completions.create({
model: "gpt-4o",
messages: [
{ role: "system", content: longSystemPrompt }, // 被缓存
{ role: "user", content: userInput },
],
});
四、成本优化
历史消息压缩
function compressHistory(messages: Message[], maxTokens: number): Message[] {
// 策略 1:保留最近 N 轮
const recent = messages.slice(-10);
// 策略 2:摘要压缩
// 对较早的消息生成摘要,替代原始消息
// 策略 3:滑动窗口 + 关键信息提取
return recent;
}
五、监控与告警
| 监控指标 | 告警阈值 | 工具 |
|---|---|---|
| TTFT | > 3s | 自定义 Metrics |
| 错误率 | > 5% | Sentry |
| Token 用量 | 接近预算 | OpenAI Usage |
| 缓存命中率 | < 30% | Redis Metrics |
常见面试问题
Q1: 如何降低 AI 应用的 API 成本?
答案(按效果排序):
- 模型降级:简单任务用 mini/haiku 模型(价格相差 10-50 倍)
- 缓存:语义缓存 + Prompt Caching(减少 30-70% 调用)
- Prompt 精简:减少 system prompt 和历史消息长度
- Batch API:非实时场景用批量接口(OpenAI Batch API 50% 折扣)
- 用户限额:设置每日/每月调用限制
Q2: TTFT 太高怎么优化?
答案:
- 选快模型:mini/haiku 的 TTFT 比大模型快 2-5 倍
- 减少 input token:精简 prompt,压缩历史消息
- 地区选择:使用离用户最近的 API 区域
- 预热:保持连接池(HTTP Keep-Alive),避免冷启动