GraphRAG与传统RAG的区别
检索增强生成(RAG)技术在大语言模型应用中已广泛落地,但传统基于向量相似度的检索方式在面对跨文档推理、全局性问题时表现不佳。GraphRAG通过引入知识图谱结构,将文本片段之间的关联关系显式建模,使模型在检索阶段不仅能匹配语义相似的文本,还能沿图谱路径完成多跳推理。
GraphRAG的核心流程分为三个阶段:知识抽取、图谱构建、图谱增强检索。知识抽取阶段从原始文档中识别实体和关系;图谱构建阶段将实体作为节点、关系作为边构建有向图;检索阶段通过图遍历算法找到与问题相关的子图,再将子图内容拼接为上下文输入给大模型生成回答。
知识抽取与图谱构建流程
知识抽取是GraphRAG的基础环节。以LangChain + LlamaIndex的GraphRAG实现为例,首先需要安装依赖:
pip install llama-index llama-index-graph-stores pyvis
配置大模型和嵌入模型后,使用LLM从文档中抽取实体和关系三元组:
from llama_index.core import KnowledgeGraphIndex, SimpleDirectoryReader
from llama_index.core import StorageContext, ServiceContext
from llama_index.core.graph_stores import SimpleGraphStore
from llama_index.llms.openai import OpenAI
# 加载文档
documents = SimpleDirectoryReader("./docs").load_data()
# 配置图存储
graph_store = SimpleGraphStore()
storage_context = StorageContext.from_defaults(graph_store=graph_store)
# 配置LLM用于知识抽取
llm = OpenAI(model="gpt-4o", temperature=0.1)
service_context = ServiceContext.from_defaults(llm=llm, chunk_size=512)
# 构建知识图谱索引
kg_index = KnowledgeGraphIndex.from_documents(
documents,
max_triplets_per_chunk=5,
storage_context=storage_context,
service_context=service_context,
include_embeddings=True,
)
max_triplets_per_chunk控制每个文本块抽取的三元组数量,数值越大图谱越密集但抽取时间越长。include_embeddings=True为每个节点生成向量嵌入,支持混合检索模式。
社区检测与层次化摘要生成
GraphRAG的进阶应用涉及社区检测算法。微软开源的graphrag库实现了层次化聚类,将知识图谱中的密集子图划分为社区,并为每个社区生成摘要,支持全局性问题的回答。
pip install graphrag
初始化项目并配置:
graphrag init --root ./graphrag_project
# 修改 settings.yml 核心参数
# chunks:
# size: 1200
# overlap: 100
# community_reports:
# max_length: 2000
# entity_extraction:
# entity_types: [organization, person, location, event]
构建索引时,graphrag会自动完成实体抽取、关系识别、社区检测(Leiden算法)和层次化摘要生成:
graphrag index --root ./graphrag_project --method standard
索引完成后生成以下数据文件:
create_final_entities.parquet– 实体表create_final_relationships.parquet– 关系表create_final_communities.parquet– 社区表create_final_community_reports.parquet– 社区摘要
全局检索与局部检索的区别
GraphRAG支持两种查询模式:全局检索(global search)和局部检索(local search)。全局检索遍历所有社区摘要,适合回答”这个领域有哪些主要趋势”这类宽泛问题;局部检索从问题相关实体出发,沿图谱路径扩展,适合回答”X公司与Y公司有什么关系”这类具体问题。
# 全局检索
graphrag query --root ./graphrag_project \
--method global \
--query "该领域有哪些核心技术趋势?"
# 局部检索
graphrag query --root ./graphrag_project \
--method local \
--query "张三与公司A之间是什么关系?"
Neo4j存储与大规模图谱管理
当知识图谱节点规模超过十万级,SimpleGraphStore的内存存储方式不再适用。Neo4j作为原生图数据库,支持Cypher查询和图算法,适合承载大规模GraphRAG知识图谱。
from llama_index.graph_stores.neo4j import Neo4jGraphStore
graph_store = Neo4jGraphStore(
username="neo4j",
password="your_password",
url="bolt://localhost:7687",
database="neo4j",
)
storage_context = StorageContext.from_defaults(graph_store=graph_store)
kg_index = KnowledgeGraphIndex.from_documents(
documents,
storage_context=storage_context,
max_triplets_per_chunk=10,
include_embeddings=True,
)
Neo4j存储后可使用Cypher查询直接验证图谱结构:
MATCH (e:Entity)-[r:RELATES_TO]->(t:Entity)
WHERE e.name CONTAINS "张三"
RETURN e.name, type(r), t.name
LIMIT 20;
也可以调用Neo4j内置的GDS图算法库执行社区检测、节点相似度计算等操作,将结果回传给GraphRAG的检索层。
检索质量评估与调优
GraphRAG的检索质量取决于知识抽取准确率和图谱结构合理性。评估指标包括实体召回率、关系精确率、答案忠实度。可通过以下方式调优:
- 调低LLM抽取温度(temperature=0.1~0.3)提升三元组一致性
- 对实体名称做归一化处理,合并同一实体的不同表述
- 设置关系置信度阈值,过滤低频低概率关系
- 在检索阶段结合向量相似度和图路径距离做混合排序
在评估数据集上对比GraphRAG与传统向量RAG的答案质量,GraphRAG在多跳推理类问题上的准确率通常提升15%至30%,但在简单事实类问题上因额外开销可能略慢。实际部署中应根据问题类型动态选择检索策略。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/da-mo-xing-zhi-shi-tu-pu-rong-he-shi-zhan-graphrag-jian-suo/