本文介绍了如何使用Bedrock Access Gateway实现代码完全兼容的方式从OpenAI ChatGPT切换到Anthropic Claude3 完成模型调用。
一、背景
OpenAI的ChatGPT和Amazon Bedrock上调用模型的API有所不同。针对已经在使用ChatGPT的场景,如果需要切换流量到Bedrock上访问Claude模型,那么需要改动API接口的代码,引入新的依赖包,并按照Bedrock和Claude3的要求去构建访问请求。同时,在身份认证场景上,OpenAI是单一的API Key认证,而Amazon Bedrock是标准的AWS服务,需要Access Key和Secret Key(AKSK)两个字符串进行身份认证。
基于以上不同,要将使用OpenAI的ChatGPT模型的代码切换为调用Amazon Bedrock上Claude模型的代码,是需要代码改动的。为了简化这个流量切换过程,让现有ChatGPT的代码可以快速的调用Bedrock上的Claude3模型,可以部署本方案。源代码在Github上这里。
本方案Bedrock Access Gateway是AWS中国区团队开发的一个Proxy性质的小工具,通过CloudFormation一键部署。它在AWS云上部署了一个由ALB承载的流量入口,并且将收到的OpenAI格式的请求通过Lambda函数格式转换进行处理,并把转换后的请求发送给Bedrock服务上的Claude3模型。对用户而言,只需要在现有OpenAI代码基础上,替换原OpenAI的API Key为新的Bedrock Access Gateway设置的API Key,且配置API地址为AWS一侧的地址,即可实现近乎“无缝”的切换。
Bedrock Access Gateway的架构如下图(引自官方Github)。
现在开始Bedrock Access Gateway整个方案的配置。
二、配置访问密钥并安装
1、配置访问密钥
Bedrock Access Gateway使用和OpenAI相似的单一API Key来进行身份验证。这个API不需要明文写在ALB配置或者Lambda函数中,而是设置在System Manager服务的Parameter Store服务中作为密钥保存,便于统一轮换。现在来设置这个密钥。
进入AWS控制台,搜索System Manager
服务,并点击进入。如下截图。
在System Manager控制台上,从左侧菜单中找到Parameter Store
服务,点击右上角 Create parameter
按钮。如下截图。
在创建新参数界面,输入名称为bedrock-access-gateway-api-key
,选择Tier级别为Standard
。然后继续向下滚动屏幕。如下截图。
在类型位置,选择SecureString
安全字符串。在KMS位置选择默认的My current account
。在KMS Key ID中选择默认的。然后继续向下滚动屏幕。如下截图。
在Value
值部分,输入要使用的密钥,建议使用24位以上字符串,数字和英文大小写混合。最后点击创建按钮,完成创建。如下截图。
创建密钥完成。
请保存好这一密钥,接下来会代入代码。
2、通过CloudFormation部署Bedrock Access Gateway
先登录到要部署的Region的AWS控制台,例如本文是美西2俄勒冈区域,进去CloudFormation服务。
进入Github的Readme页面,从中找到CloudFormation的链接,以比较轻量的Lambda方案为例,点击按钮启动模版。如下截图。
页面跳转到CloudFormation模版后,在Prepare template
位置,选择Choose an existing template
选择已经存在的模版。此时页面下方的Template source
和Amazon S3 URL
应该已经自动带出了模版的URL,这个地址是从Github上跳转过来自动代入的,因此无需修改。点击下一步继续。如下截图。
在向导第二步,堆栈名称位置,使用默认值即可。在参数Parameters
中ApiKeyParam
位置,输入上一步在System Manager中设置的密钥的名称bedrock-access-gateway-api-key
,然后点击下一步继续。如下截图。
在向导第三步页面中,保持所有值为默认,滚动到页面最下方,点击下一步。如下截图。
在向导最后一步页面中,保持所有值为默认,滚动到页面最下方,然后选中所有确认按钮。点击创建按钮。如下截图。
现在需要等待3-5分钟,直到创建完成。
3、获得Gateway的请求入口
进入上一步的CloudFormation堆栈,找到新创建的堆栈,确认其状态为创建完成。点击Output标签页,查看其中的参数。如下截图。
此处的ALB地址,就是代码要调用的入口,且这个地址已经和刚才预先配置的API密钥做了集成,只有密钥正确才可以访问。将这个地址复制下来,后续代码中要使用。
三、设置API参数让OpenAI的调用改为访问Bedrock
以Python代码调用OpenAI为例,一般会直接Import OpenAI的依赖库,然后配置OpenAI密钥,即可访问。当切换到Bedrock时候,密钥需要被替换为上文部署Bedrock Access Gateway时候设置的密钥,此外,调用Open服务器的地址也需要替换。
1、通过环境变量设置密钥和访问接口地址(推荐)
为了安全,OpenAI的密钥一般放在环境变量中,而不是在代码中显式声明。否则,当代码被上传到代码仓库之后,将会导致所有能访问代码仓库的人都能看到你的密钥,这样会造成密钥泄漏。
除了密钥之外,请求地址也可以放在环境变量中。以如下一段调用OpenAI ChatGPT的代码为例。
from openai import OpenAI
client = OpenAI()
completion = client.chat.completions.create(
model="gpt-3.5-turbo",
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "你是什么模型?"}
]
)
print(completion.choices[0].message)
现在更换其中的model
为Bedrock上Claude3的model。代码如下:
from openai import OpenAI
client = OpenAI()
completion = client.chat.completions.create(
model="anthropic.claude-3-sonnet-20240229-v1:0",
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "你是什么模型?"}
]
)
print(completion.choices[0].message)
设置环境变量如下:
export OPENAI_API_KEY=1qazxsw23edcvfr4
export OPENAI_BASE_URL=http://Bedroc-Proxy-xYrsBbLZWYcw-751203243.us-west-2.elb.amazonaws.com/api/v1
然后在运行代码,即可看到代码链接的是Bedrock上的Claude,也输出了对应的内容。如下截图。
2、通过在代码中显式声明的方式设置密钥和访问地址(不推荐)
本方式会在代码中显式声明密钥和访问地址,由于代码被上传到代码仓库后,会导致密钥被所有人看到,因此不推荐这样使用。本方法仅用于开发调试。另外,以Python代码为例,要求OpenAI>1.19.0。
代码如下。
from openai import OpenAI
client = OpenAI(
api_key="1qaz3edc4rfv7ujm",
base_url="http://Bedroc-Proxy-hDrxB018jpV2-39533929.us-west-2.elb.amazonaws.com/api/v1"
)
completion = client.chat.completions.create(
model="anthropic.claude-3-sonnet-20240229-v1:0",
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "你是什么模型?"}
]
)
print(completion.choices[0].message)
运行正常,如下截图。
至此确认Bedrock Access Gateway工作正常。
四、参考资料
Bedrock Access Gateway@Github 中文介绍
https://github.com/aws-samples/bedrock-access-gateway/blob/main/README_CN.md