跳到内容

使用 AWS Bedrock 实现结构化输出

本指南演示了如何将 AWS Bedrock 与 Instructor 结合使用来生成结构化输出。您将学习如何使用 AWS Bedrock 的大型语言模型 (LLM) 与 Pydantic 来创建类型安全、经过验证的响应。

先决条件

您需要拥有一个有权访问 Bedrock 并具有相应权限的 AWS 账户。您还需要设置您的 AWS 凭证。

pip install "instructor[bedrock]"

AWS Bedrock

AWS Bedrock 是一项完全托管的服务,通过单一 API 提供来自领先 AI 公司(如 AI21 Labs、Anthropic、Cohere、Meta、Stability AI 和 Amazon)的多种高性能基础模型 (FM)。

同步示例

import boto3
import instructor
from pydantic import BaseModel

# Initialize the Bedrock client
bedrock_client = boto3.client('bedrock-runtime')

# Enable instructor patches for Bedrock client
client = instructor.from_bedrock(bedrock_client)


class User(BaseModel):
    name: str
    age: int


# Create structured output
user = client.chat.completions.create(
    modelId="anthropic.claude-3-sonnet-20240229-v1:0",
    messages=[
        {"role": "user", "content": [{ "text": "Extract: Jason is 25 years old" }]},
    ],
    response_model=User,
)

print(user)
# > User(name='Jason', age=25)

支持的模式

AWS Bedrock 使用 Instructor 支持以下模式

  • BEDROCK_TOOLS:对支持函数调用的模型使用此模式(例如 Claude 模型)
  • BEDROCK_JSON:直接生成 JSON 响应
import boto3
import instructor
from instructor import Mode
from pydantic import BaseModel

# Initialize the Bedrock client
bedrock_client = boto3.client('bedrock-runtime')

# Enable instructor patches for Bedrock client with specific mode
client = instructor.from_bedrock(
    bedrock_client,
    mode=Mode.BEDROCK_TOOLS
)


class User(BaseModel):
    name: str
    age: int


# Create structured output
user = client.converse(
    modelId="anthropic.claude-3-sonnet-20240229-v1:0",
    messages=[
        {"role": "user", "content": "Extract: Jason is 25 years old"},
    ],
    response_model=User,
)

print(user)
# > User(name='Jason', age=25)

嵌套对象

import boto3
import instructor
from pydantic import BaseModel

# Initialize the Bedrock client
bedrock_client = boto3.client('bedrock-runtime')

# Enable instructor patches for Bedrock client
client = instructor.from_bedrock(bedrock_client)


class Address(BaseModel):
    street: str
    city: str
    country: str


class User(BaseModel):
    name: str
    age: int
    addresses: list[Address]


# Create structured output with nested objects
user = client.converse(
    modelId="anthropic.claude-3-sonnet-20240229-v1:0",
    messages=[
        {
            "role": "user",
            "content": """
            Extract: Jason is 25 years old.
            He lives at 123 Main St, New York, USA
            and has a summer house at 456 Beach Rd, Miami, USA
        """,
        },
    ],
    response_model=User,
)

print(user)
#> User(
#>     name='Jason',
#>     age=25,
#>     addresses=[
#>         Address(street='123 Main St', city='New York', country='USA'),
#>         Address(street='456 Beach Rd', city='Miami', country='USA')
#>     ]
#> )

更多资源