利用 LangChain 和 Neo4j 向量索引,构建一个RAG应用程序

2024-01-21

Neo4j 在5.11版本中将向量搜索功能完全集成到 Neo4j AuraDB 和 Neo4j 图数据库中。随后对 Neo4j 向量检索的全面支持也被集成到了 LangChain 库中。

Neo4j 向量检索已成为检索增强生成 (RAG) 应用程序领域的关键工具,特别是在处理结构化和非结构化数据方面。LangChain 库是构建大型语言模型 (LLM) 应用程序的重要框架。

这种集成有助于将数据有效地摄取到 Neo4j Vector Index 中,简化了 RAG 应用程序中的数据摄取和查询,并能够构建有效的 RAG 应用程序,通过利用结构化和非结构化数据提供实时、准确且与上下文相关的答案。它支持数据摄取和读取工作流程,对于使用 RAG 架构开发问答聊天机器人特别有用。

这篇文章将演示如何利用 LangChain 将数据有效摄取到 Neo4j 向量索引中,然后构建一个简单而有效的 RAG 应用程序。

图片

本教程将包含以下步骤:

  • 使用 LangChain 文档阅读器阅读维基百科文章

  • 将文本分块

  • 将文本存储在 Neo4j 中并使用新添加的向量索引对其进行索引

  • 实施问答工作流程以支持 RAG 应用程序。

用通俗易懂方式讲解系列

  • 用通俗易懂的方式讲解:自然语言处理初学者指南(附1000页的PPT讲解)
  • 用通俗易懂的方式讲解:NLP 这样学习才是正确路线
  • 用通俗易懂的方式讲解:28张图全解深度学习知识!
  • 用通俗易懂的方式讲解:不用再找了,这就是 NLP 方向最全面试题库
  • 用通俗易懂的方式讲解:实体关系抽取入门教程
  • 用通俗易懂的方式讲解:灵魂 20 问帮你彻底搞定Transformer
  • 用通俗易懂的方式讲解:大模型算法面经指南(附答案)
  • 用通俗易懂的方式讲解:十分钟部署清华 ChatGLM-6B,实测效果超预期
  • 用通俗易懂的方式讲解:内容讲解+代码案例,轻松掌握大模型应用框架 LangChain
  • 用通俗易懂的方式讲解:如何用大语言模型构建一个知识问答系统
  • 用通俗易懂的方式讲解:最全的大模型 RAG 技术概览

技术交流群

前沿技术资讯、算法交流、求职内推、算法竞赛、面试交流(校招、社招、实习)等、与 10000+来自港科大、北大、清华、中科院、CMU、腾讯、百度等名校名企开发者互动交流~

我们建了NLP面试与技术交流群, 想要进交流群、需要源码&资料、提升技术的同学,可以直接加微信号:mlc2060。加的时候备注一下:研究方向 +学校/公司+CSDN,即可。然后就可以拉你进群了。

方式①、添加微信号:mlc2060,备注:技术交流
方式②、微信搜索公众号:机器学习社区,后台回复:技术交流

在这里插入图片描述

01 Neo4j 环境设置

我们需要设置 Neo4j 5.11 或更高版本才能完成本文章中的示例。最简单的方法是在 Neo4j Aura 上启动一个免费实例,它提供 Neo4j 数据库的云实例。或者,我们还可以通过下载 Neo4j Desktop 应用程序并创建本地数据库实例来设置 Neo4j 数据库的本地实例。

首先安装 langchain openai wikipedia tiktoken neo4j 包

pip install langchain openai wikipedia tiktoken neo4j

然后导入配置

import os

from langchain.vectorstores.neo4j_vector import Neo4jVector
from langchain.document_loaders import WikipediaLoader
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.text_splitter import CharacterTextSplitter

os.environ['OPENAI_API_KEY'] = "API_KEY"

02 阅读和分块维基百科文章

我们将从阅读和分块维基百科文章开始。这个过程非常简单,因为 LangChain 集成了维基百科文档加载器以及文本分块模块。

from langchain.document_loaders import WikipediaLoader
from langchain.text_splitter import CharacterTextSplitter

