AI API 调用太慢怎么办?7 个实测有效的延迟优化技巧
AI API 调用延迟高是开发者最头疼的问题之一。用户等 5 秒没响应就关页面,线上服务超时直接报错——API 太慢不只是体验问题,更是业务问题。本文整理了 7 个经过实测验证的优化技巧,涵盖流式输出、Prompt Caching、模型选择等关键维度,每个都附代码示例,拿来就能用。
核心要点
- 流式输出(Streaming) 可将用户感知延迟从 10 秒+ 降到 500ms 以内,是体验优化的第一优先级
- Prompt Caching 能减少最高 80% 的延迟和 90% 的输入 token 成本,适合系统提示词固定的场景
- 模型选择直接决定速度:GPT-5.2 吞吐量约 187 tokens/s,Claude Haiku 4.5 TTFT 最低约 597ms,按场景选模型比调参数更有效
- 减少输出 token 数是最直接的提速手段——砍一半输出,延迟大约降一半
- 国内开发者通过 API 中转服务可将网络延迟从 500ms+ 降到 30-40ms
先搞清楚:API 调用慢在哪?
在动手优化之前,需要先定位瓶颈。一次 API 调用的延迟由三部分组成:
| 阶段 | 耗时占比 | 说明 |
|---|---|---|
| 网络传输 | 10-30% | 请求和响应的网络往返时间,跨境调用尤为明显 |
| 输入处理(Prefill) | 10-30% | 模型处理输入 prompt 的时间,与 token 数成正比 |
| 输出生成(Decode) | 40-70% | 逐 token 生成响应,通常是最大瓶颈 |
对应两个关键指标:
- TTFT(Time to First Token):从发送请求到收到第一个 token 的时间,反映”多快开始回答”
- 吞吐量(Tokens/s):每秒生成的 token 数,反映”回答多快说完”
根据 2026 年的行业基准测试,TTFT 低于 500ms 为优秀,token 生成速度低于 50ms/token 为理想水平。
技巧一:开启流式输出(Streaming)
效果:用户感知延迟降低 90%+
流式输出是性价比最高的优化手段。不用等模型生成完整响应,第一个 token 产出就开始返回——用户看到文字在”打字”,心理上就不觉得慢了。
from openai import OpenAI
client = OpenAI(
api_key="your-api-key",
base_url="https://api.ofox.ai/v1" # 兼容 OpenAI 协议
)
# 流式调用
stream = client.chat.completions.create(
model="gpt-5.2",
messages=[{"role": "user", "content": "解释什么是 RAG"}],
stream=True # 开启流式输出
)
for chunk in stream:
if chunk.choices[0].delta.content:
print(chunk.choices[0].delta.content, end="", flush=True)
SSE(Server-Sent Events) 是流式输出的标准协议。如果你在做 Web 应用,前端配合 EventSource 或 fetch + ReadableStream 即可消费:
const response = await fetch('https://api.ofox.ai/v1/chat/completions', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer your-api-key'
},
body: JSON.stringify({
model: 'gpt-5.2',
messages: [{ role: 'user', content: '解释什么是 RAG' }],
stream: true
})
});
const reader = response.body.getReader();
const decoder = new TextDecoder();
while (true) {
const { done, value } = await reader.read();
if (done) break;
const text = decoder.decode(value);
// 解析 SSE 数据
const lines = text.split('\n').filter(line => line.startsWith('data: '));
for (const line of lines) {
if (line === 'data: [DONE]') continue;
const json = JSON.parse(line.slice(6));
process.stdout.write(json.choices[0]?.delta?.content || '');
}
}
注意:流式输出不会减少模型的实际处理时间,总耗时甚至可能略增(SSE 有额外开销)。但用户不用干等完整响应,体验提升是实实在在的。
技巧二:用 Prompt Caching 省时省钱
效果:延迟降低最高 80%,输入 token 成本降低 90%
如果你的应用有固定的系统提示词(system prompt),Prompt Caching 是必开的优化。原理很简单:模型会缓存已处理过的 prompt 前缀,相同前缀的后续请求直接复用计算结果,跳过重复的 prefill 阶段。
OpenAI 的 Prompt Caching 自动生效(无需改代码),触发条件:
- prompt 长度 ≥ 1024 tokens
- 前缀完全匹配(逐字符比对)
- 缓存有效期约 5-10 分钟
最佳实践:把不变的内容(系统提示词、few-shot 示例、工具定义)放在 prompt 开头,把动态内容(用户输入、RAG 检索结果、对话历史)放在 末尾。
# ✅ 正确:静态内容在前,动态内容在后
messages = [
{"role": "system", "content": LONG_SYSTEM_PROMPT}, # 固定的,会被缓存
{"role": "system", "content": FEW_SHOT_EXAMPLES}, # 固定的,会被缓存
*conversation_history, # 动态的
{"role": "user", "content": user_input} # 动态的
]
# ❌ 错误:动态内容穿插在中间,破坏前缀匹配
messages = [
{"role": "system", "content": PART_1_PROMPT},
{"role": "user", "content": rag_context}, # 每次不同,后面的都无法缓存
{"role": "system", "content": PART_2_PROMPT},
]
Anthropic Claude 也支持 Prompt Caching,但需要显式标记缓存断点(cache_control),配置稍有不同。通过兼容 OpenAI 协议的聚合平台(如 Ofox),可以用统一接口调用两家的缓存能力。
技巧三:选对模型,速度差 4 倍
效果:同等质量下延迟可降低 50-75%
不是所有任务都需要最强模型。2026 年主流模型的速度差异非常大:
| 模型 | 吞吐量 | TTFT | 适用场景 |
|---|---|---|---|
| GPT-5.2 | ~187 tokens/s | ~800ms | 复杂推理、长文生成 |
| GPT-5.4 Mini | ~220 tokens/s | ~400ms | 日常对话、内容生成 |
| Claude Opus 4.6 | ~50 tokens/s | ~1200ms | 深度分析、代码生成 |
| Claude Haiku 4.5 | ~150 tokens/s | ~597ms | 分类、提取、简单问答 |
| Gemini 3.1 Flash | ~200 tokens/s | ~650ms | 多模态、快速响应 |
| DeepSeek V4 | ~120 tokens/s | ~700ms | 数学推理、代码 |
实战建议:按任务复杂度分级调用。
def get_model_for_task(task_type: str) -> str:
"""根据任务类型选择最优模型"""
model_map = {
"classification": "claude-haiku-4-5", # 分类:速度优先
"extraction": "gpt-5.4-mini", # 信息提取:速度优先
"chat": "gpt-5.4-mini", # 日常对话:均衡
"summarization": "gemini-3.1-flash", # 摘要:快速+质量
"code_generation": "claude-opus-4-6", # 代码生成:质量优先
"deep_analysis": "gpt-5.2", # 深度分析:质量优先
}
return model_map.get(task_type, "gpt-5.4-mini")
通过 Ofox 这类 API 聚合平台,一个 API Key 就能在不同模型间灵活切换,不用为每家供应商单独维护 SDK。
技巧四:控制输出长度
效果:输出减半,延迟约降 50%
输出生成(decode)是 API 调用中耗时最长的阶段。一个直觉:生成 1000 个 token 比生成 500 个 token 慢一倍。所以,尽可能精确控制输出长度。
# ✅ 限制输出长度
response = client.chat.completions.create(
model="gpt-5.4-mini",
messages=[{"role": "user", "content": "用一句话解释量子计算"}],
max_tokens=100 # 限制最大输出
)
# ✅ 在 prompt 中明确要求简洁
messages = [
{"role": "system", "content": "回答简洁精准,不超过 3 句话。"},
{"role": "user", "content": "什么是向量数据库?"}
]
避免的参数:
n > 1:生成多个候选响应,延迟翻倍best_of > 1(部分 API 支持):生成多个再选最好的,延迟更高- 不设
max_tokens:模型可能输出到上限才停止
技巧五:异步并发,不要串行等
效果:多个独立调用并行处理,总耗时从 N×单次 降到 ≈单次
如果你的业务需要同时调多个模型、或对同一内容做多项分析,串行调用是最大的浪费。
import asyncio
from openai import AsyncOpenAI
client = AsyncOpenAI(
api_key="your-api-key",
base_url="https://api.ofox.ai/v1"
)
async def analyze_text(text: str):
"""并行执行三个独立的 AI 分析任务"""
tasks = [
client.chat.completions.create(
model="gpt-5.4-mini",
messages=[{"role": "user", "content": f"提取关键词:{text}"}],
max_tokens=50
),
client.chat.completions.create(
model="claude-haiku-4-5",
messages=[{"role": "user", "content": f"情感分析:{text}"}],
max_tokens=20
),
client.chat.completions.create(
model="gemini-3.1-flash",
messages=[{"role": "user", "content": f"一句话摘要:{text}"}],
max_tokens=50
),
]
# 三个任务并行执行
results = await asyncio.gather(*tasks)
return {
"keywords": results[0].choices[0].message.content,
"sentiment": results[1].choices[0].message.content,
"summary": results[2].choices[0].message.content,
}
# 运行
result = asyncio.run(analyze_text("你的文本内容"))
注意并发限制:大多数 API 提供商有 RPM(每分钟请求数)限制。生产环境建议用信号量(asyncio.Semaphore)控制并发数,避免触发 429 限流。
技巧六:精简 Prompt,减少输入处理时间
效果:延迟降低 1-5%(输入阶段),但改善 Prompt Caching 命中率
虽然减少输入 token 对延迟的直接影响不大(OpenAI 官方数据:砍掉 50% prompt 大约只省 1-5% 延迟),但精简 prompt 有几个间接好处:
- 提高 Prompt Caching 命中率——前缀越稳定、越短,缓存越容易命中
- 降低 token 成本——输入 token 也是要花钱的
- 减少模型”迷路”概率——简洁的指令比冗长的说明效果更好
# ❌ 冗长的 prompt
system_prompt = """
你是一个非常专业的、经验丰富的、在人工智能领域有深厚造诣的技术顾问。
你的回答应该是准确的、专业的、易于理解的。
请你在回答问题的时候注意以下几点:
1. 回答要准确
2. 语言要专业
3. 内容要易懂
...(重复废话 500 字)
"""
# ✅ 精简的 prompt
system_prompt = "你是 AI 技术顾问。回答准确、专业、简洁。"
实用技巧:把 few-shot 示例替换为清晰的规则描述,通常能在保持效果的同时大幅减少 token 数。
技巧七:国内开发者必看——解决网络延迟
效果:网络延迟从 500ms+ 降到 30-40ms
对国内开发者来说,API 调用慢的头号原因往往不是模型,而是网络。直接调用 OpenAI、Anthropic、Google 的 API,跨境网络延迟动辄 500ms 起步,高峰时段还容易超时断连。
解决方案是使用国内有加速节点的 API 中转服务。以 Ofox 为例,在阿里云和火山云部署了国内节点,网络延迟可控制在 30-40ms:
from openai import OpenAI
# 只需修改 base_url,代码其他部分不用改
client = OpenAI(
api_key="your-ofox-api-key",
base_url="https://api.ofox.ai/v1" # 国内加速节点
)
response = client.chat.completions.create(
model="gpt-5.2",
messages=[{"role": "user", "content": "Hello"}],
stream=True
)
选择 API 中转服务时重点关注:
| 评估维度 | 要看什么 |
|---|---|
| 延迟 | 国内 TTFT 是否 < 100ms |
| 稳定性 | 成功率是否 > 99.5% |
| 模型覆盖 | 是否支持你需要的所有模型 |
| 协议兼容 | 是否兼容 OpenAI SDK,迁移成本如何 |
| 支付方式 | 是否支持人民币支付(微信/支付宝) |
优化效果实测对比
综合运用上述技巧,以一个典型的 AI 客服场景为例(系统提示词 2000 tokens + 用户消息 200 tokens + 期望输出 500 tokens):
| 优化项 | 优化前 | 优化后 | 提升 |
|---|---|---|---|
| 开启流式输出 | 用户等 8s 才看到回复 | 0.5s 开始看到文字 | 感知延迟 -94% |
| Prompt Caching | TTFT 1200ms | TTFT 240ms | TTFT -80% |
| 模型选择(Opus→Haiku) | 总耗时 10s | 总耗时 3.3s | -67% |
| 控制输出 500→200 tokens | 总耗时 3.3s | 总耗时 1.3s | -60% |
| 国内中转节点 | 网络延迟 500ms | 网络延迟 40ms | -92% |
最终效果:用户在 0.3 秒内 看到第一个字,1.5 秒内 收到完整回复。
常见问题
Q:流式输出和非流式输出哪个总耗时更低?
非流式通常总耗时更低(少了 SSE 封包开销),但用户感知延迟远高于流式。面向用户的场景一律用流式;纯后端批处理用非流式。
Q:Prompt Caching 需要改代码吗?
OpenAI 的 Prompt Caching 自动生效,不需要改代码。但你需要确保 prompt 结构稳定——静态内容在前、动态内容在后。Claude 的缓存需要显式标记 cache_control 参数。
Q:选便宜的小模型会不会影响质量?
分场景。分类、提取、格式化等结构化任务,小模型(Haiku、Mini)和大模型效果差距很小,优先用小模型。深度推理、创意写作、复杂代码生成,建议用旗舰模型。
Q:API 返回 429 错误怎么办?
429 表示触发了速率限制。解决方法:① 实现指数退避重试;② 用 asyncio.Semaphore 控制并发数;③ 如果是配额问题,考虑通过聚合平台分散请求到不同上游供应商。
总结
API 延迟优化的核心思路只有三个字:减、换、并。
- 减:减输出 token(
max_tokens)、减重复计算(Prompt Caching)、减网络绕路(国内节点) - 换:按任务复杂度换模型,不要所有场景都上旗舰
- 并:独立任务并行执行,串行变并行
这 7 个技巧不需要全用上——先开流式输出和 Prompt Caching,这两项改动最小、收益最大。然后根据你的具体瓶颈(网络?模型速度?输出太长?)针对性优化。
如果你在国内开发 AI 应用,建议先通过 Ofox 解决网络延迟问题,一个 API Key 接入 50+ 模型,支持微信/支付宝支付,然后在此基础上应用本文的其他优化技巧。


