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

本文将介绍如何使用 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 模型。如下截图。

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

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

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

存储桶创建完毕。现在向存储桶内上传文件,可上传 PDF、Word 等格式。支持的格式清单在下文同步知识库部分有介绍。
3. 创建 Bedrock 知识库(自动生成向量数据库)
进入 Bedrock 服务,在左侧菜单下找到知识库,在右侧界面点击创建知识库。如下截图。

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

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

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

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

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

向导会卡在这个位置转圈圈。这是因为在后台创建 OpenSearch Serverless 集群。如果将页面向上滑动到最上方,可以看到有一个蓝色的条幅提示创建 OpenSearch 中。
此时请不要离开当前页面,如果电脑休眠、网络中断、或者浏览器离开了当前页面,那么向导将只完成 OpenSearch Serverless 的创建,而不会完成整个 Bedrock 知识库的创建。如果发生了这种情况,您只能先删除掉 OpenSearch Serverless,然后重新运行一遍 Bedrock 知识库创建向导。本步骤需要大概 6 分钟时间。因此请保持耐心等待本页面完成。
4. 完成 Knowledge bases 构建
当创建向导完成了 Bedrock 知识库的创建后,需要将 S3 存储桶内的数据加载到 Bedrock 服务中,通过向量模型生成向量,写入数据库。本步骤可通过在页面上按同步按钮进行数据加载。在创建知识库成功后,页面多个地方都提示需要进行数据同步。如下截图。

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

搭建 RAG 问答机器人
1. 部署 ChatGPT Next Web
使用 ChatGPT Next Web 作为 RAG 问答机器人,在搭建之前本机需要事先配置 React.js 环境。
首先从 github 上克隆 ChatGPT Next Web 的代码,在 git 客户端里使用命令。

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

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

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 中为默认模型添加参数支持,以下是部分示例代码:
新增 Bedrock API 接口:
修改 app/client/api.ts,让应用程序支持 Bedrock API,以下是部分示例代码:
新增 AWS AKSK 配置:
修改 app/config/server.ts,增加从配置文件读取 AWS AKSK 的功能,以下是部分示例代码:
新增 Amazon Bedrock 模型选项:
修改 app/constant.ts,增加 Amazon Bedrock 模型,提供用户在模型选择界面可以选择到 Amazon Bedrock 模型,以下是部分示例代码:
编写 Amazon Bedrock TS:
在 app/client/platforms 目录下创建一个服务文件 amazonbedrock.ts,用于与 Amazon Bedrock 交互,加强原本 ChatGPT Next Web 的对话功能,以下是部分示例代码:
新增 Knowledge Bases 选项:
修改 app/components/chat.tsx 文件,增加一个 Knowledge Bases 的功能,可以在对话时候切换不同的知识库,以下是部分示例代码:
至此已实现了 Knowledge bases for Amazon Bedrock 的 RAG 工具构建,后续只需运行此项目,就可以通过 ChatGPT Next Web 和 Bedrock 进行对话了。
版权声明: 本文为 InfoQ 作者【伊克罗德信息科技】的原创文章。
原文链接:【http://xie.infoq.cn/article/591baf5fc93d11ad2ba5cc17b】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论