亚马逊AWS官方博客

Bedrock 多模型接入 – Bedrock Connector 部署与使用指南

在 Claude 3 发布之后,其强大的多模态推理、视觉能力、翻译、总结、写作、编码等能力,再次激发生成式 AI 的热潮。Amazon Bedrock 也是首个 Claude 3 全托管且正式可用的服务。

伴随越来越多的业务场景落地,我们也收集了很多针对 Bedrock Claude 3 的需求和反馈。
我们开发了 Bedrock Connector 并开源,供大家测试使用,和代码参考。

Bedrock Connector 主要解决以下几个需求:

  • 多租户管理,通过 API_KEY & Host 方式使用 Claude
  • 针对多租户的计费,和费用限额,预充值管理
  • 兼容更多的客户端工具的访问方式,如以下常见客户端
    • ChatHub
    • AIChatOne
    • OpenAI Translator
    • siders

1. Bedrock Connector 部署架构介绍

Bedrock Connector 通过 Docker Image 的方式提供。

生产环境中,根据业务和架构情况,有三种建议到部署方式:

  1. 部署在 Amazon Elastic Kubernetes Service(Amazon EKS)
  2. 部署在 Amazon Elastic Container Service(Amazon ECS)
  3. 通过 Lambda + Lambda Function URL 部署

以上三种方式,都是从 Amazon Elastic Container Registry(Amazon ECR)拉取 Image。客户端可以通过 API_KEY & Host 访问,Aurora 用来存储 API_KEY 信息,费用信息等。

在介绍完 Bedrock Connector 架构之后,我们开始逐步介绍部署步骤。本文使用 Amazon ECS 进行部署演示。

2. 环境准备

部署资源列表:

  • Aurora Postgresql Serverless V2:存储 Bedrock Connector 数据
  • ECR:存储Docker Image
  • ECS+Fargate:运行 Bedrock Connector
  • Cloudfront:Bedrock Connector 的 HTTP/HTTPS 接入点

2.1 创建数据库环境

Bedrock Connector 使用 Amazon Aurora PostgreSQL Serverless 作为数据存储。它会根据应用程序的需求自动启动、关闭以及扩展或缩减容量。可在云中运行数据库,而无需管理任何数据库实例。 Amazon Aurora Serverless v2 可在不到一秒钟的时间内立即扩展到能够处理数十万个事务的能力。在扩展过程中,系统会以极为精细的增量调整容量,从而确保恰好提供应用程序所需的数据库资源量。

2.1.1 创建 Aurora Progresql Serverless v2 集群

  1. 登录 AWS Management Console 并通过以下网址打开 Amazon RDS 控制台:https://console.aws.amazon.com/rds/
  2. 在导航窗格中,选择 Databases(数据库)
  3. 选择创建数据库。在显示的页面上,选择以下选项:
  • 对于引擎类型,选择 Aurora(PostgreSQL 兼容)
  • 对于版本,请选择 Aurora Serverless v2 支持的版本之一。
  1. 对于数据库实例类,请选择 Serverless v2。
  2. 对于容量范围,您可以接受默认范围。或者,您可以为最小和最大容量单位选择其他值。您可以从最少 5 个 ACU 到最多 128 个 ACU 中进行选择,增量为 0.5 个 ACU。
  3. 有关 Aurora Serverless v2 容量单位的更多信息,请参阅 Aurora Serverless v2 容量Aurora Serverless v2 的性能和扩缩

2.1.2 使用 RDS Query Editor 执行 SQL

  1. 在导航窗格中,选择 Query Editor(查询编辑器)
  2. 选择要对其运行 SQL 查询的 Aurora 数据库集群。
  3. 对于 Actions(操作),选择 Query(查询)。如果您之前未连接到数据库,则 Connect to database(连接到数据库)页面将打开。
  1. 在 Query Editor 中,创建 Bedrock Connector 使用的数据库
    CREATE DATABASE brconnectordb;

    在 Bedrock Connector 启动过程中,系统会自动检查相关表信息,如果表不存在,会自动创建表。

注意:
如果是使用 RDS PostgreSQL,修参数改 rds.force_ssl = 0,重启 RDS 生效。
RDS PostgreSQL 参数默认值是 rds.force_ssl = 1,Bedrock Connector 未使用 SSL 连接数据库。
而 Aurora PostgreSQL 参数默认值是 rds.force_ssl = 0,无需修改。

3. Bedrock Connector 环境部署

