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

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

相关文章

SpringBoot文件上传+拦截器

1、resource static下有个图片,希望浏览器可以查看这个图片 访问: 若yml设置路径,则可以定义在static下才可以访问 classpath代表类路径,都在target下 也就是项目在运行后的resource下的文件都会到classes下去 无需在target下创…

设计模式之业务代表模式

在编程江湖的风雨中漂泊多年,每当我遇到那些错综复杂的业务逻辑和系统交互,总有一个模式像一位忠诚的骑士,默默守护着我的代码城堡,那就是——业务代表模式(Business Delegate Pattern)。它不是最耀眼的明星…

Spark Structured Streaming 分流或双写多表 / 多数据源(Multi Sinks / Writes)

博主历时三年精心创作的《大数据平台架构与原型实现:数据中台建设实战》一书现已由知名IT图书品牌电子工业出版社博文视点出版发行,点击《重磅推荐:建大数据平台太难了!给我发个工程原型吧!》了解图书详情,…

分类预测 | MATLAB实现LSSVM最小二乘支持向量机多分类预测

分类预测 | MATLAB实现LSSVM最小二乘支持向量机多分类预测 目录 分类预测 | MATLAB实现LSSVM最小二乘支持向量机多分类预测分类效果基本介绍程序设计参考资料分类效果 基本介绍 MATLAB实现LSSVM最小二乘支持向量机多分类预测。最小二乘支持向量机(Least Squares Support Vecto…

android 分区存储(沙盒存储)适配总结

目录 一、分区存储概念 1.外部存储分类 2.分区存储如何影响文件访问 二、分区适配方案 1. 应用分区存储的文件访问规定 (1).应用专属目录--私有目录 (2).共享目录文件--公有目录 2.MediaStore API介绍 3.Storage Access Framework介绍 三、所有文件访问权限 四、总结…

【开发技巧 | 第二篇】IDEA新增作者信息、方法参数返回值

文章目录 2.IDEA新增作者信息、方法参数返回值2.1类新增作者信息2.2方法新增参数返回信息2.3测试2.3.1新建类2.3.2新建方法 2.IDEA新增作者信息、方法参数返回值 2.1类新增作者信息 打开IDEA的Settings,Editor->Code Style->File and Code Templates->Inc…

LabVIEW鸡蛋品质智能分级系统

LabVIEW鸡蛋品质智能分级系统 随着现代农业技术的飞速发展,精确、高效的农产品质量控制已成为行业的重要需求。其中,鸡蛋作为日常膳食中不可或缺的重要组成部分,其品质直接关系到消费者的健康与满意度。本文设计并实现了一套基于LabVIEW的鸡…

工厂模式和策略模式区别

工厂模式和策略模式都是面向对象设计模式,但它们的目的和应用场景有所不同。 工厂模式是一种创建型设计模式,旨在通过使用一个工厂类来创建对象,而不是直接使用new关键字来创建对象。这样做可以使系统更容易扩展和维护,因为新的对…

Kotlin基础​​

数据类型 定义变量 var表示定义变量,可以自动推导变量类型,所以Int可以不用写。 定义常量 条件语句 if表达式可以返回值,该值一般写在if里的最后一行 类似switch的用法 区间 循环 a是标签,可以直接break到标签的位置&#xf…

超详细的Vue脚手架

文章目录 Node.js介绍安装快速入门控制台输出使用函数模块化编程 npm包管理器介绍命令初始化命令本地安装(了解)全局安装(掌握)批量下载淘宝npm镜像(建议使用) Webpack介绍安装快速入门方式一:webpack原始方式方式二:基于NPM方式 webpack-dev-server 开发…

GPU并行计算CUDA

一、CUDA 和 GPU 简介 CUDA 是显卡厂商 NVIDIA 推出的运算平台,是一种通用并行计算架构,使得 GPU 能够解决复杂的计算问题。开发人员可以使用 C 语言来为 CUDA 架构编写程序,可以在支持 CUDA 的处理器上以超高性能运行,CUDA 3.0 …

【Docker学习】docker version查看版本信息

就像很多应用一样,docker也使用version来查看版本信息。但因为docker包含有不少独立组件,version的作用范围会更广一些。 用法1: docker --version 描述: 输出安装的Docker CLI 的版本号。关于Docker CLI,请访问。 实操…

ROS2专栏(三) | 理解ROS2的动作

​ 1. 创建一个动作 目标: 在ROS 2软件包中定义一个动作。 1.1 新建包 设置一个 workspace 并创建一个名为 action_tutorials_interfaces 的包: mkdir -p ros2_ws/src #you can reuse existing workspace with this naming convention cd ros2_ws/s…

【C++】:类和对象(下)

目录 一,再谈构造函数1.初始化列表2. 隐式类型转换的过程及其优化3. 隐式类型转换的使用4. explcit关键字5. 单参数和多参数构造函数的隐式类型转换 二,static成员1.静态成员变量2.静态成员函数3. static 成员的应用 三,友元3.1 友元函数3.2 …

SQL注入漏洞扫描---sqlmap

what SQLMap是一款先进的自动执行SQL注入的审计工具。当给定一个URL时,SQLMap会执行以下操作: 判断可注入的参数。判断可以用哪种SQL注入技术来注入。识别出目标使用哪种数据库。根据用户的选择,读取哪些数据库中的数据。 更详细语法请参考…

Mac 安装 JDK21 流程

一、下载JDK21 访问Oracle官方网站或选择OpenJDK作为替代品。Oracle JDK从11版本开始是商业的,可能需要支付费用。OpenJDK是一个免费开源选项。 Oracle JDK官方网站:Oracle JDK Downloads OpenJDK官方网站:OpenJDK Downloads 这里以JDK21为…

Nginx实现端口转发与负载均衡配置

前言:当我们的软件体系结构较为庞大的时候,访问量往往是巨大的,所以我们这里可以使用nginx的均衡负载 一、配置nginx实现端口转发 本地tomcat服务端口为8082 本地nginx端口为8080 目的:将nginx的8080转发到tomcat的8082端口上…

如何从Mac电脑恢复任何删除的视频

Microsoft Office是包括Mac用户在内的人们在世界各地创建文档时使用的最佳软件之一。该软件允许您创建任何类型的文件,如演示文稿、帐户文件和书面文件。您可以使用 MS Office 来完成。所有Microsoft文档都可以在Mac上使用。大多数情况下,您处理文档&…

网络安全审计

一、什么叫网络安全审计 网络安全审计是按照一定的安全策略,利用记录、系统活动和用户活动等信息,检查、审查和检验操作时间的环境及活动,从而发现系统漏洞、入侵行为或改善系统性能的过程,它是提高系统安全性的重要手段。 系统…

springboot整合mybatis配置多数据源(mysql/oracle)

目录 前言导入依赖坐标创建mysql/oracle数据源配置类MySQLDataSourceConfigOracleDataSourceConfig application.yml配置文件配置mysql/oracle数据源编写Mapper接口编写Book实体类编写测试类 前言 springboot整合mybatis配置多数据源,可以都是mysql数据源&#xff…