目 录CONTENT

文章目录

在 Amazon Bedrock 的自定义模型导入中引入结构化输出

Administrator
2025-11-08 / 0 评论 / 0 点赞 / 0 阅读 / 0 字

📢 转载信息

原文链接:https://aws.amazon.com/blogs/machine-learning/introducing-structured-output-for-custom-model-import-in-amazon-bedrock/

原文作者:Manoj Selvakumar, Lokeshwaran Ravi, Muzart Tuman, Revendra Kumar, and Yanyan Zhang


通过 Amazon Bedrock 的 Custom Model Import(自定义模型导入),您可以将经过微调或专有的基础模型部署并扩展到一个完全托管的无服务器环境中。您可以将自己的模型引入 Amazon Bedrock,在不管理基础设施的情况下安全地扩展它们,并将它们与其他 Amazon Bedrock 功能集成。

今天,我们很高兴地宣布在自定义模型导入中增加了结构化输出功能。结构化输出可以实时约束模型的生成过程,使其生成的每一个token都符合您定义的schema(模式)。您现在可以直接在推理时生成结构化输出,而不是依赖于提示工程技巧或脆弱的后处理脚本。

对于某些生产应用程序而言,模型输出的可预测性比其创意灵活性更重要。客服聊天机器人可能会受益于多样化、自然的回复,但订单处理系统需要符合预定义模式的精确、结构化数据。结构化输出通过保持基础模型的智能性,同时验证其输出满足严格的格式要求,从而弥合了这种差距。

这标志着从自由文本生成向一致的、机器可读的、旨在与企业系统无缝集成的输出的转变。虽然自由文本擅长供人类消费,但生产应用需要更高的精度。当系统依赖结构化输出来可靠地与 API、数据库和自动化工作流程交互时,企业不能承担自然语言变化的歧义。

在本文中,您将学习如何在 Amazon Bedrock 的自定义模型导入中实现结构化输出。我们将介绍什么是结构化输出,如何在 API 调用中启用它,以及如何将其应用于需要结构化、可预测输出的实际场景中。

理解结构化输出

结构化输出,也称为约束解码(constrained decoding),是一种方法,它引导大型语言模型(LLM)的输出符合预定义的schema,例如有效的 JSON。它不是允许模型根据概率分布自由选择 token,而是在生成过程中引入约束,将选择限制为仅那些能保持结构有效性的选项。如果某个特定的 token 会通过产生无效 JSON、插入杂项字符或使用意外的字段名称来违反 schema,结构化输出会拒绝该 token,并要求模型选择另一个允许的选项。这种实时验证有助于保持最终输出的一致性、机器可读性,并可供下游应用程序直接使用,无需额外的后处理。

如果没有结构化输出,开发人员通常会尝试通过提示指令来强制执行结构,例如“只用 JSON 响应。”虽然这种方法有时有效,但由于 LLM 本质上的概率特性,它仍然是不可靠的。这些模型通过从概率分布中采样来生成文本,引入了使响应感觉自然的自然变化,但这给自动化系统带来了巨大挑战。

考虑一个对工单进行分类的客户支持应用程序:如果响应在“这似乎是一个计费问题,”、“我将其归类为:计费,”和“类别 = BILLING”之间变化,下游代码就无法可靠地解释结果。生产系统所需要的是可预测的、结构化的输出。例如:

{
  "category": "billing",
  "priority": "high",
  "sentiment": "negative"
}

有了这样的响应,您的应用程序就可以自动路由工单、触发工作流或更新数据库,而无需人工干预。通过提供可预测的、与 schema 对齐的响应,结构化输出将 LLM 从对话工具转变为可靠的系统组件,可以与数据库、API 和业务逻辑集成。此功能开启了自动化的新可能性,同时保持了这些模型价值基础的智能推理能力。

