Amazon Bedrock 四个影响推理成本的请求级选择:缓存 TTL、服务层级、推理努力与 maxTokens
Four Amazon Bedrock inference choices that affect cost
AWS 博客讲解 Amazon Bedrock 中缓存时长、服务层级、推理努力和 maxTokens 四个请求级选择如何影响推理成本,不改模型和提示词也能改变 token 处理量与费率。
原文用实测数据说明四个请求级参数如何影响 Bedrock 推理成本,方法可迁移到读者自己的账单优化。
在调整提示词和应用逻辑之后,你的 Amazon Bedrock 推理账单仍可能持续攀升。请求级别的选择仍会改变服务处理的 token 数量以及适用的费率。缓存时长、服务层级、推理(reasoning)力度以及 maxTokens 都可能在不更改模型或提示词的情况下影响成本。
每项选择都取决于模型和工作负载。本文将展示我们如何测试每项选择,以及如何通过响应元数据、日志和账单数据来验证其效果。
要亲自尝试这些设置,请从 Amazon Bedrock Samples 的 notebook Mixed TTL Caching 和 Tenant Isolation with Prompt Caching 开始。关于 maxTokens 和推理力度,请参阅 GitHub 仓库 sample-code-for-genai-cost-management-workshop 中的 01-low-effort 文件夹。每个示例都设置了各自的模型 ID,因此请修改模型 ID 和推理参数,以匹配你所调用的模型。有关各 AWS 区域的模型可用性,请参阅 Models at a glance。有关更广泛的决策(如模型选择、批量推理、路由和蒸馏),请参阅 Effective cost optimization strategies for Amazon Bedrock。
推理成本从何而来
每条 Amazon Bedrock 响应都带有用量元数据。输入和输出 token 按服务该请求的模型和层级对应的费率计费。缓存读取和写入使用单独的 token 计数器,而推理(reasoning)token 计入输出 token。
提示词缓存时长
当缓存过期时,重复的系统指令、工具定义或参考上下文可能在下一个请求之前被重新处理。《Prompt caching for faster model inference》指南列出了受支持的 Anthropic 模型的 5 分钟和 1 小时生存时间(TTL)值。该指南还列出了受支持的 GPT-5.6 模型的 30 分钟最小 TTL。支持情况和 API 字段因模型而异,因此在选择时长之前请查看当前的支持矩阵。
对于受支持的模型,Amazon Bedrock 还提供 隐式提示词缓存,它会尝试重用符合条件的提示词前缀,而无需在请求中设置缓存控制。由于隐式缓存是尽力而为的机制,并不保证缓存命中,因此本节讨论的时长选择适用于显式缓存。
以下 Converse API 签名在支持该功能的模型上请求 1 小时的缓存条目:
{ "cachePoint": { "type": "default", "ttl": "1h" } }对于受支持的 Anthropic 模型,InvokeModel 将相同的 ttl 值放入 cache_control。
更长的时长并不一定更便宜。《Amazon Bedrock Pricing》页面列出了 5 分钟写入、1 小时写入和缓存读取的独立费率。对于 Amazon Bedrock 上的 Anthropic Claude Sonnet 5 和 Anthropic Claude Opus 5,5 分钟写入的成本是输入费率的 1.25 倍,1 小时写入是 2 倍,缓存读取是 0.1 倍。
假设每个请求都重用完全相同的前缀,且每次缓存读取都会刷新 TTL,这些费率决定了盈亏平衡点。5 分钟缓存在 5 分钟内的首次重用即可回本。当针对相同前缀的请求间隔超过 5 分钟时,每个请求都会以 1.25 倍的费率重新写入。此时,如果一小时内有第二个请求,1 小时缓存则更便宜。
缓存费率和检查点最小值因模型而异。请查阅你所调用模型的《Amazon Bedrock Pricing》页面和《提示词缓存指南》。针对你的模型重新运行这一对比,然后在上线后通过缓存读取和写入 token 来加以确认。
将稳定内容放在动态内容之前,满足模型的检查点最低要求,并使用按需推理,因为提示缓存不适用于批量推理。
更改缓存前缀(包括系统指令或工具定义)会导致缓存未命中并产生新的写入。检查点按工具、系统、消息的顺序进行评估,因此对靠前部分的更改也会使靠后的部分失效。为经常变动的提示建立版本,让每个版本拥有自己的缓存条目。我们在 Claude Sonnet 5 上使用 1 小时检查点运行了六次调用,其中更改了一次系统提示和一次工具定义。每次更改都产生零次缓存读取和一次新的写入。
AWS 将缓存条目描述为限定于你的账户和区域,而不是限定于你的租户。在多租户应用程序中,在可缓存前缀前附加一个租户专属的 SHA-256 哈希。《Optimizing cost and latency with Amazon Bedrock prompt caching for Anthropic models》一文描述了这一模式。在构建提示之前先执行租户授权校验。该哈希会在同一账户内对条目进行分区。如果受监管的工作负载需要硬性数据边界,请将每个租户放在单独的 AWS 账户中。
对频繁复用的场景保持 5 分钟默认时长。当同一前缀每小时至少出现两次且间隔超过 5 分钟时,再切换到更长的受支持时长。要想优于完全不使用缓存,1 小时缓存每小时需要三次请求。
面向延迟不敏感工作负载的服务层级
后台作业、评估框架、夜间摘要和回填任务并不总是需要交互式请求所用的延迟表现。对于支持 Flex 的模型,请使用以下请求签名进行选择:
{ "serviceTier": { "type": "flex" } }使用 default 而非 standard 来请求 Standard 层级。你也可以直接省略 serviceTier:
{ "serviceTier": { "type": "default" } }层级支持因模型而异,因此请按确切的模型版本记录支持情况。Amazon Nova 2 Lite 和 OpenAI gpt-oss-120b 的模型卡将 Flex 列为受支持。Amazon Bedrock 上的 Anthropic Claude Sonnet 5 和 Anthropic Claude Opus 5 模型卡则将其列为不受支持。向不支持 Flex 的模型发送 Flex 请求会返回 ValidationException 错误,而不是静默地以 Standard 运行。我们向 Anthropic Claude Sonnet 5 发送的请求就返回了该错误。
如果你的策略允许以 Standard 作为回退方案,可捕获不支持该层级的错误并用 default 重试一次。不要在每次遇到 ValidationException 时都重试,因为格式错误的请求也会引发该错误。为应用层重试设置上限。AWS SDK 的有界重试策略可以处理限流和瞬时错误。
为 Flex 请求设置自己的截止时限。受支持的响应会报告已解析的层级,你也可以通过 Amazon CloudWatch ResolvedServiceTier 进行验证。请参阅Service tiers for optimizing performance and cost 以及你所调用具体模型的 Amazon Bedrock Pricing 页面。
我们在 Amazon Nova 2 Lite 上测试了 Flex,发送了 200 个 default 请求和 200 个 flex 请求,以交错成对的方式发送。两个层级处理的输入和输出令牌数量相同。全部 400 个请求都解析到了所请求的层级,延迟中位数差异小到无法与噪声区分。在撰写本文时,Nova 2 Lite 在 us-west-2 公布的 Flex 费率是 Standard 费率的一半,我们的账单也反映了这一点。请查看 Amazon Bedrock Pricing 页面了解当前费率。将延迟敏感的流量保留在 default 上。
自适应思考强度
推理令牌按输出令牌计费。Claude Sonnet 5 和 Claude Opus 5 默认在 high 强度下使用自适应思考,即使请求中省略了 thinking 字段也是如此。一个从 Claude Sonnet 4.6 迁移且未做修改的应用将开始对思考令牌计费,且 maxTokens 现在会限制思考加响应文本的总量。Claude Haiku 5.5 默认为 medium。这三个模型均支持 low、medium、high、xhigh 和 max。使用以下请求签名降低任务的强度:
{
"thinking": { "type": "adaptive" },
"output_config": { "effort": "low" }
}请将 effort 保持在 output_config 中,而不是放在 thinking 内部。每次更换模型时,请查阅 自适应思考。
我们在 Claude Opus 5 上测试了一个工具调用智能体。它的三个任务遵循 Build long-horizon agents with Grok 4.7 on Amazon Bedrock 中的设计,每个任务都有一个正确答案。我们在每个强度级别下将每个任务运行了八次。表中显示了输出令牌的中位数:
| 强度 | 正确运行次数 | 输出令牌中位数 | 相对 low 的变化(95% 区间) |
| low | 24/24 | 936 | 基准 |
| medium | 24/24 | 1,484 | +59%(50% 至 78%) |
| high(默认) | 24/24 | 2,521 | +169%(112% 至 190%) |
| xhigh | 24/24 | 2,964 | +217%(170% 至 260%) |
| max | 24/24 | 3,762 | +302%(180% 至 402%) |
较低强度下的准确率取决于模型和任务。请在与你的任务形态相似的任务上进行测量。
在 Amazon Bedrock Samples 的 Invoke Bedrock model for code generation 工作负载上,low 时的输出令牌中位数为 676,high 时为 743,差异在多次运行之间的波动范围内。我们评分的程序在每个强度级别下均通过。
使用每次请求的输出令牌计数、CloudWatch AWS/Bedrock OutputTokenCount、调用日志以及任务通过率来评估这一选择。对于例行的、边界清晰的任务,可从低于 high 的强度开始。在质量测试表明任务需要时,保留 high。导致任务失败的令牌削减并不是节省。
输出令牌上限
maxTokens 是应用程序输出的上限。它限制了错误的提示词、回归或循环在请求停止之前可能产生的输出。配额规则已在 How tokens are counted in Amazon Bedrock 中说明。Amazon Bedrock 会在请求开始时扣减你的输入令牌加上 maxTokens,因此过大的数值会降低并发度。
输出上限并不是安全控制。在生产环境的生成式 AI 工作负载中,请使用 Amazon Bedrock Guardrails 作为标准的负责任 AI 控制手段。Guardrails 可以过滤内容、检测提示词攻击,并对支持的输入和响应进行依据性检查。参见 Detect and filter harmful content by using Amazon Bedrock Guardrails。
在观察了具有代表性的输出令牌分布之后,按任务类型设置 maxTokens:
{ "inferenceConfig": { "maxTokens": 155 } }请求参数请参见 Inference using Converse API。
在我们在 Claude Sonnet 5 上的测试中,五个正常输出的峰值是 103 个令牌,因此我们设置了一个带余量的示例性围栏值 155 个令牌。然后,我们在禁用自适应思考的情况下发送了同一段刻意冗长的提示词,一次设置 2,048 个令牌的上限,一次设置 155 个令牌的围栏。第一个请求生成了 2,048 个输出令牌,第二个生成了 155 个,因此围栏节省了 1,893 个输出令牌。两者都在 max_tokens 处停止,因此两个响应都被截断了。围栏限制了支出,但不会让一个不合适的提示词变得有用,并且在多轮对话或智能体链中,一个被截断的轮次可能会破坏其后的步骤。
在生产环境进行校准时,请比较每种任务类型的第 95 和第 99 百分位数(P95 和 P99),并在所选百分位数的基础上预留余量。开启自适应思考后,maxTokens 还会限制思考 token 数量,因此校准时请启用思考。P95 更激进地限制暴露,但接受更多的截断风险。P99 以更高的上限保留更多有效的长尾响应。监控 max_tokens 停止情况,并在提高该任务的限制之前调查请求。
综合应用
对每种设置使用相同的测试循环:确认模型支持情况,更改一个请求选项,测量 token 或成本,并跟踪质量或完成率。如果跨模型路由,请为每个模型版本、区域(Region)和 API 保留一份能力记录:支持的缓存时长、服务层级、推理级别和输出上限。发送每个请求之前,先根据该记录进行验证,然后检查响应中已解析的层级和缓存计数器。
| 设置 | 默认或宽松状态 | 结果 | 可接受的风险 |
| 缓存时长 | 特定于模型的 TTL | 根据已公布的 Sonnet 5 和 Opus 5 费率,当间隔超过 5 分钟时,1 小时缓存从每小时第二次请求起即更划算 | 1 小时写入成本是输入的 2 倍,低复用率会亏本。对租户前缀进行分区 |
| 服务层级 | default |
在撰写本文时,Nova 2 Lite Flex 公布的价格为标准费率的一半,我们的账单也与之相符 | 处理时间更长。请自行设置截止时间和一个后备方案 |
| 推理力度 | 在所测试的自适应模型上为 high |
从低到高:智能体测试中输出 token 中位数增加 169%,代码生成方面无可靠差异 | 接近任务能力边界时质量可能下降。结合 token 跟踪通过率 |
maxTokens |
宽松的 2,048 token 上限 | 在一次测试中,一个示例性的 155 token 边界避免了 1,893 个输出 token | 截断可能在多轮或智能体链中级联。在提高限制之前检查 stopReason |
需要关注的信号
| 设置 | 症状 | 验证方式 | 首要响应措施 |
| 缓存时长 | 重复上下文未产生预期的延迟或成本收益 | 应用延迟和成本遥测数据 | 在更改 TTL 之前,检查前缀稳定性、复用间隔和模型支持情况 |
| 服务层级 | 请求的层级不受支持,或实际服务层级与预期不符 | 响应 serviceTier 和 CloudWatch ResolvedServiceTier |
使用受支持的层级,或将延迟敏感的流量返回到 default |
| 推理力度 | 输出 token 上升而质量保持不变 | 按请求的响应遥测数据、CloudWatch OutputTokenCount、调用日志和任务通过率 |
为该任务类别降低推理力度,并重新运行其质量测试 |
maxTokens |
stopReason 为 max_tokens |
响应停止原因和按任务范围的输出 token 分布 | 在提高限制之前,检查提示词和任务边界 |
根据带任务标签的应用遥测数据或调用日志,推导出每种任务类型的 P95 和 P99。
结论
所有四个选项都位于推理请求中。更改模型时请重新检查支持情况,然后一次更改一项设置并在您的应用中测量结果。
使用以下资源来评估适用于您工作负载的选项:
- Amazon Bedrock 控制台:console.aws.amazon.com/bedrock。
- 提示词缓存:提示词缓存以加速模型推理。
- 服务层级:用于优化性能和成本的服务层级。
- 自适应思考:自适应思考。
- 负责任的 AI 控制:使用 Amazon Bedrock Guardrails 检测和过滤有害内容。
- 相关阅读:Amazon Bedrock 的有效成本优化策略。
- 相关示例和文章:调用 Bedrock 模型进行代码生成以及在 Amazon Bedrock 上使用 Grok 4.7 构建长时程智能体。
关于作者
来源: AWS Machine Learning Blog · aws.amazon.com