知识图谱与GraphRAG

生活化类比:知识图谱就像一张「人物关系网」——节点是人/物,边是关系(谁提出了什么、谁毕业于哪)。GraphRAG 则给这张网配了个「导游」,既能回答「爱因斯坦的相对论讲了啥」,也能顺着关系网推理出「他老师是谁」。

核心概念

知识图谱(Knowledge Graph) 是一种用图结构表示知识的方式,由实体(节点)和关系(边)组成。它能够存储结构化的事实知识,支持复杂的推理和查询。

GraphRAG(Graph Retrieval-Augmented Generation,基于图谱的检索增强生成)是 Microsoft 于 2024 年提出的一种基于知识图谱的 RAG 方法,通过图结构增强检索和生成质量。

知识图谱基础

三元组表示

知识图谱的核心是三元组(Triple):


graph LR

    E1["爱因斯坦"] -->|出生于| U["乌尔姆"]

    E1 -->|提出了| T["相对论"]

    T -->|属于| P["物理学"]

知识图谱 vs 关系数据库

维度知识图谱关系数据库
数据模型图(节点+边)表(行+列)
Schema灵活,无需预定义严格,需要预定义
查询语言Cypher, SPARQLSQL
推理能力支持图推理有限
适用场景复杂关系、灵活模式结构化数据、事务处理

知识图谱存储

存储类型工具特点
原生图数据库Neo4j, JanusGraph性能最优,支持图算法
RDF 存储Apache Jena, Virtuoso标准化,支持 SPARQL
嵌入式NetworkX (Python)简单,适合小规模
向量化用于图嵌入支持相似度查询

实体与关系提取

命名实体识别(NER, Named Entity Recognition)


graph LR

    TEXT["文本: 爱因斯坦在1905年发表了狭义相对论"] --> NER["NER 识别"]

    NER --> E1["爱因斯坦 → Person 人物"]

    NER --> E2["1905年 → Date 时间"]

    NER --> E3["狭义相对论 → Theory 理论"]

关系提取


graph LR

    TEXT["文本: 爱因斯坦提出了相对论"] --> RE["关系提取"]

    RE --> TRIPLE["(爱因斯坦, 提出, 相对论)"]

    RE --> TYPE["关系类型: author_of / discovered"]

提取方法

方法描述优缺点
基于规则使用正则表达式、模式匹配精确但覆盖有限
监督学习训练标注数据的分类器精度高但需要标注
远程监督利用现有知识库自动标注规模大但有噪音
LLM-based使用 LLM 进行提取灵活但成本高

GraphRAG

传统 RAG 的局限

问题描述
全局理解缺失传统 RAG 检索局部片段,难以回答需要全局理解的问题
关系推理不足难以处理多跳推理和复杂关系查询
信息分散相关信息分散在多个文档中,难以整合

GraphRAG 的核心思想


graph TD

    subgraph TRAD["传统 RAG"]

        TDOC["文档"] --> TCHUNK["分块"] --> TVEC["向量化"] --> TRET["检索"] --> TGEN["生成"]

    end

    subgraph GRAPH["GraphRAG"]

        GDOC["文档"] --> GE["实体/关系提取"] --> GK["知识图谱构建"] --> GRET["图检索"] --> GGEN["生成"]

    end

    ADV["优势: 1. 结构化知识表示  2. 支持多跳推理<br/>3. 全局上下文理解  4. 可解释的检索路径"]

GraphRAG 流程


flowchart TD

    subgraph PHASE1["阶段1: 图构建"]

        P1_1["① 文档解析"]

        P1_2["② 实体识别 NER"]

        P1_3["③ 关系提取"]

        P1_4["④ 实体对齐和消歧"]

        P1_5["⑤ 知识图谱存储"]

        P1_1 --> P1_2 --> P1_3 --> P1_4 --> P1_5

    end

    subgraph PHASE2["阶段2: 社区检测"]

        P2_1["① 图聚类 如 Leiden 算法"]

        P2_2["② 识别实体社区"]

        P2_3["③ 生成社区摘要"]

        P2_1 --> P2_2 --> P2_3

    end

    subgraph PHASE3["阶段3: 检索与生成"]

        P3_1["① 查询理解"]

        P3_2["② 图检索 实体匹配 + 社区匹配"]

        P3_3["③ 路径推理"]

        P3_4["④ 生成回答"]

        P3_1 --> P3_2 --> P3_3 --> P3_4

    end

    PHASE1 --> PHASE2 --> PHASE3