除了提高可靠性和简化后处理之外,结构化输出还提供了额外的优势,可以增强生产环境中的性能、安全性和保障:

  • 更低的 token 使用量和更快的响应速度:通过将生成限制在定义的 schema 内,结构化输出消除了不必要的冗长、自由格式的文本,从而减少了 token 数量。由于 token 生成是顺序进行的,更短的输出直接转化为更快的响应和更低的延迟,从而提高了整体性能和成本效率。
  • 增强的抗提示注入安全性:结构化输出缩小了模型的表达空间,有助于防止其生成任意或不安全的内容。恶意行为者无法注入指令、代码或定义结构之外的意外文本。每个字段都必须与其预期的类型和格式匹配,确保输出保持在安全范围内。
  • 安全和策略控制:结构化输出允许您设计本质上有助于防止有害、有毒或违反策略内容的 schema。通过将字段限制为批准的值、强制执行模式和限制自由格式文本,schema 确保输出符合监管要求。

在下一节中,我们将探讨结构化输出如何与 Amazon Bedrock 中的自定义模型导入配合工作,并介绍在 API 调用中启用它的示例。

在 Amazon Bedrock 的自定义模型导入中使用结构化输出

让我们从假设您已经使用自定义模型导入功能将一个 Hugging Face 模型导入 Amazon Bedrock 开始。

先决条件

在继续之前,请确保您已具备:

  • 一个有权访问 Amazon Bedrock 的有效 AWS 账户
  • 使用自定义模型导入功能在 Amazon Bedrock 中创建的自定义模型
  • 通过 Amazon Bedrock Runtime 调用模型的适当 AWS Identity and Access Management (IAM) 权限

在具备这些先决条件后,让我们来探讨如何在自定义模型导入中实现结构化输出。

要开始在 Amazon Bedrock 的自定义模型导入中使用结构化输出,请首先配置您的环境。在 Python 中,这涉及到创建一个 Bedrock Runtime 客户端,并从您的导入的 Hugging Face 模型中初始化一个 tokenizer(分词器)。

Bedrock Runtime 客户端使用 Bedrock InvokeModel API 访问您的导入模型。Tokenizer 应用与导入模型对齐的正确聊天模板,该模板定义了如何将用户、系统和助手消息组合成单个提示,如何插入角色标记(例如,<|user|>, <|assistant|>),以及模型响应应从何处开始。

通过调用 tokenizer.apply_chat_template(messages, tokenize=False),您可以生成一个与您的模型期望的精确输入格式相匹配的提示,这对于一致和可靠的推理至关重要,尤其是在启用了结构化编码时。

import boto3
from transformers import AutoTokenizer
from botocore.config import Config # HF model identifier imported into Bedrock
hf_model_id = "<<huggingface_model_id>>" # Example: "deepseek-ai/DeepSeek-R1-Distill-Qwen-7B
model_arn = "arn:aws:bedrock:<<aws-region>>:<<account-id>>:imported-model/your-model-id"
region = "<<aws-region>>" # Initialize tokenizer aligned with your imported model
tokenizer = AutoTokenizer.from_pretrained(hf_model_id)
# Initialize Bedrock client
bedrock_runtime = boto3.client( service_name="bedrock-runtime", region_name=region)

实现结构化输出

当您在 Amazon Bedrock 上调用自定义模型时,您可以选择在请求载荷中添加一个 response_format 块来启用结构化输出。该块接受一个 JSON schema,用于定义模型响应的结构。在推理过程中,模型会实时强制执行此 schema,确保每个生成的 token 都符合定义的结构。下面是通过一个简单的地址提取任务演示如何实现结构化输出的步骤。

步骤 1: 定义数据结构

您可以使用 Pydantic 模型定义期望的输出,该模型充当您想要提取的数据的类型化契约。

from pydantic import BaseModel, Field

class Address(BaseModel):
    street_number: str = Field(description="Street number")
    street_name: str = Field(description="Street name including type (Ave, St, Rd, etc.)")
    city: str = Field(description="City name")
    state: str = Field(description="Two-letter state abbreviation")
    zip_code: str = Field(description="5-digit ZIP code")

步骤 2: 生成 JSON schema

Pydantic 可以自动将您的数据模型转换为 JSON schema

schema = Address.model_json_schema()
address_schema = { "name": "Address", "schema": schema
}

schema 定义了每个字段的类型、描述和要求,创建了一个模型在生成过程中将遵循的蓝图。

步骤 3: 准备输入消息

使用模型期望的聊天格式来格式化您的输入:

messages = [
    { "role": "user", "content": "Extract the address: 456 Tech Boulevard, San Francisco, CA 94105"
}
]

步骤 4: 应用聊天模板

