news 2026/10/25 1:00:27

[GraphRAG实现原理-01]让LLM基于构建的知识图谱回答问题

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
[GraphRAG实现原理-01]让LLM基于构建的知识图谱回答问题

GraphRAG是一种结构化的、分层的检索增强生成 (RAG) 方法,它不同于使用纯文本片段的简单语义搜索方法。GraphRAG的流程包括:从原始文本中提取知识图谱,构建社群层级结构,为这些社群生成摘要,然后在执行基于 RAG 的任务时利用这些结构。

1. GraphRAG V.S Baseline RAG

RAG是一种利用真实世界信息改进逻辑逻辑模型(LLM)输出的技术。该技术是大多数基于LLM的工具的重要组成部分,大多数RAG方法都使用向量相似度作为搜索技术,我们称之为基线Baseline RAG。GraphRAG利用知识图谱,在推理复杂信息时显著提升问答性能。RAG技术在帮助逻辑学习模型 (LLM) 处理私有数据集方面展现出潜力,这里的私有数据集是指LLM未接受过训练且从未见过的数据,例如企业的专有研究、业务文档或通信记录。基线 RAG 的创建旨在帮助解决这个问题,但我们观察到Baseline RAG在某些情况下表现非常糟糕:

  • Baseline RAG难以将各个信息点联系起来。这种情况发生在回答问题需要梳理分散的信息,并分析它们之间的共同属性,从而得出新的综合见解时;
  • 当被要求全面理解大型数据集甚至单个大型文档中的概括语义概念时,Baseline RAG的表现很差。

为了解决这个问题,技术界正在努力开发扩展和增强RAG的方法。微软研究院的新方法GraphRAG 基于输入语料库创建知识图谱。该图谱与社区摘要和图机器学习输出一起,用于在查询时增强提示信息。GraphRAG 在回答上述两类问题方面表现出显著的改进,展现出超越以往方法的智能或精湛技术。

这个系列我们将介绍GraphRAG的基本编程模式以及背后的实现原理,以及如何对它进行扩展。并通过一个简单的示例来演示如何使用GraphRAG来构建知识图谱并进行问答。

2. 安装和初始化GraphRAG

我们先来安装GraphRAG并初始化一个新的项目,请确保你已经安装了Python 3.8或更高版本。如下的脚本在激活的Python虚拟环境中在执行python -m pip install graphrag命令后,执行graphrag init对GraphRAG进行了初始化。出现提示时,请指定您希望在配置中使用的默认聊天和嵌入模型,以及API-KEY。

mkdirgraphrag_explorcdgraphrag_quickstart python-mvenv .venv .venv\Scripts\activate python-mpipinstallgraphrag graphrag init

GraphRAG舒适化的过程会在指定的目录下创建如下的目录结构。其中prompts中会包含一系列预定义的提示词模板,他们服务于GraphRAG的知识图谱构建(这个过程被成为索引)和在此基础上的查询。.env文件作为环境变量文件中会包含你在初始化时输入的API-KEY,settings.yaml是GraphRAG的配置文件,它会提供默认的配置。

graphrag_explor ├── prompts ├── .env └── settings.yaml

3. 修改配置文件

settings.yaml提供的配置非常丰富,我们将在后续文章中对每个配置进行介绍,这里我从中摘出如下几个配置节。

## LLM settingscompletion_models:default_completion_model:model_provider:openaiapi_base:https://eap2410.openai.azure.com/openai/v1model:gpt-5.4-miniauth_method:api_key# or azure_managed_identityapi_key:${GRAPHRAG_API_KEY}# set this in the generated .env file, or remove if managed identityretry:type:exponential_backoffapi_version:2024-02-15-previewembedding_models:default_embedding_model:model_provider:openaimodel:text-embedding-3-smallapi_base:https://eap2410.openai.azure.com/openai/v1auth_method:api_keyapi_key:${GRAPHRAG_API_KEY}retry:type:exponential_backoffapi_version:2024-02-15-preview## Storage settingsinput_storage:type:file# [file, blob, cosmosdb]base_dir:"input"output_storage:type:file# [file, blob, cosmosdb]base_dir:"output"## Document processing settingsinput:type:csv# [csv, text, json, jsonl]chunking:type:tokenssize:1200overlap:100encoding_model:o200k_base## Caching settingscache:type:json# [json, memory, sqlite, none]storage:type:file# [file, blob, cosmosdb]base_dir:"cache"## Vector store settingsvector_store:type:lancedbdb_uri:output\lancedbvector_size:1536extract_claims:enabled:truecompletion_model_id:default_completion_modelprompt:"prompts/extract_claims.txt"description:"Any claims or facts that could be relevant to information discovery."max_gleanings:1

