构建一个基于异构数据存储的去中心化语义搜索引擎,使用自主代理 大数据博客
构建基于异构数据存储的去中心化语义搜索引擎
关键要点
在这篇文章中,您将学习如何使用自主代理构建一个去中心化的语义搜索引擎,该引擎能够高效处理结构化和非结构化数据。这种方法不仅能够提高投资分析的自动化,也能为其他行业的问答场景提供支持。
随着大型语言模型LLMs如 Anthropic Claude 和 Amazon Titan 的发展,它们在自动化多个业务流程方面展现出巨大潜力,能够处理结构化与非结构化的数据。例如,金融分析师目前需要手动阅读和总结冗长的法规文件和财报纪录,以便回应投资策略的提问。而 LLMs 则可以自动提取和总结这些文件中的关键信息,使分析师能够高效地获取准确的摘要并快速制定投资建议。Amazon Bedrock 是一个完全托管的服务,提供来自领先 AI 公司如 AI21 Labs、Anthropic、Cohere、Meta、Stability AI 和 Amazon的高性能基础模型,帮助企业构建具有安全性、隐私及责任感的生成式 AI 应用。
在此文章中,我们展示了如何使用 RAG检索增强生成构建问答机器人。RAG 利用像 Amazon Redshift 和 Amazon OpenSearch Service 这样的数据源检索文档,以增强 LLM 的提示。为从 Amazon Redshift 获取数据,我们使用 Anthropic Claude 20,并利用 LangChain 预定义的提示模板库对最终回应进行摘要。对于 Amazon OpenSearch Service,数据片段被切分并转换成向量,使用 Amazon Titan 文本嵌入 模型进行处理。
在客户交互中,我们使用基于 ReAct 的代理工具。ReAct 提示由几次任务解决轨迹组成,并附带人类编写的文本推理和行动记录,以及对行动的环境观察。在本示例中,我们使用 ReAct 进行零shot 训练,以生成符合预定义模板的回应,最终的生成内容将与原始输入提示一起用作文本生成器的上下文信息,从而产生最终输出。
解决方案概述
我们的解决方案展示了金融分析师如何利用生成式人工智能AI,结合 RAG 方法,根据财务报告和收益记录调整投资建议,利用 LLM 生成事实内容。该混合架构使用多个数据库和 LLM,通过 Amazon Bedrock 提供的基础模型识别数据源、生成 SQL 以及基于结果进行文本生成。以下架构中的步骤 1 和 2 表示数据工程需要以批量模式进行的数据摄取;步骤 3、4 和 5 是查询和响应生成的过程。
下图展示了 QampA 处理链的更详细视图。用户提出问题,LangChain 查询 Redshift 和 OpenSearch Service 数据存储以获取相关信息,构建提示并将其发送给 Anthropic Claude 模型,并返回响应。
每个步骤的详细信息如下:
将公司股票信息填充到 Amazon Redshift Serverless 数据仓库中,所需数据存储于 Amazon 简单存储服务Amazon S3中。Redshift Serverless 是一个功能完备的数据仓库,实时维护数据表。从 S3 数据湖加载非结构化数据到 OpenSearch Service 中,以创建索引并进行语义搜索。LangChain 库加载知识库文档,拆分文档为小块,并使用 Amazon Titan 生成块的嵌入向量。客户通过聊天机器人或网站界面提交问题。将用户查询通过 Amazon SageMaker Notebook 提交,执行 API 调用到 Amazon Bedrock 的 LLM。使用 LLM 代理生成 SQL 文本,验证查询是否相关于数据仓库表。如果相关,则运行查询以提取信息。LangChain 库调用 Amazon Titan 嵌入生成用户问题的向量,并调用 OpenSearch 向量搜索以获取相似文档。LangChain 使用获取的知识作为上下文,调用 Anthropic Claude 模型生成答案,并将生成的内容返回给客户。在该部署中,您将选择 Amazon Redshift Serverless,使用 Anthropic Claude 20 模型 和 Amazon Titan 文本嵌入 模型。部署的总开支将与 Amazon Bedrock 模型的输入/输出令牌数量、知识库体量、使用小时数等参数直接相关。
要部署解决方案,您需要两个数据集:SEC Edgar 年度财务申报 和 股票定价数据。为进行分析,这两个数据集需要选择 股票代码 作为连接键。提供的 AWS CloudFormation 模板将会部署本文所需的数据集,以及 SageMaker notebook。
前置条件
要跟随本帖操作,您需要有 AWS 账户,并具备 AWS 身份与访问管理IAM的用户凭证,以便部署 AWS 服务。
使用 AWS CloudFormation 部署聊天应用程序
要部署资源,请完成以下步骤:
部署以下 CloudFormation 模板 在 useast1 AWS 区域创建堆栈。堆栈将部署 OpenSearch Service 域、Redshift Serverless 端点、SageMaker notebook 及其他您将在本帖中使用的服务如 VPC 和 IAM 角色。模板为 OpenSearch Service 域设置了默认的用户名密码,并为 Redshift Serverless 设置了管理员。您可以选择修改这些值或使用默认值。在 AWS CloudFormation 控制台,导航到您创建的堆栈。在 输出 标签下,选择 SageMakerNotebookURL 的 URL 打开 notebook。
在 Jupyter 中选择 semanticsearchwithamazonopensearch,然后是 blog,进入 LLMBasedAgent 文件夹。
打开 notebook Generative AI with LLM based autonomous agents augmented with structured and unstructured dataipynb。
按照 notebook 中的说明操作,按顺序运行代码。
运行 notebook
notebook 中有六个主要部分:
准备 OpenSearch Service 中的非结构化数据 下载 SEC Edgar 年度财务申报 数据集,并使用 Amazon Titan 文本嵌入 模型将公司财务申报文档转换为向量,并存储在 Amazon OpenSearch Service 向量数据库中。准备 Redshift 数据库中的结构化数据 将结构化数据摄取到 Amazon Redshift Serverless 表中。使用向量搜索查询 OpenSearch Service 中的非结构化数据 创建一个函数来实现与 OpenSearch Service 的语义搜索。在 OpenSearch Service 中,匹配相关公司 financial 信息,以便作为 LLM 的上下文信息。此项非结构化数据将增强 LLM 的表现。使用 SQL 数据库链查询 Amazon Redshift 中的结构化数据 使用 LangChain 库将 LLM 文本转换为 SQL 查询存储在 Amazon Redshift 中的公司股票信息。搜索结果将作为 LLM 的上下文信息。创建一个基于 LLM 的 ReAct 代理,增强来自 OpenSearch Service 和 Amazon Redshift 的数据 使用 LangChain 库定义 ReAct 代理,判断用户查询是否与股票或投资相关。如果查询与股票相关,代理将查询 Amazon Redshift 中的结构化数据以获取股票代码和股票价格,从而增强 LLM 的上下文。该代理还使用语义搜索从 OpenSearch Service 检索相关财务信息以增强 LLM 的上下文。使用基于 LLM 的代理生成最终回应,基于用于零shot培训的模板 下面是 “ABC 是否是一个好的投资选择” 查询的股票价格推荐的样本用户流程。示例问题与回答
在本节中,我们展示了三个示例问题及其回答,以测试我们的聊天机器人。
示例 1:历史数据可用
在第一次测试中,我们探讨了当历史数据可用时,机器人如何响应问题。我们使用问题:“[公司名称] 现在是个好投资选择吗?”将 [公司名称] 替换为您想要查询的公司名称。
这是与股票相关的问题。公司的股票信息存储在 Amazon Redshift 中,而财务报表信息则在 OpenSearch Service 中。代理将执行以下过程:
印尼节点加速器确定这是否是一个与股票相关的问题。获取公司名称。从 Amazon Redshift 获取股票代码。从 Amazon Redshift 获取股票价格。利用语义搜索从 OpenSearch Service 中获取与 10K 财务申报数据相关的信息。pythonresponse = zeroshotagent(nnHuman Is {company name} a good investment choice right now nnAssistant)
输出可能如下所示:
plaintextFinal Answer 是的,{公司名称} 目前似乎是个不错的投资选择,基于稳定的股票价格、持续的收入和盈利增长,以及分红发放。我建议在当前价格水平投资 {公司名称} 的股票。
您可以在 notebook 中查看来自整个链的最终响应。
示例 2:历史数据不可用
在下一个测试中,我们看看当历史数据不可用时,机器人如何回应问题。我们问:“亚马逊现在是个好投资选择吗?”
这是一个与股票相关的问题。然而,Redshift 表中没有亚马逊的股票价格信息。因此,机器人将回答:“没有股票价格信息,我无法提供股票分析。”代理将运行以下过程:
确定这是否是与股票相关的问题。获取公司名称。从 Amazon Redshift 获取股票代码。从 Amazon Redshift 获取股票价格。pythonresponse = zeroshotagent(nnHuman Is Amazon a good investment choice right now nnAssistant)
输出如下所示:

