Prompt 缓存与预填充:TTFT 优化的工程实践#
AI 产品的体验生死线不是总延迟,是首字延迟(TTFT)——用户发完问题到看到第一个字的时间。3 秒的 TTFT 用户就流失,500ms 用户觉得"真快"。
TTFT 优化两大杀器:Prompt 缓存(重复内容不重新计算)和预填充(Prefill)(让模型先想好再开口)。这两个我在 AI 面试产品里都用了,效果显著。
一、TTFT 为什么慢#
LLM 生成过程:
问题:
二、第一招:Prompt 缓存#
1
2
3
4
5
6
7
|
# OpenAI/Anthropic 等主流 API 都支持(自动生效或显式启用)
messages = [
{"role": "system", "content": SYSTEM_PROMPT}, # 固定前缀
*history, # 渐增
{"role": "user", "content": new_question},
]
# 命中缓存:缓存前缀部分不再计费、不再重新计算
|
关键设计:把"不变"放前面#
三、第二招:预填充(Prefill)#
让模型"先想好,再开口":在生成开始前,预填 assistant 的开头,把模型引向正确的回答结构。
1
2
3
4
5
6
|
messages = [
{"role": "system", "content": SYSTEM},
{"role": "user", "content": question},
{"role": "assistant", "content": "基于候选人所述,我的评价是:"} # prefill
]
# 模型从这里继续生成,方向被锁定
|
最佳实践#
四、组合拳:三层 Prompt + 缓存 + 预填充#
我们 AI 面试的最终架构:
五、其他 TTFT 优化手段#
| 手段 |
原理 |
效果 |
| Prompt 缓存 |
复用前缀计算 |
40-60% |
| 预填充 |
锁定输出方向 |
减少返工 |
| 流式输出 |
首字即出,边生成边展示 |
感知提升 50%+ |
| 小模型前置 |
简单问题走快模型 |
场景性 |
| 并发预取 |
预估用户问题预生成 |
高级,复杂 |
流式输出(SSE)是必做项:TTFT 3 秒但流式显示,用户感知是"它在打字";TTFT 0.5 秒但白屏 10 秒,用户感知是"卡死了"。感知 = 首字时间 + 流式节奏。
六、踩坑记录#
- 缓存前缀污染:系统提示词里拼了时间戳 → 每 60 秒缓存失效一次 → 时间类内容放 User 层
- 预填过度:预填了完整的回答 → 模型只补充最后一句 → 回答失去自然性 → 预填 20-50 token 足够
- 缓存计费误解:缓存命中省的是 prefill 计算,不是全部费用 → 看账单要分 prefill/output
- 缓存与服务商绑定:切换模型/服务商缓存失效 → 设计上别依赖缓存,当"白赚"的优化
TTFT 优化的核心认知:
- TTFT 是体验生死线:流式 + 首字快 = 用户觉得快
- Prompt 缓存是地基:前缀固定、静态在前,命中率决定收益
- 预填充是方向盘:锁定输出方向,减少返工
- 组合拳:缓存 + 预填 + 流式 + 合适模型
AI 产品的"快",不是生成快,是"开口快"。首字时间 + 流式节奏,比总耗时更能决定用户感受。
微信公众号「福清而不淡」
后端架构 · AI 工程 · 云原生的一线实践,扫码关注,不错过更新。
本文已同步发布到公众号,欢迎留言交流。