使用Neo4j和Langchain创建知识图谱

使用Neo4j和Langchain创建知识图谱

知识图谱是组织和整合信息的强大工具。通过使用实体作为节点和关系作为边缘,它们提供了一种系统的知识表示方法。这种有条理的表示有利于简化查询、分析和推理,使知识图在搜索引擎、推荐系统、自然语言处理和人工智能等各个领域中不可或缺。

在人工智能领域,知识图谱通过提供补充的上下文洞察,在提高机器学习模型的效率方面发挥着关键作用。它们通过在各种单词和短语之间建立联系来促进对自然语言的更深入理解。此外,它们还为人工智能系统提供了大量可以有效利用的结构化信息,从而能够开发出更加动态和精明的人工智能系统。

开发和维护知识图谱是一项复杂的工作,需要从不同来源提取和验证信息,并用新数据不断更新图谱。尽管存在困难,但知识图谱的潜在优势使其成为持续研究和创新的焦点。

使用Neo4j创建和实现知识图

创建知识图遵循一个结构化的过程,从建立最小可行图(MVG)开始,然后逐步扩展它。大致的简化过程如下:

1. 摘要:最初,从文档中摘录相关信息,这些数据被解析并结构化为可管理的块,作为知识图中的节点。

2. 增强:数据在提取后进行增强,以丰富其价值。嵌入被添加到每个块中,为信息提供额外的上下文和深度。这一步对于使图更加健壮和能够产生更丰富的见解至关重要。

3. 扩展:一旦数据得到增强,图就可以进行扩展了。这涉及到将节点彼此连接起来,以扩展图中的上下文和关系。

4. 迭代改进:提取、增强和扩展的过程可以根据需要重复,结合额外的文件、外部数据源和用户反馈,不断改进和提高图表的相关性和准确性。这种迭代方法确保知识图随着时间的推移而发展,以合并新信息并满足不断变化的分析需求。

5. 可视化分析:在最后阶段,地址节点可以添加到图表中,从而可以在相应文件的背景下对空间关系进行可视化分析和探索。

通过遵循这种结构化的方法并结合你的文件中的相关数据,可以创建一个全面的动态知识图谱。这样的图表不仅有助于更深入地了解企业信息披露,还有助于在各个领域做出明智的决策。

这里是一个例子,使用Neo4j和Langchain从《博伽梵歌》论文PDF开发基本知识图谱

让我们来分析一下如何使用《博伽梵歌》电子版来创建一个基本的知识图谱。这篇由斯瓦米·西瓦南达所写的文章充满了丰富的信息,我们可以用知识图谱来组织。我们将使用Neo4j(它帮助我们管理和构建图形)和Langchain(它帮助我们处理文本)。

首先,使用Neo4j创建一个免费帐户。对于本例,我们将使用免费层,它允许创建一个实例。

凭据文件将包含在后续代码中需要使用的以下详细信息:

# Wait 60 seconds before connecting using these details, or login to https://console.neo4j.io to validate the Aura Instance is available
NEO4J_URI=value
NEO4J_USERNAME=neo4j
NEO4J_PASSWORD=value
AURA_INSTANCEID=value
AURA_INSTANCENAME=Instance01

引用相应的库

from dotenv import load_dotenv
import os
# Common data processing
import textwrap
# Langchain
from langchain_community.graphs import Neo4jGraph
from langchain_community.vectorstores import Neo4jVector
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.chains import RetrievalQAWithSourcesChain
from langchain.llms import OpenAI
from langchain.embeddings import OpenAIEmbeddings
from langchain.document_loaders import PyPDFLoader

从PDF中提取文本:第一步是加载PDF文件并将其页面拆分为可管理的文本块。我们使用来自langchain库的PyPDFLoader模块来完成此任务。

# Load PDF file
loader = PyPDFLoader("path/to/your/pdf/file.pdf")
pages = loader.load_and_split()

将文本分割成块:接下来,我们将提取的文本分割成更小的块,以方便进一步处理。来自langchain的
RecursiveCharacterTextSplitter类被用于此目的。