本文使用 Amazon ECS 进行部署演示。下面就会详细介绍镜像拉取、ECR 创建、镜像托管、ECS 环境部署等步骤。

3.1 构建镜像

  1. 下载代码
    git clone https://github.com/aws-samples/sample-connector-for-bedrock.git
  2. 进入目录
    cd sample-connector-for-bedrock/
  3. 构建 connector 和 WebUI 服务。在构建完成之后,connector & WebUI 会分别存在目录 dist/public 和 dist/server 中
    npm run build
    # or
    yarn build
    
  4. 创建 Dockerfile,./Dockerfile 需要创建在代码根目录
    FROM node:20
    
    COPY ./dist /app
    WORKDIR /app
    COPY ./src/scripts/create.sql ./src/scripts/create.sql
    COPY ./package.json .
    
    RUN npm install --omit=dev
    
    HEALTHCHECK --interval=5s --timeout=3s \
      CMD curl -fs http://localhost:8866/ || exit 1
    
    EXPOSE 8866
    
    CMD ["node", "server/index.js"]
    
  5. 执行构建命令
    docker build -t <bedrock-connector-tag> .
  6. 查看镜像
    # docker images
    REPOSITORY          TAG       IMAGE ID       CREATED              SIZE
    bedrock_connector   0.0.1     a6fb8fa533be   About a minute ago   1.31GB
    

至此,Docker Image 已经构建完成。

3.2 使用 ECR 进行镜像管理

Amazon Elastic Container Registry(Amazon ECR)是一个完全托管式容器注册表,可提供高性能托管,因此您可以在任何地方可靠地部署应用程序映像和构件。

开始创建 ECR

  1. 选择 Private,输入 ECR 名称,点击保存
  2. 点击 View push commands
  3. 点击 View push commands,即可获得相关命令
  4. 根据提示即可完成 Image 上传
  5. 命令详情如下:
    获取 ECR 登录 token

    aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin 123456789987.dkr.ecr.us-east-1.amazonaws.com

    给 image 打标签

     docker tag bedrock_connector:0.0.1 123456789987.dkr.ecr.us-east-1.amazonaws.com/bedrock_connector:latest

    上传 image

    docker push 123456789987.dkr.ecr.us-east-1.amazonaws.com/bedrock_connector:latest
  6. 上传完成后,可以在 ECR 中查看到 image

3.3 创建 ECS + Fargate

Amazon Elastic Container Service(Amazon ECS)是一项完全托管式容器编排服务,可帮助您更有效地部署、管理和扩展容器化应用程序。它与 AWS 环境深度集成,为使用 Amazon ECS Anywhere 在云端和本地运行容器工作负载提供易于使用的解决方案,并具有高级安全特征。

3.3.1 创建任务定义

任务定义类似于应用程序的蓝图。每次在 Amazon ECS 中启动任务时,您都指定任务定义。这样,服务知道要用于容器的 Docker 映像、任务中要使用的容器数量以及为每个容器分配的资源。

  1. 在导航窗格中,选择 Task Definitions
  2. 选择 Create new Task Definition(创建新的任务定义) ,并参考下图完成设置。注意: Task Role 需要赋予访问 Bedrock Claude 3 的权限。
  1. 输入服务端口,Bedrock connector 通过 8866 对外提供服务访问。
  2. 设置环境变量,在 ECS 服务启动时,会将以下参数传入容器内。

3.3.2 创建 Service(服务)

  1. 使用刚刚生成的 Task Definition,创建 Service(服务)。
  2. 在 Load balancing 选项中,输入提前准备好的 Network Load Balance”ecs-brconnector”,并设置 Listener 信息。
  3. Network Load Balance 信息如下:

    注意:NLB 要作为 Cloudfront 的源,所以 NLB 安全组的 Inbound Rule 要允许 Cloudfront prefix list 访问 80 端口 com.amazonaws.global.cloudfront.origin-facing。

3.4 Cloudfront 的设置

在完成以上配置之后,通过 NLB 的 DNS name 已经可以通过 HTTP 方式访问 Bedrock Connector 了。那为什么我们要配置 Cloudfront 呢?因为部分 Client 使用 HTTPS 的方式访问,需要 Cloudfront 来接收 HTTPS 的请求。根据最佳实践,使用 Cloudfront,会有更多收益。

 如果您要直接从 Amazon Elastic Load Balancer(ELB)或 Amazon EC2 实例向 Internet 上的最终用户提供动态内容(例如 Web 应用程序或 API),则可以使用 Amazon CloudFront 作为内容分发网络来提高内容的性能、可用性和安全性。借助 Amazon CloudFront,最终用户连接将在距离他们更近的 CloudFront 站点终止,这有助于减少建立连接所需的总体往返时间。这些 CloudFront 站点与具有高度弹性的 Amazon 主干网络相连,后者可以提供卓越的性能和可用性,以便连接到 AWS 源。

