实现RAG:使用LangChain实现图检索查询

你是不是有时会遇到这样的问题:你可能遇到的任何主题或问题,都有大量的文档,但是当尝试将某些内容应用于自己的用途时,突然发现很难找到所需的内容。
在这篇博文中,我们将看一下LangChain是如何实现RAG的,这样你就可以将相同的原理应用到任何带有LangChain和LLM的应用程序中。

什么是RAG

该术语在当今的技术领域中使用得很多,但它的实际含义是什么呢?以下是来自不同来源的一些定义:

“检索增强生成(RAG)是优化大型语言模型输出的过程,因此在生成响应之前,它会参考训练数据源之外的权威知识库。” — AWS

“检索增强生成(RAG)是一种利用从外部来源获取的事实,提高生成式人工智能模型的准确性和可靠性的技术。” — 英伟达

“检索增强生成(RAG)是一个人工智能框架,通过将模型建立在外部知识来源上,以补充法学硕士对信息的内部表示,从而提高法学硕士生成的响应的质量。” — IBM研究院

在本篇博文中,我们将关注如何编写检索查询来补充或支撑LLM的答案。我们将使用Python和LangChain,一个用于编写与llm交互的生成式AI应用程序的框架。

数据集

首先,让我们快速浏览一下我们的数据集。我们将处理来自EDGAR(电子数据收集、分析和检索系统)数据库的SEC(证券交易委员会)文件。美国证券交易委员会提交的文件是一个信息宝库,包含财务报表、披露信息和其他有关上市公司的重要信息。

the data set

这些数据包含已向SEC提交财务报表(10k、13等)的公司。不同的经理持有这些公司的股票,这些公司属于不同的行业。在财务表格本身中,文本中提到了各种各样的人,我们将文本分解为更小的块,以便向量搜索查询处理。我们将每个文本块放在一个表单中,并创建了一个向量嵌入,该向量嵌入也存储在chunk节点上。当我们运行向量搜索查询时,我们将查询的向量与CHUNK节点的向量进行比较,以找到最相似的文本。 

检索查询示例

我使用了一些资源来帮助我理解如何在LangChain中编写检索查询。第一篇是Tomaz Bratanic的博客文章,他写了一篇关于如何使用维基百科文章数据在LangChain中使用Neo4j矢量索引的文章。第二个是来自GenAI Stack的查询,它是使用Docker构建的演示应用程序的集合,并利用包含技术问题和答案的StackOverflow数据集。

所有查询都包含在下面:

# Tomaz's blog post retrieval query
retrieval_query = """OPTIONAL MATCH (node)<-[:EDITED_BY]-(p)WITH node, score, collect(p) AS editorsRETURN node.info AS text,score, node {.*, vector: Null, info: Null, editors: editors} AS metadata
"""# GenAI Stack retrieval query
retrieval_query="""WITH node AS question, score AS similarityCALL  { with questionMATCH (question)<-[:ANSWERS]-(answer)WITH answerORDER BY answer.is_accepted DESC, answer.score DESCWITH collect(answer)[..2] as answersRETURN reduce(str='', answer IN answers | str + '\n### Answer (Accepted: '+ answer.is_accepted +' Score: ' + answer.score+ '): '+  answer.body + '\n') as answerTexts}RETURN '##Question: ' + question.title + '\n' + question.body + '\n' + answerTexts AS text, similarity as score, {source: question.link} AS metadataORDER BY similarity ASC // so that best answers are the last
"""

现在,请注意,这些查询看起来并不完整。我们不会用可选的MATCH或with子句启动Cypher查询。这是因为检索查询被添加到向量搜索查询的末尾。

read_query = ("CALL db.index.vector.queryNodes($index, $k, $embedding) ""YIELD node, score "
) + retrieval_query

因此,LangChain首先调用db.index.vector.queryNodes()(更多信息见文档)来查找最相似的节点,并传递(YIELD)相似节点和相似度分数,然后将检索查询添加到向量搜索查询的末尾,以提取额外的上下文。了解这一点非常有帮助,特别是当我们构造检索查询时,以及当我们开始测试结果时!

