GraphRAG 全流程实战指南:从入门到业务落地

本文较长,建议点赞收藏。更多AI大模型应用开发学习视频及资料,在智泊AI
本文全面解析微软开源的 GraphRAG 项目,从它是什么、怎么用、如何优化运行性能、生成哪些关键文件,到如何集成到你自己的业务中。内容深入但通俗,适合开发者、数据分析师、AI工程师学习参考。


一、什么是 GraphRAG?它解决了什么问题?

GraphRAG(Graph Retrieval-Augmented Generation)是微软研究团队发布的开源项目,它是一种"图增强的检索生成系统"。

与传统的RAG不同,GraphRAG不仅仅是"检索+生成",它引入了图结构,使得RAG具备以下关键能力

能力 描述
结构化理解 构建文档内的实体-关系图谱
全局洞察 对文档中的知识点进行社区聚类和语义总结
精确查询 提供局部语义搜索全局知识总结两种方式
可解释性强 每个结论都可以回溯原始实体、文本、社区

使用GraphRAG的典型场景:

  • 长文档问答(文档QA) :如法律文书、政策文件、财报等
  • 结构化摘要生成:需要从海量文本中提炼结构化知识
  • 知识图谱构建:不手写规则、纯靠LLM自动提取关系
  • 企业数据洞察:对公司资料、项目报告进行结构建模和分析
特性 传统Embedding Search 普通RAG GraphRAG
基于向量检索
上下文生成
知识关系建模
社区聚类分析
全局结构回答
可解释性

简言之,GraphRAG是对RAG的能力升级,不仅可问,还能解释"知识是如何构成的"。


二、如何跑通 GraphRAG?从0到1完整流程

1. 安装环境(推荐使用虚拟环境)

复制代码
​
pip install graphrag
不再需要 Poetry、源码克隆等繁琐步骤。GraphRAG 已正式发布到 PyPI。
​

2. 初始化项目目录

使用官方命令快速初始化:

bash 复制代码
graphrag init --root ./ragtest
这一步会生成标准的目录结构:
ragtest/
├── settings.yaml      
# 主配置文件
├── prompts/           
# 提示词模板
├── .
env
# 存放API密钥(需手动填入)
└── input/             
# ❗需要手动创建,用来放你要分析的文档
​

3. 配置 API 密钥

编辑 .env 文件,填入你的 API Key。例如使用硅基流动 API:

ini 复制代码
GRAPHRAG_API_KEY = sk-your-siliconflow-api-key
同时,在settings.yaml中设置 API 提供方:
makefile 复制代码
models:
default_chat_model:
type: openai_chat
api_base: https://api.siliconflow.cn/v1
api_key: ${GRAPHRAG_API_KEY}
model: deepseek-ai/DeepSeek-V3
encoding_model: cl100k_base
concurrent_requests: 3
requests_per_minute: 30
default_embedding_model:
type: openai_embedding
api_base: https://api.siliconflow.cn/v1
api_key: ${GRAPHRAG_API_KEY}
model: BAAI/bge-large-zh-v1.5
encoding_model: cl100k_base
concurrent_requests: 3
requests_per_minute: 30

4. 添加文档到 input 目录

将你需要处理的文档放入 ragtest/input/ 目录中:

bash 复制代码
ragtest/
├── settings.yaml   # 配置文件
├── prompts/        # 提示词模板
├── input/          # 数据输入目录(需手动创建)
├── .env            # 存储API密钥
└── output/         # 自动生成的索引结果
支持.txt,.pdf,.docx等多种格式。

5. 运行索引构建命令

bash 复制代码
cd ragtest
graphrag index --root .
该命令会自动完成以下过程:
  1. 文本分块
  2. 实体识别与关系提取(调用大模型)
  3. 构建实体-关系图谱
  4. 社区检测(Leiden算法)
  5. 生成社区摘要(调用大模型)
  6. 嵌入计算 + 向量索引构建

这个过程会花费很长时间


6. 运行查询命令

