使用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应用。

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

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

相关文章

Zabbix监控中文乱码问题解决方法

一、问题描述 1.查看Zabbix仪表盘 在Zabbix的监控仪表盘界面,字体显示为“方框”,无法查看到具体的性能指标名称。 2.问题分析 Zabbix的web端没有中文字库,导致切换到中文页面,中文成了乱码这个问题,我们最需要把中文…

Vue2 组件通信方式

props/emit props 作用&#xff1a;父组件通过 props 向子组件传递数据parent.vue <template><div><Son :msg"msg" :pfn"pFn"></Son></div> </template><script> import Son from ./son export default {name: …

RAG 场景对Milvus Cloud向量数据库的需求

虽然向量数据库成为了检索的重要方式,但随着 RAG 应用的深入以及人们对高质量回答的需求,检索引擎依旧面临着诸多挑战。这里以一个最基础的 RAG 构建流程为例:检索器的组成包括了语料的预处理如切分、数据清洗、embedding 入库等,然后是索引的构建和管理,最后是通过 vecto…

【计算机毕业设计】springboot河北任丘非物质文化遗产数字化传承

当今社会进入了科技进步、经济社会快速发展的新时代。国际信息和学术交流也不断加强&#xff0c; 计算机技术对经济社会发展和人民生活改善的影响也日益突出&#xff0c;人类的生存和思考方式也产生了变化。传统购物方式采取了人工的管理方法&#xff0c;但这种管理方法存在着许…

第二章 项目定义

七大项目定义基本问题&#xff1a; 为什么要做这些&#xff1f;&#xff08;意图&#xff09;当前项目要支持什么组织目标&#xff1f;&#xff08;目标和宗旨&#xff09;当前项目如何与其他正在进行的项目保持协调一致&#xff1f;&#xff08;项目范围、项目背景、项目依赖…

TCP超时重传机制

一、TCP超时重传机制简介 TCP超时重传机制是指当发送端发送数据后&#xff0c;如果在一定时间内未收到接收端的确认应答&#xff0c;则会认为数据丢失或损坏&#xff0c;从而触发重传机制。发送端会重新发送数据&#xff0c;并等待确认应答。如果在多次重传后仍未收到确认应答&…

三级综合医院微信预约挂号系统源码,PC后台管理端+微信公众号+支付宝小程序全套源码

智慧医院预约挂号系统&#xff0c;微信医疗预约挂号小程序源码&#xff0c;实体医院预约挂号支付系统源码 本系统主要面向中大型的医疗机构&#xff0c;适用于各级公立和民营医院&#xff0c;可对接院内his、lis、pacs系统。 PC后台管理端微信公众号支付宝小程序 系统支持当日…

智慧互联,统信UOS V20桌面专业版(1070)解锁办公新模式丨年度更新

从小屏到大屏 突破&#xff0c;就在方寸之间 从人机到智脑 融合&#xff0c;旨在新质生产力 统信UOS一直致力于将先进科技与用户场景相结合&#xff0c;不断提升用户的工作效率和生产力。在最新发布的统信UOS V20桌面专业版&#xff08;1070&#xff09;版本中&#xff0c;我们…

【stm32-5】输入捕获模式测频率PWMI模式测频率占空比

1.输入捕获模式测频率 &#xff08;1&#xff09;main.c #include "Device/Include/stm32f10x.h" // Device header #include "pwm.h" #include "delay.h" #include "OLED.h" #include "IC.h" uint8_t i; int main(void…

HTML【安装HBuilder、常用标签】--学习JavaEE的day44

day44 JavaEE 学习过程&#xff1a;前端—>数据库—>服务器端 前端的VUE在框架阶段学习 JavaEE学习过程图 HTML 前端&#xff1a;展示页面、与用户交互 — HTML 后端&#xff1a;数据的交互和传递 — JavaEE/JavaWeb 1. 前端开发的工作模式 开发输出htmlcssjs 理解&am…

