本文将介绍如何使用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进行对话了。