第二件要注意的事情是,这两个查询都返回相同的三个变量:文本、分数和元数据。这是LangChain所期望的,所以如果没有返回,您将得到错误。文本变量包含相关文本,分数是块与搜索文本的相似度分数,元数据可以包含我们想要的上下文的任何其他信息。

构造检索查询

让我们构建检索查询!我们知道相似性搜索查询将返回节点和分数变量,因此我们可以将这些变量传递到检索查询中,以提取这些相似节点的连接数据。我们还必须返回文本、分数和元数据变量。

retrieval_query = """WITH node AS doc, score as similarity# some more query hereRETURN <something> as text, similarity as score, {<something>: <something>} AS metadata
"""

好了,这就是我们的骨架。现在我们想要中间的是什么?我们知道我们的数据模型将在相似性搜索中提取CHUNK节点(这些将是上面WITH子句中的节点AS文档值)。文本块不能提供大量上下文,因此我们想要拉入连接到CHUNK节点的Form、Person、Company、Manager和Industry节点。我们还在NEXT关系中包含一系列文本块,因此我们可以将下一个和上一个文本块拉到相似的文本块周围。我们还将提取所有具有相似分数的块,我们希望缩小范围。

retrieval_query = """WITH node AS doc, score as similarityORDER BY similarity DESC LIMIT 5CALL { WITH docOPTIONAL MATCH (prevDoc:Chunk)-[:NEXT]->(doc)OPTIONAL MATCH (doc)-[:NEXT]->(nextDoc:Chunk)RETURN prevDoc, doc AS result, nextDoc}# some more query hereRETURN coalesce(prevDoc.text,'') + coalesce(document.text,'') + coalesce(nextDoc.text,'') as text,similarity as score, {<something>: <something>} AS metadata
"""

现在我们保留5个最相似的块,然后在CALL{}子查询中提取前一个和下一个文本块。我们还更改了RETURN,将前一个、当前和下一个块的文本都连接到文本变量中。coalesce()函数用于处理空值,因此如果没有前一个块或下一个块,它将只返回一个空字符串。

让我们添加更多的上下文来拉入图中的其他相关实体。

retrieval_query = """WITH node AS doc, score as similarityORDER BY similarity DESC LIMIT 5CALL { WITH docOPTIONAL MATCH (prevDoc:Chunk)-[:NEXT]->(doc)OPTIONAL MATCH (doc)-[:NEXT]->(nextDoc:Chunk)RETURN prevDoc, doc AS result, nextDoc}WITH result, prevDoc, nextDoc, similarityCALL {WITH resultOPTIONAL MATCH (result)-[:PART_OF]->(:Form)<-[:FILED]-(company:Company), (company)<-[:OWNS_STOCK_IN]-(manager:Manager)WITH result, company.name as companyName, apoc.text.join(collect(manager.managerName),';') as managersWHERE companyName IS NOT NULL OR managers > ""WITH result, companyName, managersORDER BY result.score DESCRETURN result as document, result.score as popularity, companyName, managers}RETURN coalesce(prevDoc.text,'') + coalesce(document.text,'') + coalesce(nextDoc.text,'') as text,similarity as score, {documentId: coalesce(document.chunkId,''), company: coalesce(companyName,''), managers: coalesce(managers,''), source: document.source} AS metadata
"""

第二个CALL{}子查询拉入任何相关的Form、Company和Manager节点(如果存在,则为OPTIONAL MATCH)。我们将经理收集到一个列表中,并确保公司名称和经理列表不为空或空。然后我们按分数对结果排序(目前不提供价值,但可以跟踪文档被检索了多少次)。

由于只返回文本、分数和元数据属性,因此我们需要在元数据字典字段中映射这些额外的值(documentId、company和managers)。这意味着要更新最终的RETURN语句以包含这些语句。

总结

本文中,我们了解了RAG是什么,以及在LangChain中检索查询是如何工作的。我们还查看了一些用于Neo4j的Cypher检索查询示例,并构建了我们自己的示例。我们在查询中使用了SEC文件数据集,并了解了如何提取额外的上下文并将其映射到LangChain期望的三个属性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/800916.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024年贵州省职业院校技能大赛云计算应用赛项赛题第2套