mac安装禅道

前提已安装&#xff1a;phpapacheMySQL mac安装 php7.1/apache-CSDN博客 安装MySQL 一、禅道下载 安装官方文档 源码包下载地址&#xff1a;禅道下载 - 禅道开源项目管理软件 。 1. 解压禅道源码包 2. 将解压后的文件复制到Apache访问目录下 &#xff08;默认路径为 /Libra…

等保2.0|定级、备案、整改、测评流程

从个人数据泄露&#xff0c;到企业遭到黑客攻击&#xff0c;网络安全风险已经越发严重。随着互联网的不断发展&#xff0c;数字化经济的普及&#xff0c;信息安全等级保护既是行业标准&#xff0c;又是国家要求。如果企业不做等保&#xff0c;轻则罚款、重则停业。 我国等级保…

全方位清理Mac电脑内存必备软件工具CleanMyMac

对于很多职场朋友来说&#xff0c;一台mac电脑上标配&#xff0c;它的高效性能与优秀的交互体验总能让工作变得更加得心应手&#xff0c;但有时候也会发现&#xff0c;随着时间的推移&#xff0c;Mac运行变得缓慢&#xff0c;处理工作不似最开始的丝滑&#xff0c;那这可能是因…

HashSet扩容机制

HashSet底层是HashMap,第一次添加的时候,table数组扩容到16,临界值是16*加载因子(默认是0.75),到达临界值进行扩容。 HashSet<Integer> hashSet = new HashSet<>();hashSet.add(5);hashSet.add(2);hashSet.add(5);hashSet.add(8);hashSet.add(1);当new一个H…

SOCKET编程(3):相关结构体与函数

相关结构体与函数 sockaddr、sockaddr_in结构体 sockaddr和sockaddr_in详解 struct sockaddr共16字节&#xff0c;协议族(family)占2字节&#xff0c;IP地址和端口号在sa_data字符数组中 /* Structure describing a generic socket address. */ struct sockaddr {__SOCKADDR…

基于Spring Cloud的房产销售平台设计与实现

基于Spring Cloud的房产销售平台设计与实现 开发语言&#xff1a;Java 框架&#xff1a;SpringCloud JDK版本&#xff1a;JDK1.8 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea 系统部分展示 前台首页界面&#xff0c;前台首页包括房源信息、…

LabVIEW学习记录4-局部变量、全局变量、共享变量

【LabVIEW】局部变量、全局变量、共享变量 一、变量定义二、内存分配三、竞争状态四、变量创建及简单使用示例4.1 局部变量4.1.1 局部变量的创建4.1.2 局部变量的编程实例 4.2 全局变量4.2.1 创建4.2.2 调用4.2.3 编程实例 4.3 共享变量 一、变量定义 LabVIEW&#xff08;Labor…

三层交换机静态路由连通实验

静态路由是一种手动配置路由表的方式&#xff0c;网络管理员需要手动指定网络中的每一个路由器下一跳路由器的地址&#xff0c;以及到达目的网络的最短路径。静态路由的路由表不会自动更新&#xff0c;如果网络拓扑发生了变化&#xff0c;管理员需要手动更改路由表。 实验拓扑图…

如何使用Vite快速构建vue项目

1、在自己定义的目录下打开cmd命令窗口&#xff1a;如文件夹目录上面输入cmd回车就可以打开 2、检查 node环境&#xff1a;通过node --version看版本号表示安装好了 3、 使用Vite 快速构建Vue项目 npm init vitelatest qiuqiu.admin 注意&#xff1a;如何你电脑没有装vite首…

python 根据网址和关键词批量下载影像

最近用到了GLASS的LAI产品&#xff0c;但这个产品的文件夹分得很细&#xff0c;我需要的影像又有8个瓦片&#xff0c;一个一个点击很麻烦&#xff0c;于是探索了批量下载的方法 一、下载1幅 import requests import re import os import requests import re# 网页URLurl &…