GraphRAG构建本地知识库的一种用法

RAG 即检索增强生成(Retrieval Augmented Generation),图知识库则是以图结构来组织和存储知识。相对于普通的单一性知识库的查取,图知识库更具备以下优点:

一、图知识库的优点

图知识库是一种以图结构来存储和管理知识的数据库,具有能高效处理复杂关系、提升知识表示的灵活性等优势,在知识推理、可解释性等方面也表现出色,以下是具体介绍:

高效处理复杂关系:现实世界中的知识往往存在着错综复杂的关系,图知识库以节点表示实体,以边表示实体之间的关系,能够自然且直观地对这些复杂关系进行建模和存储。例如在生物医学领域,基因、蛋白质、疾病等实体之间存在着大量的相互作用关系,使用图知识库可以清晰地将这些关系表示出来,便于研究人员进行分析和理解。

知识表示的灵活性:图知识库可以轻松地表示不同类型的知识,包括结构化、半结构化和非结构化数据。它能够处理多种关系类型和属性,允许在节点和边上存储丰富的信息,使得知识的表示更加全面和细致。以社交媒体为例,用户、兴趣标签、发布的内容等都可以作为节点,而用户之间的关注关系、用户与兴趣标签的关联等都可以作为边,同时还可以为节点和边添加各种属性,如用户的年龄、兴趣标签的热度等。

强大的知识推理能力:基于图的结构和关系信息,图知识库能够进行高效的知识推理。通过图遍历、路径查找等算法,可以从已知的知识中推导出新的知识,发现潜在的关系和模式。在智能客服系统中,当用户提出问题时,图知识库可以根据已有的知识关系进行推理,找出最相关的答案和解决方案,即使问题与知识库中的直接内容不完全匹配,也能通过推理提供合理的回答。

良好的可解释性:图知识库的图结构使得知识的展示和解释更加直观易懂。人们可以通过可视化工具将图知识库呈现出来,清晰地看到实体之间的关系路径和知识脉络,便于理解和分析知识的来源和依据。在金融风险评估领域,通过图知识库展示企业之间的股权关系、交易关系等,可以让风险管理人员直观地了解风险传导的路径和机制,更好地做出决策。

支持多领域应用:图知识库的通用性使其能够广泛应用于多个领域,如医疗、金融、教育、智能交通等。无论是构建企业的知识图谱来支持决策分析,还是创建智能教育系统来根据学生的知识掌握情况提供个性化学习路径,图知识库都能发挥重要作用。

与人工智能技术的良好结合:在人工智能领域,图神经网络(GNN)等技术就是基于图结构数据进行学习和推理的。图知识库为这些技术提供了天然的数据基础,使得人工智能模型能够更好地利用知识图谱中的结构信息和语义信息,提升模型的性能和效果。在推荐系统中,将用户和物品表示为图中的节点,利用图神经网络可以更好地捕捉用户与物品之间的复杂关系,从而提供更精准的推荐。

数据更新和扩展的便利性:随着业务的发展和知识的不断积累,图知识库能够方便地进行数据更新和扩展。可以随时添加新的节点和边,或者修改现有节点和边的属性,以反映最新的知识和关系。在电商领域,当有新的商品上架或用户产生新的行为时,能够快速地将这些信息更新到图知识库中,以便及时进行数据分析和应用。

       说了这么多,图知识库看来是当下人工智能问答领域里必不可少的一项工具,那如何构建图知识库呢?还是老样子,废话不多说,直接上代码!

二、建图知识库并应用于 RAG 的具体做法

2.1. 数据收集与准备

2.1.1 确定数据来源

收集与目标领域相关的各种数据,如结构化数据(数据库记录、电子表格)、半结构化数据(XML、JSON 文件)和非结构化数据(文本、网页、文档)。例如,构建医疗领域的图知识库,数据来源可以包括医学文献、病例报告、药品说明书等。

2.1.2 数据清洗与预处理

对收集到的数据进行清洗,去除噪声、重复和错误信息。对于文本数据,进行分词、词性标注、命名实体识别等预处理操作,以便后续构建图结构。

2.2. 图的构建

2.2.1 定义实体和关系

识别实体:从预处理后的数据中识别出关键实体,如医疗领域中的疾病、症状、药品等。

定义关系:确定实体之间的关系,如 “疾病 - 症状” 关系、“疾病 - 治疗药物” 关系等。

2.2.2 构建图结构

使用图数据库(如 Neo4j、JanusGraph 等)来存储图结构。以下是使用 Neo4j 和 Python 的示例代码:

from py2neo import Graph, Node, Relationship

# 连接到 Neo4j 数据库

graph = Graph("bolt://localhost:7687", auth=("neo4j", "password"))

# 创建实体节点

disease = Node("Disease", name="感冒")

symptom = Node("Symptom", name="咳嗽")

# 创建关系

relation = Relationship(disease, "HAS_SYMPTOM", symptom)

# 将节点和关系添加到图中

graph.create(disease)

graph.create(symptom)

graph.create(relation)

2.3. 检索模块构建

2.3.1 设计检索算法

根据图的结构和特点,设计合适的检索算法。常见的检索算法包括基于图遍历的算法(如广度优先搜索、深度优先搜索)和基于图嵌入的算法(如 Node2Vec、DeepWalk)。

2.3.2 实现检索接口

使用编程语言(如 Python)实现检索接口,以便在 RAG 流程中调用。以下是一个简单的基于 Neo4j 的检索示例:

# 执行 Cypher 查询进行检索

query = "MATCH (d:Disease)-[:HAS_SYMPTOM]->(s:Symptom) WHERE s.name = '咳嗽' RETURN d.name"

results = graph.run(query)

for record in results:

    print(record["d.name"])

2.4. 生成模块集成

2.4.1 选择生成模型

选择合适的生成模型,如 DeepSeek、Qwen2.5等大语言模型。可以本地部署,或者使用模型的 API 进行调用。

2.4.2 集成检索和生成

将检索到的图知识库信息作为输入,传递给生成模型,让模型根据这些信息生成相应的回答。例如:

import ollama

from TangQianTechLLM import MuZhiLLM

from TangQianTechVectorDatabase import MuZhiDB

if __name__ == '__main__':

    ML: MuZhiLLM = MuZhiLLM("qwen2.5:7b")  # 或者模型deepseek-r1:1.5b

    MV: MuZhiDB = MuZhiDB("Neo4j") #或者JanusGraph

     # 假设检索到的信息为 retrieved_info

    question = "感冒会有什么症状?"

    retrieved_info = MV.call_Vector_DB( question )  #例如:返回结果 retrieved_info = "感冒可能会导致咳嗽" 等等

    # 构建输入提示

    prompt = f"根据以下信息回答问题:{retrieved_info}。{question}"

    # 调用生成模型

    res = ML.call_Ollama_engine(prompt )

    print("问答结果:", ML.analysis_Ollama_engine(res))

2.5. 评估与优化

2.5.1 评估指标定义

定义合适的评估指标,如准确率、召回率、F1 值等,来评估 RAG 系统的性能。(后面会具体介绍评估指标的概念)

2.5.2 持续优化

根据评估结果,对图知识库、检索算法和生成模型进行持续优化,提高系统的性能和准确性。

BTW:  欢迎关注《堂前科技》,期待技术交流!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,907评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,987评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,298评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,586评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,633评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,488评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,275评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,176评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,619评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,819评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,932评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,655评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,265评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,871评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,994评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,095评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,884评论 2 354

推荐阅读更多精彩内容