# 知识图谱

# 安装 neo4j 图数据库

jdk 版本只支持 11,需要到系统环境变量中去改(现在已经改至 11)

# 启动 neo4j

  1. 在 neo4j 解压的文件夹的 bin 文件夹下,打开 cmd

  2. 安装 / 卸载服务(cmd 命令):

  3. # 安装
    neo4j install-service
    # 卸载
    neo4j uninstall-service
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30

    4. 启动服务:neo4j.bat console。

    5. 浏览器打开:[http://localhost:7474/](https://link.zhihu.com/?target=http%3A//localhost%3A7474/),默认账号和密码均为:neo4j。首次登录会提醒修改密码

    6. 常见命令:如开始服务、停止服务、重启服务、安装、卸载、更新等。
    Usage: neo4j { console | start | stop | restart | status | install-service | uninstall-service | update-service } < -Verbose >

    ## 知识图谱基础知识

    1. 存储信息在节点和关系中的
    2. 每个节点和关系都可以有属性、键值对
    3. 节点可以被赋予标签以帮助将它们分组在一起
    4. 关系始终有类型和方向

    ![image-20241220202343473](https://cdn.jsdelivr.net/gh/Aura-HY/blogImage@main/img/image-20241220202343473.png)

    LangChain

    ## 查询知识图谱

    ### Querying the movie knowledge graph

    取一个Python中的多行字符串,赋值给cypher

    ```python
    cypher=""""
    MATCH(n) #匹配子句,模式匹配,可以寻找的最小模式匹配是一个单节点模式·将结果赋值给n
    RETURN count(n) As numberOfNodes #返回这些节点的个数
    """"

要运行查询本身,就要利用之前设置好的 LangChain 集成

1
2
result = kg.query(cypher)
result ===>[{'numberOfNodes':171}]

1
2
3
4
5
6
cypher=""""
MATCH(m:movie) //寻找一个标签是电影的
RETURN count(m) As numberOfMovie
""""

kg.query(cypher)

1
2
3
4
5
6
cypher=""""
MATCH(tom:Person {name:"Tom Hanks"}) //寻找一个标签是人的,名字属性是"Tom Hanks"的
RETURN tom
""""

kg,query(cypher)

# 为 RAG 准备文本

1
2
3
4
from dotenv import load_dotenv
import os

from langchain_community.graphs import Neo4jGraph

1
2
3
4
5
6
7
# Load from enviroment
load_dotenv('../.env.studiomac',override=Ture)
NEO4J_URI = os.getenv('NEO4J_URI')
NEO4J_USERNAME = os.getenv('NEO4J_USERNAME')
NEO4J_PASSWORD = os.getenv('NEO4J_PASSWORD')
NEO4J_DATABASE = os.getenv('NEO4J_DATABASE')
OPENAI_API_KEY = os.getenv('OPENAI_API_KEY')

1
2
3
4
# 创建与知识图的连接,以便发送一些查询
kg = Neo4jGraph(
url=NEO4J_URI,username=USERNAME,password=PASSWORD,database=DATABASE
)

启用向量搜索的第一步是创建一个向量索引

image-20241220211902481

要关注的是 OPTIONS 部分中向量的索引有多大,维度有多大(这里是 OpenAI 嵌入模型的默认大小)

还有相似函数

1
question = "What movies are about adenture?"

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
kg.query("""
WITH ganai.vector.encode(
$question,
"OpenAI",
{token:$openAiApiKey}) AS question_embedding
CALL db.index.vector.queryNodes(
'movie_tagline_embeddings',
$top_k,
quesion_embedding
) YIELD node AS movie,score
RETURN movie.title,movie.tagline,score
""",
params={"openAiApiKey":OPENAI_API_KEY,
"question":quesion,
"top_k":5
})

WITH 用于将前一句的结果传递给下一句,并且可以在这个过程中进行计算或过滤。

ganai.vector.encode : 这是一个自定义的函数调用,可能是通过扩展或插件添加到图数据库中的。它接受三个参数

AS question_embedding : 将 ganai.vector.encode 函数返回的结果(即问题的向量表示)赋值给一个新的变量 question_embedding

CALL : 调用一个过程或函数

'movie_tagline_embeddings' : 指定要查询的向量索引名称,这里是指包含电影标语嵌入的索引。

question_embedding : 使用之前生成的问题嵌入作为查询条件。

YIELD 关键字用于从被调用的过程中提取结果。

node 是查询返回的节点,我们将其重命名为 movie

score 是匹配度得分,表示查询向量与节点向量之间的相似度

从头到尾一直在使用现有的数据库,但是,要构建自己的 RAG 应用程序,需要从头开始构建一个来表示和存储数据

# 从文本文档构建知识图谱

# Plan of attack

  1. 对于每种形式都有不同的文本部分,我们要将他们拆分成块
  2. 拆分成的块就是一个个节点,包含文本原始内容以及一些元数据作为属性
  3. 然后就可以创建向量索引
  4. 将计算文本嵌入以填充每个分块文本的索引
  5. 做完这些就可以进行相似性搜索

image-20241221150701214

# start work

引入以及全局环境和变量设置

这里只用了单个的 10k 文件,在实际实践中,需要对每个文件进行重复操作

image-20241221150820335

取第一个文本,并将其加载到 python 的一个变量中,检查这个变量在 python 中的类型是否为字典,然后遍历这个字典,看有什么可用的,然后取其中一个项目看其文本,只看其前 1500,接下来将它分割为快

image-20241221151215575

对文本进行分块,先是设置每一个分块的大小都是 2000,有 200 个字符重叠 ,然后执行这个分块将结果给 item1_text_chunks, 可以看到分到的块有 254 块

image-20241221155004607

接着需要写一个函数,用来遍历文本并进行分块,遍历分块

在函数中,使用一个数组来存储分块后的数据,先遍历文件中的每一个项目,将每一个项目进行分块后再遍历每一个块,将块中的 信息,赋值,添加到一个数据记录中,附加有元数据的块集合

image-20241221155418608

然后既可以使用这个函数

image-20241221155834149

要将分块合并到知识图谱中,使用 cypher 语言

image-20241221160118011

在创建知识图谱之前要确保不会重复数据,就要添加约束索引,唯一 id

image-20241221160355215

遍历每一个块,对于每一个块执行之前的合并查询语句,并附上参数

image-20241221160613541

image-20241221160717831

创建一个索引,文本嵌入块

image-20241221160936918

image-20241221161025038

image-20241221161014247

辅助函数用于相关搜索

将问题作为参数传入这个函数中,将返回相似得分,节点文本

image-20241221161353906

image-20241221163113893

image-20241221164101325

image-20241221164113215

image-20241221164338065

Edited on Views times

Give me a cup of [coffee]~( ̄▽ ̄)~*

Aura-HY WeChat Pay

WeChat Pay

Aura-HY Alipay

Alipay

Aura-HY PayPal

PayPal