每日 Prompt 技巧

Prompt 缓存:让长上下文调用成本降 90%、延迟快 5 倍

2026-08-15
通用
Claude / GPT-4
Prompt技巧Prompt Caching成本优化工程化

技巧摘要

Prompt 链式调用每步都把 system prompt 和资料塞进去,token 重复传输、重复计算,账单爆炸。Prompt Caching 让模型记住前缀,相同部分只算一次,后续调用直接复用。本文拆解缓存原理、4 种缓存策略、Claude/GPT 的实现差异与落地代码,帮你把长上下文成本砍到 1/10。

Prompt 模板

## Prompt 缓存策略设计器

你是 LLM 成本优化专家。请分析以下调用场景,设计缓存策略:

## 调用场景
{{scenario}}

## 设计要求
1. 识别可缓存的稳定前缀(system / 资料 / few-shot)
2. 标注每个前缀的预估 token 数
3. 计算缓存前后成本对比(缓存命中率 80% 假设)
4. 给出缓存失效条件与刷新策略
5. 推荐适配的模型(Claude prompt caching / GPT 自动缓存)

## 输出
- 可缓存前缀清单
- 成本对比表
- 代码示例(伪代码)

为什么需要 Prompt 缓存

Prompt 链式调用 把大任务拆成多步,但有个隐形成本:

Step 1:[system 2000 token] + [用户问题 100]   → 2100 token
Step 2:[system 2000 token] + [Step1输出 500] → 2500 token
Step 3:[system 2000 token] + [Step2输出 800] → 2800 token
...

system 那 2000 token 在每一步都被重复传输、重复计算。链路 10 步 = 20000 token 浪费在相同前缀上。

更典型的是 RAG 场景:

每次问答:
  system prompt(角色定义 + 规则)   1500 token
  检索到的资料片段                   3000 token
  用户问题                           100 token
  总计                               4600 token

一天 10000 次调用 = 4600 万 token = ¥920/天

其中 system prompt 那 1500 token 是稳定的,重复传输 10000 次 = 1500 万 token 纯浪费。

Prompt 缓存的核心思想

让模型把稳定的前缀"记住",后续调用直接复用,只对新增部分计费和计算。

首次调用:
  [system + 资料] 4500 token → 完整计算 → 缓存结果
  
后续调用(前缀相同):
  [system + 资料] 命中缓存 → 不计费(或 1 折)
  + [新问题] 100 token → 只算这部分
  
成本从 4600 降到 ~460,降幅 90%
延迟从 2s 降到 0.4s,快 5 倍

四种缓存策略

策略 1:静态前缀缓存(最常用)

把不变的 system prompt + 固定资料放前面,变化部分放后面。

[system: 你是客服,规则如下...]     ← 稳定,缓存
[资料: 产品手册 5000 字]            ← 稳定,缓存
[对话历史]                          ← 半稳定,可缓存
[当前问题]                          ← 变化,不缓存

适用:客服问答、知识库问答、固定角色的 Agent。

策略 2:分层缓存

把 Prompt 分成多层,每层独立缓存:

Layer 1: system 角色(几乎永不变)      → 长期缓存
Layer 2: 用户偏好(偶尔变)             → 中期缓存
Layer 3: 会话上下文(每轮增长)         → 短期缓存
Layer 4: 当前输入(每次变)             → 不缓存

适用:长对话 Agent、个性化助手。

策略 3:资料块缓存(RAG 专用)

把知识库切成块,每块独立缓存,检索到哪块用哪块:

知识库 1000 个块,每块 500 token
用户问 A → 检索到块 12, 45, 78 → 这 3 块命中缓存
用户问 B → 检索到块 12, 99    → 块 12 命中,99 首次缓存

适用:大规模文档问答、企业知识库。

策略 4:Few-Shot 模板缓存

把 few-shot 示例放前面缓存,只换最后的问题:

[system + 10 个示例]  ← 稳定,缓存(示例占大头)
[实际问题]            ← 变化,不缓存

适用:分类、抽取、格式转换等需要大量示例的任务。

各模型的实现差异

Claude Prompt Caching(显式控制)

Anthropic 的 prompt caching 需要显式标记哪些块要缓存:

import anthropic

client = anthropic.Anthropic()

resp = client.messages.create(
    model="claude-3-5-sonnet-20241022",
    messages=[
        {
            "role": "user",
            "content": [
                {
                    "type": "text",
                    "text": system_prompt + documentation,  # 稳定前缀
                    "cache_control": {"type": "ephemeral"}   # 标记缓存
                },
                {
                    "type": "text",
                    "text": user_question  # 变化部分
                }
            ]
        }
    ]
)

