Bedrock及最接近GPT的大语言模型Claude开箱 (上篇)

本文介绍了Amazon Bedrock服务的初始化,如何开始使用Claude模型,并讲解了Prompt Engineer调优的最佳实践,以及几个简单场景样例代码。本文分成上下两篇:

一、背景

Amazon Bedrock是托管的大模型服务,可通过API调用来自多家公司的基础模型(Foundation Model, 以下简称FM),包括AI21 Labs、Anthropic、Cohere、Meta、Stability AI以及Amazon等。使用Amazon Bedrock可通过模型微调(Fine-tune)和检索增强生成(Retrieval Augmented Generation,以下简称RAG)等技术实现更好的检索效果。由于Amazon Bedrock是无服务器的,因此您无需管理EC2虚拟机、GPU等基础设施,可使用多种开发语言从应用程序中调用,使用场景包括文本生成、文本摘要、图像生成、对话、虚拟助手、知识库、向量转换等。

在大模型的选择上,除了大家熟知的Meta(Facebook)的Llama2等模型之外,Bedrock提供了来自Anthropic的Claude模型,这是最接近OpenAI ChatGPT的大模型。在2023年9月,Amazon向Anthropic投资40亿美金并且达成合作。

在模型版本选择上,Claude V2.1版本对标GPT 4,Claude Instant对标GPT 3.5, Titan Embeddings G1对标OpenAI的text-embedding-ada-002。他们支持的Token、相应的Cost都是在同等体量。

二、申请模型访问权限并在AWS控制台上使用

1、确认联系信息为海外地址

申请Bedrock服务中的Claude大模型要求必须有AWS海外账户,且账户的联系信息登记的支付信息(Billing Address)等信息都应为海外地址,不能是中国大陆地址。如果之前注册账号的时候,使用了中国大陆地址注册,则可以在账户信息页面编辑修改,使用公司的海外营业机构地址。

从右上角进入自己账户的Billing and Cost Managment界面。

向下移动页面中,找到联系信息,编辑他们,确保使用海外分支机构的地址和联系人。

2、申请模型权限

切换要操作的Region到特定区域,例如本文为us-west-2美西2俄勒冈区域。

接下来进入Bedrock服务界面,可看到其中的模型如果还没申请,状态就是Available to request。点击右上角的Model access按钮,点击右侧的Manage model access按钮发起申请。

推荐申请的模型包括:

  • Claude(对标OpenAI gpt-4-1106-preview4)
  • Claude Instant(对标OpenAI gpt-3.5-turbo-1106)
  • Titan Embeddings G1 – Text 对标OpenAI的text-embedding-ada-002
  • Titan Multimodal Embeddings G1

获得模型许可授权后,可以通过左侧的Playgrounds菜单,进入图形界面测试。点击Select model选择模型。如下截图。

在选择模型的清单中,点击Anthropic公司,选择Claude V2.1,最大允许传入Context是200K的。点击Apply,即可在界面上发起交互。

现在可以在控制台上使用了!

三、配置IAM和AKSK通过代码访问Bedrock API

Bedrock与OpenAI的ChatGPT调用认证方式不同。ChatGPT因为是独立的SaaS服务,其身份认证只依靠HTTPS的Header。Bedrock是属于整个AWS体系中的一个服务,因此其有着标准的Access Key/Secret Key的认证方式。此外,还需要匹配的IAM Policy才可以调用。下面进行配置。

1、创建IAM Policy

进入IAM服务,点击左侧Policy策略菜单,点击右上角创建策略按钮。

在向导第一步,策略编辑器位置,不使用可视化模式,而是点击JSON按钮,直接粘贴策略。如下截图。

策略如下:

{
    "Version": "2012-10-17",
    "Statement": {
        "Sid": "bedrock",
        "Effect": "Allow",
        "Action": [
            "bedrock:InvokeModel",
            "bedrock:InvokeModelWithResponseStream"
        ],
        "Resource": "arn:aws:bedrock:*::foundation-model/*"
    }
}

点击下一步继续,在策略名称位置,输入名称bedrock-runtime,记住这个名称,稍后将会使用。如下截图。

创建策略完成。

2、创建IAM用户并绑定IAM Policy

进入IAM服务,点击左侧菜单Users用户,点击右上角新建User按钮。如下截图。

在新建用户的向导中,为用户起名叫做bedrock-runtime,不需要选中向用户提供 AWS 管理控制台的访问权限,因为是API调用,不需要登录AWS控制台,所以不需要给这个权限。然后点击下一步继续,。如下截图。

