此文档将帮助您开始使用 AWS Bedrock 的 聊天模型。Amazon Bedrock 是一个完全托管的服务,提供来自 AI21 Labs、Anthropic、Cohere、Meta、Stability AI 和 Amazon 等领先人工智能公司的高性能基础模型(FMs)的选择,并通过单一 API 提供您构建生成式 AI 应用所需的一系列功能,包括安全性、隐私性和负责任的人工智能。使用 Amazon Bedrock,您可以轻松地针对您的用例实验和评估顶级 FMs,在其中私有化定制它们以您的数据使用诸如微调和检索增强生成(RAG)等技术,并构建执行任务的代理,这些任务可以利用您的企业系统和数据源。由于 Amazon Bedrock 是无服务器的,因此您无需管理任何基础设施,并且可以安全地通过您熟悉的 AWS 服务将生成式 AI 能力集成到您的应用程序中。
AWS Bedrock 维护了一个 Converse API,该 API 提供了对 Bedrock 模型的统一对话接口。此 API 目前不支持自定义模型。您可以在 此处查看所有受支持的模型列表。
Anthropic 模型在 Bedrock 上对于 Anthropic 模型,您可以使用 ChatAnthropicBedrock,它扩展了 ChatAnthropic 并提供了相同的 API,在 AWS Bedrock 基础设施上运行。有关详细信息,请参阅下方的 ChatAnthropicBedrock 部分。
要详细了解所有 Bedrock 功能和配置,请访问 API 参考文档。
整合细节
模型功能
以下适用于 ChatBedrock 和 ChatBedrockConverse。
要访问 Bedrock 模型,您需要创建一个 AWS 账户、设置 Bedrock API 服务、获取访问密钥 ID 和秘密密钥,并安装 langchain-aws 整合包。
前往 AWS 文档 注册 AWS 并设置凭据。
或者,ChatBedrockConverse 默认会从以下环境变量读取:
# os.environ["AWS_ACCESS_KEY_ID"] = "..."
# os.environ["AWS_SECRET_ACCESS_KEY"] = "..."
# 如果使用临时凭证,则需要。
# 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 包中:
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=...,
# 其他参数...
)
messages = [
(
"system",
"您是一个将英语翻译成法语的帮助助手。请翻译用户句子。",
),
("human", "我热爱编程。"),
]
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}})
J'adore la programmation.
流式传输
请注意,ChatBedrockConverse 在流式传输过程中会发出内容块:
for chunk in llm.stream(messages):
print(chunk)
content=[] additional_kwargs={} response_metadata={} id='run-d0e0836e-7146-4c3d-97c7-ad23dac6febd'
content=[{'type': 'text', 'text': 'J', 'index': 0}] additional_kwargs={} response_metadata={} id='run-d0e0836e-7146-4c3d-97c7-ad23dac6febd'
content=[{'type': 'text', 'text': "'adore la", 'index': 0}] additional_kwargs={} response_metadata={} id='run-d0e0836e-7146-4c3d-97c7-ad23dac6febd'
content=[{'type': 'text', 'text': ' programmation.', 'index': 0}] additional_kwargs={} response_metadata={} id='run-d0e0836e-7146-4c3d-97c7-ad23dac6febd'
content=[{'index': 0}] additional_kwargs={} response_metadata={} id='run-d0e0836e-7146-4c3d-97c7-ad23dac6febd'
content=[] additional_kwargs={} response_metadata={'stopReason': 'end_turn'} id='run-d0e0836e-7146-4c3d-97c7-ad23dac6febd'
content=[] additional_kwargs={} response_metadata={'metrics': {'latencyMs': 600}, 'model_name': 'anthropic.claude-3-5-sonnet-20240620-v1:0'} id='run-d0e0836e-7146-4c3d-97c7-ad23dac6febd' usage_metadata={'input_tokens': 29, 'output_tokens': 11, 'total_tokens': 40, 'input_token_details': {'cache_creation': 0, 'cache_read': 0}}
您可以使用输出的 text 属性过滤文本:
for chunk in llm.stream(messages):
print(chunk.text, end="|")
|J|'adore la| programmation.||||
流式传输工具调用和结构化输出
在使用 工具调用 或 结构化输出 与 Anthropic 模型时,默认情况下,工具调用参数会以部分 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"]
}
)
细粒度工具流式传输支持 Claude 4.5 及以上版本的模型。请参阅 Claude 文档 获取更多详细信息。
在使用细粒度工具流式传输时,您可能会收到无效或部分 JSON 输入。确保在代码中考虑这些边缘情况。
扩展思考
本指南重点介绍了如何使用 AWS Bedrock 和 LangChain 的 ChatBedrockConverse 整合实现扩展思考。
支持的模型
以下 Claude 模型在 AWS Bedrock 上支持扩展思考:
| 模型 | 模型 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': '用户希望我将“我热爱编程”从英语翻译成法语。\n\n“我热爱”在法语中翻译为“J\'aime”。\n“编程”在法语中翻译为“la programmation”。\n\n因此完整的翻译是“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", "我热爱 AI")]
ai_msg = llm.invoke(next_messages)
ai_msg.content_blocks
[{'type': 'reasoning',
'reasoning': '用户希望我将“我热爱 AI”从英语翻译成法语。 \n\n“我热爱”在法语中翻译为“J\'aime”。\n“AI”代表“人工智能”,在法语中是“Intelligence Artificielle”或“IA”(法语缩写)。\n\n因此翻译应该是“J\'aime l\'IA”或“J\'aime l\'intelligence artificielle”。\n\n我认为使用缩写“IA”会更自然和简洁,类似于用户在英语中使用的“AI”。',
'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 键标记其关联的内容块。请参阅以下示例:
import requests
from langchain_aws import ChatBedrockConverse
llm = ChatBedrockConverse(model="us.anthropic.claude-sonnet-4")
# 拉取 LangChain 读 me
get_response = requests.get(
"https://raw.githubusercontent.com/langchain-ai/langchain/master/README.md"
)
readme = get_response.text
messages = [
{
"role": "user",
"content": [
{"type": "text", "text": "根据其读 me 什么是 LangChain?"},
{"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"第一次调用:\n{usage_1}")
print(f"\n第二次:\n{usage_2}")
第一次调用:
{'cache_creation': 1528, 'cache_read': 0}
第二次:
{'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}, # [!代码高亮]
},
}
response = llm.invoke(
[
{
"role": "user",
"content": [
{"type": "text", "text": "描述此文档。"},
document,
]
},
]
)
response.content_blocks
ChatAnthropicBedrock
对于特别关注 Anthropic 模型的 AWS Bedrock 用户,langchain-aws 提供了 ChatAnthropicBedrock。该类扩展了 ChatAnthropic 并提供了相同的接口,在 AWS Bedrock 基础设施上运行。这利用了 Anthropic SDK 的 Bedrock 客户端。
使用 langchain-aws 附加组件安装所需的依赖项:
pip install --upgrade "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 自动发现:
# 设置环境变量
# 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 参考。
通过 MCP 将这些文档与 Claude、VSCode 等连接,实时获取答案。