第30回 知识图谱基础——图、三元组与图算法

线索不是一条线,往往织成一张网。
若能把网画出来,寻路自有章法在。

上回我们讲“长上下文 vs RAG”:
长上下文像通读卷宗,RAG 像取证入卷。

可看官很快会遇到第三种案件:
答案不在某一段话里,而在“多段证据的关系链”里。

比如:

  • “A 属于 B,B 属于 C,那 A 属于 C 吗?”
  • “甲公司控股乙公司,乙公司投资丙公司,甲与丙是什么关系?”
  • “这条政策引用了哪条法规,而那条法规又修订了什么条款?”

这种问题最像“办案走线索”:
要把“点与点之间的关系”显式化。

这就是知识图谱(Knowledge Graph, KG)的用武之地。
近两年(2024–2026)“LLM + KG”也成为热门方向:
一方面 LLM 能辅助构图与抽取,另一方面 KG 能提供可解释的结构化证据与多跳推理路径。1

这一回先不讲高深模型,只讲“图谱的内功”:

  • 三元组怎么表示
  • 图怎么存
  • 最短路/多跳怎么查

一、图是什么:点与边,外加一张“关系表”

高二数学里你见过函数图像、坐标系;
知识图谱里的“图”,更像离散数学里的图:

  • 点(节点):实体,比如“北京”“清华”“张三”
  • 边(关系):比如“位于”“就读于”“朋友”

与普通图不同的是:
知识图谱的边通常“带标签”,说清楚是什么关系。


二、三元组:最小证据颗粒

知识图谱最常用的表示是三元组:

(头实体,关系,尾实体)

例如:

  • (张三,就读于,清华)
  • (清华,位于,北京)
  • (北京,属于,中国)

有了三元组,很多“多跳推理”就变成了“沿边走路”:

张三 → 清华 → 北京 → 中国


三、图算法在 KG 里怎么用:最常见是“找路”

知识图谱最常用的三个基础算法(高二直觉版):

  1. BFS(广度优先搜索):一圈一圈往外扩,找最短跳数路径
  2. 最短路(带权图时):如果边有代价,就用 Dijkstra 一类算法
  3. 连通性与子图:查某个实体相关的局部网络

在“多跳问答”里,BFS 就很够用:
它能找到“从 A 到 B 最少需要几步关系”。


四、极简可跑代码:一个三元组图谱 + BFS 找关系链

下面代码实现:

  • 用三元组存图谱
  • 建邻接表(从一个实体能走到哪些实体)
  • 用 BFS 找从 srcdst 的最短关系链
from collections import deque, defaultdict


TRIPLES = [
    ("张三", "就读于", "清华"),
    ("清华", "位于", "北京"),
    ("北京", "属于", "中国"),
    ("李四", "就读于", "北大"),
    ("北大", "位于", "北京"),
    ("清华", "友校", "北大"),
]


def build_graph(triples):
    g = defaultdict(list)
    for h, r, t in triples:
        g[h].append((t, r))
    return g


def bfs_path(g, src, dst, max_hops=4):
    q = deque()
    q.append(src)
    prev = {src: None}
    prev_edge = {}
    depth = {src: 0}

    while q:
        u = q.popleft()
        if u == dst:
            break
        if depth[u] >= max_hops:
            continue
        for v, r in g.get(u, []):
            if v in prev:
                continue
            prev[v] = u
            prev_edge[v] = r
            depth[v] = depth[u] + 1
            q.append(v)

    if dst not in prev:
        return None

    nodes = []
    rels = []
    cur = dst
    while cur is not None:
        nodes.append(cur)
        if cur != src:
            rels.append(prev_edge[cur])
        cur = prev[cur]
    nodes.reverse()
    rels.reverse()
    return nodes, rels


if __name__ == "__main__":
    g = build_graph(TRIPLES)
    for src, dst in [("张三", "中国"), ("张三", "北大"), ("李四", "中国")]:
        ans = bfs_path(g, src, dst, max_hops=4)
        print(src, "->", dst, ":", ans)

输出里你会看到:

  • 张三到中国能走通(就读于→位于→属于)
  • 张三到北大也能走通(清华—友校→北大)

这就是“多跳证据链”的最小可运行版本:
它天然带“可解释性”:每一步都写清楚走了哪条关系。


五、知识图谱与 RAG 的关系:图是“结构化证据”,RAG 是“文本证据”

把两者并列看:

  • RAG:从文本块里取证据
  • KG:从关系网里取证据

两者结合起来就很自然:

  1. 先从文本抽取三元组,构图
  2. 问答时先在图上找关系链
  3. 再回到原文段落做引用与核查

这样既有“图的路径解释”,也有“原文引用的可追溯”。

第三篇到这里就埋下一颗伏笔:
第四篇我们会讲 GraphRAG,把图当成检索与推理的骨架,把“相关段落”升级成“相关子图”。


六、小结:第三篇收束——把记忆做成“可查、可证、可追溯”

第三篇十回(21–30)到此告一段落:
我们从“智能体骨架”讲到“检索证据”,再讲到“结构化关系网”。

你现在手里有三样本事:

  • 会让模型用工具(第22回)
  • 会让模型取证并评估(第23–29回)
  • 会把证据组织成可解释的关系链(第30回)

从下一篇(第四篇)起,我们要把这些本事拼成“能行动、能协作”的系统:
知识图谱怎么构建?GraphRAG 怎么跑?多智能体怎么分工?失败怎么复盘?

欲知后事如何,且听下回分解。


幻觉核查

  • “LLM+KG”作为研究方向的动机与分类:可核对 2024 综述对 KG-augmented LLMs、LLM-augmented KGs 等范式的划分。1
  • 本回的 KG 定义为入门抽象(实体/关系/三元组),未覆盖超关系、时间戳、置信度等工业扩展字段。

逻辑审计

  • 与第29回衔接:第29回讨论“取证与可控”,本回把取证从文本块提升到关系链,强调可解释路径。
  • 与导读一致:导读强调“事实校验与可追溯”,KG 的路径天然可审计,并可与原文引用结合。
  • 为第四篇铺路:GraphRAG 与图检索需要先理解三元组与找路;本回提供最小可运行 BFS 作为骨架。

引用与溯源

Footnotes

  1. Ibrahim, N., et al. A survey on augmenting knowledge graphs (KGs) with large language models (LLMs): models, evaluation metrics, benchmarks, and challenges (Discover Artificial Intelligence, 2024) https://link.springer.com/article/10.1007/s44163-024-00175-8 2