使用LangChain编写图检索查询实现RAG

news2024/10/5 23:31:15

大家好,检索增强生成(Retrieval-Augmented Generation,简称RAG)是一种先进的人工智能技术,通过整合大型语言模型(LLM)的内部知识和外部权威数据源,来提升生成式AI模型的表现。

本文将介绍如何有效编写检索查询,进一步提升LLM的输出质量,使用Python和Langchain框架(专为与LLM互动而量身打造的平台)来详细阐述这一过程。通过这种方式,开发者能够更精确地从大量数据中提取所需信息,从而在各种应用场景中实现更高质量的AI生成内容。

1. 数据集

首先了解一下这里的数据集,使用来自EDGAR(电子数据收集、分析和检索系统)数据库的SEC(证券交易委员会)文件(https://corporatefinanceinstitute.com/resources/valuation/sec-filings/)。这些文件极为宝贵,详细记录了上市公司的财务状况、经营活动和关键信息,如财务报表和重要披露事项。

图片

来自EDGAR数据库的SEC文件的图形数据模型

具体来说,这些数据集包含了各公司提交给SEC的财务表格,如10K和13表格等。这些公司由不同的管理层持股,分布在多个不同的行业中。

为了便于处理,这里将这些财务表格中的文本内容细分为较小的块,并为每个文本块创建向量嵌入,这些嵌入存储在CHUNK节点中。在执行向量搜索查询时,会对比查询向量与CHUNK节点的向量,以此来定位和提取最为相似的文本块。这种方法能够有效地从大量复杂的财务信息中提取有价值的数据。

2. 构建检索查询

在构建检索查询的过程中,首先利用相似性搜索查询得到的结果,即每个相关节点(node)及其对应的相似度得分(score)。将这些结果作为输入,进一步执行检索查询。这一步骤目的是深入挖掘与这些节点相连的数据,从而获取更完整的信息。

为了实现这一目标,检索查询不仅要返回原始的节点和得分,还需要包含文本内容(text)和附加的元数据(metadata),这些元数据可以提供关于数据项的更多背景信息。通过这种方式,能够确保检索查询的结果既准确又有深度,为用户提供全面的数据视角。

retrieval_query = """
  WITH node AS doc, score as similarity
  # 这里还有一些查询
  RETURN <something> as text, similarity as score,
    {<something>: <something>} AS metadata
"""

框架已经建立,现在需要明确想要从中提取的信息。在相似性搜索过程中,数据模型会识别出CHUNK节点,这些节点在查询中以node AS doc的形式出现。由于单个文本块(CHUNK)本身并不包含丰富的上下文信息,我们的目标是获取与这些CHUNK节点相连接的Form、Person、Company、Manager和Industry等实体节点。为了更全面地理解文本内容,还希望包括与每个CHUNK节点相邻的文本块,即前一个和后一个文本块(通过NEXT关系连接)。

此外,计划提取每个块及其相应的相似性得分,但为了提高效率和针对性,决定只聚焦于相似度最高的前5个块。这样的策略可以帮助更精确地筛选出最相关的信息,同时减少不必要的数据处理。通过这种方法,能够构建一个既精确又高效的检索系统,为用户提供最有价值的数据。

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

我们的目标是筛选出与查询最为相似的五个文本块,并在子查询中提取这些块的前后文本。为了实现这一点,对RETURN语句进行了调整,以便将相邻的文本块内容合并到一个名为text的变量中。在这个过程中,利用了coalesce()函数来确保即使在缺少前一个或后一个文本块的情况下,也能够平滑地处理这些空值,仅返回一个空字符串,从而保证了查询结果的完整性和一致性。

来添加更多的上下文,以提取图中的其他相关实体。

retrieval_query = """
  WITH node AS doc, score as similarity
  ORDER BY similarity DESC LIMIT 5
  CALL { WITH doc
    OPTIONAL MATCH (prevDoc:Chunk)-[:NEXT]->(doc)
    OPTIONAL MATCH (doc)-[:NEXT]->(nextDoc:Chunk)
    RETURN prevDoc, doc AS result, nextDoc
  }
  WITH result, prevDoc, nextDoc, similarity
  CALL {
    WITH result
    OPTIONAL 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 managers
    WHERE companyName IS NOT NULL OR managers > ""
    WITH result, companyName, managers
    ORDER BY result.score DESC
    RETURN 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能够灵活地处理可能存在或缺失的节点。对于管理者信息,将其累积到一个列表中,并确保公司名称和管理者列表在返回结果时非空。

尽管目前没有利用得分来提供具体价值,但它可以作为一个有用的指标,记录文档被检索的频次。因此根据得分对结果集进行排序,以便对检索频率有一个直观的认识。

由于查询结果只返回textscoremetadata三个属性,需要将额外的信息,如documentIdcompanymanagers,整合到metadata字典中。这样,最终的RETURN语句将包含所有必要的信息,确保返回的数据既全面又结构化。

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

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

相关文章

网站访问502,网站服务器崩溃,比较常见几个的原因

其实&#xff0c;配置再好的服务器也难免在使用过程中出现一些故障&#xff0c;造成宕机。 服务器一旦出现故障&#xff0c;影响到用户实时访问网站&#xff0c;造成用户流失&#xff0c;如果在企业的销售高峰期&#xff0c;则将直接影响到商业利润&#xff0c;而且不仅影响外…

RUST语言流控制语句使用示例

1.判断语句 单条件判断: let mut x128;//声明一个32位整数x512;//修改变量原来的值为新值//如果 ... 否则//判断变量x是否大于256if x>256 {println!("x>256,x{}",x);}else {println!("x<256,x{}",x);}let is_ok:bool true;//rust中不用()if i…

5.Python数据分析—Pandas数据结构详讲

5.Python数据分析—Pandas数据结构详讲 摘要个人简介简介Series定义和特点创建方法属性和方法 DataFrame定义和特点创建方法数据获取和操作 索引对象种类和应用作用和管理 摘要 Pandas是一个开源的Python数据分析库&#xff0c;提供了高性能、易用的数据结构和数据分析工具。它…

突破校园网限速:使用 iKuai 多拨分流负载均衡 + Clash 代理(内网带宽限制通用)

文章目录 1. 简介2. iKuai 部署2.1 安装 VMware2.2 安装 iKuai(1) 下载固件(2) 安装 iKuai 虚拟机(3) 配置 iKuai 虚拟机(4) 配置 iKuai(5) 配置多拨分流 2.3 测试速度 3. Clash 部署3.1 准备工作(1) 配置磁盘分区(2) 安装 Docker(3) 安装 Clash(4) 设置代理 1. 简介 由于博主…

openwrt开发包含路由器基本功能的web问题记录

1.这里的扫描怎么实现的先找一些luci代码&#xff0c;在openwrt21版本后&#xff0c;luci用js替换了lua写后台&#xff0c;先找一些代码路径 在openrwt15这部分代码是在这个目录下 feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_network/wifi_join.htm 里面包含…

现代化个人博客系统 ModStartBlog v9.2.0

ModStart 是一个基于 Laravel 模块化极速开发框架。模块市场拥有丰富的功能应用&#xff0c;支持后台一键快速安装&#xff0c;让开发者能快的实现业务功能开发。 系统完全开源&#xff0c;基于 Apache 2.0 开源协议。 功能特性 丰富的模块市场&#xff0c;后台一键快速安装会…

JavaScript基础代码练习之翻转数组

一、要求将给定数组 [red, green, blue, pink, purple] 的内容反转存放&#xff0c;并将结果输出到控制台。 二、编写代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" cont…

Windows 中的硬链接、软连接、快捷方式和普通文件

在 Windows 中&#xff0c;文件可以有四种类型&#xff1a; 硬链接软连接快捷方式普通文件 当我们正常创建一个文件时&#xff0c;这个文件就是普通文件 echo hello > a.txt (Get-Item "a.txt").LinkType -eq $null # 输出 True然后我们可以为其添加一个软连接…

计算机视觉之三维重建(6)---多视图几何(上)

文章目录 一、运动恢复结构问题&#xff08;SfM&#xff09;二、欧式结构恢复2.1 概述2.2 求解2.3 欧式结构恢复歧义 三、仿射结构恢复3.1 概述3.2 因式分解法3.3 总结3.4 仿射结构恢复歧义 一、运动恢复结构问题&#xff08;SfM&#xff09; 1. 运动恢复结构问题&#xff1a;通…

Stable Diffusion扩散模型推导公式的基础知识

文章目录 1、独立事件的条件概率2、贝叶斯公式、先验概率、后验概率、似然、证据3、马尔可夫链4、正态分布 / 高斯分布5、重参数化技巧6、期望7、KL散度 、高斯分布的KL散度8、极大似然估计9、ELBO :Evidence Lower Bound10、一元二次方程 1、独立事件的条件概率 A 和 B 是两个…

基于lora技术微调Gemma(2B)代码实践

一、前置条件 获得模型访问权&#xff0c;选择Colab运行时&#xff0c;配置训练环境。 先在Kaggle上注册&#xff0c;然后获得Gemma 2B 的访问权&#xff1b; 然后在Google colab 配置环境&#xff0c;主要是GPU的选择&#xff0c;免费的是T4&#xff0c;建议采用付费的A100…

【JVM基础】JVM入门,详讲JVM

组建团队中......加v备注进群个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名大三在校生&#xff0c;喜欢AI编程&#x1f38b; &#x1f43b;‍❄️个人主页&#x1f947;&#xff1a;落798. &#x1f43c;个人WeChat&#xff1a;hmmwx53 &#x1f54a;️系列专栏…

[蓝桥杯练习题]出差

一道DJ题,重要的是隔离时间,把隔离时间加在边权上即可 现实生活的题大多都是无向图建图,需要边的两端点各自上邻接表和相同权重 #include<bits/stdc.h> using namespace std; #define ll long long const int N1005; const int M10005; struct edge{int to;ll w;edge(int…

电商好评语整理与优化:让繁琐工作变得轻松高效

在电子商务领域&#xff0c;客户的好评是店铺信誉和产品质量的重要体现。然而&#xff0c;整理和优化这些好评语却是一项既繁琐又需要细致耐心的工作。本文将探讨如何高效地进行电商好评语的筛选、分类和优化&#xff0c;让这一工作变得更加轻松和高效。 一、明确整理目的 在开…

从零开始学RSA加密解密过程

因为文字太过晦涩难懂&#xff0c;下面以图示的方法来理解RSA加密解密的过程 以上过程中因为HACK无法得到p,q信息&#xff0c;也就是无法计算出d , 导致了无法解密 c 得到 m (n,e) 公钥 (d,n) 私钥 (p,q,n,e) 生成的加密必要信息 必要的公式 c ≡ me mod n ----------->…

单片机家电产品学习记录--IO推挽输出

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 单片机家电产品–IO推挽输出 前言 记录学习单片机家电产品内容 已转载记录为主 一、知识点 1 单片机IO口科普&#xff1a;推挽输出、开漏输出详解 推挽输出既可以输出低…

Android 性能优化之黑科技开道(一)

1. 缘起 在开发电视版智家 App9.0 项目的时候&#xff0c;发现了一个性能问题。电视系统原本剩余的可用资源就少&#xff0c;而随着 9.0 功能的进一步增多&#xff0c;特别是门铃、门锁、多路视频同屏监控后等功能的增加&#xff0c;开始出现了卡顿情况。 经过调研分析发现有…

OpenHarmony实战:Makefile方式组织编译的库移植

以yxml库为例&#xff0c;其移植过程如下文所示。 源码获取 从仓库获取yxml源码&#xff0c;其目录结构如下表&#xff1a; 表1 源码目录结构 名称描述yxml/bench/benchmark相关代码yxml/test/测试输入输出文件&#xff0c;及测试脚本yxml/Makefile编译组织文件yxml/.gitat…

C语言:文件操作(一)

目录 前言 1、为什么使用文件 2、什么是文件 2.1 程序文件 2.2 数据文件 2.3 文件名 3、文件的打开和关闭 3.1 文件指针 3.2 文件的打开和关闭 结&#xff08;一&#xff09; 前言 本篇文章将介绍C语言的文件操作&#xff0c;在后面的内容讲到&#xff1a;为什么使用文…

2024-04-03 NO.4 Quest3 手势追踪抓取物体

文章目录 1 手势抓取方式1.1 Hand Grab1.2 Touch Hand Grab1.3 Distance Hand Grab 2 HandGrabExamples 示例场景2.1 Interactor 对象2.2 Interactable 对象2.2.1 父子结构2.2.2 “Hand Grab lnteractable” 脚本2.2.3 “Move Towards Target Provider” 脚本2.2.4 其他 Moveme…