图增强 RAG:基于知识图谱与文本图的检索生成

FreeGuideOnline 最新 2026-06-13

什么是 RAG?为什么需要图增强?

检索增强生成(RAG) 是一种让大语言模型(LLM)在回答问题之前,先从外部知识库中检索相关信息,再基于这些信息生成答案的技术。它有效解决了模型知识过时、幻觉和私有数据利用等问题。

然而,传统RAG大多依赖向量检索——将文档切块,转为稠密向量,用相似度匹配。这在面对以下场景时力不从心:

  • 需要多跳推理的复杂问题(例如:“张三的导师的导师是谁?”)
  • 信息分散在多个文档,且存在实体关系需要明确连接
  • 问题涉及结构化的领域知识(如医学、法律、金融)

图增强 RAG 正是为了解决这些问题而生。它将传统文本块升级为图结构数据,让检索过程不仅能“查文”,还能“顺藤摸瓜”,沿着关系链路找到答案。

图增强 RAG 概述

图增强 RAG 的核心思路是:将知识表示为,图中的节点可以是实体、概念或文本块,边代表它们之间的语义关系。在检索阶段,系统不再仅进行向量相似度匹配,而是执行图遍历子图抽取甚至多跳路径搜索,把更精准、更具上下文关联的信息送给大模型。

两种主要图结构

  1. 知识图谱
    节点 = 实体(如“姚明”、“休斯顿火箭队”),边 = 明确关系(如“效力于”、“出生地”)。来源于结构化三元组,通常由信息抽取技术构建。

  2. 文本图(Text Graph / Document Graph)
    节点 = 文本块或整个文档,边 = 语义相似度、超链接、话题共现、引用关系等。本质是文档间关系的网络,构建更灵活,不需要精确的实体定义。

在实际系统中,二者经常结合使用:用文本图快速定位相关片段,再用知识图谱深挖其中的实体关系。本文后续统称两者为“图增强”。

图增强 RAG 的工作流程

一个完整的图增强 RAG 系统包含以下阶段:

1. 图构建(索引阶段)

这是将非结构化/半结构化文档转化为图数据的过程。

  • 知识图谱构建
    利用命名实体识别(NER)和关系抽取模型,从文本中提取出 <实体,关系,实体> 三元组,存储到图数据库(如 Neo4j)。
    示例:从“莫言获得2012年诺贝尔文学奖”中抽取 (莫言,获奖,诺贝尔文学奖)

  • 文本图构建
    将文档按语义切分为文本块,为每个块生成向量。根据块之间的相似度(余弦相似度)建立边,或利用文档结构(如标题层级、交叉引用)创建层级边。这样形成一个“文本块相似网络”。

2. 图增强检索

当用户提问时,检索过程会比传统RAG多一个“图”的维度:

  • 实体链接与种子定位
    先对问题进行实体识别,在图数据库中找到对应的起始节点。例如问题“2022年世界杯冠军的队长是谁?”,找到实体“2022年世界杯”和“冠军”。

  • 图遍历 / 多跳推理
    从种子节点出发,沿着与问题意图相关的边进行多跳遍历。例如:从“2022年世界杯” → 关系“冠军” → 实体“阿根廷” → 关系“队长” → 实体“梅西”。每一步遍历结果都作为上下文候选。

  • 混合检索:向量 + 图
    同时进行向量相似度搜索(找语义相关的文本块)和图检索。将两路结果按策略融合(如合并、去重、按图结构调整排序),形成最终的上下文集合。

  • 子图抽取
    对于复杂问题,可能需要抽取出包含多个节点和边的局部子图,将整个子图的结构化信息作为上下文送入大模型。例如用 Cypher 查询 Neo4j,并将返回的图景转化为自然语言描述。

3. 生成

将图检索得到的结构化上下文(关系列表、子图描述)与传统文本块上下文一起,嵌入提示词模板中,供 LLM 生成答案。提示词会明确告诉模型:哪些是事实三元组,哪些是相关文档片段,并引导模型综合利用。

动手实践:一个最简示例

我们以 LangChain + Neo4j 为例,展示知识图谱增强 RAG 的关键代码步骤(简化版)。

环境准备

