Prompt 缓存与预填充:TTFT 优化的工程实践

AI 产品的体验生死线不是总延迟,是首字延迟(TTFT)——用户发完问题到看到第一个字的时间。3 秒的 TTFT 用户就流失,500ms 用户觉得"真快"。

TTFT 优化两大杀器:Prompt 缓存(重复内容不重新计算)和预填充(Prefill)(让模型先想好再开口)。这两个我在 AI 面试产品里都用了,效果显著。

一、TTFT 为什么慢

LLM 生成过程:

P r o m p t T T t F o T k e = n p r e f p i r l e l f i + l l t o k t e o n k e n d e c o d e

问题

1 2 3 . . . P " r o m + p t " p r e f i l l / p r e T f T i F l T l 8 0 %

二、第一招:Prompt 缓存

原理

P r o m p t = " + " + K p V r e f i l l

落地

1
2
3
4
5
6
7
# OpenAI/Anthropic 等主流 API 都支持(自动生效或显式启用)
messages = [
    {"role": "system", "content": SYSTEM_PROMPT},  # 固定前缀
    *history,                                      # 渐增
    {"role": "user", "content": new_question},
]
# 命中缓存:缓存前缀部分不再计费、不再重新计算

关键设计:把"不变"放前面

= / m i s s

效果

T T 2 F T 4 0 - 6 0 % p r e f i l l 8 0 % +

三、第二招:预填充(Prefill)

原理

让模型"先想好,再开口":在生成开始前,预填 assistant 的开头,把模型引向正确的回答结构。

1 2 3 A " . . . I " " 3 G o " " "

实现

1
2
3
4
5
6
messages = [
    {"role": "system", "content": SYSTEM},
    {"role": "user", "content": question},
    {"role": "assistant", "content": "基于候选人所述,我的评价是:"}  # prefill
]
# 模型从这里继续生成,方向被锁定

最佳实践

" " t o Q " k P e S n " 8 0 0 " 5 0 0 0 + "

四、组合拳:三层 Prompt + 缓存 + 预填充

我们 AI 面试的最终架构:

S U A y s s s e s t r i e s m t a n t + + P r o m p t
T T F + + + T 线 P 1 r . o 8 m s p 6 t 5 0 m s 8 0 0 4 m 5 s 0 m s

五、其他 TTFT 优化手段

手段 原理 效果
Prompt 缓存 复用前缀计算 40-60%
预填充 锁定输出方向 减少返工
流式输出 首字即出,边生成边展示 感知提升 50%+
小模型前置 简单问题走快模型 场景性
并发预取 预估用户问题预生成 高级,复杂

流式输出(SSE)是必做项:TTFT 3 秒但流式显示,用户感知是"它在打字";TTFT 0.5 秒但白屏 10 秒,用户感知是"卡死了"。感知 = 首字时间 + 流式节奏。

六、踩坑记录

  1. 缓存前缀污染:系统提示词里拼了时间戳 → 每 60 秒缓存失效一次 → 时间类内容放 User 层
  2. 预填过度:预填了完整的回答 → 模型只补充最后一句 → 回答失去自然性 → 预填 20-50 token 足够
  3. 缓存计费误解:缓存命中省的是 prefill 计算,不是全部费用 → 看账单要分 prefill/output
  4. 缓存与服务商绑定:切换模型/服务商缓存失效 → 设计上别依赖缓存,当"白赚"的优化

总结

TTFT 优化的核心认知:

  1. TTFT 是体验生死线:流式 + 首字快 = 用户觉得快
  2. Prompt 缓存是地基:前缀固定、静态在前,命中率决定收益
  3. 预填充是方向盘:锁定输出方向,减少返工
  4. 组合拳:缓存 + 预填 + 流式 + 合适模型

AI 产品的"快",不是生成快,是"开口快"。首字时间 + 流式节奏,比总耗时更能决定用户感受。