上述的配置主要划分为如下几类:

  • LLM:这里设置了两类LLM,一种是服务于知识图谱构建和最终用来查询的LLM(completion_models),另一种用来将文本转换成嵌入向量并存入销量数据库(embedding_models)。这里我指定的分别是gpt-5.4-mini和text-embedding-3-small(默认为text-embedding-3-normal);
  • 存储:input_storage和output_storage是对输入和输出存储的配置,输入存储提供构建知识图谱的原始内容,构建的支持图谱体现为一系列的表(Table)和向量数据库,它们保证在输出存储中。GraphRAG默认提供了file,blob和CosmosDB三种存储,这里我选择的是基于文件系统的file,并设置了对应的目录(input和ouput);
  • 文档处理:input利用type提供了输入文件的格式,这里我使用了csv(默认为text)。chunking用来设置如何将大文档切割成利于处理的切片(chunk),具体包括长度计量方式(tokens)、切片长度、重叠部分长度和编码方式;
  • cache:由于用来构建知识图谱的索引过程会频繁调用LLM,一般会通过缓存LLM响应内容节约成本(Token)和提高效率,cache设置了缓存内容的格式和存储;
  • vector_store:GraphRAG并没有放弃向量数据库,但是向量数据库在GraphRAG和Baseline RAG中的使用方式完全不同。GraphRAG主要利用它来实现针对实体相似度的检索。这里使用的是lancedb,由于使用的嵌入模式为text-embedding-3-small,所里这里设置的维度(1536)需要与之匹配。我们利用db_uri的设置将lancedb输出到output目录下;
  • extract_claims:知识图谱除了会提取实体和关系这些静态规则外,还会以声明(Claim)的方式提取发生在某个实体上的离散事件。这个开关默认是关闭的,我们通过这个配置节将其打开。

4. 构建知识图谱

所谓的知识图谱构建的构建,就是利用预定义的执行管道读取提供的原始数据,然后将其转换成标准文本,并重中提取实体(Entity)、关系(Relationship)、声明(Claim),并最终构建基于层级社区(Community)结构的知识图谱的过程。上面将输入存储设置为目录为input的文件系统,所以我们将承载原始数据的data.csv文件中。

graphrag_explor └── input └── data.csv

data.csv文件内容如下,相当于一个4*3的表格,它从四个维度(选址、产品、营销和供应链)描述了李明如何经营他的咖啡馆。我们将基于这个内容来构建一个简单的知识图谱,并在此基础上实时基于自然语言的查询。

id,title,text doc1,选址,2024年3月,李明决定在杭州开一家咖啡店。他考察了三个地点:学校附近、写字楼商圈、老城区街角。学校附近人流量大,但租金每月高达两万元;写字楼商圈工作日客流稳定,周末冷清;老城区租金低,但年轻客群少。最终李明选择了写字楼商圈,月租一万五千元,签约两年。 doc2,产品,李明将核心产品定为拿铁和美式。拿铁定价二十八元,适合大众口味;美式定价二十二元,面向咖啡爱好者。2024年5月,他推出季节限定款桂花拿铁,首月销量占总额的三成。店长王芳建议增加会员折扣,提升复购率。 doc3,营销,开业初期,李明通过小红书和抖音引流,首周新增粉丝五千人。2024年6月,他建立会员体系,充值五百元赠送五十元,三个月内会员数达到八百人。李明还与周边书店、健身房合作互推,获客成本从每人三十元降到十二元。 doc4,供应链,咖啡豆由云南普洱的供应商张伟每月供货一次,单价每公斤一百二十元。牛奶由本地乳企每日配送。2024年7月,因雨季运输延误,门店断货两天,损失约四千元。李明随后增加了第二家供应商作为备份。

我们只需要在根目录下执行graphrag index命令完成索引。这个过程将执行一段预先配置好的管道,实时输出的内容也体现了这个管道的执行流程。我们将在后续文章中对管道的每一项任务进行详细介绍。

