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 产品的"快",不是生成快,是"开口快"。首字时间 + 流式节奏,比总耗时更能决定用户感受。