3.4.1 创建分配步骤

  1. 登录 AWS Management Console 并打开 CloudFront 控制台,网址为 https://console.aws.amazon.com/cloudfront/v4/home
  2. 在导航窗格中,选择分配,然后选择创建分配
  3. 指定分配的设置。有关更多信息,请参阅您创建或更新分配时指定的值
  4. 保存您的更改。
  5. CloudFront 创建分配后,分配的 “状态” 列的值将从 InProgress 变为 “已部署”。如果您选择启用该分配,其状态变为已部署后就已就绪,可以处理请求了。

3.4.2 重点设置信息

  1. origin设置
  2. Behaviors 设置
  3. Cache Policies 设置
  • TTL 时间设置
  • Headers 设置

在 Cloudfront 状态可用之后,整个 Bedrock Connector 环境就已经部署完成。接下来我们进入客户端使用测试环节。

4. 客户端配置使用

4.1 添加用户

  1. 创建管理员 API KEY(修改 name 和 email)
    第一个用户需要通过 API 创建,不可以通过控制台创建。创建一个 admin 用户:

    curl https://<Distribution>.cloudfront.net/admin/api-key/apply \
      -H "Content-Type: application/json" \
      -H "Authorization: Bearer br_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
      -d '{
      "name": "yourmail",
      "group_id": 1,
      "role": "admin",
      "email": "yourmail@amazon.com",
      "month_quota": 1.00
    }'
    

    输出:

    {"success":true,"data":{"id":1,"name":"yourmail","email":"yourmail@amazon.com","api_key":"br-w3MF8z6WQYAtbbMhhN2a0Hp9LoZzm","role":"admin","month_quota":"1.0000000000","balance":"0.0000000000"}}
  2. 查看用户信息:
    curl "https://<Distribution>.cloudfront.net/admin/api-key/list?q=yourmail" \
      -H "Authorization: Bearer br_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
    

    输出:

    {"success":true,"data":{"items":[{"id":1,"group_id":1,"api_key":"br-w3MF8z6WQYAtbbMhhN2a0Hp9LoZzm","name":"yourmail","email":"yourmail@amazon.com","role":"admin","total_fee":"0.0000000000","balance":"0.0000000000","month_fee":"0.0000000000","month_quota":"1.0000000000","created_at":"2024-04-12T15:54:28.967Z","updated_at":"2024-04-12T15:54:28.967Z"}],"total":"1","limit":20,"offset":0}}
  3. 通过 API 再创建两个 user key
    curl https://<Distribution>.cloudfront.net/admin/api-key/apply \
      -H "Content-Type: application/json" \
      -H "Authorization: Bearer br_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
      -d '{
      "name": "user1",
      "group_id": 1,
      "role": "user",
      "email": "yourmail@amazon.com",
      "month_quota": 1.00
    }'
    
    
    curl https://<Distribution>.cloudfront.net/admin/api-key/apply \
      -H "Content-Type: application/json" \
      -H "Authorization: Bearer br_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
      -d '{
      "name": "user2",
      "group_id": 1,
      "role": "user",
      "email": "yourmail@amazon.com",
      "month_quota": 1.00
    }'
    
  4. 通过命令行测试 Bedrock Claude 3
     curl https://<Distribution>.cloudfront.net/v1/chat/completions \
              -H "Content-Type: application/json" \
              -H "Authorization: Bearer br-fC9fVwOgUsIZnFqfkfHduXRmvRFGA" \
              -d '{
              "model": "claude-3-sonnet",
              "messages": [
                {
                  "role": "user",
                  "content": "你好"
                }
              ],
              "stream": false,
              "temperature": 1,
              "max_tokens": 4096
            }'
    
  5. 现在你已经可以正常访问 Bedrock Claude 3,测试如下:
    {"choices":[{"message":{"content":"你好,很高兴和你交谈。作为一个人工智能助手,我会尽我所能为你提供帮助和回答你的问题。如果有任何我可以为你做的事情,请随时告诉我。我会耐心地倾听并尽最大努力解答。","role":"assistant"}}],"usage":{"completion_tokens":92,"prompt_tokens":10,"total_tokens":102}}%