在设置权限界面,点击右侧直接附加策略按钮,然后在下方权限策略的搜索框中,输入上一步创建的Policy名叫bedrock-runtime,下方即可过滤出来。选中这个策略,点击下一步继续。如下截图。

创建用户完成。

3、为用户创建AKSK

接下来为用户创建AKSK密钥。从IAM用户中,找到刚才的用户,点击安全凭证标签页。如下截图。

在安全凭证标签页中,将页面向下移动,来到创建访问密钥部分。点击创建访问密钥。如下截图。

选择使用场景是命令行界面(CLI),并点击下方的确认,我理解上述建议,并希望继续创建访问密钥。然后点击右下角的下一步按钮。如下截图。

输入密钥的标签,例如取名bedrock-runtime。点击右下角的创建访问密钥按钮。如下截图。

创建密钥完成。请注意,密钥只显示一次,如果没有复制下来,或者没有下载CSV文件,则密钥不再显示,只能重新生成一个新的密钥。如下截图。

点击已完成按钮完成密钥创建。

四、测试API调用

调用Bedrock使用的Access Key/Secret Key是与调用其他AWS服务的认证通用的,因此其配置过程可通过安装AWSCLI进行快速配置,也可以手工配置让各种编程语言的SDK识别到这个Key。

从安全角度考虑,不推荐在代码中硬编码写入密钥,推荐将密钥配置在本机的home目录下。

1、通过AWSCLI安装配置密钥(可选)

下载AWSCLI,并安装。

安装后运行aws configure,依次输入Access Key,Secret Key,调用的Region(本次实验为us-west-2),最后一步默认输出格式,填写JSON即可。

2、手工配置Access Key/Secret Key

如果上一步通过AWSCLI配置好了密钥,那么本步骤可以跳过。

(1) Linux系统

Linux系统放置AKSK到Home目录下特定位置

创建~/.aws/credentials文件,内容如下:

[default]
aws_access_key_id = YOUR_ACCESS_KEY
aws_secret_access_key = YOUR_SECRET_KEY

创建~/.aws/config文件,请注意使用特定的Region,例如文本前边步骤申请Model Access时候,选择的是us-west-2区域。内容如下:

[default]
region=us-west-2

保存退出。

(2) Windows系统

创建C:\Users\%USERNAME%\.aws\credentials文件。其中%USERNAME%是当前Windows使用的用户名,另外.aws目录是开头带有一个圆点表示隐藏目录。内容如下:

[default]
aws_access_key_id = YOUR_ACCESS_KEY
aws_secret_access_key = YOUR_SECRET_KEY

创建C:\Users\%USERNAME%\.aws\config文件。其中%USERNAME%是当前Windows使用的用户名,另外.aws目录是开头带有一个圆点表示隐藏目录。请注意使用特定的Region,例如文本前边步骤申请Model Access时候,选择的是us-west-2区域。内容如下:

[default]
region=us-west-2

保存退出。

3、安装对应语言的SDK(以Python为例)

pip install boto3 json

4、测试代码

准备如下测试代码:

import boto3
import json

session = boto3.Session(
    region_name="us-west-2"
    )
brt = session.client('bedrock-runtime')

prompt_data = '\n\nHuman: Write an email from Bob, Customer Service Manager, to the customer "John Doe" who provided negative feedback on the service provided by our customer support engineer\n\nAssistant: Here is a draft:\n'

body = json.dumps({"prompt": prompt_data, 'max_tokens_to_sample': 4000 })
response = brt.invoke_model_with_response_stream(
    modelId='anthropic.claude-instant-v1',
    body=body
)

stream = response.get('body')

i=1
output = []
if stream:
    for event in stream:
        chunk = event.get('chunk')
        if chunk:
            chunk_obj = json.loads(chunk.get('bytes').decode()) #print(f'{chunk_obj}')
            text = chunk_obj['completion']
            output.append(text)
            #print(f'\t\t\x1b[31m**Chunk {i}**\x1b[0m\n{text}\n')
            print(f'{text}') 
            i+=1

如果是没有配置上述的home目录下的密钥,那么可以在代码中硬编码写入密钥,只是这种方式存在安全隐患,不推荐使用。代码中硬编码写入密钥的方法如下:

session = boto3.Session(
    aws_access_key_id="xxxxxxxxxxxxxxx",
    aws_secret_access_key="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
    region_name="us-west-2"
    )

执行后,即可看到正常的输出,是以客户服务经理Bob的身份写给客户John Doe的关于差评的一封道歉信。


五、Claude Prompt Engineering 调优

请参考本文下篇。点击这里跳转。