使用模型的 tokenizer 来生成格式化的提示:

prompt = tokenizer.apply_chat_template(
    messages,
    tokenize=False,
    add_generation_prompt=True
)

步骤 5: 构建请求载荷

创建您的请求体,包括引用您 schemaresponse_format

request_body = {
    'prompt': prompt,
    'temperature': 0.1,
    'max_gen_len': 1000,
    'top_p': 0.9,
    'response_format': {
        "type": "json_schema",
        "json_schema": address_schema
    }
}

步骤 6: 调用模型

使用 InvokeModel API 发送请求:

response = bedrock_runtime.invoke_model(
    modelId=model_arn,
    body=json.dumps(request_body),
    accept="application/json",
    contentType="application/json"
)

步骤 7: 解析响应

从响应中提取生成的文本:

result = json.loads(response['body'].read().decode('utf-8'))
raw_output = result['choices'][0]['text']
print(raw_output)

由于 schema 定义了必需的字段,模型的响应将包含它们:

{
"street_number": "456",
"street_name": "Tech Boulevard",
"city": "San Francisco",
"state": "CA",
"zip_code": "94105"
}

输出是干净的、有效的 JSON,可以被您的应用程序直接使用,无需额外的解析、过滤或清理。

结论

Amazon Bedrock 中带有自定义模型导入的结构化输出提供了一种从模型生成结构化、与 schema 对齐的输出的有效方法。通过将验证转移到模型推理本身,结构化输出减少了对复杂后处理工作流和错误处理代码的需求。

结构化输出生成了可预测且易于集成到您的系统中的输出,并支持各种用例,例如构建需要精确数据提取的金融应用程序、需要结构化临床文档的医疗保健系统,或需要一致工单分类的客户服务系统。

立即开始使用您的 Custom Model Import 试验结构化输出,改变您的 AI 应用程序交付一致、可用于生产的结果的方式。


作者简介

Manoj Selvakumar 是 AWS 的一位生成式 AI 解决方案架构师专家,他帮助组织在云中设计、原型制作和扩展由 AI 驱动的解决方案。凭借在深度学习、可扩展云原生系统和多智能体编排方面的专业知识,他专注于将新兴创新转化为驱动可衡量业务价值的生产级架构。他热衷于将复杂的 AI 概念付诸实践,并赋能客户以负责任的方式进行大规模创新——从早期实验到企业部署。在加入 AWS 之前,Manoj 在咨询行业工作,为企业客户提供数据科学和 AI 解决方案,构建端到端机器学习系统,并通过强大的 MLOps 实践来支持生产中的训练、部署和监控。

Yanyan Zhang 是 Amazon Web Services 的一位高级生成式 AI 数据科学家,她作为生成式 AI 专家从事尖端 AI/ML 技术工作,帮助客户利用生成式 AI 实现其预期成果。Yanyan 毕业于德克萨斯 A&M 大学,获得电气工程博士学位。在工作之余,她喜欢旅行、锻炼和探索新事物。

Lokeshwaran Ravi 是 AWS 的一位高级深度学习编译器工程师,专注于 ML 优化、模型加速和 AI 安全。他致力于提高效率、降低成本并在安全生态系统中构建 AI 技术,使尖端的 ML 能够跨行业普及并产生影响力。

Revendra Kumar 是 Amazon Web Services 的一位高级软件开发工程师。在他目前的职位上,他专注于 Amazon Bedrock 上的模型托管和推理 MLOps。在此之前,他曾作为工程师从事在云端托管量子计算机和为本地云环境开发基础设施解决方案的工作。在职业追求之外,Revendra 喜欢通过打网球和徒步旅行来保持活跃。

Muzart Tuman 是一位软件工程师,他利用在深度学习、机器学习优化和 AI 驱动应用等领域的经验,以可扩展、高效和可访问的方式帮助解决现实世界的问题。他的目标是创建不仅能推进技术能力,还能激发各行业和社区产生有意义变革的、具有影响力的工具。




🚀 想要体验更好更全面的AI调用?

欢迎使用青云聚合API,约为官网价格的十分之一,支持300+全球最新模型,以及全球各种生图生视频模型,无需翻墙高速稳定,文档丰富,小白也可以简单操作。

0

评论区