亚马逊AWS官方博客

基于 Amazon Bedrock 自建 GenAI 平台(模型、对话、知识库、翻译)

Amazon Bedrock 是一项完全托管的服务,提供了来自领先 AI 公司(如 AI21 Labs、Anthropic、Cohere、Meta、Stability AI 和亚马逊)的高性能基础模型(FM)选择,以及构建生成式 AI 应用所需的广泛功能,包括安全、隐私和负责任的 AI。使用亚马逊 Bedrock,您可以轻松地尝试和评估适用于您的用例的顶级 FM,使用微调和检索增强生成(RAG)等技术私有化定制它们,并构建使用企业系统和数据源执行任务的代理。

由于亚马逊 Bedrock 是无服务器的,您无需管理任何基础架构,可以使用您已经熟悉的 AWS 服务将生成式 AI 能力安全地集成和部署到您的应用程序中。

GenAI Bedrock Builder 是基于 Amazon Bedrock 服务开发的生成式 AI 解决方案,可以帮助快速自建无服务的生成式 AI 解决方案,并应用到业务生产应用中。

方案特点:

  1. 基于云原生开发,贴合业务场景;
  1. 一键部署,操作简单;
  1. 独立用户认证,并方便集成内外部用户认证协议;
  1. 无服务器进行开发和调度,按需计费;
  1. 方便进行二次开发,扩展更多可能;

(提醒:此解决方案仅用于 PoC,不代表亚马逊云科技官方提供的代码)

1. 方案架构及流程

1.1 数据流程

  1. 当用户在浏览器客户端发起访问请求,经过 CloudFront 缓存并回源 S3 获取网站静态资源;
  1. 用户在网页端登录,通过 SDK 请求 Cognito 获取登录认证授权 jwt token 信息;
  1. 当用户登录后需要在前端页面根据业务需要请求相关功能时,首先调用 Lambda Function Url 进行相关请求的签名,携带 JWT Token 信息验证用户权限并获得签名后的请求 header 信息;
  1. 根据业务需要,使用签名后的 header 请求相关服务的 Lambda Function URL(Model 对话、Agent 对话、翻译、知识库等);
  1. Lambda Function 根据需要使用 Bedrock SDK 请求 Bedrock 的相关功能;
  1. 请求结果上下文记录到 DynamoDB 的 Table 中;

1.2 技术架构介绍

前端页面相关的 AWS 服务:

  1. CloudFront:CDN
  1. S3:静态资源存储
  1. Cognito:用户池用于登录认证

后端接口相关的 AWS 服务:

  1. Lambda Function:后端逻辑代码
    以下列出了常用的核心函数信息:
    GenAIBuilderSecuritySignFunction:获取请求签名函数
    GenAIBuilderRecordsListFunction:获取操作记录函数
    GenAIBuilderS3PresignFunction:知识库上传 S3 预签名函数
    GenAIBuilderKBInvokeFunction:查询知识库函数
    GenAIBuilderModelInvokeFunction:调用模型对话函数
    GenAIBuilderKBIngestFunction:上传文档后同步知识库函数
    GenAIBuilderAgentInvokeFunction:调用 Bedrock Agent 对话函数
    GenAIBuilderKBListFunction:获取知识库列表函数
    GenAIBuilderS3QueryFunction:上传文档到知识库时查询 S3 内容函数
  1. Bedrock Model:Claude 等模型调用
  1. Bedrock Agent:模型代理服务,用于会话、自定义逻辑等场景;
  1. Bedrock Knowledge base:知识库
  1. OpenSearch Serverless:存储知识库相关的向量数据
  1. S3:存储知识库相关的文件源数据
  1. IAM:服务权限管理

开发框架

  1. 前端:Cloudscape + React JS
  1. 后端:Node JS + AWS SDK
  1. 自动部署:AWS CDK + TypeScript

2. 方案部署

