技术分享丨使用 Knowledge Bases for Amazon Bedrock 制作 RAG 工具_Web

本文将介绍如何使用Knowledge Bases for Amazon Bedrock开发一个RAG工具,Amazon Bedrock Knowledge Bases支持从S3存储桶中的多种文档获取数据,自动切片转换为文本块生成向量,并存储在向量数据中。因此业务代码只需要调用单个API,即可同时完成从Bedrock所集成的向量数据库中进行召回和大语言模型的内容生成,所以后续只需交由Web平台调用API,即可实现RAG能力。


使用的技术概览

• Amazon Bedrock & Knowledge Bases

Amazon Bedrock 提供了一种无服务器的方式来构建生成式 AI 应用程序,其中 Knowledge Bases 是一个核心组件。它允许用户上传自定义数据集,训练模型生成更具针对性和上下文相关的回答。

• ChatGPT Next Web

ChatGPT Next Web是一个开源项目,旨在创建一个可扩展的对话系统。该项目提供了一个 Web 界面,并支持自定义插件扩展,非常适合作为 RAG 工具的基础。

使用的技术栈及服务

• 前端:React.js,AWS SDK for JavaScript V3

• 亚马逊云服务:Amazon Bedrock,Amazon S3,Amazon OpenSearch

• 其他工具:Git,AWS CLI


创建 Bedrock Knowledge bases知识库
1. 开通大模型访问权限

如果之前没有使用过Bedrock,那么默认所有模型都是处于未开启状态,需要申请模型访问权限。申请模型操作权限的位置是在Bedrock服务的左侧菜单,建议申请Claude 3 Sonnet和Claude 3 Haiku等模型,可实现小效果和性价比的平衡。此外还要申请Amazon Titan Embeddings模型。如下截图。

技术分享丨使用 Knowledge Bases for Amazon Bedrock 制作 RAG 工具_Amazon_02

2. 创建作为数据源的S3存储桶

创建S3存储桶时候,需要注意选择存储桶所在的区域要和Bedrock服务在同一个区域。例如Bedrock服务在美东1 (弗吉尼亚北部)(us-west-1),那么存储桶也创建在这个区域。在存储桶名称位置可根据需要任意输入,在存储桶类型(也就是使用场景)位置,选择【通用】,然后继续向下滚动页面。如下截图。

技术分享丨使用 Knowledge Bases for Amazon Bedrock 制作 RAG 工具_API_03

在【对象所有权】位置,选择ACL 禁用(推荐)选项。在【此存储桶的“屏蔽公共访问权限”设置】的选项中,选中第一项阻止所有公开访问。由此将确保整个存储桶是完全私有的,即便某个应用上传文件时候额外指定了Public ACL,也将被拒绝公开。以此从最高层面保护存储桶为私有。如下截图。

技术分享丨使用 Knowledge Bases for Amazon Bedrock 制作 RAG 工具_Amazon_04

继续向下滚动页面。在默认加密的位置,选择第一项【使用 Amazon S3 托管密钥进行服务器端加密(SSE-S3)】也就是默认的加密算法(SSE-S3)。在【存储桶密钥】位置,选择启用。最后点击创建按钮完成创建。

技术分享丨使用 Knowledge Bases for Amazon Bedrock 制作 RAG 工具_Amazon_05

存储桶创建完毕。现在向存储桶内上传文件,可上传PDF、Word等格式。支持的格式清单在下文同步知识库部分有介绍。

3. 创建Bedrock知识库(自动生成向量数据库)

进入Bedrock服务,在左侧菜单下找到知识库,在右侧界面点击创建知识库。如下截图。

技术分享丨使用 Knowledge Bases for Amazon Bedrock 制作 RAG 工具_Web_06

在向导第一步,创建知识库向导会自动生成一个知识库名称,可按需修改。在IAM权限位置,选择创建和使用新的服务角色由Bedrock自动创建一个新的IAM角色用于知识库服务,其中会自动包含对应的Bedrock模型调用策略、S3存储桶访问策略、OpenSearch集群访问策略等。如果您要创建多个知识库,或者反复创建多次,请注意每次创建时候都选择自动生成一个新的IAM Role。这是因为多个知识库之前,他们使用的存储桶、OpenSearch集群是不一样的,因此如果您多个知识库使用一个IAM策略,那么会提示权限错误。因此建议创建新知识库时候都选择自动生成新的IAM策略。如下截图。

技术分享丨使用 Knowledge Bases for Amazon Bedrock 制作 RAG 工具_API_07

在向导第二步,数据来源名称位置向导自动生成了一个名称,可按需修改。在S3 URI,输入上一步创建的S3存储桶的名称。如下截图。

技术分享丨使用 Knowledge Bases for Amazon Bedrock 制作 RAG 工具_API_08

在向导第三步,选择向量嵌入模型位置,选择第二项Amazon Titan模型,至此向量维度是1536。然后向下滚动页面。如下截图。

技术分享丨使用 Knowledge Bases for Amazon Bedrock 制作 RAG 工具_API_09

在向量数据库选择的位置,选择左侧的【快速创建新的向量存储 - 推荐】,也就是由Bedrock知识库向导为本知识库创建一个新的OpenSearch Serverless集群。这里还需要注意,默认创建的集群是成本优化型适合非关键业务,如果是关键业务,需要选择下方的选项【启用冗余(活动副本)- 可选】来创建具有冗余能力的OpenSearch Serverless集群。然后点击下一步继续。如下截图。