计费:

  • 首次写入缓存:1.25x 价格(写入费)
  • 命中缓存读取:0.1x 价格(1 折)
  • 缓存有效期:5 分钟(每次命中刷新)

关键约束:

  • 最小缓存块:1024 token(Sonnet)/ 2048 token(Opus)
  • 最多 4 个 cache_control 标记
  • 缓存按前缀匹配,前缀任一字符变化则失效

GPT-4o 自动缓存(隐式)

OpenAI 的缓存是自动的,无需标记:

from openai import OpenAI

client = OpenAI()

# 只要前缀相同,自动命中缓存
resp = client.chat.completions.create(
    model="gpt-4o",
    messages=[
        {"role": "system", "content": system_prompt},  # 自动缓存
        {"role": "user", "content": user_question}
    ]
)

计费:

  • 命中缓存:0.5x 价格(5 折)
  • 无写入费
  • 缓存有效期:5-10 分钟(无官方保证)

关键约束:

  • 最小缓存前缀:1024 token
  • 完全前缀匹配(任何变化都失效)
  • 不可控、不可观测(无法确定是否命中)

两者对比

维度ClaudeGPT-4o
控制方式显式标记自动
折扣0.1x(1 折)0.5x(5 折)
写入费1.25x无
可观测有 cache_read/input token无明确指标
多块缓存支持(最多 4 块)单前缀
适合场景长 RAG、多段资料简单 system prompt

成本计算实例

场景:客服 RAG,每次 4600 token,日均 10000 次

无缓存:

  • 4600 × 10000 = 4600 万 token
  • GPT-4o 价格 $2.5/百万 input = $115/天

GPT-4o 自动缓存(命中率 70%):

  • 缓存命中:4600 × 7000 × 0.5 = 1610 万等价 token
  • 未命中:4600 × 3000 = 1380 万 token
  • 合计 2990 万等价 token = $74.75/天
  • 省 35%

Claude 显式缓存(命中率 90%):

  • 首次写入:4500 × 1000 × 1.25 = 562 万等价 token
  • 命中读取:4500 × 9000 × 0.1 = 405 万等价 token
  • 新增部分:100 × 10000 = 100 万 token
  • 合计 1067 万等价 token = $26.7/天(按 $2.5/百万算)
  • 省 77%

结论:长前缀、高命中场景,Claude 的 1 折优势碾压;短前缀、低命中场景,GPT 的自动缓存省心。

落地代码

Claude 分层缓存(system + 资料 + 对话)

import anthropic

client = anthropic.Anthropic()

SYSTEM_PROMPT = """你是客服助手。规则:
1. 仅基于资料回答
2. 标注引用
..."""  # 1500 token,几乎不变

DOCUMENTATION = load_docs()  # 5000 token,每天更新一次

def chat_with_cache(history, question):
    resp = client.messages.create(
        model="claude-3-5-sonnet-20241022",
        max_tokens=1024,
        system=[
            {
                "type": "text",
                "text": SYSTEM_PROMPT,
                "cache_control": {"type": "ephemeral"}  # Layer 1
            },
            {
                "type": "text",
                "text": DOCUMENTATION,
                "cache_control": {"type": "ephemeral"}  # Layer 2
            }
        ],
        messages=[
            *history,  # Layer 3: 对话历史(也会被缓存)
            {"role": "user", "content": question}  # Layer 4: 不缓存
        ]
    )
    
    # 观察缓存命中
    usage = resp.usage
    print(f"输入: {usage.input_tokens}, 缓存写入: {usage.cache_creation_input_tokens}, 缓存命中: {usage.cache_read_input_tokens}")
    
    return resp.content[0].text

输出示例:

首次调用:输入 100, 缓存写入 6500, 缓存命中 0     ← 写入缓存
5 分钟内:输入 100, 缓存写入 0, 缓存命中 6500      ← 命中,只算 100

GPT-4o 配合前缀对齐

from openai import OpenAI

client = OpenAI()

# 关键:保证前缀完全一致
def chat_aligned(history, question):
    # system 必须完全相同(包括空格)
    messages = [
        {"role": "system", "content": SYSTEM_PROMPT},
        *history,
        {"role": "user", "content": question}
    ]
    resp = client.chat.completions.create(
        model="gpt-4o",
        messages=messages
    )
    # GPT 不返回明确命中指标,需通过 prompt_tokens 间接判断
    return resp.choices[0].message.content

缓存命中率优化技巧

1. 前缀稳定性

✗ system: "现在是{当前时间},你是客服..."  ← 时间变化导致整段失效
✓ system: "你是客服..." + user: "现在{时间},问题是..."

把变化内容移到后段,前缀保持稳定。

2. 资料排序固定