# Read the wikipedia article
raw_documents = WikipediaLoader(query="Leonhard Euler").load()
# Define chunking strategy
text_splitter = CharacterTextSplitter.from_tiktoken_encoder(
    chunk_size=1000, chunk_overlap=20
)
# Chunk the document
documents = text_splitter.split_documents(raw_documents)

# Remove summary from metadata
for d in documents:
    del d.metadata['summary']

由于 Neo4j 是一个图形数据库,使用有关 Leonhard Euler 的维基百科文章作为示例是比较合适的。接下来,我们使用 tiktoken 文本分块模块,该模块使用 OpenAI 制作的分词器,将文章分成具有1000个标记的块。我们可以在本文中了解有关文本分块策略的更多信息。

LangChain WikipediaLoader 默认为每个块添加一个摘要。我认为添加的摘要有点多余。例如,如果我们使用向量相似性搜索来检索前三个结果,则摘要将重复三次。因此,我决定将其从数据集中删除。

03 使用 Neo4j 存储文本并为其建立索引

LangChain 可以轻松地将文档导入 Neo4j 并使用新添加的向量索引对其进行索引,官方尽可能地使其用户友好,这意味着我们无需了解有关 Neo4j 或图形的任何知识即可使用它。另一方面,官方为更有经验的用户提供了几个自定义选项,这些选项官方都会出单独的文章进行介绍。

Neo4j 向量索引被包装为 LangChain 向量存储,因此遵循用于与其他向量数据库交互的语法。

from langchain.vectorstores import Neo4jVector
from langchain.embeddings.openai import OpenAIEmbeddings

# Neo4j Aura credentials
url="neo4j+s://.databases.neo4j.io"
username="neo4j"
pd="<insert password>"

# Instantiate Neo4j vector from documents
neo4j_vector = Neo4jVector.from_documents(
    documents,
    OpenAIEmbeddings(),
    url=url,
    username=username,
    password=pd
)

该 from_documents 方法连接到 Neo4j 数据库,导入并嵌入文档,并创建向量索引。默认情况下,数据将表示为“Chunk”节点。如前所述,我们可以自定义数据的存储方式以及返回哪些数据。不过,这将在下面的文章中讨论。

如果我们已有包含填充数据的现有向量索引,则可以使用该 from_existing_index 方法。

04 向量相似度搜索

我们将从简单的向量相似性搜索开始,以验证一切是否按预期工作。

query = "Where did Euler grow up?"

results = neo4j_vector.similarity_search(query, k=1)
print(results[0].page_content)

结果如下:

图片

LangChain 模块使用指定的嵌入函数(本例中为 OpenAI)嵌入问题,然后通过比较用户问题和索引文档之间的余弦相似度来找到最相似的文档。

Neo4j 向量索引还支持欧几里得相似度度量以及余弦相似度。

05 LangChain 问答工作流程

LangChain 的好处是它支持仅使用一两行代码的问答工作流程。例如,如果我们想要创建一个问答系统,根据提供的上下文生成答案,同时还提供它用作上下文的文档,我们可以使用以下代码。

from langchain.chat_models import ChatOpenAI
from langchain.chains import RetrievalQAWithSourcesChain

chain = RetrievalQAWithSourcesChain.from_chain_type(
    ChatOpenAI(temperature=0),
    chain_type="stuff",
    retriever=neo4j_vector.as_retriever()
)

query = "What is Euler credited for popularizing?"

chain(
    {"question": query},
    return_only_outputs=True,
)

结果如下:

图片

正如我们所看到的,LLM 根据提供的维基百科文章构建了准确的答案,但也返回了它使用的源文档。我们只需要一行代码就可以实现这一点。

在测试代码时,我注意到并不总是返回源代码。这里的问题不是 Neo4j Vector 实现,而是 GPT-3.5-turbo。有时,它不听指令返回源文档。但是,如果我们使用 GPT-4,问题就会消失。

最后,为了复制 ChatGPT 界面,我们可以添加一个内存模块,该模块还为 LLM 提供对话历史记录,以便我们可以提出后续问题。同样,我们只需要两行代码。

from langchain.chains import ConversationalRetrievalChain
from langchain.memory import ConversationBufferMemory

memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True)
qa = ConversationalRetrievalChain.from_llm(
    ChatOpenAI(temperature=0), neo4j_vector.as_retriever(), memory=memory)

现在我们来测试一下。