bash 复制代码
# 全局查询(问结构化主题)
graphrag query --root . --method global "公司的核心项目是什么?"
# 局部查询(问细节语义)
graphrag query --root . --method local "张三的职责是什么?"
需要在包含 settings.yaml 配置文件的目录中运行,也就是 ragtest 目录。
cd ragtest  # 切换到包含settings.yaml的目录
示例:
graphrag query --root . --method global --query "张飞是谁的兄弟"
Missing reports for communities: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498]        
SUCCESS: Global Search Response:
张飞是刘备的兄弟。在三国时期,张飞与刘备、关羽并称为'桃园三结义',三人结为异姓兄弟,共同参与了三国的诸多历史事件。[Data: Reports (1, 3)]      

三、ragtest目录结构详解

一旦运行完索引命令,目录结构如下:

csharp 复制代码
ragtest/
├── input/                          # 输入数据
│   └── three_kingdomspart.txt      # 我们给定的文档,比如三国演义
├── output/                         # 主要输出文件
│   ├── documents.parquet           # 文档表
│   ├── text_units.parquet          # 文本单元表
│   ├── entities.parquet            # 实体表
│   ├── relationships.parquet       # 关系表
│   ├── communities.parquet         # 社区表
│   ├── community_reports.parquet   # 社区报告表
│   ├── covariates.parquet          # 协变量表(可选)
│   └── lancedb/                    # 向量数据库
│       └── default/                # 存储文本嵌入向量
├── cache/                          # 缓存文件
│   ├── base_text_units.parquet     # 基础文本单元缓存
│   ├── extracted_entities.parquet  # 提取的实体缓存
│   ├── extracted_relationships.parquet # 提取的关系缓存
│   └── ... (其他中间缓存文件)
└── logs/                           # 运行日志
└── indexing-engine.log         # 索引过程日志

四、GraphRAG输出文件详解

1️⃣ documents.parquet(文档表)

  • 存储原始文档的元信息与全文内容
  • 每个文档一个条目,记录其 titletextdoc_id
  • 就是原始文档的条目

2️⃣ text_units.parquet(文本单元表)

  • 将每个文档分块(chunk)后的切片内容
  • 每一块对应一次LLM调用(如实体提取)
  • 就是切分后的每一个chunk的内容

3️⃣ entities.parquet(实体表)

  • 所有文档中提取出的人物、组织、地点、事件
  • 包含:实体名称、类型、频率、描述、出现在哪些块中
  • 是知识图谱的"节点"

4️⃣ relationships.parquet(关系表)

  • 每对实体之间的语义关系(如"张三-管理-产品部")
  • 包含描述、关系类型、权重等
  • 是知识图谱的"边"

5️⃣ communities.parquet(社区表)

  • 基于图谱运行社区检测算法,聚出"主题组"
  • 每个社区包含一组相关的实体(如某产品线团队)
  • 作用是发现"主题集群"

6️⃣ community_reports.parquet(社区报告表)

  • 对每个社区,调用LLM生成的结构化摘要
  • 包括报告标题、摘要、主要发现
  • 面向的是用户,用的是自然语言
  • Qwen模型容易失败,得换个合适的模型

7️⃣ lancedb/(向量数据库)

  • 每个文本单元的向量表示,用于局部语义搜索

五、GraphRAG是否用到GPU?用的是API还是本地推理?

✅ GraphRAG 默认是 纯CPU + API架构

  • 大模型(LLM)的生成任务 → 调用远程API(如OpenAI、DeepSeek、硅基流动)
  • 向量嵌入 → 调用API返回向量
  • 图谱构建与聚类 → 本地CPU完成

无需安装本地大模型,也不需要GPU。只需配置好API Key,即可全流程运行。


六、如何让GraphRAG跑得更快?性能优化建议

虽然GraphRAG不依赖GPU,但它对网络和API速率非常敏感。

常见导致运行慢的原因:

  1. 文本分块太多(默认1200字符一块)
  2. 并发请求太高,API服务限速
  3. 提取的实体种类太多(默认4类)
  4. 启用了多轮提取或大社区处理

✅ 优化建议清单:

1. 减小文本块大小,降低请求量

yaml 复制代码
chunks:
  size: 600     # 默认1200,减小可以减少每次Token量
  overlap: 50

2. 限制实体类型

yaml 复制代码
extract_graph:
  entity_types: [person, organization]