pip install langchain langchain-openai langchain-community neo4j

假设本地已运行 Neo4j 数据库,并有包含电影知识图谱。

步骤 1:构建知识图谱的检索链

from langchain_community.graphs import Neo4jGraph
from langchain_openai import ChatOpenAI
from langchain.chains import GraphCypherQAChain

graph = Neo4jGraph(
    url="bolt://localhost:7687",
    username="neo4j",
    password="password"
)

llm = ChatOpenAI(model="gpt-4", temperature=0)

chain = GraphCypherQAChain.from_llm(
    cypher_llm=llm,
    qa_llm=llm,
    graph=graph,
    verbose=True,
    allow_dangerous_requests=True  # 仅示例,生产需谨慎
)

步骤 2:提问并获得图增强答案

question = "哪位演员在电影《盗梦空间》中饰演了主角,这部影片的导演还执导过哪部科幻电影?"
result = chain.invoke({"query": question})
print(result["result"])

背后发生了什么?

  • cypher_llm 将自然语言问题转为 Cypher 查询,例如:
    MATCH (p:Person)-[:ACTED_IN]->(m:Movie {title:"盗梦空间"})
    MATCH (m)-[:DIRECTED_BY]->(d:Person)
    MATCH (d)-[:DIRECTED]->(other:Movie)
    WHERE other.genre = "Sci-Fi"
    RETURN p.name, other.title
    
  • 查询结果图数据后,通过 qa_llm 将结构化结果转为自然语言答案。

扩展:文本图 + 知识图谱混合

你还可以将文本块作为节点存入 Neo4j,用 text_chunk 标签,并通过相似度关系 SIMILAR 连接。检索时先找到相关文本块,再通过 MENTIONS 关系跳到对应实体,既获得具体证据,又获得全局关系。

工具与框架生态

  • 图数据库:Neo4j (最常用), Amazon Neptune, ArangoDB
  • 大模型编排框架
    • LangChain:提供 GraphCypherQAChainGraphIndexCreator,以及兼容各种图数据库的接口。
    • LlamaIndex:具有 KnowledgeGraphIndexPropertyGraphIndex,支持自动抽取三元组并建图。
  • 知识图谱构建
    • 本地模型:使用 spaCy + OpenNRE 或 HuggingFace 的关系抽取模型。
    • 大模型抽取:利用 GPT-4 等从文本中直接抽取三元组(LlamaIndex 内置此功能)。
  • 混合检索编排:LangChain 的 EnsembleRetriever 可组合图检索器与向量检索器。

适用场景

  • 多跳问答:需要跨多个文档或实体关系才能回答的问题。
  • 长文档跨段落推理:如法律合同审核、学术文献关联分析。
  • 结构化知识库问答:企业知识图谱、产品目录、医学知识库。
  • 个性化推荐系统:基于用户、商品、属性图的多度关联推荐。

挑战与最佳实践

挑战

  • 图构建质量:实体识别和关系抽取的准确性直接影响效果,需要针对领域微调模型或人工审核。
  • 检索延迟:图遍历可能导致更高延迟,需限制跳数并优化索引。
  • 图规模膨胀:当节点数达百万级时,需要图分区或近似检索技术。
  • 图与向量的融合:如何合理分配两种检索结果的权重,尚无通用标准。

最佳实践

  1. 从简单开始:先用文本图(文档块相似网络),再逐步引入结构化知识图谱。
  2. 用小模型做实体链接:将问题实体优先映射到图中,减少大模型参与,同时提升准确率。
  3. 混合检索策略:先向量快速召回候选文本块,再在图内扩展实体一跳邻居,平衡效果与速度。
  4. 可解释性输出:让大模型在答案中引用图路径,如“根据您的问题,从A实体通过关系R找到B实体,相关文档提到……”

总结

图增强 RAG 将传统“查字典”式的平面检索,升级为“查地图”式的立体推理。它让大模型不仅能看见离散的文本片段,更能理解信息之间的深层关联。无论是构建企业知识库、智能问答系统,还是在垂直领域做深度搜索,图增强都是一个值得掌握的前沿方向。

现在,你可以从搭建一个简单的电影知识图谱问答开始,亲身体验图增强 RAG 的强大之处。