使用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://www.rhkb.cn/news/324168.html

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

相关文章

你认识edge吗,edge是做什么的

简介 Microsoft Edge(研发代号为Project Spartan,又译作微软边缘浏览器,Edge浏览器)是一个由微软研发的基于Chromium开源项目及其他开源软件的网页浏览器,于2015年1月21日公布,2015年3月30日公开发布第一个…

走进C++:C到C++的过渡

目录 什么是C呢? C的发展史 多了一些吃前来很香的“语法糖”。 语法糖一:命名空间 命名空间有个强大的功能 如何使用 语法糖二:缺省参数 语法糖三:函数重载 语法糖四:引用 引用传参 引用返回 引用和…

MySQL变量的定义与使用

一、标识符命名规范 1、以字母或下划线开头,不能以数字作为开头 2、不允许使用关键字,不能以数字作为开头 3、只允许使用_和$作为标识符,不允许使用其他标识符。 二、变量的种类 1、用户变量。 用户变量必须以标记作为前缀,…

QX---mini51单片机学习---(6)独立键盘

目录 1键盘简绍 2按键的工作原理 3键盘类型 4独立键盘与矩阵键盘的特点 5本节相关原理图 6按键特性 7实践 1键盘简绍 2按键的工作原理 内部使用轻触按键,常态按下按键触点才闭合 3键盘类型 编码键盘与非编码键盘 4独立键盘与矩阵键盘的特点 5本节相关原理…

Python-VBA函数之旅-slice函数

目录 一、slice函数的常见应用场景 二、slice函数使用注意事项 三、如何用好slice函数? 1、slice函数: 1-1、Python: 1-2、VBA: 2、推荐阅读: 个人主页: https://blog.csdn.net/ygb_1024?spm1010.…

Xilinx 千兆以太网TEMAC IP核用户接口信号

用户接口包括AX14-Stream发送接口和AX14-Stream接收接口,下文简称为用户发送接口和用户接收接口,数据案度可以是易位或16位,其中,8位接口主要针对标准的以太网应用,它利用一个125MHz的时钟产生1Gbps的数据率;当使用16位…

景联文科技:用高质量数据采集标注赋能无人机技术,引领无人机迈入新纪元!

随着无人机技术的不断发展与革新,它已成为现代社会中一个前景无限的科技领域。 无人机应用领域 边境巡逻与安防:边境管理部门利用无人机监控边境线,防止非法越境和其他安全威胁,同时也能监控地面安保人员的工作状态和行动路线。 …

Java入门基础学习笔记11——关键字和标识符

1、关键字 关键字是java中已经被赋予特定意义的,有特殊作用的一些单词,不可以把这些单词作为标识符来使用。 注意:关键字是java用了的,我们就不能用来作为:类名、变量名、否则会报错。 标识符: 标识符就是…

GAME101-Lecture06学习

前言 上节课主要讲的是三角形的光栅化。重要的思想是要利用像素的中心对三角形可见性的函数进行采样。 这节课主要就是反走样。 课程链接:Lecture 06 Rasterization 2 (Antialiasing and Z-Buffering)_哔哩哔哩_bilibili 反走样引入 ​ 通过采样,得到…

开源相机管理库Aravis例程学习(七)——chunk-parser

开源相机管理库Aravis例程学习(七)——chunk-parser 简介例程代码函数说明arv_camera_create_chunk_parserarv_camera_set_chunksarv_chunk_parser_get_integer_value 简介 本文针对官方例程中的:05-chunk-parser做简单的讲解。并介绍其中调…

Vue项目npm install certificate has expired报错解决方法

1.Vue项目 npm install 安装依赖突然报错: npm ERR! code CERT_HAS_EXPIRED npm ERR! errno CERT_HAS_EXPIRED npm ERR! request to https://registry.npm.taobao.org/zrender/download/zrender-4.3.0.tgz failed, reason: certificate has expired npm ERR! A com…

Ranger 面试题及答案整理,最新面试题

Ranger 的安全模型是如何设计的? Ranger的安全模型设计主要基于访问控制和安全策略的管理,它通过以下几个关键组件实现: 1、策略管理: Ranger 提供了一个中央管理平台,用于定义、更新和管理安全策略。这些策略根据资…

网络基础-ICMP协议

ICMP(Internet Control Message Protocol, Internet控制消息协议) ICMP协议是IP协议的辅助协议,用于在IP网络上发送控制消息,它通常被用于诊断网络故障、执行网络管理任务以及提供一些错误报告;对于收集各…

Linux 文件

文章目录 文件操作回顾(C/C)系统调用接口 管理文件认识一切皆文件C/C的文件操作函数与系统调用接口的关系……重定向与缓冲区 -- 认识重定向与缓冲区 -- 理解使用重定向缓冲区实现一个简单的Shell(加上重定向)标准输出和标准错误(在重定向下的意义) 磁盘文件磁盘存储文件操作系…

Git泄露(续)

接上一篇补充 git config --global user.name " " git config --global user.email 邮箱地址 配置用户名和邮箱 git commit 使其处于交互区,没有使用 -m,默认用vim 来编辑和提交信息 输入要提交的内容,然后按ESC建回到命令…

idea常用插件

1. 设置背景 安装插件:Background Image Plus设置背景图片: 2. Mybatis Log Plugin 详见:IntelliJ Idea 常用12款插件(提高开发效率),附优秀主题插件_idear codota插件 收费吗-CSDN博客 3. MybatisCodeHe…

HarmonyOS NEXT星河版之美团外卖点餐功能实战(下)

文章目录 一、购物车逻辑1.1 购物车及加减菜1.2 菜品的加减---方案一1.3 菜品的加减---方案二1.4 购物车View完善1.5 清空购物车1.5 购物车数量和价格 二、小结 一、购物车逻辑 1.1 购物车及加减菜 在utils目录下新建CartStore.ets文件,如下: import …

开发Web3 ETF的技术难点

开发Web3 ETF(Exchange-Traded Fund,交易所交易基金)软件时,需要注意以下几个关键问题。开发Web3 ETF软件是一个复杂的过程,涉及到金融、法律和技术多个领域的专业知识。开发团队需要综合考虑上述问题,以确…

数据库调优-数据库优化

数据库优化 如何发现复杂的SQL有问题? 一个个去explain吗?你有没有这样的困惑,开发代码运行顺畅丝滑,上生产了却卡的一逼? 哈哈,相信大家都会遇到这样的问题! sql 复制代码 # 举个栗子&…

数据库基础语法二

一、数据库 1、登陆数据库 2、创建数据库zoo 3、修改数据库zoo字符集为gbk 4、选择当前数据库为zoo 5、查看创建数据库zoo信息 6、删除数据库zoo mysql -uroot -p #登陆数据库 create database zoo; #创建数据库zoo alter database zoo character set gbk collate gbk_…