3. 降低并发并限速(尤其用硅基流动时)

yaml 复制代码
models:
  default_chat_model:
    concurrent_requests: 3
    requests_per_minute: 30

4. 启用缓存

yaml 复制代码
cache:
  type: file
  base_dir: "cache"

5. 先用小文档测试,逐步扩大规模

进一步的性能优化清单

优化点 说明 适用场景
Chunk Size & Overlap 调参 • 若供应商按 token/min 计费/限速,减小 chunk 可让单次 token-load↓,降低被限速概率;但请求数会增多。• 若按 req/min 限速,增大 chunk (1500-2000 tokens)+ overlap 50→20 可以显著减少调用次数。 大文件 / 限速严格
停用 Claim 与 Gleanings settings.yamlclaim_extraction.enabled: false``extract_graph.max_gleanings: 0 只想要实体-关系-社区时
分阶段执行 先跑 graphrag index --root . --method embeddings 只计算嵌入,确认速度 OK 后再跑完整流水线。 超长语料试跑
本地嵌入模型 api_base: http://localhost:11434 + Ollama embedding(nomic-embed)可把 60-70 %的 API 调用转本地,速度和成本双降。 有 GPU / CPU 充裕
递增批处理 利用 parallelization.stagger(0.3-0.5)让请求批次交错,更平滑地利用限额。 供应商支持并发高但限速
文本预清洗 去除页眉页脚、模板重复段,可减少 10-30 % 无效 token。 PDF 批量导入
重用 Prompt 模板 把长系统 prompt 写进 prompt_template: 文件并引用,可显著减小每次 token。 自定义 prompt 很长时

七、我想接入自己项目,应该怎么做?

GraphRAG是标准输出结构+自定义配置驱动的系统,你只需要:

✅ 调整配置文件 settings.yaml

  • 实体类型适配你业务领域
  • 分块策略按文档特点调整
yaml 复制代码
extract_graph:
  entity_types: [person, department, project]
  prompt: prompts/extract_business.txt
chunks:
  size: 1000
  overlap: 100

✅ 修改提示词模板

prompts/ 中编写自定义模板,如:

diff 复制代码
请从以下文本中提取:
- PERSON: 员工、客户、合作伙伴
- DEPARTMENT: 公司内部部门
- PROJECT: 项目/产品

✅ 使用GraphRAG生成结构化结果并接入你系统

你可以将生成的 entities.parquet,``relationships.parquet,``community_reports.parquet作为你系统的知识结构、标签源、甚至问答基础。


✅ 总结

功能 GraphRAG
文档结构建模
实体/关系抽取
社区聚类分析
多层次问答支持
无需本地部署大模型
支持企业定制

GraphRAG 就像是一个自动化知识工厂,帮你从无结构文本中提炼出有结构的图谱和洞察。只要你配置得当,它可以无缝集成到你任何AI相关的业务系统中。


📎 项目地址:github.com/microsoft/g...

📖 官方文档:github.com/microsoft/g...

学习资源推荐

如果你想更深入地学习大模型,以下是一些非常有价值的学习资源,这些资源将帮助你从不同角度学习大模型,提升你的实践能力。

本文较长,建议点赞收藏。更多AI大模型应用开发学习视频及资料,在智泊AI

相关推荐
AI大模型2 小时前
5步构建企业级RAG应用:Dify与LangChain v1.0集成实战
langchain·llm·agent
智泊AI2 小时前
一文讲清:从语言学到深度学习NLP自然语言处理
llm
京东云开发者2 小时前
Joycode 无法跨项目读取源码怎么办?MCP Easy Code Reader 帮你解决!
程序员
京东云开发者2 小时前
宝剑锋从磨砺出——零售数据库内核,为大促铸剑!
程序员
一颗苹果OMG3 小时前
随着AI的发展,测试跟prompt会不会成为每个程序员的必修课
前端·程序员·全栈
FreeCode3 小时前
LangSmith本地部署LangGraph应用
python·langchain·agent
酥风5 小时前
AI概念解惑系列 - RAG
前端·llm·aigc
安思派Anspire6 小时前
使用LangGraph构建自主RAG(3)
aigc·openai·agent