(.venv)E:\graphrag\graphrag_explor>graphrag index Starting pipeline with workflows: load_input_documents, create_base_text_units, create_final_documents, extract_graph, finalize_graph, extract_covariates, create_communities, create_final_text_units, create_community_reports, generate_text_embeddings Starting workflow: load_input_documents Workflow complete: load_input_documents Starting workflow: create_base_text_units4/4............................................................................................Workflow complete: create_base_text_units Starting workflow: create_final_documents Workflow complete: create_final_documents Starting workflow: extract_graph50/50..........................................................................................Workflow complete: extract_graph Starting workflow: finalize_graph Workflow complete: finalize_graph Starting workflow: extract_covariates Workflow complete: extract_covariates Starting workflow: create_communities Workflow complete: create_communities Starting workflow: create_final_text_units Workflow complete: create_final_text_units Starting workflow: create_community_reports4/4............................................................................................Workflow complete: create_community_reports Starting workflow: generate_text_embeddings[2026-10-23T14:46:19Z WARN lance::dataset::write::insert]No existing dataset at E:\AI\python\graphrag\graphrag_quickstart\output\lancedb\entity_description.lance, it will be created[2026-10-23T14:46:22Z WARN lance::dataset::write::insert]No existing dataset at E:\AI\python\graphrag\graphrag_quickstart\output\lancedb\community_full_content.lance, it will be created[2026-10-23T14:46:23Z WARN lance::dataset::write::insert]No existing dataset at E:\AI\python\graphrag\graphrag_quickstart\output\lancedb\text_unit_text.lance, it will be created1/1............................................................................................Workflow complete: generate_text_embeddings Pipeline complete

管道的执行并不是单纯地将前序任务的执行结构直接交给后序任务进行处理,而且会对每项索引任务的输出进行持久化。对于我们的例子来说,所有的索引结果都会保存在output目录下。

graphrag_explor └── output ├── lancedb ├── documents.parquet ├── entities.parquet ├── relationships.parquet ├── text_units.parquet ├── covariates.parquet.parquet ├── community.parquet ├── community_reports.parquet ├── stats.json └── context.json

根据上图所示的目录结构,我们会发现输出的内容由如下四部分组成:

  • .parquet文件: 生成的标准化文档(documents.parquet)、切片/文本单元(text_units.parquet)、实体(entities.parquet)、关系(relationships.parquet)、声明(covariates.parquet)、社区(community.parquet)和社区报告(community_reports.parquet)相关的Table,它们对应采用列式存储的.parquet文件;
  • lancedb:向量数据库,这里默认使用的是lancedb;
  • stats.json:每一项索引任务针对耗时、内存使用和处理数据量的统计信息
  • context.json:索引流水线的上下文/状态信息

5. 查询知识图谱

索引工作完成之后,我们就可以执行graphrag query命令根据指定的指令针对构建的知识图谱进行查询了。这是针对查询*李明在经营咖啡店过程中遇到了哪些风险,分别采取了什么应对措施?*查询结果。文中出现的类似[Data: Reports (1, 3, 0)]的内容是GraphRAG生成答案时自动附加的结论溯源标记,表示这句话的结论来源于索引中编号为 1、3、0 的社区报告(对应于community_reports.parquet文件对应的Table)

(.venv)E:\graphrag\graphrag_explor>graphrag query"李明在经营咖啡店过程中遇到了哪些风险,分别采取了什么应对措施?"## 李明经营咖啡店面临的风险与应对措施李明在经营咖啡店过程中,主要遇到了**供应链中断风险、选址带来的经营不确定性、以及开业初期获客与流量获取风险**。他针对这些风险分别采取了相应措施,以提升门店的稳定性、客流确定性和经营连续性[Data: Reports(1,3,0)]。 首先,**供应链风险**较为直接。2024年7月,由于雨季运输延误,门店曾出现**两天缺货**,估计造成约**四千元损失**。为避免再次发生断供问题,李明随后**增加了第二家供应商作为备份**,以降低对单一供应渠道的依赖,增强供货稳定性[Data: Reports(1)]。这一做法也说明他原先对本地乳企供奶存在依赖,而天气和运输变化会放大断货风险,因此备用供应商对维持经营连续性很重要[Data: Reports(1)]。 其次,李明在**门店选址**上也面临经营风险。他在**学校附近、写字楼商圈和老城区街角**之间权衡时,需要同时考虑客流、租金和客户结构。学校附近虽然客流高,但租金也高;老城区街角租金低,但年轻客群较少。最终,他选择了**写字楼商圈**,看重的是相对稳定的工作日客流和较为可控的租金,这样可以降低经营不确定性[Data: Reports(3,0)]。 第三,李明在**获客初期**还面临流量获取不足的风险。为此,他主要借助**小红书和抖音**进行引流,争取开业初期的曝光和潜在客户。同时,他在**2024年6月建立会员体系**,并通过**充值赠送**等活动促进会员增长和复购,减少对一次性流量的依赖[Data: Reports(0)]。此外,他还通过与**周边书店、健身房**开展合作互推来分散获客压力、降低获客成本,借助本地商户联动补充自有流量不足并扩大客户来源[Data: Reports(0)]。 总体来看,李明的应对思路是围绕“**降低单点依赖、增强稳定性、分散风险**”展开:在供应上增加备用渠道,在选址上平衡客流与租金,在获客上同时使用内容平台、会员机制和本地合作来提升流量韧性[Data: Reports(1,3,0)]。

