设为首页 加入收藏 网站地图
现货平台
全国分站导航

中钢网

价格汇总
价格查询
价格走势
价格统计
中钢网新闻中心国内新闻财经新闻利用亚马逊云科技Amazon Bedrock和Amazon EKS构建基于RAG的聊天机器人

利用亚马逊云科技Amazon Bedrock和Amazon EKS构建基于RAG的聊天机器人

分享打印 2023-11-25 17:50 编辑:超级管理员     来源: 产经新闻     字体: [大][中][小]    

  导言

  随着生成式人工智能模型的出现,许多客户都在探索如何构建聊天机器人应用,以满足其终端客户的各种需求,这包括了既要让每个聊天机器人都能专门处理特定租户的上下文信息,又要能利用其开发团队熟悉的经济高效的基础设施大规模运行此类多租户应用程序。亚马逊云科技Amazon Bedrock是一项全托管的云服务,它通过应用编程接口(API)提供了一系列功能强大的基础模型服务,用户无需管理基础设施,简化了高适应性和高成本效益的生成式人工智能聊天机器人的开发过程,促使这一条挑战迎刃而解。亚马逊云科技Amazon EKS解决了构建这类聊天机器人应用的几个难题,如多租户,自动扩缩容,弹性和成本。大多数亚马逊云科技客户都会选择Amazon EKS来做大规模部署基于容器的多租户应用,以满足内部和外部用户的需求。根据各种调查和报告,包括来自CNCF,Splunk和Datadog等,都表明了Kubernetes作为在各类企业中首选的容器编排解决方案的日益增长的强劲势头。

  

  本文深入探讨了使用检索增强生成(RAG)构建多租户聊天机器人的解决方案。RAG是一种常见的模式,在这种模式下,通用的大语言模型会根据用户问题和从专有数据中提取的信息作为附加的上下文进行查询。

  解决方案概述

  如下图所示,该解决方案使用Amazon EKS作为运行容器化聊天机器人应用的基础,Kubernetes命名空间作为每个租户计算工作量的逻辑单位。Istio是一种开源的服务网格,通常与Kubernetes一起用于部署多租户应用,并提供Pod级别的流量管理、安全管控和可观察性等功能。使用Istio服务网格来实现入口控制和路由功能,因为它支持外部授权、JWT验证以及配置基于不同HTTP参数的请求路由。使用开放身份连接(Open ID Connect,OIDC)代理将授权请求转发给身份认证服务(这里采用的是Amazon Cognito User Pool)。客户端的请求通过NLB接收。对于每个租户,使用DNS子域名模式来转发用户的请求,其中DNS子域名映射到了NLB的IP地址。NLB会将所有流量转发给Istio网关,再由Istio网关对流量进行分发。

  

  要实现RAG,作为知识库的专有数据会被转换为vector embeddings,同时加入索引并存储在内存中的FAISS向量数据库中,以便进行高效的相似性搜索。使用Titan Embeddings模型将文本数据转换vector embeddings,并使用Claude Instant生成对用户查询的响应。这两种模型均可通过Amazon Bedrock获取。这里的RAG是通过FAISS实现的,FAISS是一个开源库,用于实现在内存中存储vector embeddings和提供快捷的相似性搜索。使用FAISS是因为它简单易用,占用空间较小,适合演示。但对于企业的正式环境,pgvector、Amazon Opensearch以及其他一些亚马逊云科技合作伙伴的产品才是首选,因为这些产品具有很好的扩展性,一致性和访问便捷的特性。这里采用了Amazon Titan Embeddings模型来生成vector embeddings。LangChain提供了针对大语言模型运行查询,以及通过Amazon DynamoDB来保存和管理聊天记录等功能。它可以协调处理用户输入过程中的各种步骤,包括聊天记录检索、将聊天记录和用户输入合并发送到Embedding模型进行vector embeddings的生成、使用接收到的vector embeddings去搜索向量数据库,以及将检索到的文档与聊天记录和用户输入一并发送到Claude Instant模型来获取输出。

  

  实现细节

  聊天机器人和RAG组件的容器化

  聊天机器人应用由两个微服务组件组成,包括与用户交互的前端聊天界面和RAG API。两个微服务都以Docker容器镜像的形式构建,以便在Amazon EKS上以Kubernetes pod的形式进行部署。

  

  这里采用的基础镜像是从Amazon ECR公有的镜像仓库获取的一个轻量化的Python基础镜像,同时使用了多阶段构建的方式。在第一阶段,主要是将一些Python依赖包安装到用户的家目录中。在第二阶段,要创建一个普通用户和用户组来运行基于Streamlit的用户聊天界面,同时从第一阶段的镜像中复制已安装的Python包,并将应用代码和所有相关模块复制到容器镜像中的应用工作目录。

  对于RAG API应用,使用与前端相同的Python基础镜像,并遵循与前端应用类似的步骤。在提供API服务时,使用FastAPI框架和Gunicorn/Uvicorn组合来运行高效的ASGI网络服务。

  容器镜像构建完成后,会被推送到Amazon ECR中等待部署。在Amazon EKS上部署聊天机器人应用时,所需的容器镜像会从ECR中获取。

  如下图所示,每个租户都会有一个独立的Kubernetes命名空间,并根据每个租户的特定场景设置环境变量和部署聊天机器人应用。聊天机器人应用是由两个容器组成,主容器是前端,而RAG API则作为侧载容器,提供问答任务所需的API。这里还为每个租户创建了一个亚马逊云科技身份和访问管理角色(AWS IAM Role),该角色拥有租户指定的Amazon S3存储桶和Amazon DynamoDB表的读写权限。为了简单化,为每个租户创建了专用的Amazon S3存储桶和Amazon DynamoDB表。将上述的IAM Role会和Kubernetes Service Account进行绑定之后,命名空间内的容器将会获得访问所需要数据的权限。

  

  从上面的容器定义中可以看到,有几种不同的环境变量会传递给容器中的应用程序,应用程序使用这些变量来定位当前租户中特定的数据资源和API接口。值得注意的是,容器镜像的地址也是可以作为参数传递给部署文件的,在这个例子中,这些参数被设置为每个镜像的ECR地址。

  使用FAISS和Titan Embeddings模型处理数据

  作为部署的一部分,聊天机器人用于生成用户查询回复的上下文数据会被摄取到FAISS索引中。如下图所示,上下文数据首先从租户的Amazon S3存储桶中读取。

  摄取机制使用LangChain的CharacterTextSplitter将摄取的数据分成合理大小的块,FAISS库通过调用Titan embeddings模型将每个块转换成vector embeddings,并为每一个embeddings创建一个索引。这种索引可缩短相似性搜索的响应时间。这样创建的索引集会以二进制格式文件输出,并上传回Amazon S3存储桶。RAG API微服务会在初始化过程中访问该存储桶,并将其加载到内存中。对于较大型的向量数据库,索引由数据库实例创建和管理,应用程序可使用数据库API进行查询。专用的向量数据库可将上下文数据的加载、更新和创建索引与应用程序分离开来,也可将数据库实例的扩缩容与应用程序分离开来。

  

  与Claude Instant集成

  RAG API微服务接收来自前端的用户查询,将其转换为对应基础模型所需要的提示格式,并使用LangChain与模型进行交互。LangChain初始化后会在特定租户的Amazon DynamoDB表中维护聊天记录。RAG API服务收到用户查询之后,会调用LangChain从向量数据库中检索相似性的结果,并将提示、搜索匹配的结果和之前的聊天记录作为上下文传给Claude Instant模型。从基础模型收到的响应后由RAG API通过聊天界面返回给用户,如下图所示。

  

  当用户在浏览器输入访问地址(如tenant.example.com),第一次访问聊天界面时,该请求将被Istio网关拦截,并转发到OIDC代理进行授权。由于请求中不包含与授权令牌相关联的cookie,这会将用户的浏览器重定向到Amazon Cognito登陆界面。用户登录后,请求会收到来Cognito的代码,该代码会传递给OIDC代理,由OIDC代理与Cognito交换用户的身份令牌(格式为JSON网络令牌)。OIDC代理缓存JWT,并将cookie返回给用户浏览器,以便在今后的请求中使用。当请求到达租户的聊天机器人服务时,JWT将根据其发行方URL进行验证,以确保JWT的真实性。此外,还要验证请求是否来自Istio网关。通过这些检查后,请求就会到达部署在租户命名空间中的聊天界面。

  

  Istio代理容器会从身份验证JWT令牌中提取租户ID和用户电子邮件,并将它们分别作为X-Auth- Request-Tenantid和X-Auth-Request-Email请求头注入。聊天应用程序在接收用户输入时会创建与租户ID和用户电子邮件相关联的会话ID。它还会记录上次用户交互的UNIX时间。SessionId是第4版UUID字符串。由TenantId:UserEmail:SessionId组成的连接字符串将与用户查询一起发送给RAG API,这样就可以将聊天记录与特定用户联系起来,为下游应用(如产品推荐、客户关系、技术支持等)提供丰富的上下文信息。

  由于前端和RAG API在同一个Kubernetes pod中,前端可以直接通过localhost(127.0.0.1)与RAG API通信。当RAG API服务启动时,它会将FAISS索引加载到内存中,并开始监听连接。收到请求后,它会初始化包含凭证的Bedrock boto3客户端,并将请求数据、基础模型的参数和请求Bedrock的数据结构传给LangChain。LangChain的功能是将聊天对话保存在Amazon DynamoDB表中,并启动一个ConversationalRetrievalChain,自动从FAISS索引中查找上下文,检索保存的历史记录,根据模板定义格式化查询,将上下文与格式化查询捆绑在一起,将其发送到Claude Instant模型,并保存模型的响应。RAG API会将从LangChain收到的响应返回给前端应用程序,以便呈现给用户。

  结论

  本文展示了如何使用Amazon Bedrock和Amazon EKS通过RAG构建一个多租户聊天机器人。RAG实现了使用专有数据作为大语言模型的上下文,从而使大语言模型的响应更具预测性和相关性。虽然本文展示的是聊天机器人用例,但搭建方法和相关组件也可以应用于诸如问题解答、文本总结和内容创作等场景。

  

  Amazon EKS提供原生的多租户功能,对不同租户之间的工作负载进行隔离,从而实现高效的资源共享。可以进一步探索Amazon Titan模型和Amazon Bedrock,用于生成式人工智能应用,并使用Amazon EKS作为底层协调台,构建一个具有弹性和成本效益的解决方案。

  

  原标题:利用Amazon Bedrock和Amazon EKS构建多租户的基于RAG的聊天机器人

  原链接:https://aws.amazon.com/cn/blogs/china/build-a-multi-tenant-chatbot-with-rag-using-amazon-bedrock-and-amazon-eks/

  

免责声明:市场有风险,选择需谨慎!此文仅供参考,不作买卖依据。

关键词:

 

免责声明:本文所载信息仅供参考,不作为直接决策依据。以上内容如无意中侵犯您的合法权益,请及时联系删除处理。
QQ:153405099 电话:13783683896           刘先生

Copyright © 2005 - 2023 中钢网 All Rights Reserved

全国咨询/投诉电话:400-700-8508  豫ICP备2021034665号

豫公网安备 41010502005284号