# Split pages into chunks
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
chunks = text_splitter.split_documents(pages)

创建一个矢量存储,在Neo4j中生成嵌入和存储:我们创建一个Neo4jVector对象来将文本块的嵌入存储在Neo4j图形数据库中。这允许我们在以后有效地检索和操作嵌入。

# Warning control
import warnings
warnings.filterwarnings("ignore")
# Load from environment from the credentials file
load_dotenv('.env', override=True)
NEO4J_URI = os.getenv('NEO4J_URI')
NEO4J_USERNAME = os.getenv('NEO4J_USERNAME')
NEO4J_PASSWORD = os.getenv('NEO4J_PASSWORD')
NEO4J_DATABASE = os.getenv('NEO4J_DATABASE') or 'neo4j'
NEO4J_DATABASE = 'neo4j'
# Global constants
VECTOR_INDEX_NAME = 'pdf_chunks'
VECTOR_NODE_LABEL = 'Chunk'
VECTOR_SOURCE_PROPERTY = 'text'
VECTOR_EMBEDDING_PROPERTY = 'textEmbedding'
kg = Neo4jGraph(url=NEO4J_URI, username=NEO4J_USERNAME, password=NEO4J_PASSWORD, database=NEO4J_DATABASE
)

# Create Neo4j vector store
neo4j_vector_store = Neo4jVector.from_documents(embedding=OpenAIEmbeddings(),documents=chunks,url=NEO4J_URI,username=NEO4J_USERNAME,password=NEO4J_PASSWORD,index_name=VECTOR_INDEX_NAME,text_node_property=VECTOR_SOURCE_PROPERTY,embedding_node_property=VECTOR_EMBEDDING_PROPERTY,
)

构建关系:我们在图中的块之间建立关系,指示它们的顺序以及它们与父PDF文档的关联。

# Create a PDF node
cypher = """
MERGE (p:PDF {name: $pdfName})
RETURN p
"""
kg.query(cypher, params={'pdfName': "path/to/your/pdf/file.pdf"})
# Connect chunks to their parent PDF with a PART_OF relationship
cypher = """
MATCH (c:Chunk), (p:PDF)
WHERE p.name = $pdfName
MERGE (c)-[newRelationship:PART_OF]->(p)
RETURN count(newRelationship)
"""
kg.query(cypher, params={'pdfName': "path/to/your/pdf/file.pdf"})
# Create a NEXT relationship between subsequent chunks
cypher = """
MATCH (c1:Chunk), (c2:Chunk)
WHERE c1.chunkSeqId = c2.chunkSeqId - 1
MERGE (c1)-[r:NEXT]->(c2)
RETURN count(r)
"""
kg.query(cypher)

问答:最后,我们可以利用构造好的知识图来执行问答任务。我们从矢量存储中创建检索器和聊天机器人问答链,以根据PDF文档的内容回答问题。

# Create a retriever from the vector store
retriever = neo4j_vector_store.as_retriever()# Create a chatbot Question & Answer chain from the retriever
chain = RetrievalQAWithSourcesChain.from_chain_type(OpenAI(temperature=0), chain_type="stuff",retriever=retriever
)# Ask a question
question = "What is the main topic of this PDF document?"
answer = chain({"question": question},return_only_outputs=True,
)
print(textwrap.fill(answer["answer"]))

下面是一些在neo4j中检查数据的查询

节点数

# Returns the node count
kg.query("""
MATCH (n)
RETURN count(n) as nodeCount
""")

打印模式

kg.refresh_schema()
print(kg.schema)

显示索引

kg.query("SHOW INDEXES")

样本输出

Neo4j仪表盘

问答输出

使用知识图谱以及Neo4j和Langchain等工具,我们可以将复杂的非结构化文本转换为更容易分析的结构化、相互关联的数据。这个过程可以应用于各种类型的信息,从财务报告到精神文本。这个例子是如何创建知识图的基本说明。随着我们继续探索和发展这项技术,我们可以发现理解和解释数据的新方法。

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

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

相关文章

从0开始学习制作一个微信小程序 学习部分(6)组件与事件绑定