✗ 每次按相关性排序检索结果 → 顺序变 → 前缀变 → 缓存失效
✓ 固定排序(如按文档 ID)+ 在 user 部分标注"重点看第 3 条"

3. 对话历史压缩

✗ 把完整 10 轮对话塞进去 → 每轮增长 → 每次都写缓存
✓ 每 5 轮做一次摘要,压缩成 1 条 → 减少缓存写入频次

4. 批量请求合并

✗ 100 个独立问题,100 次调用
✓ 合并成 1 次调用(system + 资料缓存 + 100 个问题)

常见坑点

坑 1:缓存未命中却以为命中

Claude:可通过 cache_read_input_tokens > 0 判断
GPT:  无明确指标,只能通过成本下降间接推断

建议接监控统计实际命中率,别想当然。

坑 2:5 分钟有效期过期

低频应用(10 分钟一次)→ 缓存总过期 → 反而多付写入费
解决:对低频场景用 GPT 自动缓存(无写入费),或预热定时请求

坑 3:前缀长度不达标

Claude Sonnet 最小 1024 token
你的 system 只有 800 token → 不缓存
解决:补充 few-shot 示例凑到 1024+

坑 4:多用户混用缓存

✗ 用户 A 的对话历史进了缓存 → 用户 B 命中 A 的历史 → 泄露
✓ 每个用户独立会话,system + 资料共享缓存,对话历史不缓存

与其他技巧的关系

  • 链式调用:链式调用的每步 system prompt 相同,最适合缓存
  • RAG:RAG 的资料库缓存是降本关键
  • Few-Shot 模板:示例放前面缓存,问题放后面

小结

Prompt 缓存是 LLM 工程化的"必修课"——不改变输出质量,只改变成本与延迟。掌握它,你能在不牺牲效果的前提下,把长上下文应用的成本压到可商业化水平。

记住一个原则:稳定的前缀往前放,变化的内容往后放,这是所有缓存优化的根基。

相关推荐

查看更多 →
Prompt编程开发

Cache-Friendly Prompting:把提示词重排一遍,输入成本直接砍半

2026 年 9 月 22 日,Anthropic 发布 Claude Opus 5.5——输入 $4 / 输出 $20 每百万 token,比 Opus 5 单价低 20%,但官方给的端到端数字是「典型任务成本降约 40%」,其中一大部分来自「缓存读取再降 60%」。90 分钟后 OpenAI 发布 GPT-6 Sol 与 Luna,Sol 的缓存输入 $0.20(标准输入 $2,差 10 倍),Luna 缓存 $0.01(标准 $0.10),并对 30 分钟内复用的合格共享前缀给到最高 90% 折扣。**缓存折扣是当前所有降本手段里投入产出比最高的一个**:不用换模型、不用改架构、不用等排期,把你写的提示词重排一遍就生效。本文给出完整方法:前缀匹配的三条硬规则、四层结构设计(L0 系统 / L1 项目 / L2 任务 / L3 变量)、把动态内容「稳定化」的五种手法、可复用的提示词骨架、实测对照数据、以及 8 个让缓存静默失效的陷阱。

2026-09-23
#Prompt技巧#提示缓存
Prompt通用

Prompt 成本优化:Token 经济学,把 API 账单砍掉 70%

Token 不是免费的,一个 Prompt 设计不好月烧千美元。成本优化不是砍功能,是让每个 Token 都花在刀刃上。本文拆解 Token 成本的 5 个来源、4 类优化策略(压缩/缓存/路由/蒸馏)、成本测算公式、ROI 评估方法,配合可运行的成本计算器,让 API 账单从'黑盒'变'可控'。

2026-08-19
#Prompt技巧#成本优化
Prompt通用

Prompt 版本管理与回滚:像管代码一样管 Prompt

Prompt 改着改着发现不如旧版好,但旧版早被覆盖找不回了。版本管理让每个 Prompt 版本可追溯、可对比、可回滚——像 Git 管代码一样管 Prompt。本文拆解版本管理的 4 要素、3 种管理方案(文件/数据库/Prompt 注册中心)、灰度发布与回滚机制,配合可运行的版本管理器代码,把团队的 Prompt 资产安全沉淀下来。

2026-08-18
#Prompt技巧#版本管理
Prompt通用

Prompt 模板复用与参数化:让 Prompt 像函数一样可调用

Prompt 写一次用一次是最大的浪费。模板复用与参数化让 Prompt 变成像函数一样的可调用单元——定义一次、传参调用、跨场景共享。本文拆解参数化的 4 种模式、变量设计原则、版本管理与共享机制,配合可运行的模板引擎代码,把团队的 Prompt 资产沉淀下来。

2026-08-16
#Prompt技巧#模板复用