社区检测与摘要


graph LR

    subgraph C1["社区1 Leiden算法"]

        EA["实体A"] ---|关系1| EB["实体B"]

        EA ---|关系3| ED["实体D"]

        EB ---|关系5| EE["实体E"]

    end

    subgraph C2["社区2 Leiden算法"]

        EC["实体C"] ---|关系2| EB2["实体B"]

        EC ---|关系4| EF["实体F"]

        EE2["实体E"] ---|关系6| EF2["实体F"]

    end

    C1_SUM["社区1摘要: 实体A/B/D主要涉及..."]

    C2_SUM["社区2摘要: 实体C/E/F主要涉及..."]

图检索策略

基于实体的检索


flowchart TD

    Q["查询: 爱因斯坦的相对论"] --> STEP1["① 识别查询中的实体: 爱因斯坦、相对论"]

    STEP1 --> STEP2["② 在知识图谱中查找实体节点"]

    STEP2 --> STEP3["③ 获取实体的邻居节点和关系"]

    STEP3 --> STEP4["④ 返回相关三元组"]

基于关系的检索


flowchart TD

    Q["查询: 谁提出了相对论?"] --> STEP1["① 识别查询意图: 查找'提出'关系"]

    STEP1 --> STEP2["② 在图中查找'提出'关系"]

    STEP2 --> STEP3["③ 返回: 爱因斯坦, 提出, 相对论"]

多跳推理


graph LR

    E["爱因斯坦"] -->|毕业于| ETH["苏黎世联邦理工学院"]

    ETH -->|教授| M["明可夫斯基"]

    ANSWER["答案: 明可夫斯基"]

图嵌入(Graph Embedding)

方法分类

方法描述代表模型
转移距离基于距离的嵌入TransE, TransR
语义匹配基于相似度的嵌入DistMult, ComplEx
图神经网络使用 GNN 学习嵌入GCN, GraphSAGE

TransE 原理


flowchart LR

    H["h 头实体"] -->|"+ r/关系"| APPROX["≈ t 尾实体"]

    POS["正样本 (h,r,t): dist(h+r,t) 应小"]

    NEG["负样本 (h',r,t'): dist(h'+r,t') 应大"]

    GOAL["通过距离学习实体和关系的向量表示"]

一句话说人话

核心公式:h + r ≈ t(头实体 + 关系 ≈ 尾实体)

把实体想成地图上的点,关系就是「往某个方向走一步」:

🧭 「北京」+「首都→」≈「中国」

「爱因斯坦」+「提出了→」≈「相对论」

训练方式:猜对了有奖,猜错了挨打

  • 正样本(事实):h+r 和 t 离得近 → 表扬,让它们更近

  • 负样本(瞎编):h+r 和 t 离得远 → 揍它,让它们更远

优点:简单暴力,训练飞快

缺点:太单纯,搞不定复杂关系(比如 1 对 N、对称关系),后来被 TransR、RotatE 等更聪明的模型取代。

混合知识系统

向量数据库 + 知识图谱


graph TD

    ROUTER["查询路由"] --> VDB["向量数据库 语义检索"]

    ROUTER --> KG["知识图谱 结构化查询"]

    VDB --> FUSE["结果融合 + 重排序"]

    KG --> FUSE

    FUSE --> GEN["生成回答"]

    ADV1["优势: 向量数据库 - 语义相似度检索"]

    ADV2["优势: 知识图谱 - 结构化推理和精确查询"]

    ADV3["优势: 结合两者优势"]