系列文章目录 学习篇第一篇我们讲了编译器下载,项目、环境建立、文件说明与简单操作:第一篇链接 第二、三篇分析了几个重要的配置json文件,是用于对小程序进行的切换页面、改变图标、控制是否能被搜索到等的操作第二篇链接、第三篇链接 第四…

Windows设置Redis为开机自启动

前言 Redis作为当前最常用的当前缓存技术,基本上Web应用中都有使用。所以,每次我们在本地启动项目前,都必须将Redis服务端启动,否则项目就会启动失败。但是,每次都要去启动Redis就很麻烦,有没有办法做到开…

Python爬虫--爬取糗事百科段子

爬取糗事百科段子&#xff1a; 段子在 <div class"content"> 里面的 <span> 标签里面 不过这里有个坑&#xff0c;div 标签跟 span 标签 之间有很多空行 普通 .*? 是匹配不了的&#xff0c;需要使用模式修饰符 S S 的意思 让 .(点) 匹配&#xff0c…

吴恩达2022机器学习专项课程(一)正则化(正则化成本函数正则化线性回归正则化逻辑回归)

目录 一.正则化1.1 正则化的好处1.2 正则化的实现方式 二.正则化改进线性回归的成本函数2.1 正则化后的成本函数的意义2.2 λ参数的作用2.3 不同λ对算法的影响2.4 为什么参数b没有正则化项 三.正则化线性回归的梯度下降3.1 为什么正则化可以在梯度下降迭代中减小w3.2 导数的计…

机器学习笔记-18

异常检测问题 异常检测虽然主要用于无监督学习问题上&#xff0c;但是和监督学习问题很相似。 异常检测(Anomaly Detection)&#xff1a;给定正确样本集{ x ( 1 ) , x ( 2 ) . . . x ( n ) x^{(1)},x^{(2)}...x^{(n)} x(1),x(2)...x(n)}&#xff0c;记新样本即要检测的样本为…

eNSP-抓包解析HTTP、FTP、DNS协议

一、环境搭建 1.http服务器搭建 2.FTP服务器搭建 3.DNS服务器搭建 二、抓包 三、http协议 1.HTTP协议&#xff0c;建立在FTP协议之上 2.http请求 3.http响应 请求响应报文参考&#xff1a;https://it-chengzi.blog.csdn.net/article/details/113809803 4.浏览器开发者工具抓包…

002-ChatGLM4接入Langchain

智谱AI GLM-4 新一代基座大模型GLM-4,整体性能相比GLM3全面提升60%,逼近GPT-4;支持更长上下文;更强的多模态;支持更快推理速度,更多并发,大大降低推理成本;同时GLM-4增强了智能体能力。 基础能力(英文):GLM-4 在 MMLU、GSM8K、MATH、BBH、HellaSwag、HumanEval等…

ubuntu搭建jupyter_notebook服务器

环境&#xff1a;ubuntu 22.04 目录 环境&#xff1a;ubuntu 22.04 一、创建一个anaconda用户 创建用户condaUser 为用户condaUser设置密码 开放opt文件夹的权限 登录condaUser用户 二、安装anaconda 下载anaconda 安装anaconda 三、添加环境变量 四、anaconda换源 …

【Unity Shader入门精要 第4章】数学基础(二)

1. Unity中的坐标空间 1.1 五个坐标空间 模型空间 模型自身的3D坐标系空间&#xff0c;左手坐标系是一个相对空间&#xff0c;坐标轴指向随模型旋转变化当物体有父节点时&#xff0c;Transform组件中各属性的值表示的即为该物体在其父物体的模型空间中的值当模型顶点传入顶点…

ARP防火墙能够为网络安全贡献什么样的力量

ARP防火墙&#xff08;Address Resolution Protocol Firewall&#xff09;作为网络安全的一环&#xff0c;起到保护网络免受ARP欺骗攻击的关键作用。今天德迅云安全给您介绍ARP防火墙的相关方面&#xff0c;帮助您深入了解和认识这一关键的安全措施。 网络安全对于现代社会的信…