原始内容涉及三个人李明、王芳和张伟,我们问它三个人是什么关系,得到的答案是准确的。

(.venv)E:\graphrag\graphrag_explor>graphrag query"李明、王芳和张伟三人是什么关系?"## 关系判断从现有数据看,**李明、王芳和张伟并没有形成一个完整的三人直接关系链**。三人都与李明经营的咖啡店有关,但证据只支持以下两组关系: - **李明与王芳**:存在明确的门店经营协作关系。王芳是店长,并就会员折扣和复购率提升向李明提出建议,说明她在门店运营中承担辅助管理角色,而李明负责整体经营决策[Data: Reports(0)]。 - **李明与张伟**:存在供应链关系。张伟是来自云南普洱的咖啡豆供应商,按月向门店供货,说明他是李明咖啡店的上游供应端之一[Data: Reports(2)]。## 结论目前**没有证据表明王芳与张伟之间存在直接关系**,也**没有证据表明张伟直接与王芳发生业务往来**。因此,能确认的是: **李明分别与王芳、张伟存在业务联系,但王芳和张伟之间的关系未被数据明确支持**[Data: Reports(0,2)]。

如果你希望进一步了解构建的知识图谱由哪些具体的表组成,可以阅读下一篇#:GraphRAG实现原理-02:基于社区(Community)的知识图谱

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/25 0:30:00

H3CNE-MSA存储认证:DAS/NAS/SAN与RAID快照考点

简介:面向备考 H3C 认证工程师-MSA 存储(H3CNE-MSA)的考生与技术人员的题库文档,聚焦 H3C 代理 MSA 存储设备的基础配置与维护知识,适合希望系统梳理知识点、检验掌握程度并冲刺认证的初、中级存储工程师。压缩包内仅 …

作者头像 李华
网站建设 2026/10/25 0:19:51

OpenMetadata Docker安装排错:环境、下载、编排、访问四层拆解

简介:《openMetadata docker 安装》是一份面向运维人员、数据平台开发者及系统管理员的实操文档,围绕在 CentOS 7 上使用 Docker 与 Docker Compose 部署 OpenMetadata 元数据管理平台展开,适合需要快速搭建数据发现、数据血缘、数据质量与数…

作者头像 李华
网站建设 2026/10/24 23:50:37

MyBatisPlus批量插入性能优化与实现方案

1. 为什么需要自己实现MyBatisPlus批量插入MyBatisPlus作为MyBatis的增强工具,虽然提供了基础的CRUD操作,但在批量插入场景下存在几个明显的痛点。首先是性能问题,默认的saveBatch()方法实际上是通过for循环执行单条INSERT语句,当…

作者头像 李华
网站建设 2026/10/24 23:41:38

MSA 2040认证题库拆解:从GB0-670到真机排障闭环

简介:这份H3C认证工程师-MSA存储题库文档面向备考H3CNE-MSA的代理商技术服务人员与存储初学者,围绕MSA存储设备的基础配置、维护与产品特性组织内容,可用于考前自测、知识点排查和课堂练习。压缩包仅含1个docx文件,约32KB&#xf…

作者头像 李华
网站建设 2026/10/24 22:52:17

Spring Boot+Vue+SQLite搭建局域网离线考试系统全解析

简介:局域网考试系统终版是一份专为教育领域设计的考试系统安装包,主要面向需要在校内机房或培训场所组织在线考核的教师与信息化管理人员,利用局域网封闭、稳定的特点,解决传统纸笔考试出卷、阅卷、统计耗时耗力的问题。压缩包约…

作者头像 李华
网站建设 2026/10/24 22:44:43

阶梯碳价与电制氢协同优化:MATLAB/YALMIP可商用MILP建模

简介:本资源是一份面向能源系统优化研究者与工程师的MATLAB实战教程,聚焦阶梯型碳交易机制与电制氢技术融合下的综合能源系统24小时优化调度问题。内容涵盖系统建模(传统机组、风电、电解槽、储氢罐、燃料电池五单元耦合)、分段线…

作者头像 李华