选择指南

场景推荐方案
开放域问答向量数据库为主
结构化查询知识图谱为主
复杂推理知识图谱为主
语义搜索向量数据库为主
混合需求两者结合

常见问题

问题回答要点
知识图谱和向量数据库的核心区别是什么?知识图谱用图结构存储实体和关系,支持结构化查询和推理;向量数据库存储 embedding 向量,支持语义相似度检索。两者互补,知识图谱擅长精确查询和推理,向量数据库擅长语义搜索。
GraphRAG 相比传统 RAG 有什么优势?GraphRAG 通过知识图谱提供结构化知识表示,支持多跳推理和全局上下文理解。传统 RAG 只检索局部片段,难以处理需要整合多个文档信息的复杂问题。
实体和关系提取有哪些方法?主要方法:基于规则(正则表达式)、监督学习(标注数据训练分类器)、远程监督(利用现有知识库自动标注)、LLM-based(使用 LLM 提取)。实际中常结合多种方法。
什么是知识图谱的社区检测?社区检测是将图中的实体聚类成组,组内实体关系紧密,组间关系稀疏。常用 Leiden 算法。社区可以生成摘要,帮助理解知识图谱的全局结构。
如何设计混合知识系统?结合向量数据库和知识图谱:语义搜索用向量数据库,结构化查询用知识图谱。需要设计查询路由策略,根据查询类型选择合适的检索方式,然后融合结果。
TransE 的核心思想是什么?TransE 基于”h + r ≈ t”的假设,即头实体加上关系应该接近尾实体。通过最小化正样本的距离、最大化负样本的距离来学习实体和关系的向量表示。
为什么需要多跳推理?很多问题需要经过多个关系才能得到答案。例如”爱因斯坦的老师是谁”需要:爱因斯坦→毕业学校→教授。传统 RAG 难以处理这种链式推理,知识图谱天然支持。
GraphRAG 的社区摘要有何作用?社区摘要提供了知识图谱的全局视图,帮助回答需要整体理解的问题。例如”这个领域的主要研究方向是什么”需要全局理解,而不仅是单个实体的信息。

速记卡(面试闪卡)

Q1:一句话讲清「知识图谱与GraphRAG」到底是什么?

A:知识图谱用图存实体和关系,GraphRAG 借它增强检索,支持多跳推理与全局理解。

Q2:一、知识图谱基础 —— 怎么理解?

A:知识图谱像一张”人物关系网”:节点是人/物,边是关系(谁提出啥)。三元组(Triple)是基本单位,如 (爱因斯坦, 提出, 相对论)。比起关系数据库,它 schema 灵活、天生会推理。

Q3:二、实体与关系提取 —— 怎么理解?

A:从文本里挖实体(NER)和关系,方法从规则、监督学习到 LLM-based。像从一堆新闻里摘出”谁、干了啥、和谁有关”,攒成可查询的知识网。远程监督能自动标注但带噪音。

Q4:三、GraphRAG 核心思想 —— 怎么理解?

A:传统 RAG 只捞局部片段;GraphRAG 先抽实体/关系建图谱,再做图检索 + 社区检测(Leiden 算法)生成摘要。优势:结构化表示、多跳推理、全局上下文、可解释路径。

Q5:四、图嵌入与混合系统 —— 怎么理解?

A:TransE 核心 “h + r ≈ t”:头实体加关系约等于尾实体,像”北京+首都→≈中国”。混合系统用路由(router)分配:语义搜索走向量库,结构化查询走图谱,结果融合。

Q6:核心速记主线有哪些?

  • 图谱 = 节点+边的三元组网络

  • 提取:NER + 关系,多法结合

  • GraphRAG:建图→社区摘要→图检索

  • 混合:向量库 + 图谱,路由分流

口诀

A:图谱一张关系网,实体边上记端详;

抽实体建图增强,多跳推理不慌张。

TransE 加关系近,混合检索两头忙;

向量图谱相映照,答案靠谱路更长。

相关链接

相关链接