4.2 WebUI 服务配置与使用

  1. 管理服务端访问
    https://<Distribution>.cloudfront.net/manager
  2. 输入 Host 和 API Key,即可登录
  3. 费用查询
    可以查询整体费用的统计

    可以查看费用明细

  1. 通过控制台(New 按钮)创建新用户

4.3 Bedrock Client 配置与使用

客户端工具,我们使用 BRClient 进行演示。BRClient(“Bedrock Client”的简称)是开源的桌面应用,为用户提供了友好的图形界面,可以轻松访问和使用 Claude 3 的功能。更多 BRClient 信息,请查询文末参考文档。

打开 Brclient,选择左下角设置按钮

  1. 选择 True
  2. 填入 Cloudfront Distribution
  3. 填入 User API Key
  4. 选择模型

    开启 AI 之旅

    也可以选择对应的“面具”,进行更专业的对话

5. API 使用说明

开发者可以参考以下 API 代码样例,进行应用集成。

5.1 聊天 API

POST /v1/chat/completions
Content-Type: application/json
Authorization: Bearer br_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

{
  "model": "claude-3-sonnet",
  "messages": [
    {
      "role": "user",
      "content": "ping"
    }
  ],
  "stream": true,
  "temperature": 1,
  "max_tokens": 4096
}

5.2 管理端

  1. 创建一个 api key(用户)
    POST /admin/api-key/apply
    Content-Type: application/json
    Authorization: Bearer br_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    
    {
      "name": "jack",
      "group_id": 1,
      "role": "user",
      "email": "",
      "month_quota": 1.00
    }
    
  2. 创建一个 api key(用户),并且有管理员权限
    POST /admin/api-key/apply
    Content-Type: application/json
    Authorization: Bearer br_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    
    {
      "name": "rob",
      "group_id": 1,
      "role": "admin",
      "email": ""
    }
    
  3. 更新 api key 信息
    POST /admin/api-key/update
    Content-Type: application/json
    Authorization: Bearer br_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    
    {
      "id": 2,
      "name": "张三",
      "month_quota": 10.00
    }
    
  4. 给 api key 充值
    POST /admin/api-key/recharge
    Content-Type: application/json
    Authorization: Bearer br_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    
    {
      "api_key": "br-xxxxxxxxxxxxxxx",
      "balance": 0.23
    }
    
  5. 充值历史
    GET /admin/payment/list?key_id=
    Authorization: Bearer br_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    
  6. 列表显示 api key
    GET /admin/api-key/list?q=&limit=10&offset=
    Authorization: Bearer br_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    
  7. 列表显示 会话
    GET /admin/session/list?q=&limit=10&offset=&key_id=
    Authorization: Bearer br_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    
  8. 列表显示 对话
    GET /admin/thread/list?q=&limit=10&offset=&key_id=&session_id=
    Authorization: Bearer br_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    

5.3 User API

  1. 我的会话
    GET /user/session/list?q=&limit=10&offset=
    Authorization: Bearer br_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    
  2. 我的会话详情
    GET /user/session/detail/1
    Authorization: Bearer br_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    
  3. 我的对话列表
    GET /user/thread/list?q=&limit=10&offset=&session_id=
    Authorization: Bearer br_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    
  4. 我的对话详情
    GET /user/thread/detail/1
    Authorization: Bearer br_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    

至此,通过本篇的内容,已经完成了 Bedrock Connector 的部署与使用。快速开启你的 Bedrock Claude 3 之旅吧!

最后,感谢 Bedrock Connector 的开发者们为该项目做出的贡献。

开发者名单(排名不分先后,按姓名拼音字母排序)

  • 郭强
  • 黄俊杰
  • 刘加昌
  • 买乌
  • 粟伟
  • 谢正伟
  • 张孝峰

参考文档:

https://github.com/aws-samples/sample-connector-for-bedrock

https://aws.amazon.com/cn/blogs/china/brclient-user-guide

本篇作者

许晓亮

亚马逊云科技解决方案架构师,负责基于 AWS 云计算方案架构的咨询和设计,在国内推广 AWS 云平台技术和各种解决方案。擅长数据库和大数据领域,结合云原生特性,为客户设计高效稳定的全球化系统方案。

谢正伟

亚马逊云科技资深解决方案架构师,致力于云计算方案架构设计、应用和推广。具有 20 多年 IT 行业工作经验,擅长应用的架构和开发,历任全栈开发工程师,应用架构师,系统架构师等。在加入 AWS 之前,曾服务于优酷,阿里巴巴,腾讯等公司。