#需要资源&#xff08;软件包及镜像&#xff09;或有问题的&#xff0c;可私聊博主&#xff01;&#xff01;&#xff01; #需要资源&#xff08;软件包及镜像&#xff09;或有问题的&#xff0c;可私聊博主&#xff01;&#xff01;&#xff01; #需要资源&#xff08;软件包…

产品经理和项目经理的区别

1. 前言 本文深入探讨了产品经理与项目经理在职责、关注点以及所需技能方面的显著区别。产品经理主要负责产品的规划、设计和市场定位,强调对用户需求的深刻理解和产品创新的推动;而项目经理则侧重于项目的执行、进度控制和资源管理,确保项目按时、按质、按预算完成。两者在…

在NBA我需要翻译--适配器模式

1.1 在NBA我需要翻译&#xff01; "你说姚明去了几年&#xff0c;英语练出来了哦&#xff0c;我看教练在那里布置战术&#xff0c;他旁边也没有翻译的&#xff0c;不住点头&#xff0c;瞧样子听懂没什么问题了。" "要知道&#xff0c;最开始&#xff0c…

03-JAVA设计模式-原型模式

原型模式 什么是原型模式 Java原型模式&#xff08;Prototype Pattern&#xff09;是一种创建型设计模式&#xff0c;其核心理念在于通过复制&#xff08;克隆&#xff09;已有的对象来创建新的对象&#xff0c;而不是通过构造函数来创建。 该模式可以显著提高对象创建的效率…

HTML+CSS+JavaScript网页制作案例教程第2版-黑马程序员-第7章动手实践

7.6 动手实践 学习完前面的内容&#xff0c;下面动手实践一下吧。 请结合给出的素材&#xff0c;运用元素的浮动和定位实现图7-49所示的“焦点图”效果。 链接&#xff1a;https://pan.baidu.com/s/1H98ySBSkd8h3IRA19AV2mw?pwd1024 提取码&#xff1a;1024 index.html <…

代码随想录|Day34|动态规划03|343.整数拆分、96.不同的二叉搜索树

343.整数拆分 动规五步&#xff1a; 确定 dp[i] 含义&#xff1a;拆分数字 i&#xff0c;可以获得的最大乘积为 dp[i]。递推公式&#xff1a;dp[i] max(j * (i - j), j * dp[i - j])。i 可以被拆解为两个数&#xff08;j 和 i - j&#xff09;或者多个数&#xff08;j 和 dp[i…

KMP刷leetcode速通

前言 KMP真厉害&#xff0c;刷题刷到 28.找出字符串中第一个匹配项的下标 和 1668.最大重复子字符串 next 数组用来匹配不上时&#xff0c;前缀 j j j 可以快速回退到 n e x t [ j − 1 ] next[j-1] next[j−1] 的位置。 void getNext(vector<int>& next, const…

5毛钱的DS1302 N/Z串行实时时钟IC

推荐原因&#xff1a; 便宜&#xff0c;够用 该器件最早为DALLAS的产品&#xff0c;所以冠有DS&#xff0c;现国内有多个厂家生产&#xff0c;部分价格不到5毛钱的含税价格&#xff0c;有此自行车&#xff0c;还要什么宝马&#xff1f; 下述为简介&#xff0c;使用前请参阅相应…

Linux 网络配置 主机名解析过程

Windows查看网络信息 ipconfigLinux中查看网络配置&#xff1a; ifconfigVMware的网络编辑器&#xff1a; 测试两台主机网络是否连通&#xff1a; ping ip地址自动获取IP 自动获取IP&#xff0c;可以避免IP冲突&#xff0c;但IP可能会变&#xff0c;使用图形界面&#xf…

xilinx AXI CAN驱动开发