技术分享丨使用 Knowledge Bases for Amazon Bedrock 制作 RAG 工具_API_10

在向导第四步,Review之前的配置,不需要修改,直接点击创建。如下截图。

技术分享丨使用 Knowledge Bases for Amazon Bedrock 制作 RAG 工具_Web_11

向导会卡在这个位置转圈圈。这是因为在后台创建OpenSearch Serverless集群。如果将页面向上滑动到最上方,可以看到有一个蓝色的条幅提示创建OpenSearch中。

此时请不要离开当前页面,如果电脑休眠、网络中断、或者浏览器离开了当前页面,那么向导将只完成OpenSearch Serverless的创建,而不会完成整个Bedrock知识库的创建。如果发生了这种情况,您只能先删除掉OpenSearch Serverless,然后重新运行一遍Bedrock知识库创建向导。本步骤需要大概6分钟时间。因此请保持耐心等待本页面完成。


4. 完成Knowledge bases构建

当创建向导完成了Bedrock知识库的创建后,需要将S3存储桶内的数据加载到Bedrock服务中,通过向量模型生成向量,写入数据库。本步骤可通过在页面上按同步按钮进行数据加载。在创建知识库成功后,页面多个地方都提示需要进行数据同步。如下截图。

技术分享丨使用 Knowledge Bases for Amazon Bedrock 制作 RAG 工具_Amazon_12

当数据同步进行中时候,Bedrock知识库服务的下方数据源部分,就会提示正在同步中。同步完成后以下功能都能够正常使用。如下截图。

技术分享丨使用 Knowledge Bases for Amazon Bedrock 制作 RAG 工具_Amazon_13


搭建RAG问答机器人
1. 部署ChatGPT Next Web

使用ChatGPT Next Web作为RAG问答机器人,在搭建之前本机需要事先配置React.js 环境。

首先从github上克隆ChatGPT Next Web的代码,在git客户端里使用命令。

git clone: https://github.com/ChatGPTNextWeb/ChatGPT-Next-Web.git
  • 1.

技术分享丨使用 Knowledge Bases for Amazon Bedrock 制作 RAG 工具_API_14

ChatGPT Next Web使用React编写,无需额外安装数据库及组件,通过yarn命令就可以启动,验证Web是否能够正常启动。

cd ChatGPT-Next-Web
yarn install && yarn dev
  • 1.
  • 2.

技术分享丨使用 Knowledge Bases for Amazon Bedrock 制作 RAG 工具_Web_15

访问http://localhost:3000,可以看到如下截图的操作界面,这说明已经成功在本地运行起 ChatGPT Next Web应用。

技术分享丨使用 Knowledge Bases for Amazon Bedrock 制作 RAG 工具_Web_16

2. ChatGPT Next Web改造

ChatGPT Next Web是个一键部署的跨平台私人 ChatGPT 应用, 支持 GPT3, GPT4 & Gemini Pro 等模型,它自身提供通过配置大模型SaaS版API的key来实现,这与Bedrock提供的API方式不同,因此需要针对这块的代码进行改造。

新增top_k 算法参数:

Claude 模型在使用时必须要有top_k算法参数,在app/store/config.ts中为默认模型添加参数支持,以下是部分示例代码:

…………

top_k: 200

…………
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
新增 Bedrock API 接口:

修改 app/client/api.ts,让应用程序支持Bedrock API,以下是部分示例代码:

…………

import { AmazonBedrockApi, AWSBRApi } from "./platforms/amazonbedrock";

…………
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
新增 AWS AKSK配置:

修改app/config/server.ts,增加从配置文件读取AWS AKSK的功能,以下是部分示例代码:

…………

      // Amazon Bedrock only

      AWS_ACCESS_KEY?: string;

      AWS_SECRET_ACCESS_KEY?: string;

…………
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
新增 Amazon Bedrock 模型选项:

修改app/constant.ts,增加 Amazon Bedrock 模型,提供用户在模型选择界面可以选择到 Amazon Bedrock 模型,以下是部分示例代码:

…………

export enum ServiceProvider {

  …………

  AmazonBedrock = "AmazonBedrock",

}

 

export const DEFAULT_MODELS = [

  {

    name: "Claude 3.5 Sonnet",

    available: true,

    provider: {

      id: "AmazonBedrock",

      providerName: "AmazonBedrock",

      providerType: "anthropic-claude3-5-sonnet",

    },

  },

…………
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
编写 Amazon Bedrock TS:

在 app/client/platforms 目录下创建一个服务文件amazonbedrock.ts,用于与 Amazon Bedrock 交互,加强原本ChatGPT Next Web的对话功能,以下是部分示例代码:

…………

export class AmazonBedrockApi implements LLMApi {

  extractMessage(res: any) {

    return res?.output?.choices?.at(0)?.message?.content ?? "";

  }

  convertMessagePayload(

    messages: any,

    modelConfig: any,

    model_version: string,

  ):

…………
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
新增 Knowledge Bases选项:

修改app/components/chat.tsx文件,增加一个Knowledge Bases的功能,可以在对话时候切换不同的知识库,以下是部分示例代码:

…………

      <chataction

        notallow={() => setShowKnowledgeBaseSelector(true)}

        text={currentKnowledgeBase}

        icnotallow={}

      />

…………
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.

至此已实现了Knowledge bases for Amazon Bedrock的RAG工具构建,后续只需运行此项目,就可以通过ChatGPT Next Web和Bedrock进行对话了。