Amazon Bedrock 为 Anthropic Claude 模型提供结构化输出
Structured outputs for Anthropic Claude models on Amazon Bedrock
Amazon Bedrock 现已为支持该功能的 Anthropic Claude 模型提供结构化输出,覆盖 bedrock-runtime 和 bedrock-mantle 两个端点。功能通过受约束解码生成符合 JSON Schema 的响应,并提供 JSON Schema 输出格式和严格工具调用两种机制;支持批量推理,bedrock-runtime 还支持跨区域推理和流式结构化响应。
文章说明了结构化输出如何在生成时约束 JSON Schema,并比较 JSON Schema 输出与严格工具调用两种机制,便于理解其在数据提取和智能体工作流中的用法。
Amazon Bedrock 现已在 bedrock-runtime 和 bedrock-mantle 端点上支持所有 Anthropic Claude 模型的结构化输出(前提是该端点提供相应模型)。
无论你是通过 Boto3 和 bedrock-runtime API 调用 Claude,还是通过 Messages API 和 bedrock-mantle 端点调用 Claude,现在都可以获得符合定义结构的 JSON 响应,无需自定义解析、重试逻辑或后处理。
实际应用
借助 Amazon Bedrock 上 Claude 的结构化输出,你可以在各行各业自动执行可靠且符合架构要求的任务。例如,从财报和合规文档中提取所有必需字段,将临床记录解析为电子健康记录(EHR),以及使用一致且经过验证的结果丰富产品目录。你还可以分析合同中的关键条款、当事方和义务,或实现智能支持工单路由,确保意图、情绪和实体始终与应用程序的数据模型相匹配。
Amazon Bedrock 上的结构化输出带来哪些变化
结构化输出通过约束解码在生成令牌时强制遵循 JSON 架构,而不是事后处理。模型不会生成违反架构的令牌。这使输出格式从概率性变为确定性。
现在,Amazon Bedrock 的两个端点均提供两种互补机制:
| 功能 | 用途 | 使用场景 |
| JSON Schema 输出格式 | 控制模型响应的结构 | 数据提取、报告生成、API 响应 |
| 严格工具使用 | 根据架构验证工具参数 | 智能体工作流、函数调用、多步骤自动化 |
这对你意味着什么
每个响应都是有效的 JSON,因此你不再会遇到 JSON.parse() 错误或解析异常。响应也具有类型安全性:字段类型会得到强制执行,必需字段始终存在。由于输出始终符合你的架构,你无需通过重试来处理架构违规问题,从而使集成更加可靠。结构化输出还会将响应限制为架构中定义的字段,从而减少输出令牌数量,并有可能降低高负载工作量的推理成本。这些特性使结构化输出可用于生产环境,因此你无需添加额外的架构验证代码即可大规模部署。
支持的模型和可用性
结构化输出适用于批量推理,因此你可以异步处理大量请求,同时仍能获得符合架构要求的输出。在 bedrock-runtime 端点上,它还支持跨区域推理,因此无需额外设置即可在多个 AWS 区域使用。如果你需要实时响应,可以将结构化响应作为带类型的事件进行流式传输。
工作原理
使用 JSON 架构发出请求时,后台会发生以下过程:
- 架构验证 – Amazon Bedrock 根据受支持的 JSON Schema Draft 2020-12 子集验证你的 JSON 架构。
- 语法编译 – 对于新架构,Amazon Bedrock 会编译语法构件(首次请求可能会稍微耗时更长)。
- 缓存 – 编译后的语法会缓存 24 小时,从而加快后续请求的处理速度。
- 约束生成 – 模型生成令牌,以生成符合架构的有效 JSON。
性能注意事项
出于性能考虑,使用新架构发送的第一个请求可能会耗时更长,因为 Amazon Bedrock 会在开始生成之前编译语法产物。初次编译后,后续使用相同架构的请求开销极小,因为编译后的语法会被缓存。此缓存按账户隔离,自首次访问起保留 24 小时。更改 JSON 架构的结构会使缓存失效并触发重新编译,而仅更改名称或描述字段则会保留缓存的语法。
入门:使用 InvokeModel API(bedrock-runtime)生成结构化输出
InvokeModel API 使用 Anthropic 原生请求体,因此架构应以 JSON 对象而非 JSON 字符串的形式放在 output_config.format 中。以下示例演示如何使用 boto3 和 Anthropic Claude 模型,从客户邮件中提取结构化的潜在客户数据:
Python
import boto3
import json
REGION = "us-east-1" # Choose your preferred region
bedrock_runtime = boto3.client(service_name="bedrock-runtime", region_name=REGION)
# Define the JSON schema for structured output
schema = {
"type": "object",
"properties": {
"name": {"type": "string", "description": "Customer name"},
"email": {"type": "string", "description": "Customer email address"},
"plan_interest": {"type": "string", "description": "Product plan of interest"},
"demo_requested": {"type": "boolean", "description": "Whether a demo was requested"}
},
"required": ["name", "email", "plan_interest", "demo_requested"],
"additionalProperties": False
}
# Make a request with structured outputs via the InvokeModel API
# (reusing the schema defined for the Converse example)
response = bedrock_runtime.invoke_model(
modelId="global.anthropic.claude-sonnet-5-5",
body=json.dumps({
"anthropic_version": "bedrock-2023-05-31",
"max_tokens": 512,
"messages": [
{"role": "user", "content": (
"Paulo Santos (paulo@example.com) is interested in our Enterprise plan "
"and wants to schedule a demo for next Tuesday at 2pm."
)}
],
"output_config": {"format": {"type": "json_schema", "schema": schema}}
})
)
body = json.loads(response["body"].read())
# Check the stop reason before parsing
if body["stop_reason"] == "end_turn":
result_text = next(b["text"] for b in body["content"] if b["type"] == "text")
print(json.dumps(json.loads(result_text), indent=2))
elif body["stop_reason"] == "max_tokens":
print("Response truncated: increase max_tokens and retry.")JSON
{
"name": "Paulo Santos",
"email": "paulo@example.com",
"plan_interest": "Enterprise",
"demo_requested": true
}响应符合你的架构。无需进行额外验证。
如需更多 API 用法示例(包括 Messages API),请参阅配套的 示例笔记本。
面向智能体工作流的严格工具调用
Amazon Bedrock Mantle 专为使用服务器端工具、后台推理和有状态对话的智能体应用而设计。在 bedrock-mantle 端点上启用严格工具调用后,你现在可以确保工具参数与输入架构完全一致。以下示例展示了如何定义一个启用严格架构强制执行的工具:
Import json
from anthropic import AnthropicBedrockMantle
# Reusing the client created in the Messages API example
client = AnthropicBedrockMantle(aws_region="us-east-1")
message = client.messages.create(
model="anthropic.claude-sonnet-5",
max_tokens=512,
messages=[{"role": "user", "content": "What's the weather like in San Francisco?"}],
tools=[
{
"name": "get_weather",
"description": "Get the current weather for a specified location",
"strict": True,
"input_schema": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "The city and state, e.g., San Francisco, CA"
},
"unit": {
"type": "string",
"enum": ["celsius", "fahrenheit"],
"description": "Temperature unit"
}
},
"required": ["location", "unit"],
"additionalProperties": False
}
}
]
)
#Tool inputs conform to the schema
for block in message.content:
if block.type == "tool_use":
print(f"Tool: {block.name}")
print(f"Input: {json.dumps(block.input, indent=2)}")设置 strict: true 可约束模型的工具输入,使其与架构完全一致。location 字段始终为字符串,unit 字段则始终为 celsius 或 fahrenheit。模型无法添加架构之外的字段,因此工具输入只包含架构中指定的内容。
对于 Amazon Bedrock Mantle 上的智能体用例,这一点尤其有价值,因为模型会通过 web 搜索和代码解释器等服务器端工具来编排多步骤工作流。
Claude 结构化输出的主要用例
在以下三种常见模式中,结构化输出最能降低错误处理的复杂度:
- 数据提取: 从发票、合同、电子邮件和转录文本中提取字段,生成始终符合架构的 JSON,可直接载入数据库或客户关系管理 (CRM) 系统。
- 可靠的智能体工具调用: 在生成时根据架构验证工具参数,让多步骤智能体工作流不会因输入格式错误而失败。
- 大规模分类: 按意图、优先级和情感对工单、潜在客户或内容进行分类,用于路由、审核和评估。
Claude Haiku 5.5 能可靠地处理摘要、压缩、数据库查询和分类请求等快速且重复的工作负载。以下示例展示了如何使用 Invoke API 和 Haiku 5.5 对传入数据进行分类和路由:
import boto3
import json
REGION = "us-east-1" # Choose your preferred region
bedrock_runtime = boto3.client(service_name="bedrock-runtime", region_name=REGION)
# Classification schema: enums restrict output to a fixed set of labels
schema = {
"type": "object",
"properties": {
"category": {
"type": "string",
"enum": ["billing", "technical", "account", "sales", "other"],
"description": "Primary ticket category"
},
"priority": {
"type": "string",
"enum": ["low", "medium", "high", "urgent"],
"description": "Urgency based on business impact"
},
"sentiment": {
"type": "string",
"enum": ["positive", "neutral", "negative"],
"description": "Customer sentiment"
},
"escalate": {"type": "boolean", "description": "Whether a human should review immediately"},
"reason": {"type": "string", "description": "One-sentence justification for the classification"}
},
"required": ["category", "priority", "sentiment", "escalate", "reason"],
"additionalProperties": False
}
ticket = (
"Our production API calls have been failing with 500 errors since this morning. "
"We're losing orders every minute. This is the second outage this month!"
)
# Make a request with structured outputs via the InvokeModel API
response = bedrock_runtime.invoke_model(
modelId="global.anthropic.claude-haiku-5-5",
body=json.dumps({
"anthropic_version": "bedrock-2023-05-31",
"max_tokens": 512,
"system": "You are a support ticket classifier. Classify the ticket accurately.",
"messages": [
{"role": "user", "content": f"Classify this support ticket:\n\n{ticket}"}
],
"output_config": {"format": {"type": "json_schema", "schema": schema}}
})
)
body = json.loads(response["body"].read())
# Check the stop reason before parsing
if body["stop_reason"] == "end_turn":
result_text = next(b["text"] for b in body["content"] if b["type"] == "text")
result = json.loads(result_text)
print(json.dumps(result, indent=2))
# Route the ticket based on the guaranteed-valid labels
if result["escalate"]:
print(f"Escalating to on-call: {result['category']} / {result['priority']}")
elif body["stop_reason"] == "max_tokens":
print("Response truncated: increase max_tokens and retry.")要求和最佳实践
要在 Amazon Bedrock 上有效使用结构化输出,请遵循以下准则:
- 对所有对象设置 additionalProperties: false:这是结构化输出正常工作的必要条件。如果不设置,架构将无法通过验证。
- 使用描述性字段名称和描述:模型会借助属性名称和描述来理解需要提取哪些数据。使用
customer_email这样的清晰名称,效果优于field1这样的通用名称。 - 对受限值使用 enum:当字段的有效值范围有限时,请使用
enum来限定选项。 - 从基础开始,再逐步增加复杂度:先从必需的最少字段开始,再逐步增加复杂度。基础架构编译速度更快、更易于调试,还能让请求负载保持精简,因为架构会计入 Converse API 负载大小。
- 重复使用架构以利用缓存:设计应用程序,使其能够在多个请求中重复使用架构。24 小时语法缓存可提升重复查询的性能。
- 检查每个响应中的停止原因:两种情况可能导致响应不符合要求:拒绝(模型出于安全原因拒绝回答)和令牌限制(在完成之前达到
max_tokens)。请在代码中处理这两种情况。 - 部署前使用真实数据进行测试:使用具有生产代表性的数据验证架构。真实数据中的边缘情况往往会暴露架构设计问题。
如需了解更多最佳实践和架构设计建议,请参阅《Amazon Bedrock 用户指南》中的 结构化输出。
支持的 JSON Schema 功能
- 所有基本类型:
object、array、string、integer、number、boolean、null。 enum(仅限字符串、数字、布尔值或 null)。const、anyOf、allOf(有限制)。$ref、$def和definitions(仅限内部引用)。- 字符串格式:
date-time、time、date、duration、email、hostname、uri、ipv4、ipv6、uuid。 - 数组
minItems(仅限值 0 和 1)。
不支持
API 会接受这些关键字,但在生成过程中不会强制执行。包含这些关键字的请求会返回成功响应,但模型仍可能返回违反这些关键字的值。请在应用程序中验证这些约束,而不要依赖架构来强制执行。
- 递归架构。
- 外部
$ref引用。 - 数值约束(
minimum、maximum、multipleOf)。 - 字符串约束(
minLength、maxLength)。 additionalProperties设置为 false 以外的任何值。
结语
Amazon Bedrock 上 Anthropic Claude 模型的结构化输出,能够提供生产级 AI 应用所需的可靠性。该功能现已在 bedrock-runtime 和 bedrock-mantle 端点上推出。通过结合使用 JSON Schema 输出格式和严格工具使用,您可以构建无需额外验证的数据管道。您还可以创建可靠的智能体工作流和生产级 AI 应用,而无需自定义解析或重试逻辑。
Amazon Bedrock 上 Claude 的结构化输出现已正式推出。如需了解更多信息,请参阅 Amazon Bedrock 文档并查看我们的示例笔记本。
经过验证且符合架构的 JSON 能改进您所在组织中的哪些工作流?欢迎在评论中分享您的反馈和问题。
作者简介
Anshika Saxena
Anshika 是 AWS 的生成式 AI 数据科学家,专注于 Amazon Bedrock。她通过指导企业客户在 Amazon Bedrock 上构建和实施解决方案,帮助他们加速采用生成式 AI 和智能体 AI。她还与 ISV 和初创公司合作,帮助他们在 Amazon Bedrock 上使用最新的 Anthropic 服务。
Dani Mitchell
Dani 是 AWS 的生成式 AI 高级专业解决方案架构师,负责 Anthropic 在 Amazon Bedrock 上的市场推广。他帮助全球各地的企业利用 Amazon Bedrock 上 Anthropic 模型及其功能设计和部署生成式 AI 解决方案,以构建可扩展、可用于生产的应用程序。
Alfredo Castillo
Alfredo 是 AWS 生成式 AI 高级专家解决方案架构师,专注于 Anthropic 模型在 Amazon Bedrock 上的市场推广。他与金融服务客户合作,设计并扩展分布式系统中的生成式 AI 解决方案,并将生成式 AI 实验转化为生产工作负载。工作之余,他热爱家庭和耐力运动。
Aamna Najmi
Aamna 是生成式 AI 高级专家解决方案架构师,专注于 Anthropic 模型,以及在 Amazon Bedrock 上大规模运营和治理生成式 AI 系统。她帮助 ISV 解决挑战、拥抱创新,并借助 Amazon Bedrock 创造新的商业机会。
Sofian Hamiti
Sofian 是一位技术领导者,拥有 12 年以上构建 AI 解决方案和领导高绩效团队以最大化客户成果的经验。他热衷于赋能不同背景的人才,推动全球影响力并实现职业抱负。
Ayan Ray
Ayan 是 AWS 首席合作伙伴解决方案架构师和 AI 技术负责人,同时担任 AWS Anthropic 全球技术负责人。他专注于云架构与人工智能的交汇领域,帮助组织在 AWS 上采用并扩展 Anthropic 的技术。
来源:AWS Machine Learning Blog · aws.amazon.com