GraphRAG 系统教程:知识图谱与向量搜索如何突破传统 RAG 局限
本文系统讲解如何借助 LangChain、Gemini 和 Neo4j 构建一套生产级 GraphRAG 系统。从传统 RAG 的痛点出发,逐步深入系统架构、核心组件部署与测试,助你全面掌握这一前沿技术。
一、传统 RAG 的局限性与 GraphRAG 的革命性突破
传统 RAG 系统主要依赖向量相似度进行检索,虽然在多数场景中表现良好,但存在根本性缺陷:无法充分理解实体间的复杂关系。例如,在处理法律文档时,难以准确识别“当事人”“律师”“案件”之间的关联;在处理技术文档时,难以把握“组件”“接口”“依赖”之间的内在联系。
GraphRAG 通过将知识图谱与向量嵌入深度融合,实现了从语义相似性检索到关系感知检索的跨越。相较于传统 RAG,它具有四大显著优势:
- 关系感知能力:理解实体间的连接,如“管理”“实施”“要求”等关系。
- 上下文检索能力:通过图遍历找到相关信息,结果更全面、更贴合上下文。
- 更高准确性:语义相似性 + 结构化关系,显著提升回答准确率。
- 结果可解释性:图关系提供透明的推理路径,用户可追溯答案来源。
其核心创新在于将非结构化文本转化为结构化知识图谱,同时保留向量表示,兼顾检索效率与关系推理能力。
二、GraphRAG 系统架构设计详解
GraphRAG 采用分层架构设计,巧妙融合向量搜索与知识图谱,形成完整的查询处理管道。主要包含以下阶段:
- 文档加载与预处理:目前支持
.docx格式,将原始文档转化为可处理的文本格式。 - 语义分块:基于嵌入的文本分割技术,按语义相关性分割成完整语义单元。
- 图提取:利用 LLM 自动识别实体(人物、组织、概念等)并发现关系(如 MANAGES、IMPLEMENTS)。
- 双重存储:内存向量存储(快速向量检索) + Neo4j 图数据库(管理知识图谱)。
- 混合检索:图遍历 + 向量相似度,提供更全面准确的回答。

三、核心组件与实现细节详解
1. 文档加载与语义分块模块
该模块负责加载 .docx 文件,并利用语义分块器将其分割为语义完整的文本块。
def load_and_chunk_documents() -> List[Document]:
"""加载并使用语义分块处理.docx文件"""
documents = []
docx_files = glob.glob("./documents/*.docx") # 根据需要调整路径
if not docx_files:
print("未找到.docx文件")
return documents
# 初始化语义分块器
text_splitter = SemanticChunker(embeddings)
for docx_file in docx_files:
print(f"处理 {docx_file}...")
# 加载文档
loader = Docx2txtLoader(docx_file)
raw_docs = loader.load()
# 应用语义分块
chunks = text_splitter.split_documents(raw_docs)
# 添加元数据
for chunk in chunks:
chunk.metadata["source"] = os.path.basename(docx_file)
documents.extend(chunks)
print(f"已加载 {len(documents)} 个文档块")
return documents
