多租户RAG实现:基于某中心Bedrock与某中心OpenSearch服务的JWT集成方案
近年来,大型语言模型(LLM)的出现加速了AI在各行业的应用。然而,为了进一步增强LLM能力并有效利用最新信息和领域特定知识,与外部数据源的集成变得至关重要。检索增强生成(RAG)作为一种应对这一挑战的有效方法而受到关注。
RAG是一种从现有知识库或文档中基于用户输入搜索相关信息,并将这些信息融入LLM输入以生成更准确和上下文相关响应的技术。该技术正被广泛应用于从产品开发中的技术文档使用到客户支持中的FAQ回答,甚至基于最新数据的决策支持系统。
解决方案概述
在RAG中,用于增强LLM输出的相关文档等数据通过嵌入语言模型进行向量化,并在向量数据库中建立索引。用户自然语言问题使用嵌入模型转换为向量,并在向量数据库中进行搜索。通过向量搜索检索到的数据作为上下文传递给LLM以增强输出。
本解决方案使用OpenSearch服务作为向量数据存储,用于存储RAG中的知识源。流程如下:
- 各租户的RAG应用用户在某个中心Cognito用户池中创建用户,登录前端时获得包含租户ID信息的JWT
- 用户在前端发起聊天时,用户查询通过某个中心API网关与JWT一起传递给Lambda函数
- 用户查询与某个中心Bedrock中的文本嵌入模型结合进行向量化
- 从某个中心DynamoDB获取检索所需的域和索引信息
- 在OpenSearch服务上执行向量搜索,从索引中检索与查询相关的信息
- 检索到的信息作为上下文添加到提示中,并传递给某个中心Bedrock中的LLM生成响应
JWT在多租户数据隔离中的有效性
JWT是一种自包含令牌,在多租户环境中实现数据隔离和访问控制具有以下优势:
- 动态租户识别:JWT有效负载可包含属性信息(租户上下文)来识别租户
- 与OpenSearch中FGAC的集成:FGAC可直接使用JWT中的属性信息进行角色映射
数据隔离模式
域级隔离
为每个租户分配单独的OpenSearch服务域。在此隔离模式中,域专用于每个租户,因此无需在域内进行数据隔离。
索引级隔离
多个租户共享OpenSearch服务域,为每个租户分配单独索引。每个租户只能访问自己的索引。
文档级隔离
多个租户共享OpenSearch服务域和索引,使用FGAC文档级安全性实现索引内租户数据的访问权限隔离。
技术实现细节
用户认证与JWT生成
使用某个中心Cognito用户池进行RAG应用用户认证。通过预令牌生成Lambda触发器从DynamoDB检索每个用户的租户ID信息并添加到令牌中。
请求路由
DynamoDB表存储租户ID、目标OpenSearch服务域和索引的映射信息。从JWT解析获得的租户ID用于确定路由目的地。
访问控制配置
FGAC为租户数据创建专用角色进行访问权限控制。通过后端角色实现租户用户与FGAC租户角色之间的映射。
部署要求
- AWS账户
- 运行AWS CDK所需的IAM访问权限
- 前端执行环境:需要安装node.js和npm
- 配置AWS CDK
- 配置对某中心Bedrock中所用模型的访问权限
清理建议
为避免意外费用,建议在不再需要时删除资源。使用CDK destroy命令删除所有创建的资源。