plaintextFinal Answer 我无法提供没有股票价格信息的股票分析。
示例 3:不相关问题,并且历史数据不可用
在我们的第三次测试中,我们观察到当历史数据不可用时,机器人对不相关问题的响应。这是针对虚假信息的测试。我们使用问题:“什么是 SageMaker?”
这不是与股票相关的查询。代理将运行以下过程:
确定这是否是一个与股票相关的问题。pythonresponse = zeroshotagent(nnHuman What is SageMaker nnAssistant)
输出如下所示:
plaintextFinal Answer 什么是 SageMaker? 不是一个与股票相关的查询。
以上是一个基于 RAG 的 ReAct 聊天代理,分析来自不同数据存储的信息。在现实场景中,您可能希望进一步增强响应,通过输入和输出的限制或保护措施,例如过滤不当语言以确保输入的有效性、输出过滤、对话流控制等。您也可能希望探索 可编程保护措施 以应用于基于 LLM 的对话系统。
清理
要清理您的资源,请删除 CloudFormation 堆栈 llmbasedagent。
结论
在这篇文章中,您探讨了 LLMs 如何参与用户问题的回答。您查看了服务于金融分析师的场景。您也可以将这种方法论应用于其它问答场景中,例如通过快速上下文化索赔数据或客户交互来支持保险案例。您利用结构化和非结构化数据的知识库,以 RAG 方法合并数据,从而创建智能聊天机器人。您还学到了如何使用自主代理提供符合上下文的相关响应,并限制作出无关和不准确的回应。
欢迎在评论区留言反馈或提问。
参考文献
构建语义搜索引擎和 RAG 应用程序,使用向量数据库和大型语言模型如何使用变换器和 Faiss 构建语义搜索引擎使用 Amazon OpenSearch Service 进行语义和向量搜索利用生成式 AI 和语义搜索革新企业知识管理使用 Amazon OpenSearch Service 向量引擎尝试语义搜索关于作者
Dhaval Shah是亚马逊网络服务的首席解决方案架构师,总部位于纽约,负责指导全球金融服务客户在云端构建高度安全、可扩展、可靠和高性价比的应用。Dhaval 在软件开发和架构、数据工程和 IT 管理领域拥有超过 20 年的技术经验。
Soujanya Konka是 AWS 的高级解决方案架构师和分析专家,专注于帮助客户在云端构建他们的想法,拥有数据平台设计和实施的专业知识。在加入 AWS 之前,Soujanya 曾在 HSBC 和 Cognizant 等公司工作。
Jon Handler是位于加利福尼亚州帕洛阿尔托的亚马逊网络服务的高级首席解决方案架构师,与 OpenSearch 和 Amazon OpenSearch Service 密切合作,为希望将搜索和日志分析工作负载迁移到 AWS 云的广大客户提供帮助和指导。在加入 AWS 之前,Jon 的软件开发职业生涯包括四年的大型电子商务搜索引擎编码。他获得了宾夕法尼亚大学的文学士学位,并在西北大学获得计算机科学与人工智能的硕士学位和博士学位。
Jianwei Li 是亚马逊网络服务的首席分析师 TAM,提供咨询服务,帮助客户设计和构建现代数据平台。Jianwei 一直从事大数据领域的工作,担任软件开发人员、顾问和技术领导者。
Hrishikesh Karambelkar 是 AWS 专业服务亚太地区和日本的数据和 AIML 负责人。他积极与 APJ 区