print(qa({"question": "What is Euler credited for popularizing?"})["answer"])

结果如下:

图片

现在是一个后续问题。

print(qa({"question": "Where did he grow up?"})["answer"])

结果如下:

图片

总结

向量索引是 Neo4j 的一个重要补充,使其成为处理 RAG 应用程序的结构化和非结构化数据的出色解决方案。希望 LangChain 集成能够简化将向量索引集成到现有或新的 RAG 应用程序中的过程,这样我们就不必担心细节。请记住,LangChain 已经支持生成 Cypher 语句并使用它们来检索上下文,因此我们现在可以使用它来检索结构化和非结构化信息。

参考文献

https://medium.com/neo4j/langchain-library-adds-full-support-for-neo4j-vector-index-fa94b8eab334

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

利用 LangChain 和 Neo4j 向量索引,构建一个RAG应用程序 的相关文章

  • Neo4j Spatial over REST 通过 JAVA API 不起作用(对我来说)

    我正在 Neo4J 上开发 Grails 应用程序 我还想将其导出为 GIS 数据库 查看如何在 GeoServer uDig 中使用 neo4j 的示例 似乎空间集成仅通过嵌入式 neo4j 数据库进行 有谁知道是否可以进行设置 以便我的
  • Cypher - 删除具有特定值的所有属性

    我正在寻找一种方法来删除数据库中任何节点的每个属性 使用 Cypher 具有特定值 Context我从关系表中获取了一个包含大量 NULL 值的 csv 批量文件 LOAD CSV将它们作为价值观 删除它们 用 csv 文件中的空 替换它们
  • 无论如何,在一个 neo4j 实例上有多个数据库?

    从关系数据库的思维方式来看 每个 Neo4j 实例只有一个图形数据库似乎很奇怪 我们的想法是从根开始创建多个子图吗 Thanks 根 节点的概念正在消失 这存在很多问题 其中大部分与节点密度有关 我相信您问题的核心在于数据库设计 以及拥有多
  • Neo4j 2 和 Java 8

    Java 8 将于本周发布 当将 Neo4j 1 9 与 Java 7 一起使用时 我们看到弹出警告 提示仅支持 6 但我们对 1 9 7 组合从未遇到任何问题 我知道 Neo4j 2 不能使用低于 Java 7 的任何东西 但是 Neo4
  • Java 中 Cypher 查询的结果检索速度慢 - Neo4j 2.0

    我的结果检索速度出奇地慢ResourceIterator
  • 有没有办法对 Neo4j 数据进行分片和复制?

    我正在考虑为我正在从事的一些新项目选择 Neo4j 对于给定的数据需求 本质上基于图形 neo4j 非常适合 并且快速原型为我提供了良好的响应时间 我想了解的是如何扩展 neo4j 部署 具体来说 如何跨 neo4j 部署对数据进行分片 由
  • org.xml.sax.SAXParseException:src-resolve:无法将名称“repository:auditing-attributes”解析为(n)“属性组”组件

    在项目上运行 Maven 测试时出现以下错误 我正在使用 Spring Data Neo4j 构建一个测试应用程序 java lang IllegalStateException Failed to load ApplicationCont
  • 找不到 Spring MVC Neo4jConfiguration 类

    我正在学习 Spring MVC 我想扩展 Neo4jConfiguration 类 但它不可用 我导入了以下依赖项
  • neo4j 使用选项卡加载 CSV

    我正在尝试使用以下命令加载 csv 并在 neo4j 2 1 0 中创建节点 使用定期提交 从 file c temp listings TXT 加载 CSV AS 行 FIELDTERMINATOR t CREATE p person i
  • Titan 顶点中心索引与 Neo4j 标签

    在接近这个问题时 我试图对这两种技术进行比较 我想知道你们中是否有人已经有处理其中任何一种或两种技术的经验 我主要对处理类似用例时的性能数字感兴趣 这两个概念之间的区别是全局索引和本地索引之间的区别 据我了解 Neo4j顶点标签允许您通过顶
  • Neo4j cpu 卡在 GC 上

    突然间 工作了一个月后 CPU 几乎没有使用 1 到 5 之间 neo4j 服务器在垃圾收集时 cpu 占用率达到 100 我在 ubuntu 4 处理器服务器上运行 neo4j entherprise 2 0 3 未嵌入 这是我的 neo
  • Rails 3 和图形数据库

    在 Postgresql 上运行的 Rails 3 应用程序需要切换到图形数据库才能成长 它们有很多 并且都提供不同类型的 API 主要是 REST 我深受启发talks http nosql mypopescu com post 3429
  • 当属性名称为参数时如何查询属性值?

    通常我们可以查询属性值 例如 Match n Product where n name iPhone X return n 但是 就我而言 我不知道应该匹配哪个属性 但我只知道值 在这种情况下属性名称就变成了一种变量 我想要这样的东西 Ma
  • 使用 Neo4J 和 Spring Data 按 ID 创建关系

    我定义了一个简单的节点对象 如下所示 Node product public class Product Id private String sku Relationship type SOLD BY private Set
  • Bulbflow:neo4jserver Graph 和 neo4jserver Neo4jclient 之间的区别

    我现在正在尝试学习如何连接到 Neo4j 服务器并使用 Python 中的 Bulbflow 在其上运行 Cypher 查询 我不明白的是连接到 neo4j 服务器的两种可能性之间的区别 1 Graph http bulbflow com
  • Neo4j 客户端使用“DateTime?”展开

    我目前正在尝试展开具有 日期时间 的 TravelEdges 列表 但我不断收到以下错误 CypherTypeException 类型不匹配 需要一个地图 但是字符串 2018 05 21T08 38 00 我目前正在使用最新版本的 neo
  • 如何以最佳方式将 SQL 查询转换为 cypher?

    我是 neo4j 的新手 使用 3 0 版本 我有一个巨大的事务数据集 我将其转换为图形模型 我需要将下面的 SQL 查询转换为 cypher create table calc base as select a ticket id tic
  • 带子图聚合的递归查询(任意深度)

    我问了一个问题earlier https stackoverflow com questions 28036055 recursive query with sub graph aggreagation关于沿着图表聚合数量 提供的两个答案效
  • 有没有办法从密码结果中删除 _id _type

    我使用 apoc convert toTree 过程将查询结果转换为树 然后过滤结果以仅获取几个属性 但是 在生成的有效负载中 我得到了两个无法删除的属性 id 和 type 这是我的查询 我应该只获取 prefLabel 和 uri MA
  • 如何禁用 Spring Data Neo4j 的登录

    我从 spring neo4j 收到不需要的查询日志 如下所示 25 08 2018 23 47 07 597 restartedMain INFO o n o d bolt request BoltRequest executeReque

