在 Amazon Bedrock 中精确缓存 GPT-5.6 提示词:降低重复推理成本

2026-07-31 31 预计阅读时间: 1 分钟
来源: aws.amazon.com AI 摘要 Original link

Disclaimer: This article is an AI-assisted summary. Read it together with the original source when precision matters. The summary may omit context, version differences, or edge cases and is not official documentation.

预计阅读时间:9 分钟

OpenAI GPT-5.6 Sol、Terra 和 Luna 已在 Amazon Bedrock 正式可用。与模型一同推出的显式提示词缓存,让应用可以明确指定哪些提示内容应被缓存和复用,而不是把缓存行为完全交给平台判断。对于长系统提示、固定知识库和重复工具定义较多的工作负载,这直接关系到推理成本与响应延迟。

显式缓存解决的不是“所有提示都重复”

典型的生产提示并不是一个不可拆分的字符串,而是由多个稳定性不同的部分组成:

  • 长期稳定:安全规则、输出格式、品牌规范、工具定义。
  • 阶段性稳定:某个版本的产品文档、客服知识库、代码仓库上下文。
  • 每次变化:用户问题、会话状态、当前时间和实时检索结果。

显式提示词缓存的价值,在于把缓存边界放在稳定内容之后。后续请求只要复用相同前缀,就有机会避免重复处理这部分输入。

可以把提示组织成下面的逻辑结构:

[系统规则]
[工具定义]
[固定知识库]
--- cache point ---
[本轮用户问题]
[实时检索结果]

缓存点的位置很重要。放得太早,可复用内容太少;放得太晚,时间戳、请求 ID 或实时数据等动态字段会让前缀不断变化,削弱命中率。

可改造的 Bedrock Converse 示例

下面示例演示一种迁移方式:将稳定的系统指令和参考资料放在缓存点之前,将用户问题保留在动态消息中。

运行前需要安装并配置 AWS SDK:

python -m pip install --upgrade boto3
aws configure
export BEDROCK_MODEL_ID='替换为目标区域中实际可用的 GPT-5.6 模型 ID'

由于具体模型 ID、区域支持以及缓存内容块约束可能随 Bedrock 模型目录更新,请以当前账户中的 Bedrock 文档和 API 模型为准。以下代码采用 Bedrock Converse API 的 cachePoint 内容块作为可改造示例:

import os
import boto3

MODEL_ID = os.environ["BEDROCK_MODEL_ID"]
REGION = os.getenv("AWS_REGION", "us-east-1")

client = boto3.client("bedrock-runtime", region_name=REGION)

stable_reference = """
你是企业技术支持助手。
回答必须引用给定资料;资料不足时明确说明无法确认。

固定资料:
- 退款申请必须包含订单号。
- 企业账户的审批结果由账户管理员查看。
- 不得在回答中输出访问令牌或内部密钥。
""".strip()

question = "企业账户成员在哪里查看退款审批结果?"

response = client.converse(
    modelId=MODEL_ID,
    system=[
        {"text": stable_reference},
        {"cachePoint": {"type": "default"}},
    ],
    messages=[
        {
            "role": "user",
            "content": [{"text": question}],
        }
    ],
    inferenceConfig={
        "maxTokens": 500,
        "temperature": 0.2,
    },
)

for block in response["output"]["message"]["content"]:
    if "text" in block:
        print(block["text"])

print("usage:", response.get("usage", {}))

连续运行两次,并且只修改 question,即可观察稳定前缀是否被复用。实际验证时应记录响应中的 usage 指标、延迟和账单数据,而不能只凭第二次请求“感觉更快”来判断缓存是否生效。

如果目标模型或当前 SDK 版本不接受系统消息中的 cachePoint,应根据该模型的 Bedrock 请求结构调整内容块位置。显式缓存的核心设计不变:保持缓存点之前的序列稳定,把动态内容放到缓存点之后。

从现有 GPT 工作负载迁移

迁移不应只是把原来的请求体换一个模型名称。建议先把提示组装逻辑拆成稳定区和动态区:

from dataclasses import dataclass
from typing import Sequence


@dataclass(frozen=True)
class PromptParts:
    policy: str
    tools: str
    references: Sequence[str]
    user_input: str

    def stable_prefix(self) -> str:
        sections = [self.policy, self.tools, *self.references]
        return "\n\n".join(part.strip() for part in sections if part.strip())

    def dynamic_suffix(self) -> str:
        return self.user_input.strip()

这层拆分能防止常见问题:开发者在固定提示中加入当前时间、追踪 ID 或随机排序后的 JSON,导致每个请求的缓存前缀都不同。

迁移期间还应保留原模型路径,通过配置逐步切换:

llm:
  provider: bedrock
  model_id: ${BEDROCK_MODEL_ID}
  explicit_prompt_cache: true
  rollout_percentage: 10
  metrics:
    - input_tokens
    - cached_input_tokens
    - output_tokens
    - latency_ms
    - error_rate

这份 YAML 是应用侧配置示例,不是 Bedrock 的原生资源格式。可以先让 10% 流量进入新路径,比较输出质量、缓存命中、延迟和单请求成本,再逐步扩大比例。

哪些内容适合缓存

适合放入缓存前缀的内容通常具有两个特征:体积较大,并且能跨多个请求保持完全一致。例如长系统提示、固定工具 schema、版本化文档和代码规范。

以下内容应谨慎处理:

  • 用户隐私、账户数据和跨租户上下文。
  • 高频更新的检索结果、库存、价格和权限状态。
  • 时间戳、nonce、请求 ID 等每次都会变化的字段。
  • 顺序不稳定的字典、工具列表或文档集合。

在多租户系统中,即使平台负责隔离底层缓存,应用仍应按租户和权限构造提示,避免为了提高命中率而复用不该共享的上下文。缓存不会替代访问控制,也不会自动保证知识的新鲜度。

上线前检查

引入 GPT-5.6 Sol、Terra 或 Luna 时,可以按以下清单推进:

  1. 确认目标模型在部署区域和账户中可用,并核对调用权限。
  2. 将提示拆成稳定前缀与动态后缀,清除稳定区中的随机字段。
  3. 在缓存点之前固定文本、文档和工具定义的顺序。
  4. 同时监控缓存相关 token、总输入 token、延迟、错误率和输出质量。
  5. 用灰度流量验证成本收益,不把单次测试结果当作长期命中率。
  6. 为知识库版本变化设计主动失效方式,例如把文档版本纳入稳定前缀。
  7. 保留关闭显式缓存和回退旧模型的配置开关。

显式提示词缓存最适合“长前缀、多请求复用”的应用。对于提示很短、内容几乎每次都变化或请求频率很低的场景,缓存带来的收益可能有限。真正有效的迁移,需要把提示结构、版本管理、可观测性和模型评测放在同一条工程链路中。


相关推荐