CAN收发方案有很多&#xff0c;常见的解决方案通过是采用CAN收发芯片&#xff0c;例如最常用的SJA1000,xilinx直接将CAN协议栈用纯逻辑实现&#xff0c;AXI CAN是其中一种&#xff1b; 通过这种方式硬件上只需外接一个PHY芯片即可 上图加了一个电平转换芯片 软件设计方面&…

书生·浦语大模型-第三节课笔记/作业

笔记 作业 原版 prompt控制节奏&#xff0c;实现类似关键词检索、主题、信息抽取等功能注意这里根据llm返回的topic (prompt: 告诉我这句话的主题&#xff0c;直接说主题不要解释)进行召回检索(CacheRetriever), 并再次让大模型判断query与返回的检索的相关程度. 如果本地检索…

蓝桥杯 子串简写(暴力)

题目&#xff1a;子串简写 代码1&#xff1a; #include<algorithm> #include<iostream> #include<cstring> #include<queue> #include<cmath>using namespace std;char c1,c2; int k; char s[100010]; int a[100010]; int b[100010]; int cnt; …

Nginx服务 高级配置

五、高级配置 1. 网页的状态页 基于 nginx 模块 ngx_http_stub_status_module 实现&#xff0c;在编译安装nginx的时候需要添加编译参数 --with-http_stub_status_module&#xff0c;否则配置完成之后监测会是提示语法错误注意。状态页显示的是整个服务器的状态&#xff0c;而…

Python学习之-logging模块及彩色日志详解

前言&#xff1a; Python的logging模块是内建的、功能强大的日志系统&#xff0c;可通过简单的配置&#xff0c;就能满足基本到复杂的日志管理需求。它可以让你以各种方式记录错误、调试信息、以及其他运行时的信息&#xff0c;这些都是应用程序健壯性、可维护性的关键。 1 基…

分公司=-部门--组合模式

1.1 分公司不就是一部门吗&#xff1f; "我们公司最近接了一个项目&#xff0c;是为一家在全国许多城市都有分销机构的大公司做办公管理系统&#xff0c;总部有人力资源、财务、运营等部门。" "这是很常见的OA系统&#xff0c;需求分析好的话&#xff0…

CTK插件框架学习-服务工厂(06)

CTK插件框架学习-信号槽(05)https://mp.csdn.net/mp_blog/creation/editor/137240105 一、服务工厂定义 注册插件时使用服务工厂注册&#xff0c;使用getService根据调用者插件资源文件内容获取在服务工厂内的对应实现在服务工厂中可以知道是哪个插件正在调用服务工厂懒汉模式…

Day5-Hive的结构和优化、数据文件存储格式

Hive 窗口函数 案例 需求&#xff1a;连续三天登陆的用户数据 步骤&#xff1a; -- 建表 create table logins (username string,log_date string ) row format delimited fields terminated by ; -- 加载数据 load data local inpath /opt/hive_data/login into table log…

开源免费的多功能PDF工具箱

它支持修改PDF、编辑PDF书签、导出PDF书签、导入书签、生成、合并、拆分、提取页面内容、提取图片、OCR 功能介绍: 修改PDF信息&#xff1a;修改文档属性、页码编号、页面链接、页面尺寸&#xff1b;删除自动打开网页等动作&#xff0c;去除复制及打印限制&#xff1b;设置阅读…

别再抱怨学鸿蒙没方向了! 这鸿蒙全栈(南北双向)开发学习路线收藏好!

在互联网技术不断发展的现在&#xff0c;鸿蒙操作系统的出现标志着是能技术领域的一次重大突破&#xff0c;鸿蒙作为华为推出的一代操作系统&#xff0c;鸿蒙不仅达代表了自主创新的力量&#xff0c;还因为独特的分布式架构和全场景适配能力而备受关注。随着鸿蒙生态的不断完善…

2024.4.7周报

摘要 在本周阅读的文献中&#xff0c;提出了基于Transformer的GAN模型&#xff0c;GAN的生成器和鉴别器&#xff0c;都是基于Transformer的编码器架构构建的&#xff0c;通过处理图像的方式处理时间序列数据作为该模型的输入。该模型能够生成各种长度的多维时间序列数据&#…