「 网络安全常用术语解读 」SBOM主流格式CycloneDX详解

CycloneDX是软件供应链的现代标准。CycloneDX物料清单&#xff08;BOM&#xff09;可以表示软件、硬件、服务和其他类型资产的全栈库存。该规范由OWASP基金会发起并领导&#xff0c;由Ecma International标准化&#xff0c;并得到全球信息安全界的支持&#xff0c;如今CycloneD…

Java——认识异常

目录 一.异常的概念与体系结构 1.异常的概念 1.1算术异常 1.2数组越界异常 1.3空指针异常 2.异常的体系结构 3.异常的分类 3.1编译时异常 3.2运行时异常 二.异常的处理 1.防御式编程 1.1LBYL 1.2EAFP&#xff08;核心&#xff09; 2.异常的抛出 3.异常的捕获 3…

使用 ORPO 微调 Llama 3

原文地址&#xff1a;https://towardsdatascience.com/fine-tune-llama-3-with-orpo-56cfab2f9ada 更便宜、更快的统一微调技术 2024 年 4 月 19 日 ORPO 是一种新的令人兴奋的微调技术&#xff0c;它将传统的监督微调和偏好校准阶段合并为一个过程。这减少了训练所需的计算…

【深度学习】第二门课 改善深层神经网络 Week 2 3 优化算法、超参数调试和BN及其框架

&#x1f680;Write In Front&#x1f680; &#x1f4dd;个人主页&#xff1a;令夏二十三 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd; &#x1f4e3;系列专栏&#xff1a;深度学习 &#x1f4ac;总结&#xff1a;希望你看完之后&#xff0c;能对…

python实现验证码-图片类型

1 utils.py import randomdef get_random_code():code for i in range(5):# 随机生成大写字母upper_char chr(random.randint(65, 90))lower_char chr(random.randint(97, 122))num_char str(random.randint(0, 9))res random.choice([upper_char, lower_char, num_char]…

软件应用开发安全设计指南

1.1 应用系统架构安全设计要求 设计时要充分考虑到系统架构的稳固性、可维护性和可扩展性&#xff0c;以确保系统在面对各种安全威胁时能够稳定运行。 在设计系统架构时&#xff0c;要充分考虑各种安全威胁&#xff0c;如DDoS攻击、SQL注入、跨站脚本攻击&#xff08;XSS&…

如何使用 Node.js 开发一个文件上传功能?

在 Node.js 中实现文件上传功能可以通过多种方式完成&#xff0c;但其中最常用的方法之一是使用 Express 框架和 Multer 中间件。Express 是一个流行的 Node.js Web 框架&#xff0c;而 Multer 是一个用于处理文件上传的中间件。 步骤 1: 准备工作 首先&#xff0c;确保你已经…

《Fundamentals of Power Electronics》——升压隔离型变换器、SEPIC隔离型变换器

以下是升压型隔离变换器的相关知识点&#xff1a; 升压型隔离变换器可以通过互换降压型隔离变换器的电源与负载的位置得到。升压型隔离变换器有许多种结构&#xff0c;此处简短的讨论两种情况。这些转换器主要使用在高压电源和低谐波整流器中。 图6.36所示是一种全桥型电路结…

企业定制AI智能名片商城小程序:重塑营销场景,引领数字化营销新纪元

在数字化时代的浪潮中&#xff0c;多企业AI智能名片商城小程序以其独特的魅力和创新的功能&#xff0c;为消费者带来了前所未有的购物体验。它不仅是一个汇聚各类商品的购物平台&#xff0c;更是一个充满活力和创造力的社群生态。通过强化社群互动、鼓励用户生成内容以及引入积…

uniapp 文字转语音(文字播报、语音合成)、震动提示插件 Ba-TTS

简介&#xff08;下载地址&#xff09; Ba-TTS 是一款uniapp语音合成&#xff08;tts&#xff09;插件&#xff0c;支持文本转语音&#xff08;无服务费&#xff09;&#xff0c;支持震动提示。 支持语音合成&#xff0c;文本转语音支持震动&#xff08;可自定义任意震动效果…