本文档将帮助您开始使用 AWS Bedrock 聊天模型。Amazon Bedrock 是一项完全托管的服务,提供来自 AI21 Labs、Anthropic、Cohere、Meta、Stability AI 和 Amazon 等领先 AI 公司的高性能基础模型(FM),通过单一 API 访问,同时提供构建生成式 AI 应用程序所需的各种功能,包括安全性、隐私性和负责任的 AI。使用 Amazon Bedrock,您可以轻松试验和评估适合您用例的顶级 FM,使用微调和检索增强生成(RAG)等技术通过您的数据私下定制它们,并构建能够使用您的企业系统和数据源执行任务的代理。由于 Amazon Bedrock 是无服务器的,您无需管理任何基础设施,并且可以使用您已经熟悉的 AWS 服务安全地集成和部署生成式 AI 功能到您的应用程序中。
AWS Bedrock 维护一个 Converse API ,它为 Bedrock 模型提供统一的对话界面。该 API 尚不支持自定义模型。您可以在此处查看所有 支持的模型列表.
有关所有 Bedrock 功能和配置的详细文档,请前往 API 参考.
概述
集成详情
| 类 | 包 | 可序列化 | JS 支持 | 下载量 | 版本 |
|---|---|---|---|---|---|
ChatBedrock | langchain-aws | beta | ✅ | !PyPI - 下载量 | !PyPI - 版本 |
ChatBedrockConverse | langchain-aws | beta | ✅ | !PyPI - 下载量 | !PyPI - 版本 |
模型功能
以下内容适用于 ChatBedrock 和 ChatBedrockConverse.
| 工具调用 | 结构化输出 | 图像输入 | 音频输入 | 视频输入 | Token 级流式输出 | 原生异步 | Token 使用量 | Logprobs |
|---|---|---|---|---|---|---|---|---|
| ✅ | ✅ | ✅ | ❌ | ❌ | ✅ | ❌ | ✅ | ❌ |
设置
要访问 Bedrock 模型,您需要创建一个 AWS 账户,设置 Bedrock API 服务,获取访问密钥 ID 和秘密密钥,并安装 langchain-aws 集成包。
凭证
前往 AWS 文档 注册 AWS 并设置您的凭证。
或者, ChatBedrockConverse 默认情况下会从以下环境变量读取:
# os.environ["AWS_ACCESS_KEY_ID"] = "..."
# os.environ["AWS_SECRET_ACCESS_KEY"] = "..."
# Not required unless using temporary credentials.
# os.environ["AWS_SESSION_TOKEN"] = "..."
您还需要为您的账户开启模型访问权限,您可以通过以下方式完成 这些说明.
要启用模型调用的自动追踪,请设置您的 LangSmith API 密钥:
os.environ["LANGSMITH_API_KEY"] = getpass.getpass("Enter your LangSmith API key: ")
os.environ["LANGSMITH_TRACING"] = "true"
安装
LangChain Bedrock 集成位于 langchain-aws package:
pip install -qU langchain-aws
实例化
现在我们可以实例化模型对象并生成聊天补全:
from langchain_aws import ChatBedrockConverse
llm = ChatBedrockConverse(
model_id="anthropic.claude-3-5-sonnet-20240620-v1:0",
# region_name=...,
# aws_access_key_id=...,
# aws_secret_access_key=...,
# aws_session_token=...,
# temperature=...,
# max_tokens=...,
# other params...
)
调用
messages = [
(
"system",
"You are a helpful assistant that translates English to French. Translate the user sentence.",
),
("human", "I love programming."),
]
ai_msg = llm.invoke(messages)
ai_msg
AIMessage(content="J'adore la programmation.", additional_kwargs={}, response_metadata={'ResponseMetadata': {'RequestId': 'b07d1630-06f2-44b1-82bf-e82538dd2215', 'HTTPStatusCode': 200, 'HTTPHeaders': {'date': 'Wed, 16 Apr 2025 19:35:34 GMT', 'content-type': 'application/json', 'content-length': '206', 'connection': 'keep-alive', 'x-amzn-requestid': 'b07d1630-06f2-44b1-82bf-e82538dd2215'}, 'RetryAttempts': 0}, 'stopReason': 'end_turn', 'metrics': {'latencyMs': [488]}, 'model_name': 'anthropic.claude-3-5-sonnet-20240620-v1:0'}, id='run-d09ed928-146a-4336-b1fd-b63c9e623494-0', usage_metadata={'input_tokens': 29, 'output_tokens': 11, 'total_tokens': 40, 'input_token_details': {'cache_creation': 0, 'cache_read': 0}})
print(ai_msg.content)
J'adore la programmation.
流式输出
使用 stream_events 直接流式输出 token:
stream = llm.stream_events(messages, version="v3")
for token in stream.text:
print(token, end="|")
J|'adore la| programmation.|
流式输出工具调用和结构化输出
使用 工具调用 or 结构化输出 时,工具调用参数默认以部分 JSON 块的形式流式输出。
要减少延迟并获得更均匀分布的块,您可以启用 Anthropic 的细粒度工具流式输出 beta 版:
from langchain_aws import ChatBedrockConverse
llm = ChatBedrockConverse(
model_id="us.anthropic.claude-sonnet-4-5-20250514-v1:0",
additional_model_request_fields={
"anthropic_beta": ["fine-grained-tool-streaming-2025-05-14"]
}
)
扩展思考
本指南重点介绍使用 LangChain 的 ChatBedrockConverse integration.
支持模型
扩展思考在 AWS Bedrock 上的以下 Claude 模型中可用:
| 模型 | 模型 ID |
|---|---|
| **Claude Opus 4** | anthropic.claude-opus-4-20250514-v1:0 |
| **Claude Sonnet 4** | anthropic.claude-sonnet-4-20250514-v1:0 |
| **Claude 3.7 Sonnet** | us.anthropic.claude-3-7-sonnet-20250219-v1:0 |
from langchain_aws import ChatBedrockConverse
llm = ChatBedrockConverse(
model_id="us.anthropic.claude-sonnet-4-20250514-v1:0",
region_name="us-west-2",
max_tokens=4096,
additional_model_request_fields={
"thinking": {"type": "enabled", "budget_tokens": 1024},
},
)
ai_msg = llm.invoke(messages)
ai_msg.content_blocks
[{'type': 'reasoning',
'reasoning': 'The user wants me to translate "I love programming" from English to French.\n\n"I love" translates to "J\'aime" in French.\n"Programming" translates to "la programmation" in French.\n\nSo the full translation would be "J\'aime la programmation."',
'extras': {'signature': 'EpkDCkgIBxABGAIqQGI0KGz8LoVaFwqSAYPN7N+FecI1ZGtb0zpfPr5F8Sb1yxtQHQlmbKUS8JByenWCFGpRKigNaQh1+rLZ59GEX/sSDB+6gxZAT24DJrq4pxoMySVhzwALI6FEC+1UIjDcozOIznjRTYlDWPcYUNYvpt8rwF9IHE38Ha2uqVY8ROJa1tjOMk3OEnbSoV13Pa8q/gETsz+1UwxNX5tgxOa+38jLEryhdFyyAk2JDLrmluZBM6TMrtyzALQvVbZqjpkKAXdtcVCrsz8zUo/LZT1B/92Ukux2dE0O1ZOdcW3tORK+NFLSBaWuqigcFUTDH9XNQoHd2WpQNhl+ypnCItbL2wDRscN/tEBkgGMQugvPmL0LAuLKBmsRKStKRi/RMYGJb3Ft2yEDsRnYNJBJ6TtgxXFvjDwqc/UaI9cIcTxdoVVlsPFsYccpVwirzwAOiz6CSQ1oOQTYJVT90eQ71QW74n1ubbFIZAvDBKk0KG8jK1FGx4FpuuZyFhBpXtfrgOCdrlVSAO/EE9fKCbP9FlhPbRgB'}},
{'type': 'text', 'text': "J'aime la programmation."}]
扩展思考的工作原理
当启用扩展思考时,Claude 会创建思维内容块来输出其内部推理过程。Claude 在生成最终响应之前会结合这些推理中的洞察。API 响应将包含思维内容块,后跟文本内容块。
next_messages = messages + [("ai", ai_msg.content), ("human", "I love AI")]
ai_msg = llm.invoke(next_messages)
ai_msg.content_blocks
[{'type': 'reasoning',
'reasoning': 'The user wants me to translate "I love AI" from English to French. \n\n"I love" translates to "J\'aime" in French.\n"AI" stands for "Artificial Intelligence" which in French is "Intelligence Artificielle" or "IA" (the French abbreviation).\n\nSo the translation would be "J\'aime l\'IA" or "J\'aime l\'intelligence artificielle".\n\nI think using the abbreviation "IA" would be more natural and concise, similar to how the user used "AI" in English.',
'extras': {'signature': 'EuAECkgIBxABGAIqQLWbkzJ8RzfxhVN1BhfRj5+On8/M9Utt0yH9kvj9P2zlQkO5xloq6I/AiEeArwwdJeqJVcLRjqLtinh6HIBbSDwSDFwt0GL409TqjSZNBhoMPQtJdZmx/uiPrLHUIjCJXyyjgSK3vzbcSEnsvo7pdpoo+waUFrAPDCGL/CIN5u7c8ueLCuCn8W0qGGc+BNgqxQO6UbV11RnMdnUyFmVgTPJErfzBr6U6KyUHd5dJmFWIUVpbbxT2C9vawpbKMPThaRW3BhItEafWGUpPqztzFhqJpSegXtXehIn5iY4yHzTUZ5FPdkNIuAmTsFNNGxiKr9H/gqknvQ2B7I4ushRHLg+drU4cH18EGZlAo5Tu1O9yH5GbweIEew4Uv7oWje+R8TIku0OFVhrbnQqqqukBicMV2JRifUYuz6dYM1UDYS8SfxQ1MmcVY5t1L9LDpoL4F/CtpL8/6YDsB/FosU37Qc1qm+D+pKEPTYnyxaP5tRXqTBfqUIiNJGqr9Egl17Akoy6NIv234rPfuf8HjTcu5scZoPGhOreG5rWxJ7AbTCIXgGWqpcf2TqDtniOac3jW4OtnlID9fsloKNq6Y5twgXHDR47c4Jh6vWmucZiIlL6hkklQzt5To6vOnqcTOGUtuCis8Y2wRzlNGeR2d8A+ocYm7mBvR/Y5DvDgstJwB/vCLoQlIL+jm6+h8k6EX/24GqOsh5hxsS5IsNIob/p8tr4TBbc9noCoUSYkMhbQPi2xpRrNML9GUIo7Skbh1ni67uqeShj1xuUrFG+cN6x4yzDaRb59LCAYAQ=='}},
{'type': 'text', 'text': "J'aime l'IA."}]
提示缓存
Bedrock 支持对提示元素的 缓存 ,包括消息和工具。这允许您重用大型文档、指令、 少样本文档和其他数据来减少延迟和成本。
要为提示元素启用缓存,请使用 cachePoint key。请参阅下面的示例:
from langchain_aws import ChatBedrockConverse
llm = ChatBedrockConverse(model="us.anthropic.claude-sonnet-4-6")
# Pull LangChain readme
get_response = requests.get(
"https://raw.githubusercontent.com/langchain-ai/langchain/b476fdb54aa6e6f5f0b24a68c2f4a94e43b369f9/README.md"
)
readme = get_response.text
messages = [
{
"role": "user",
"content": [
{
"type": "text",
"text": "What's LangChain, according to its README?",
},
{
"type": "text",
"text": f"{readme}",
},
{
"cachePoint": {"type": "default"},
},
],
},
]
response_1 = llm.invoke(messages)
response_2 = llm.invoke(messages)
usage_1 = response_1.usage_metadata["input_token_details"]
usage_2 = response_2.usage_metadata["input_token_details"]
print(f"First invocation:\n{usage_1}")
print(f"\nSecond:\n{usage_2}")
First invocation:
{'cache_creation': 1528, 'cache_read': 0}
Second:
{'cache_creation': 0, 'cache_read': 1528}
引用
如果输入文档启用了引用功能,则可以生成引用。文档可以 以 Bedrock 的 原生格式 或 LangChain 的 标准类型:
from langchain_aws import ChatBedrockConverse
llm = ChatBedrockConverse(model="us.anthropic.claude-sonnet-4-20250514-v1:0")
pdf_path = "path/to/your/file.pdf"
with open(pdf_path, "rb") as f:
pdf_bytes = f.read()
document = {
"document": {
"format": "pdf",
"source": {"bytes": pdf_bytes},
"name": "my-pdf",
"citations": {"enabled": True}, # [!code highlight]
},
}
response = llm.invoke(
[
{
"role": "user",
"content": [
{"type": "text", "text": "Describe this document."},
document,
]
},
]
)
response.content_blocks
from langchain_aws import ChatBedrockConverse
llm = ChatBedrockConverse(model="us.anthropic.claude-sonnet-4-20250514-v1:0")
pdf_path = "path/to/your/file.pdf"
with open(pdf_path, "rb") as f:
pdf_base64 = base64.b64encode(f.read()).decode("utf-8")
document = {
"type": "file",
"mime_type": "application/pdf",
"base64": pdf_base64,
"name": "my-pdf", # Converse requires a filename
"citations": {"enabled": True}, # [!code highlight]
}
response = llm.invoke(
[
{
"role": "user",
"content": [
{"type": "text", "text": "Describe this document."},
document,
]
},
]
)
response.content_blocks
ChatAnthropicBedrock
对于专门使用 Anthropic 模型的 AWS Bedrock 用户, langchain-aws 提供 ChatAnthropicBedrock此类扩展自 ChatAnthropic ,并在 AWS Bedrock 基础设施上运行时提供相同的接口。这利用了 Anthropic SDK 的 Bedrock 客户端.
安装
安装 langchain-aws ,使用 anthropic 额外依赖项来获取必需的依赖:
pip install --upgrade "langchain-aws[anthropic]"
uv add "langchain-aws[anthropic]"
用法
ChatAnthropicBedrock 支持与 ChatAnthropic相同的特性和参数。您可以使用 AWS 特定参数初始化它:
from langchain_aws import ChatAnthropicBedrock
model = ChatAnthropicBedrock(
model="us.anthropic.claude-haiku-4-5-20251001-v1:0",
region_name="us-west-2",
aws_access_key_id="...",
aws_secret_access_key="...",
aws_session_token="...",
)
AWS 凭据也可以从环境变量读取或由 boto3 自动发现:
# Set environment variables
# os.environ["AWS_ACCESS_KEY_ID"] = "..."
# os.environ["AWS_SECRET_ACCESS_KEY"] = "..."
# os.environ["AWS_REGION"] = "..."
from langchain_aws import ChatAnthropicBedrock
model = ChatAnthropicBedrock(model="us.anthropic.claude-haiku-4-5-20251001-v1:0")
有关可用参数和特性的详细文档,请参阅 ChatAnthropic 集成页面.
API 参考
有关所有 ChatBedrock, ChatBedrockConverse和 ChatAnthropicBedrock 特性和配置的详细文档,请前往 API 参考.