2.1 环境准备

  1. EC2:用于运行部署代码执行部署操作
    • AMI:Amazon Linux 2023 x86
    • 实例类型:≥ T3.large
    • EBS:≥ 10GB
    • 网络:使用 SSH 进行公共访问
  1. 准备 AWS IAM User 及 Credentials 信息为了测试部署顺利,这里我们需要创建一个用户具有 AdministratorAccess 策略,并创建 Secret Credentials 信息,保存 Access key 和 Secret key。参考:管理访问密钥(控制台)
  2. 登录 EC2 并初始化系统环境,升级 AWS CLIhttps://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html如果您使用的是 Linux x86,可以使用以下脚本进行升级,确保您的 AWS CLI 版本 ≥ 2.15.4
    sudo yum update -y
    
    curl "<https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip>" -o "awscliv2.zip"
    
    unzip awscliv2.zip
    
    sudo ./aws/install --bin-dir /usr/local/bin --install-dir /usr/local/aws-cli --update
  3. 安装依赖组件需要按照的组件有:
    • nvm ≥ 0.39.3
    • nodejs ≥ 18.19.0
    • npm ≥ 10.2.5
      • typescript
      • aws-cdk

    确保您的 CDK 版本 >= 2.116.1 和 npm 版本 >= 10.2.5

    curl -o- <https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.5/install.sh> | bash
    . ~/.nvm/nvm.sh
    nvm install v18.19.0
    
    sudo yum install nodejs npm -y
    
    curl -qL <https://www.npmjs.com/install.sh> | sh
    sudo npm install -g typescript -y
    sudo npm install -g aws-cdk -y
    cdk --version
    npm --version
    
    sudo yum install pip -y
    pip install awscurl
    awscurl
  4. 配置 AWS CLI(使用 2.1.2 中创建的密钥,区域建议使用 us-east-1)
    aws configure

    2.2 执行部署

    2.2.1 从 Github 获取最新的源代码

    sudo yum install git -y
    git clone <https://github.com/cloudswb/aws-genai-bedrock-builder.git>

    2.2.2 初始化部署配置参数

    我们可以自定义项目名称前缀,该前缀将添加到 CDK 堆栈和 Lambda 函数名称中。

    cd aws-genai-bedrock-builder/
    vim bin/config.ts

    现在,您可以根据以下注释修改此配置文件:

    export const Config = {
        DomainName: 'xxx.com', // 域名(非真实解析,主要用于存储桶;将与<SiteSubDomain>组合以创建类似于:<SiteSubDomain>.<DomainName>的S3存储桶名称)
        SiteSubDomain: 'genai-dev', // 将与<DomainName>组合以创建类似于:<SiteSubDomain>.<DomainName>的S3存储桶名称
        Region: "us-east-1", // 将部署的目标区域,该区域应具有可用的bedrock\\opensearch无服务器。
        Auth: 'iam', //Auth类型,请勿更改,目前仅支持此IAM Auth类型。
        KBEmbeddingModelName: "amazon.titan-embed-text-v1", //知识库嵌入模型ID
        KBLLMName: "anthropic.claude-v2", // 知识库LLM ID
        AgentLLMName: "anthropic.claude-v2", // Bedrock Agent LLM ID
    }

    2.3 执行部署

    运行以下 shell 脚本以部署所有服务:

    sudo npm install
    chmod +x ./bin/deploy.sh
    ./bin/deploy.sh

    部署完成后,将会打印出 CloudFront 分发信息如下:

    其中:

    1. Site 信息为部署后的 CloudFront 网址,可以直接打开访问(参考章节 3.1 进行添加登录用户);
    1. Bucket 信息为存储静态 web 网页资源的存储桶名称;
    1. DistributionId 为 CloudFront 的 Distribution 信息,在配置自有域名进行解析的时候会用到;

    2.4 配置自有域名(可选)

    您也可以将自己的域名通过 CNAME 的方式解析到上述 CloudFront 的域名。

    如果需要使用 HTTPS 进行访问,则需要将自己的证书上传到 ACM 或者使用 ACM 服务创建 SSL 证书,然后在 CloudFront 的 Distribution 中配置备用域名为您自己的域名并指定 SSL 证书即可使用 HTTPS 方式进行访问。

    3. 使用 Web 系统

    当网站页面被打开后,需要您使用用户信息登录后使用。因为系统默认集成了 Amazon Cognito UserPool 服务,因此我们需要在 Cognito 用户池中创建一个用户用于登录和使用。

    3.1 在 Cognito 用户池中添加用户

    方案在使用 CDK 部署后会在 CloudFormation 中保留创建的 Cognito 信息,您可以从 CloudFormation 服务中获取 Cognito 信息,堆栈名称应类似于“[XXX]CognitoUserPoolStack”。

    在 AWS 控制台打开 Cognito 服务,找到对应的用户池信息并使用自定义用户名和密码创建一个新用户用于系统登录认证。

    3.2 登录并使用网站

    您使用自定义的域名或者 CloudFront 分配的域名可以打开部署后的系统,初次未登录的状态下会提醒使用用户名和密码登录。我们输入 3.1 章节中创建的用户名信息,进行登录(Cognito 创建的用户初次登陆需要修改密码信息)。

    下图介绍了登录后的页面和功能:

    下面是一些使用动画演示:

    3.3 使用知识库

    方案部署完成后会自动创建一个名为“GenAIBuilderKnowledgeBase”的 Bedrock 知识库,当初次使用知识库的时候需要我们将自己的知识文档上传到知识库中并同步后使用。

    当前支持的文档类型包括:.doc / .docx / .pdf / .xls / .xlsx / .html / .txt / .md

    知识库的搜索结果示例如下:

    4. 删除/卸载资源

    如果需要删除部署的相关资源,只需要执行如下命令卸载对应的资源信息。

    chmod +x ./bin/destroy.sh
    ./bin/destroy.sh

    5. 升级/重新部署

    有时候您可能需要升级解决方案来修复 Bug 或使用方案中新发布的功能。除了卸载删除资源重新部署外,您也可以考虑删除局部资源重新部署。

    GenAI Bedrock Builder 的部署资源在 CloudFormation 中可以查看到,我们可以将部分相关 Stack 删除后,重新部署来实现快速更新,下面我们根据不同的场景来介绍如何更新。

    1. 更新前端网页资源 (更新前端资源有如下 2 种方式):
      1. 自行本地编译 front-end 资源并上传到 S3;
      1. 在 CloudFormation 中,删除名为“[GenAIBuilder]CloudFrontWebsiteStack”的 Stack,并参考章节 2.3 重新部署。此时部署脚本只会编译部署前端网页相关的资源。

      注意:因为是用了 CloudFront(CDN),更新前端代码不会立刻生效,如果希望尽快生效,需要在 CloudFront 中使当前的缓存失效,从而新的访问请求会访问到更新后的 S3 的资源。参考:使文件失效

    1. 更新后端逻辑代码(更新后端资源有如下 2 种方式):
      1. 直接修改相关 Lambda Function 的代码并 Deploy;
      1. 在 CloudFormation 中,删除名为“[GenAIBuilder]LambdaFunctionStack”的 Stack,并参考章节 2.3 重新部署。此时部署脚本只会重新部署 Lambda 函数相关的资源。
    1. 更新 Bedrock Agent 的功能

      可以通过在 Bedrock Agent 中修改高级提示词的方式添加更多能力,具体的控制台的路径在:

      Agent Details > Working draft > Edit advanced prompts,参考:Advanced prompts

      因为 Bedrock Agent 的使用通过 Aliases 标识区分不同版本的标签,当修改完 Agent 的功能后,为了使新的功能启用,我们需要:

      1. 创建新的 Aliases 并创建新的 Version 信息;
      1. 当产生新的 Version 信息后,我们可以修改名为 genai-builder-alias-prod 的 Aliases 并指定新创建的 Version 信息。

    注意:

    如果使用新的代码来更新和部署,我们需要获取最新的代码,但可能之前您已经在旧代码上更新了配置文件,因此您需要注意配置信息的保留。主要更新代码的 git 命令如下:

    // 备份预配置文件以记录配置信息
    cp bin/config.ts bin/config.ts.backup
    
    // 因为有可能配置文件发生变更,因此下面的强制获取新代码。
    git checkout .
    git pull

    总结

    本方案介绍了开源的 GenAI Bedrock Builder 解决方案的架构设计、数据流程、部署方法、是用方法、更新迭代。通过本文您可以快速基于该方案搭建自己的生成式 AI 工具系统,依托于 Amazon Bedrock 这一托管的 LLM 平台,您可以低成本按用量付费。同时我们也将在下一篇文章中介绍,如何基于- GenAI Bedrock Builder 解决方案进行定制化开发,实现自己的业务逻辑、用户认证等功能。

    本篇作者

    张凯

    亚马逊云科技解决方案架构师,主要负责基于 AWS 云计算的解决方案架构设计和的方案咨询,关注教育和医疗行业,10 多年的软件研发、管理和解决方案架构设计经验。