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 时,可以按以下清单推进:
- 确认目标模型在部署区域和账户中可用,并核对调用权限。
- 将提示拆成稳定前缀与动态后缀,清除稳定区中的随机字段。
- 在缓存点之前固定文本、文档和工具定义的顺序。
- 同时监控缓存相关 token、总输入 token、延迟、错误率和输出质量。
- 用灰度流量验证成本收益,不把单次测试结果当作长期命中率。
- 为知识库版本变化设计主动失效方式,例如把文档版本纳入稳定前缀。
- 保留关闭显式缓存和回退旧模型的配置开关。
显式提示词缓存最适合“长前缀、多请求复用”的应用。对于提示很短、内容几乎每次都变化或请求频率很低的场景,缓存带来的收益可能有限。真正有效的迁移,需要把提示结构、版本管理、可观测性和模型评测放在同一条工程链路中。