随机推荐

  • 怎么注册微商城?开启微商城之旅

    在这个数字化时代 微商城的出现为商家提供了一个全新的机会 商家企业可以通过微商城来展示和销售自己的产品 而对于一些商家而言 不知道怎么注册微商城 下面给大家做一个简单的分享 第一步 选择合适的微商城搭建工具 在注册微商城之前 首先需要选择一
  • 2024年网络安全十10大发展趋势发布

    2023年网络安全十10大发展趋势发布 近日 中国计算机学会 CCF 计算机安全专委会中 来自国家网络安全主管部门 高校 科研院所 大型央企 民营企业的委员投票评选出2023年网络安全十大发展趋势 福利 趋势一 数据安全治理成为数字经济的基
  • Windows7系统iprop.dll文件丢失问题

    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题 如果是新手第一时间会认为是软件或游戏出错了 其实并不是这样 其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库 这时你可以下载这个iprop d
  • 白帽子如何快速挖到人生的第一个漏洞 | 购物站点挖掘商城漏洞

    本文针对人群 很多朋友们接触安全都是通过书籍 网上流传的PDF 亦或是通过论坛里的文章 但可能经过了这样一段时间的学习 了解了一些常见漏洞的原理之后 对于漏洞挖掘还不是很清楚 甚至不明白如何下手 可能你通过 sql labs 初步掌握了sq
  • 图解python | 字符串及操作

    1 Python元组 Python的元组与列表类似 不同之处在于元组的元素不能修改 元组使用小括号 列表使用方括号 元组创建很简单 只需要在括号中添加元素 并使用逗号隔开即可 tup1 ByteDance ShowMeAI 1997 202
  • 每天10个前端小知识 <Day 5>

    前端面试基础知识题 1 typeof 与 instanceof 有什么区别 typeof与instanceof都是判断数据类型的方法 区别如下 typeof会返回一个变量的基本类型 instanceof返回的是一个布尔值 instanceo
  • 2024年华数杯国际赛B题:光伏发电功率 思路模型代码解析

    2024年华数杯国际赛B题 光伏发电功率 Photovoltaic Power 一 问题描述 中国的电力构成包括传统能源发电 如煤 油和天然气 可再生能源发电 如水电 风能 太阳能和核能 以及其他形式的电力 这些发电模式在满足中国对电力的巨
  • iprtrmgr.dll文件丢失导致程序无法运行问题

    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题 如果是新手第一时间会认为是软件或游戏出错了 其实并不是这样 其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库 这时你可以下载这个iprtrmg
  • 前端基础:回顾es6相关知识

    Author note 题记 ECMAscript is international standard of javascript ECMA 是 js的国际标准版语言 let and const 为什么之前用var现在需要用let cons
  • iPhone16或全系升级8GB内存,支持Wi-Fi 6E!

    随着新的一年到来 苹果下一代机型iPhone 16系列的爆料也越来越充实 越来越详细 从多个爆料中 我们甚至已经都够想象出下一代iPhone的基本雏形 海通国际技术分析师Jeff Pu 为我们带来了新的内容 这位分析师称 iPhone 16
  • Jenkins 插件下载速度慢、安装失败了!我教你怎么解决!

    Jenkins部署完毕 如果不安装插件的话 那它就是一个光杆司令 啥事也做不了 所以首先要登陆管理员账号然后点击系统管理再点击右边的插件管理安装CI CD必要插件 但是问题来了 jenkins下载插件速度非常慢 而且经常提示下载插件失败 真
  • ir50_32.dll文件丢失导致程序无法运行问题

    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题 如果是新手第一时间会认为是软件或游戏出错了 其实并不是这样 其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库 这时你可以下载这个ir50 32
  • 【固定翼飞机】基于最优控制的固定翼飞机着陆控制器设计研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码及文章
  • 深度好文:最全的大模型 RAG 技术概览

    本文是对检索增强生成 Retrieval Augmented Generation RAG 技术和算法的全面研究 对各种方法进行了系统性的梳理 涉及了 RAG 流程中的数据拆分 向量化 查询重写 查询路由等等 在做 RAG 的小伙伴一定知道
  • messages,CentOS 7不收集日志或不存在 /var/log/messages

    var log message var log secure等都不记录了 并且都是空文件 重启机器 reboot 无效 重启日志 systemctl start rsyslog 无效 怀疑空间不足 删除 var log messages 重
  • 图解python | 基础数据类型

    1 Python变量类型 Python基本数据类型一般分为6种 数值 Numbers 字符串 String 列表 List 元组 Tuple 字典 Dictionary 集合 Set 本文详细讲解Python中变量赋值 数据类型以及数据类型
  • 2024年金三银四网络安全考试试题

    2023年金三银四网络安全考试试题 1 关于数据使用说法错误的是 A 在知识分享 案例中如涉及客户网络数据 应取敏感化 不得直接使用 B 在公开场合 公共媒体等谈论 传播或发布客户网络中的数据 需获得客户书面授权或取敏感化 公开渠道获得的除
  • 外包干了3个月,技术退步明显。。。。。

    先说一下自己的情况 本科生 19年通过校招进入广州某软件公司 干了接近4年的功能测试 今年年初 感觉自己不能够在这样下去了 长时间呆在一个舒适的环境会让一个人堕落 而我已经在一个企业干了四年的功能测试 已经让我变得不思进取 谈了2年的女朋友
  • [C++]:11.模拟实现vector

    模拟实现vector 二 模拟实现vector 0 看一看源码SGI 1 vector h 2 stl vector h 1 构造 2 析构函数
  • 利用 LangChain 和 Neo4j 向量索引,构建一个RAG应用程序

    Neo4j 在5 11版本中将向量搜索功能完全集成到 Neo4j AuraDB 和 Neo4j 图数据库中 随后对 Neo4j 向量检索的全面支持也被集成到了 LangChain 库中 Neo4j 向量检索已成为检索增强生成 RAG 应用程