Anthropic API 和 Python SDK 非常可靠,但它们确实存在一些限制,这可能会使某些任务变得具有挑战性,尤其是在撰写本文时。还有一条使用 Anthropic 模型的替代途径 - Amazon Bedrock。Amazon Bedrock 现在提供对 Anthropic 的 Claude 模型的访问权限,包括 Claude 3.5 Sonnet。如果您需要不同的限制,或者您正在与其他 AWS 服务集成,那么将现有的 Python 代码从使用 Anthropic API 迁移到 Amazon Bedrock API 可能是有意义的。本指南将引导您完成代码迁移。它假设您已经熟悉 Anthropic 和 AWS 身份验证。
我决定不深入研究每分钟请求数、每分钟令牌数、每天令牌数、API 成本等方面的差异,因为这些差异经常变化,解释所有这些差异需要大量的文字。请做好研究,确保这是适合您的正确方法。就我个人而言,当我要求 Claude 提供数千张图像的描述时,我遇到了 Anthropic API 的每天令牌数限制。切换到 Bedrock 让我能够在一次运行中完成此任务。
1.安装所需的库
首先,确保您已经安装了必要的库:
pip install anthropic boto3
2. 导入库并设置客户端
使用 AWS SDK for Python (Boto3) 替换您的 Anthropic 导入:
# Old Anthropic import
# from anthropic import Anthropic
# New Amazon Bedrock import
import boto3
import json
然后,设置 Amazon Bedrock 客户端:
# Old Anthropic client setup
# anthropic = Anthropic(api_key="your-api-key")
# New Amazon Bedrock client setup
bedrock_runtime = boto3.client(
service_name='bedrock-runtime', # see sample code below for how I used Claude 3.5 Sonnet model
region_name='your-aws-region' # check docs - not all models are available in all regions
)
3. 构建请求 冷库www.cqzlsb.com
Amazon Bedrock 的请求结构与 Anthropic 的 API 不同。以下是如何调整您的代码:
# Old Anthropic request
# response = anthropic.messages.create(
# model="claude-3-sonnet-20240229",
# max_tokens=300,
# temperature=0.7,
# messages=[
# {"role": "user", "content": "Your message here"}
# ]
# )
# New Amazon Bedrock request
request_body = json.dumps({
"anthropic_version": "bedrock-2023-05-31",
"max_tokens": 300,
"temperature": 0.7,
"messages": [
{"role": "user", "content": "Your message here"}
]
})
4.发送请求并处理响应
现在,让我们发送请求并处理响应:
# Send request to Amazon Bedrock
response = bedrock_runtime.invoke_model(
modelId='anthropic.claude-3-5-sonnet-20240620-v1:0',
body=request_body
)
# Parse the response
response_body = json.loads(response['body'].read())
generated_text = response_body['content'][0]['text']
print(generated_text)
5.错误处理
调整错误处理以适应 Amazon Bedrock:
from botocore.exceptions import ClientError
try:
response = bedrock_runtime.invoke_model(
modelId='anthropic.claude-3-5-sonnet-20240620-v1:0',
body=request_body
)
# Process response as shown above
except ClientError as e:
print(f"An error occurred: {e.response['Error']['Message']}")
6. 需要注意的主要差异
-
身份验证:Amazon Bedrock 使用 AWS 凭证而不是 API 密钥。
-
请求结构:Amazon Bedrock 要求请求正文为 JSON 字符串。
-
模型规范:模型在调用
modelId
中被指定为参数invoke_model()
。 -
响应解析:需要从 JSON 结构解析来自 Amazon Bedrock 的响应。
-
错误处理:使用 boto3
ClientError
捕获 AWS 特定的异常。
7. Amazon Bedrock 设置的重要注意事项
-
确保您的 AWS 凭证具有访问 Bedrock 服务所需的权限。
-
检查 Claude 3.5 Sonnet 模型(anthropic.claude-3-5-sonnet-20240620-v1:0)是否在您选择的 AWS 区域中可用(截至撰写本文时,仅在少数几个区域中可用)。
-
验证您的 AWS 账户是否已获得 Claude 3.5 Sonnet 模型的访问权限。如果没有,您只需通过控制台请求访问权限,几分钟后即可获得访问权限。
-
请求体中的参数
anthropic_version
可能需要根据最新的 Bedrock API 版本进行更新。
8. 让一切运转起来
一个简单的 Anthropic API 示例:
from anthropic import Anthropic
import os
# Set up the Anthropic client
anthropic = Anthropic(api_key=os.environ.get("ANTHROPIC_API_KEY"))
# Define the message
message = "What's the difference between Amazon Aurora and RDS?"
# Send the request to Claude 3.5 Sonnet using the Messages API
response = anthropic.messages.create(
model="claude-3-sonnet-20240229",
max_tokens=300,
temperature=0.7,
messages=[
{"role": "user", "content": message}
]
)
# Print the response
print(response.content[0].text)
转换为使用 Amazon Bedrock 运行
import boto3
import json
import os
from botocore.exceptions import ClientError
# Set up the Amazon Bedrock client
bedrock_runtime = boto3.client(
service_name='bedrock-runtime',
region_name='us-east-1', # Replace with your AWS region
aws_access_key_id=os.environ.get("AWS_ACCESS_KEY_ID"),
aws_secret_access_key=os.environ.get("AWS_SECRET_ACCESS_KEY")
)
# Define the message
message = "What's the difference between Amazon Aurora and RDS?"
# Prepare the request body
request_body = json.dumps({
"anthropic_version": "bedrock-2023-05-31",
"max_tokens": 300,
"temperature": 0.7,
"messages": [
{"role": "user", "content": message}
]
})
# Specify the Claude 3.5 Sonnet model ID
model_id = 'anthropic.claude-3-5-sonnet-20240620-v1:0'
try:
print(f"Invoking model: {model_id}")
response = bedrock_runtime.invoke_model(
modelId=model_id,
body=request_body
)
# Parse and print the response
response_body = json.loads(response['body'].read())
print("Response:", response_body['content'][0]['text'])
except ClientError as e:
error_code = e.response['Error']['Code']
error_message = e.response['Error']['Message']
print(f"Error: {error_code} - {error_message}")
except Exception as e:
print(f"Unexpected error: {str(e)}")
# Print debugging information
print("\nDebugging Information:")
print(f"AWS Region: {bedrock_runtime.meta.region_name}")
print(f"Model used: {model_id}")
print("Please ensure you have the correct permissions and that this model is available in your region.")
替代方案:利用 Claude 进行代码转换
虽然手动将代码从 Anthropic API 转换为 Amazon Bedrock 有助于理解两种服务之间的差异,但还有另一种方法可以节省时间并可能捕捉到您可能错过的细微差别:使用 Claude 3.5 Sonnet 本身来协助转换过程。我能够做到这一点,但我确实需要与 Claude 3.5 Sonnet 进行一些“来回”操作才能获得有效的代码。即使面临一些小挑战,它仍然节省了我的时间!
你可以通过以下方式利用 Claude 的功能:
-
准备现有代码:收集要转换的 Anthropic API 代码。确保其注释良好且包含任何相关上下文。
-
制定明确的请求:要求 Claude 转换您的代码,并提供具体说明。例如:“请将以下使用 Claude 3.5 Sonnet 的 Anthropic API 的 Python 代码转换为使用 Amazon Bedrock。保留相同的功能并包含错误处理。以下是代码:[在此处粘贴您的代码]”
-
审查和改进:检查 Claude 提供的转换后的代码。它可能会捕捉到 API 差异中不太明显的细微差别。如果需要,请要求澄清或修改。
-
必要时进行迭代:如果转换后的代码不太正确,请向 Claude 提供反馈并要求进行调整。例如:“转换看起来不错,但您能否为特定于 AWS 的异常添加更强大的错误处理?”。
-
彻底测试:对转换满意后,彻底测试新的 Amazon Bedrock 代码,以确保它保留原始实现的功能。
这种方法在以下情况下尤其有益:
-
您正在转换大量代码
-
您不熟悉 Amazon Bedrock API 的复杂性
-
您希望确保遵循 Amazon Bedrock 集成的最佳实践
如果说我从使用 Claude 3.5 和其他 LLM 编写代码中学到了一件事的话——始终在自己的环境中检查和测试转换后的代码。
2024 年 8 月 19 日更新- 一位读者向我指出,Anthropic API 也提供了通往 Bedrock 的路径!根据您的需要,这可能是一条更简单的路径。查看 - Amazon Bedrock API - Anthropic