0Pricing
AI Prompt Engineering · 课时

缓存长前缀

利用提示缓存控制成本。

缓存长前缀 是 CoddyKit 上的免费 AI Prompt Engineering 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 AI Prompt Engineering 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 AI Prompt Engineering 课程共包含 4 节课。

前缀缓存为何存在

每个长提示词都必须支付预填充成本,在生成之前编码其中的令牌。当相同的长前缀在多次调用中重复出现时——例如系统提示词、工具规范或大型参考文档——提示词缓存可以让提供商复用已经计算出的注意力状态,而不必重新计算。

  • 缓存命中可以大幅降低延迟和输入成本。
  • 节省的成本会随前缀大小和重复使用频率增加。

缓存以此前缀为锚

缓存依据从提示词开头开始的完全匹配的令牌前缀建立索引。缓存范围从开头延伸到首个分歧点。只要在前面更改任何内容,之后的全部内容都会无法命中缓存。

这意味着,要最大化命中率,布局应将最稳定的内容放在前面,将变化最多的内容放在最后。

# Cache reuse covers: [identical prefix .... first difference)
# One early edit invalidates the whole downstream cache.

按稳定性排序

请按从最稳定到最不稳定的顺序排列内容:先是不可变的系统规则和工具定义,然后是大型稳定参考材料,接着是会话内稳定的上下文,最后是每次请求中易变的输入和问题。

  • 稳定内容 -> 前部(可缓存)。
  • 易变内容 -> 后部(唯一需要重新计算的部分)。

这一条排序原则推动了大多数缓存收益。

prompt = [
  SYSTEM_RULES,        # never changes
  TOOL_SPECS,          # rarely changes
  REFERENCE_CORPUS,    # stable for the session
  USER_TURN            # changes every call -> keep last
]

缓存断点

有些提供商允许您标记明确的缓存断点。请将断点放在每个稳定片段的末尾,使系统能够缓存截至该位置的内容。请将最大的稳定块(参考语料库或较长的系统提示词)标记为可缓存。

即使没有明确的标记,也应按稳定性顺序组织结构,这样隐式的前缀匹配仍然可以发挥作用。

blocks = [
  {'text': SYSTEM_RULES, 'cache': True},
  {'text': REFERENCE_CORPUS, 'cache': True},  # big win
  {'text': user_turn}  # uncached
]

谨防隐藏的前缀漂移

细微且无意的更改会悄悄破坏缓存:系统提示词中的时间戳、提前注入的每次请求标识符、重新排序的工具定义,或非确定性的 JSON 键顺序。每一项都会使前缀发生偏移,并迫使系统进行完整重新计算。

请审查您的前缀,找出调用之间会发生变化的任何内容,并将其移到缓存区域之后。

# BAD: dynamic value early -> kills cache
# system = 'Session ' + str(uuid4()) + ' rules: ...'
# GOOD: keep system static; put the id in the tail user turn.

TTL 与缓存生存时间

缓存会在提供商定义的生存时间到期后失效,并且通常会在每次命中时刷新。调用过于稀疏时,冷未命中会反复出现。对于突发的高频工作负载,使用缓存很有价值;对于少量且分散的调用,缓存可能会在两次使用之间过期。

请让流量模式与 TTL 相匹配,并考虑为有价值的前缀发送保活请求。

缓存的成本模型

缓存通常会对写入缓存条目收取少量额外费用,而对读取缓存条目提供大幅折扣。经济性有利于重复使用:一次写入的成本分摊到多次读取上,能够带来显著的净节省;只写入而只使用一次的情况,成本可能会略高。

  • 高重复使用率 → 积极缓存。
  • 一次性前缀 → 缓存可能不划算。
def worth_caching(prefix_tokens, expected_reuses, write_mult, read_mult):
    no_cache = expected_reuses
    cached = write_mult + read_mult * (expected_reuses - 1)
    return cached < no_cache  # in normalized prefix-cost units

设计稳定的系统区块

请让系统提示词和工具规范具有确定性,并固定其版本。请按规范顺序排列工具定义,避免嵌入动态数据,并且只在经过审慎的版本发布中修改它们。稳定的系统区块会成为一个长期存在且高命中的缓存条目,供所有请求共享。

请将缓存前缀视为带有版本的产物,而不是可以随意调整的字符串。

TOOLS = sorted(tool_defs, key=lambda t: t['name'])  # canonical order
SYSTEM_VERSION = 'v3'  # change deliberately, not per request

多轮智能体中的缓存

在智能体循环中,不断增长的对话天然就是一种缓存:每一轮都会扩展一个供下一轮重复使用的前缀。请将新轮次追加到尾部,绝不要改写较早的轮次,这样之前的缓存才能保持有效。

必须压缩时,请采用能够为后续轮次创建新稳定前缀的方式,而不是反复修改旧前缀。

衡量缓存效果

请为缓存添加监测。大多数提供商都会报告每次调用中的已缓存输入令牌数和未缓存输入令牌数。请跟踪命中率;如果命中率较低,请检查前缀是否发生漂移。命中率回归通常意味着提示词前部最近引入了动态值。

  • 记录 cached_tokens / total_input_tokens。
  • 部署后命中率下降时发出警报。
hit_rate = usage['cache_read_input_tokens'] / max(1, usage['input_tokens'])
assert hit_rate > 0.6, 'prefix drift suspected'

考虑缓存的提示词布局

要控制长前缀的成本,请按稳定性排列内容,将最大的稳定区块标记为缓存断点,消除隐藏漂移,固定系统区块和工具区块的版本,在智能体循环中仅追加,并监控命中率。目标是建立一个大型可复用前缀,以及一个每次调用都重新计算的小型易变尾部。

快速检查

您会在每天数千次查询中重复使用一个包含 100k 个令牌的参考语料库,但缓存命中率却接近于零。

回顾:缓存长前缀

提示词缓存会重复使用精确且稳定前缀的预填充内容,在重复使用频繁时大幅降低延迟和输入成本。请将最稳定的内容放在最前面,把大型稳定区块标记为断点,并将所有易变内容推到尾部。请消除隐藏漂移,固定系统区块和工具区块的版本,在智能体循环中仅追加,并监控命中率,使回归能够标记出新引入的前部变化值。

常见问题解答

「缓存长前缀」课时是免费的吗?

是的 — 「缓存长前缀」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 AI Prompt Engineering 课程的其余内容,请升级到 CoddyKit PRO。 AI Prompt Engineering 课程共包含 4 节课。

「缓存长前缀」这节课中我会学到什么?

利用提示缓存控制成本。 你通过在浏览器中直接运行的动手代码来练习 AI Prompt Engineering,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 AI Prompt Engineering 需要有经验吗?

无需任何先前经验。CoddyKit 上的 AI Prompt Engineering 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。

「缓存长前缀」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 AI Prompt Engineering 课中编写并运行代码吗?

能。每节 AI Prompt Engineering 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 百万 Token 上下文窗口
  2. 迷失在中间
  3. 组织超大型提示
  4. 缓存长前缀
← 返回 AI Prompt Engineering