使用LangChain和Neo4j快速创建RAG应用

大家好,Neo4j 通过集成原生的向量搜索功能,增强了其对检索增强生成(RAG)应用的支持,这标志着一个重要的里程碑。这项新功能通过向量索引搜索处理非结构化文本,增强了 Neo4j 在存储和分析结构化数据方面的现有优势,进一步巩固了其在存储和分析结构化数据方面的领先地位。

本文将详细介绍如何利用 Neo4j Desktop(本地版)和 Neo4j Aura(云服务版)来存储向量索引,并构建一个基于纯文本数据的 RAG 应用。

1.云服务部署

要使用基于云的 Neo4j Aura,需要按照以下步骤操作:

首先,点击链接创建一个实例(https://neo4j.com)。在设置过程中,系统会提示输入默认的用户名(neo4j)和实例的密码。请务必记下这个密码,因为设置后将无法再次查看。

创建账户后,会看到这样的界面:

图片

实例启动并运行后,接下来的任务是生成嵌入向量并将其存储。这里采用OpenAI的嵌入技术,这需要一个OPENAI_API_KEY。

为了将这些嵌入向量上传到Neo4j Aura实例,需要准备好以下环境变量:NEO4J_URI(Neo4j实例的URI)、NEO4J_USERNAME(用户名)和NEO4J_PASSWORD(密码)。

使用LangChain的WikipediaLoader功能,直接从Wikipedia网页中导入文章内容。

然后,将文章拆分成多个段落,并去除所有元数据,因为我们不需要存储这些信息。

import os
from langchain.vectorstores import Neo4jVector
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.document_loaders import WikipediaLoader
from langchain.text_splitter import CharacterTextSplitter
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough

# OPENAI API 密钥
os.environ["OPENAI_API_KEY"] = "sk-G7F8rdGxxXOWegj5nxxx3BlbkFJj7AuFUP5yyyAKKxSVTGQw"
# neo4j 凭证
NEO4J_URI="neo4j+s://9cb33544.databases.neo4j.io"
NEO4J_USERNAME="neo4j"
NEO4J_PASSWORD="rexxxJJOzDt4kjaaKgM_VyWUdT9GE4hNBXXGMNubg"

# 加载数据和分块
# 读取 Wikipedia 文章
raw_documents = WikipediaLoader(query="Leonhard Euler").load()
# 定义分块策略
text_splitter = CharacterTextSplitter.from_tiktoken_encoder(
    chunk_size=1000, chunk_overlap=20
)
# 分块文档
documents = text_splitter.split_documents(raw_documents)

# 从元数据中移除摘要
for d in documents:
    del d.metadata['summary']

以下代码片段可将嵌入向量导入 Neo4j 实例:

# 实例化 Neo4j 向量
neo4j_vector = Neo4jVector.from_documents(
    documents,
    OpenAIEmbeddings(),
    url=NEO4J_URI,
    username=NEO4J_USERNAME,
    password=NEO4J_PASSWORD
)

要在 Neo4j Aura 中访问和检查嵌入向量,需点击界面上的打开图标,会在浏览器中新开一个标签页。在这个新标签页中,可以查看到块和向量索引的详细信息。我们共有56个块,在系统中被识别为节点。此外,还可以在这个标签页中查看每个块对应的嵌入向量及其具体细节。

图片

向量检索

这段代码片段通过使用 Neo4jVector 对象并进行相似性搜索,帮助检索与查询“Euler 在哪里长大?”相关的前 4 个相关块。这段代码默认采用余弦相似性方法来识别和排序向量之间的相似度。

query = "Where did Euler grow up?"
results = neo4j_vector.similarity_search(query=query, k=4)
print(results)

# 检索到的四个文档
# [Document(page_content='== Early life ==\nLeonhard Euler was born on 15 April 1707, in Basel to Paul III Euler, a pastor of the Reformed Church, and Marguerite (née Brucker), whose ancestors include a number of well-known scholars in the classics. He was the oldest of four children, having two younger sisters, Anna Maria', metadata={'title': 'Leonhard Euler', 'source': 'https://en.wikipedia.org/wiki/Leonhard_Euler'}), ...]

创建链

我们构建了一个名为final_chain的处理链,旨在高效地处理问题并生成答案。这个链的工作原理是:首先,它接收并传递上下文信息给Neo4jVector retriever,以便从Neo4j数据库中检索相关的向量。随后,链会利用一个OpenAI模型(版本为gpt-4-1106-preview)处理接收到的提示。最终,通过一个解析器对模型的输出进行处理,以提炼出精确的答案。final_chain的设计实现了在特定上下文中对问题的智能处理和答案生成,提高了整个操作的自动化和效率。

prompt = ChatPromptTemplate.from_template(
    """Answer the question based only on the context provided.
    
    Context: {context}
    
    Question: {question}"""
)

# 创建一个 lambda 函数将上下文传递给 Neo4jVector retriever
context_to_retriever = lambda x: x["question"]

# 创建链,将上下文赋值给 Neo4jVector retriever
final_chain = (
    RunnablePassthrough.assign(context=context_to_retriever, target=lambda x: neo4j_vector)
    | prompt
    | ChatOpenAI(model="gpt-4-1106-preview")
    | StrOutputParser()
)

result = final_chain.invoke({'question': query})

# 最终结果
print(result)
# Euler 在瑞士巴塞尔长大。

2.本地部署

如果想在本地的Neo4j Desktop中存储嵌入向量,可以直接在本地环境中运行该应用。操作起来非常简单,只需对凭证信息进行更新,其余的步骤则无需更改。

具体来说,需要分别为数据库和数据库管理系统设置用户名和密码。完成这些设置后,就可以在本地的Neo4j Desktop上顺利地执行应用程序了。

NEO4J_URI="bolt://localhost:7687"
NEO4J_USERNAME="neo4j"
NEO4J_PASSWORD="newpassword"

其余部分与上述相同。

3.总结

综上所述,Neo4j 通过整合其内置的向量搜索功能,显著提升了对检索增强生成(RAG)应用的支持能力。这不仅加强了其在传统结构化数据分析方面的优势,还使其能够更有效地处理非结构化文本数据。本文详细介绍了如何利用Neo4j Aura和Neo4j Desktop来存储向量索引,并在LangChain框架的辅助下,构建出高效的RAG应用。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【MYSQL】一颗B+树可以保存多少条数据

引言 事万物都有自己的单元体系,若干个小单体组成一个个大的个体。就像拼乐高一样,可以自由组合。所以说,如果能熟悉最小单元,就意味着我们抓住了事物的本事,再复杂的问题也会迎刃而解。 存储单元 存储器范围比较大…

虚拟资源在线交易服务平台源码 线上虚拟商品交易平台搭建

在信息爆炸的时代,虚拟资源、素材、源码系统等等以其独特的魅力,逐渐成为人们日常生活和工作中不可或缺的一部分。如何高效地获取、管理和交易这些虚拟资源,分享一款虚拟资源在线交易服务平台源码,轻松搭建线上虚拟商品交易平台&a…

本来还挺喜欢……

前阵子买了个天空星开发板,到手之后发觉不对劲。 之前我们玩玩开发板都是用的面包板的,就算是ESP那种比较宽的板子用两个面包板拼一下也勉强可以用。 但是天空星它的引脚是分为两组,每组有两排,如果我们还是直接使用面包板的话&a…

【JVM】从可达性分析,到JVM垃圾回收算法,再到垃圾收集器

《深入理解Java虚拟机》[1]中,有下面这么一段话: 在JVM的各个区域中,如虚拟机栈中,栈帧随着方法的进入和退出而有条不紊的执行者出栈和入栈操作。每一个栈帧中分配多少内存基本上是在类结构确定下来时就已知的(尽管在…

C++--String类

系列文章目录 文章目录 目录 系列文章目录 文章目录 前言 一、为什么要学习string 1.c语言的字符串 2.OJ上的使用 二、string类的接口介绍 1.string简介 2.string构造成员函数 3.operator函数 4.string容器size和length 5.重载operator[]和引用返回的意义 5.1 oper…

如何开通微软必应bing国内竞价广告账户?

微软必应Bing作为全球第二大搜索引擎,凭借其特有的用户群和市场定位,为中国广告主开辟了一片潜力无限的蓝海市场。云衔科技通过专业实力,为广告主提供全方位支持,从开户到代运营,助力企业扬帆起航。 一、微软必应bing…

百度云防护502 Bad Gateway原因总结和处理方法

最近,随着原百度云加速用户新接入百度云防护后,很多站长反馈网站打不开,出现了502 Bad Gateway的情况。 为此,百度云这里给大家总结下,出现502的大概几个原因: 1.服务器防火墙拦截了百度云防护的IP节点请求…

(docker)进入容器后如何使用本机gpu

首次创建容器,不能直接使用本机gpu 在系统终端进行如下配置: 1.安装NVIDIA Container Toolkit 进入Nvidia官网Installing the NVIDIA Container Toolkit — NVIDIA Container Toolkit 1.15.0 documentation,安装NVIDIA Container Toolkit …

红黑树(RBTree)认识总结

一、认识红黑树 1.1 什么是红黑树? 红黑树是一种二叉搜索树,与普通搜索树不同的是,在每个节点上增加一个“颜色”变量 —— RED / BLACK 。 通过对各个节点颜色的限制,确保从 根 到 NIL ,没有一条路径会比其他路径长出…

R语言软件安装及配置

1、下载 网址:www.r-project.org 1.1 下载R 选择download R 选择清华源进行下载 根据自己系统情况下载,我选择windows系统。 先选择base。 选择最新的版本下载。 1.2 下载RTools 下载好后,返回,选择RTools进入后,选…

替换spring-boot中的组件版本

spring-boot是一个用于简化开发的框架,引入spring-boot后会自动包含spring框架,通过引入xxx-start来完成指定组件的功能。比如: spring-boot-starter-web(嵌入 Tomcat 和 web 开发需要的 servlet 和 jsp 支持)spring-boot-starter-data-jpa(…

python EEL应用程序的启动过程

EEL 启动流程 初始化 EEL (eel.init()): 设定静态文件目录,通常是包含 HTML、CSS、JavaScript 等文件的目录。扫描指定目录下的 JavaScript 文件,寻找通过 eel.expose() 暴露的函数。 启动 Web 服务器 (eel.start()): 基于 Bottle 框架启动一个轻量级的 …

2024年3月 青少年等级考试机器人理论真题四级

202403 青少年等级考试机器人理论真题四级 第 1 题 Arduino UNO/Nano主控板,通过按键开关切换高低电平,电路搭设如下,该电路属于?( ) A:外部上拉电阻电路 B:外部下拉电阻电路 C&a…

防火墙远程桌面端口号修改,通过防火墙修改远程桌面的端口号详细操作步骤

使用防火墙修改远程桌面的端口号是一项涉及系统安全和网络配置的重要任务。 以下是详细的操作步骤,旨在确保您能够安全、有效地完成此操作: 一、准备阶段 1. 了解默认端口号:远程桌面端口号通常是3389,这是一个用于远程访问和控…

五款商用加密软件推荐 | 商用加密软件排行榜

没有网络安全就没有国家安全。信息安全是国家经济社会稳定运行,广大人民群众利益的保障。 对于公司来讲,数据安全同样是企业可持续发展的重要保障,防止内部核心数据、知识产权的泄露是企业数据安全的重要工作。下面是五款企业常用的加密软件…

如何查看centos7是否安装nginx

要查看 CentOS 7 系统上是否安装了 Nginx,您可以使用多种方法来检查。以下是一些常见的方法: 通过 RPM 包管理器查询 在 CentOS 系统上,可以使用 RPM 包管理器来查询已安装的软件包。要查看是否安装了 Nginx,您可以在终端中运行以…

Spring框架概述

目录 1. Spring框架的起源 2. Spring框架的构成 3. Spring的发展历程 4. Spring的开发环境 4.1. Maven安装与配置 (1)Maven的下载与安装 (2)配置Maven的环境变量 (3)本地仓库的配置 (4…

使用Baidu Comate五分钟 , 工作时间摸鱼8小时

Baidu Comate:引领智能编码新时代 文章目录 Baidu Comate:引领智能编码新时代一、明日工具,今日领先——百度Comate智能编码助手二、万变不离其宗——适配场景需求三、功能研究3.1 指挥如指掌——指令功能3.2 助手增援——插件功能使用3.3 实…

Raft论文阅读笔记+翻译:In Search of Understandable Consensus Algorithm

In Search of Understandable Consensus Algorithm 摘要 Raft是一种管理复制日志的共识算法。它产生与(多)Paxos等效的结果,并且与Paxos一样高效,但其结构与Paxos不同。这使得Raft比Paxos更易理解,也为构建实际系统提供…

VS2022 错误 LNK2001 无法解析的外部符号

错误 LNK2001 无法解析的外部符号 “private: static struct std::once_flag ThreadPool::flag_” (?flag_ThreadPool0Uonce_flagstdA) STL D:\VS2019\STL\源.obj 1 错误原因 :链接器无法解析 ThreadPool::flag_ 这个静态成员变量。这通常是因为静态成员变量在声明…