GraphRAG 知识图谱增强
传统 RAG 基于向量检索,擅长语义相似度匹配,但对于复杂推理任务表现有限。"苹果公司的 CEO 是谁"简单检索能答对,但"苹果公司的 CEO 还投资了哪些与医疗相关的公司"需要多跳推理,传统 RAG 往往失败。GraphRAG 结合知识图谱的结构化推理能力和 LLM 的语义理解能力,在复杂问答、关系推理、事实核查等场景展现出优势。
知识图谱基础
知识图谱是实体(节点)和关系(边)的集合,用图结构存储世界知识。RDF(资源描述框架)是知识图谱的标准数据模型,主语-谓语-宾语的三元组是基本单位,如 <苹果公司> <CEO> <蒂姆·库克>。SPARQL 是知识图谱的查询语言,类似 SQL 但针对图数据。
Neo4j 是最流行的图数据库,支持 Cypher 查询语言和 ACID 事务。它的节点可以带属性(姓名、出生日期),关系也可以带属性(开始时间、结束时间)。Cypher 的模式匹配语法很直观,MATCH (a:Person {name:'蒂姆·库克'})-[:CEO_OF]->(c:Company) RETURN c 查找库克担任 CEO 的公司。
知识图谱的优势在于显式存储实体关系,支持多跳推理。从"苹果公司"到"蒂姆·库克"是一跳,再到"库克的投资"是二跳,再到"医疗相关公司"是三跳。这种推理路径在向量空间中难以捕捉(文档可能不会完整描述这条路径),但在图中是明确的。
GraphRAG 架构
GraphRAG 的核心是将知识图谱作为 RAG 的检索源。传统 RAG 的流程是:查询 → 向量化 → 向量检索 → 生成答案。GraphRAG 则是:查询 → 实体识别 → 图检索 → 路径推理 → 生成答案。关键步骤包括:
实体识别:从用户查询中提取实体("苹果公司"、"蒂姆·库克"),用 NER(命名实体识别)或 LLM 完成。如果查询中没有明确实体,需要先用 LLM 扩展,比如"iPhone 的开发者"映射到"苹果公司"。
图检索:在知识图谱中定位实体节点,扩展其邻域(1-2 跳的邻居),收集相关子图。这类似于向量检索的 top-k,但不是按相似度,而是按图距离和关系类型筛选。
路径推理:在子图上找到连接查询实体的路径,可能有多条,需要排序选择最相关的。路径权重可以综合关系类型(CEO 比 PARTNER 更重要)、路径长度(短路径更相关)、实体重要性(PageRank 得分)。
答案生成:将检索到的路径和实体信息转换为文本,注入 Prompt,让 LLM 基于结构化信息生成答案。关键是要让 LLM 理解图中实体和关系的语义,这需要精心设计 Prompt 模板。
知识图谱构建
GraphRAG 的前提是有领域知识图谱。对于通用场景,可以复用开源图谱如 Wikidata、DBpedia、Freebase,它们包含数百万实体和关系,覆盖百科知识。但对于垂直领域(医疗、金融、企业内部),需要自己构建。
构建流程包括数据抽取、实体对齐、关系抽取、图存储。数据源可以是结构化数据(数据库、表格)、半结构化数据(JSON、XML)、非结构化数据(文档、网页)。从非结构化数据构建是最难的,需要 LLM 或专门的信息抽取模型。
实体识别用 NER 模型(spaCy、Hugging Face 的实体识别 pipeline)或 LLM。关系抽取更复杂,需要识别文本中两个实体之间的关系类型(如"蒂姆·库克是苹果公司的 CEO"抽取为 <蒂姆·库克, CEO_OF, 苹果公司>)。小模型(BERT、RoBERTa)微调后可以完成特定领域的关系抽取,通用场景则可以直接用 LLM。
实体对齐解决同一实体不同表述的问题。"苹果"、"Apple"、"AAPL"应该指向同一个节点。对齐方法包括字符串相似度(Levenshtein 距离)、嵌入相似度(实体名称的向量匹配)、外部知识(Wikidata 的别名)。对齐是迭代过程,需要人工校验和反馈。
图存储选择取决于数据规模和查询复杂度。百万级节点以下可以用 Neo4j,它的可视化调试和 Cypher 语法友好。更大规模(千万级以上)可以考虑分布式图数据库如 JanusGraph、ArangoDB,或者用 RedisGraph 内存数据库加速查询。
LlamaIndex 的 GraphRAG 实现
LlamaIndex 提供了 KnowledgeGraphIndex 封装 GraphRAG 的开发。它自动处理文档解析、实体提取、关系抽取、图存储,开发者只需提供数据源和 LLM,就能得到可查询的知识图谱。
from llama_index import KnowledgeGraphIndex, SimpleDirectoryReader
from llama_index.graph_stores import Neo4jGraphStore
documents = SimpleDirectoryReader('data').load_data()
graph_store = Neo4jGraphStore(url='bolt://localhost:7687')
index = KnowledgeGraphIndex.from_documents(
documents,
storage_context=graph_store,
show_progress=True
)
query_engine = index.as_query_engine(
include_text=True,
retriever_mode='keyword',
response_mode='tree_summarize'
)
response = query_engine.query("蒂姆·库克投资了哪些医疗公司?")LlamaIndex 的特色是支持多种查询模式:keyword 模式基于实体名称精确匹配,embedding 模式用向量化检索(适合实体名称不确定的场景),hybrid 模式结合两者。检索到的子图可以用不同的方式组织答案:tree_summarize 按树结构汇总,no_text 只返回结构化数据,raw 返回原始三元组。
多跳推理优化
多跳推理是 GraphRAG 的核心优势,也是技术难点。查询"埃隆·马斯克收购的公司有哪些关联 Twitter 的业务",需要从马斯克到 X 公司(原名 Twitter),到收购的公司(Twitter、SolarCity、?),再到这些公司的关联业务。推理路径可能长达 5-6 跳,中间节点呈指数增长,需要剪枝策略。
路径排序是关键。不是所有路径都有用,需要根据相关性评分。评分标准包括:路径长度(越短越相关)、关系置信度(关系抽取模型给出的概率)、实体重要性(PageRank、度中心性)。可以用强化学习训练路径选择策略,用人工标注的相关路径作为奖励信号。
子图扩展策略影响召回率和效率。宽度优先搜索(BFS)均匀扩展所有邻域,适合查询关系简单的情况。深度优先搜索(DFS)沿着最相关的路径深入,适合复杂推理。自适应扩展根据中间节点的类型和关系动态调整,遇到高置信度关系就深入,遇到低置信度就回溯。
混合检索
GraphRAG 不应该替代向量检索,而是与之互补。向量检索擅长语义相似度匹配("关于人工智能的文档"),图检索擅长关系推理("人工智能的创始人是谁")。混合检索可以同时查询向量库和图数据库,合并去重后排序返回。
融合策略需要设计权重。对于事实性查询("谁发明了相对论"),图检索应该有更高权重;对于概念性查询("解释相对论"),向量检索更重要。可以用 LLM 分析查询类型,动态调整权重。或者用学习排序模型,基于历史查询的点击率训练融合权重。
应用场景
企业知识管理是 GraphRAG 的天然场景。公司内部有大量文档(产品手册、技术文档、会议记录),构建企业知识图谱后,员工可以查询"谁负责这个项目"、"这个功能依赖哪些模块"等关系问题,比关键词搜索更智能。
医疗问答需要精确的因果关系。"阿司匹林能和什么药一起吃"需要药物相互作用的知识,向量检索可能返回错误答案,图谱可以明确存储药物相互作用关系。医疗图谱的构建需要专业医生参与,确保关系的准确性。
金融风控利用知识图谱检测欺诈行为。欺诈团伙往往有复杂的关联网络(共享设备、共用地址、资金流转),图算法可以识别异常模式(短时间内多个账户汇入同一账户)。传统方法基于规则,GraphRAG 可以结合 LLM 理解新型欺诈模式。
事实核查是另一个重要场景。检测言论的真伪需要验证其与已知知识的关系。"地球是平的"与科学知识库中的"地球是球体"矛盾,可以通过图查询快速发现冲突。新闻机构可以用 GraphRAG 自动核查报道中的事实主张。
GraphRAG 代表了 RAG 技术的新方向,它弥补了纯向量检索在推理能力的不足,让 AI 应用能够处理更复杂的问题。挑战在于知识图谱的构建成本高、领域特定性强,但随着开源图谱的丰富和构建工具的成熟,GraphRAG 会在更多场景落地。