GraphRAG 核心知识点 +“提升实体 / 关系匹配数量” 全攻略(通俗版)
步骤大白话解释关键作用拆文本单元把文档切成小片段(TextUnit),比如每 200 字一段细粒度分析,方便后续提引用提知识图谱用 LLM 从片段里抠 “实体”(比如曹操、关羽)和 “关系”(比如曹操 - 结拜 - 关羽),还有 “主张”(比如 “曹操统一了北方”)把文字变成结构化的 “关系网”,是 GraphRAG 的核心社区聚类用 Leiden 算法把相关实体归成 “社区”(比如 “三国曹魏集
先划核心:GraphRAG 是「给文本建 “关系网” 的高级 RAG」—— 把文档拆成 “实体(人 / 事 / 物)+ 关系(谁和谁做了啥)” 的知识图谱,再按 “社区(相关实体组)” 分层总结,查问题时要么看全局社区、要么挖实体细节,比普通 RAG 更能答复杂问题。
下面先讲透 GraphRAG 核心知识点,再重点拆解 “怎么让匹配到的实体 / 关系更多”。
一、GraphRAG 核心知识点(通俗拆解)
1. 为啥 GraphRAG 比普通 RAG 强?
普通 RAG 是 “找相似文字片段”,比如查 “19 世纪艺术影响 20 世纪”,只能零散找到 “莫奈→印象派”“毕加索→立体主义”;GraphRAG 是 “找实体 + 关系的关联网”,能挖出 “莫奈的新技术→革新光色描绘→影响毕加索→毕加索开创立体主义→改变 20 世纪艺术”,把零散信息串起来,回答更完整。
2. GraphRAG 的核心流程(分 “建索引” 和 “查问题” 两步)
(1)建索引:把文本变成 “关系网 + 社区总结”(核心是多了 “结构化提取”)
| 步骤 | 大白话解释 | 关键作用 |
|---|---|---|
| 拆文本单元 | 把文档切成小片段(TextUnit),比如每 200 字一段 | 细粒度分析,方便后续提引用 |
| 提知识图谱 | 用 LLM 从片段里抠 “实体”(比如曹操、关羽)和 “关系”(比如曹操 - 结拜 - 关羽),还有 “主张”(比如 “曹操统一了北方”) | 把文字变成结构化的 “关系网”,是 GraphRAG 的核心 |
| 社区聚类 | 用 Leiden 算法把相关实体归成 “社区”(比如 “三国曹魏集团”“三国蜀汉集团”),还会分层(比如 “曹魏” 下分 “核心武将”“谋士”) | 把零散实体分组,方便全局查询 |
| 社区总结 | 给每个社区写摘要(比如 “曹魏集团核心人物有曹操、郭嘉,主要事迹是统一北方”) | 回答宏观问题时不用翻所有实体,直接用摘要 |
| 可视化(可选) | 用 UMAP 把实体转成 2D 图形,能直观看到实体关联 | 方便人工看 “关系网” 结构 |
(2)查问题:两种模式适配不同需求
| 查询模式 | 适用场景 | 大白话逻辑 | 例子 |
|---|---|---|---|
| 全局查询(Global) | 宏观 / 跨文档问题 | 看 “社区总结”,汇总整个知识库的信息 | “《三国演义》的主题是什么?”“19 世纪艺术如何影响 20 世纪?” |
| 本地查询(Local) | 具体 / 细节问题 | 揪出问题里的核心实体,挖它的所有关联关系 / 片段 | “关羽战胜过哪些武将?”“莫奈的新技术具体是什么?” |
3. 部署 GraphRAG 的关键步骤(微软开源版)
核心是 “先建索引,再查问题”,关键坑在配置:
- 下载代码 + 装依赖(用 poetry 管理环境,避免包冲突);
- 放文档到 input 目录(支持 txt/PDF 等);
- 改配置:.env 填 LLM 的 API Key(比如 OpenAI),settings.yaml 选便宜的模型(比如 gpt-4o-mini);
- 建索引(耗时看文档量,核心是生成知识图谱和社区);
- 查问题:全局查宏观、本地查细节。
二、核心问题:如何让匹配到的 entities(实体)和关系更多?
本质是 “让 GraphRAG 在提取 / 检索阶段,尽可能多的识别、保留、召回相关实体和关系”,分「提取阶段(建索引时)」和「检索阶段(查问题时)」两部分优化,每步都给具体操作:
第一步:提取阶段(建索引时)—— 让更多实体 / 关系被 “抠出来”
这是基础:如果建索引时没提取到某个实体 / 关系,检索时根本匹配不到。
1. 优化文本切分(TextUnit):别切太碎 / 太粗
- 问题:切太短(比如 50 字)会把 “曹操 - 任命 - 郭嘉” 拆到两个片段,LLM 没法提取关系;切太长(比如 1000 字)会让 LLM 漏检次要实体。
- 优化操作:
- 配置 settings.yaml 里的 TextUnit 大小:建议中文设置为「chunk_size=300,chunk_overlap=50」(300 字一段,相邻段重叠 50 字),既保证上下文完整,又不遗漏细节;
- 按 “语义切分” 而非 “固定字数”:比如按章节、段落自然分割,避免把一个完整的 “实体 - 关系” 拆断(微软 GraphRAG 支持自定义切分规则)。
2. 优化实体 / 关系提取的 Prompt:明确要求 LLM“多提、提全”
GraphRAG 默认用 LLM 提取实体 / 关系,Prompt 太笼统会导致漏提,需自定义 prompts 文件夹里的「entity_extract.yaml」和「relationship_extract.yaml」:
- 坏 Prompt:“提取这段文本中的实体和关系”;
- 好 Prompt(中文适配版):
请从以下文本中提取所有实体和关系,要求: 1. 实体类型包括:人物、地点、事件、组织、物品、概念(比如“印象派”“立体主义”); 2. 不要遗漏次要实体(比如配角、小事件); 3. 关系要具体,格式为「实体A-关系动词-实体B」(比如“关羽-斩杀-颜良”“莫奈-开创-印象派”); 4. 同一实体的不同叫法要标注(比如“曹孟德”=“曹操”,“关云长”=“关羽”)。 文本:{text_unit} - 关键:明确实体类型、要求提次要实体、统一关系格式,让 LLM 知道 “要提全,不是只提核心”。
3. 启用实体解析(Entity Resolution):合并 “同名 / 异名实体”
- 问题:默认没启用实体解析,会把 “曹操”“曹孟德”“魏王” 当成 3 个实体,检索时只匹配到一个,导致关系漏检;
- 优化操作:在 settings.yaml 里把「entity_resolution.enabled」设为 True;配置解析规则:比如 “基于名称相似度 + 上下文” 合并实体(GraphRAG 支持自定义解析 Prompt,要求 LLM 识别 “同实体不同名”);效果:合并后 “曹操” 相关的所有关系都会汇总到一个实体下,匹配数量翻倍。
4. 降低实体过滤阈值:别把 “弱相关实体” 筛掉
- 问题:GraphRAG 默认会过滤 “出现次数少” 的实体(比如只提了 1 次的配角),导致小众实体 / 关系被漏掉;
- 优化操作:在 settings.yaml 里调整「entity_filter.min_occurrences」(实体最小出现次数):从默认的 2 改成 1;调整「relationship_filter.min_occurrences」(关系最小出现次数):从默认的 2 改成 1;注意:别设为 0,否则会引入大量无意义实体(比如 “的”“了”),需配合停用词表过滤。
5. 选择更强大的 LLM 做提取:别用太弱的模型
- 问题:用 gpt-3.5-turbo 提取实体,比 gpt-4o-mini 漏提率高 30%+;
- 优化操作:建索引阶段(提取实体 / 关系)用更强的模型(比如 gpt-4o),查询阶段用便宜的模型(比如 gpt-4o-mini);理由:提取是 “一次性工作”,多花点成本提全,后续检索收益更大。
第二步:检索阶段(查问题时)—— 让更多已提取的实体 / 关系被 “匹配到”
提取阶段提全了,但检索时没召回,还是白搭,重点优化 “召回范围” 和 “匹配规则”:
1. 优化本地查询(Local)的实体召回范围
- 问题:默认本地查询只召回 “直接关联” 的实体(比如查 “曹操” 只找 “曹操 - 结拜 - 关羽”),漏了 “间接关联”(比如 “曹操 - 重用 - 郭嘉 - 推荐 - 司马懿”);
- 优化操作:在 settings.yaml 里调整「local_query.entity_expansion_depth」(实体扩展深度):从默认的 1 改成 2/3;解释:深度 1 = 只找直接关联实体,深度 2 = 找直接 + 间接关联实体,深度 3 = 找三层关联(比如曹操→郭嘉→司马懿→司马昭);注意:深度别超过 3,否则会引入太多无关实体,拖慢速度。
2. 放宽检索的相似度阈值:别把 “弱相关” 实体筛掉
GraphRAG 检索时会用 “相似度分数” 筛选实体,阈值太高会漏检:
- 找到 settings.yaml 里的「retrieval.similarity_threshold」(相似度阈值):
- 默认是 0.7(余弦相似度),改成 0.5~0.6;
- 效果:原本分数 0.65 的 “弱相关实体” 会被召回,匹配数量增加;
- 兜底:后续加 “重排序”(比如用 CrossEncoder),把无关实体再筛掉,既多召回又保证精准。
3. 优化查询改写:让问题里的实体更明确
- 问题:用户提问模糊(比如 “三国里谁打过关羽?”),GraphRAG 识别不出核心实体 “关羽”,导致匹配少;
- 优化操作:在查询前加 “问题改写 Prompt”,让 LLM 先把模糊问题转成 “实体明确的问题”:
plaintext
用改写后的问题去检索,能精准定位核心实体,进而召回更多关联关系。请改写以下问题,明确核心实体,格式为「核心实体:XXX,问题:XXX」: 原问题:{user_query} 例子: 原问题:三国里谁打过关羽? 改写后:核心实体:关羽,问题:《三国演义》中哪些武将与关羽有交战关系?
4. 合并多轮检索结果:别只靠一种方式找实体
- 操作:本地查询时,同时用 “语义相似度检索”+“知识图谱遍历” 两种方式找实体,再合并结果:
- 语义检索:找和问题语义相似的 TextUnit 里的实体;
- 图谱遍历:从核心实体出发,遍历所有关联实体;
- 合并去重:把两种方式找到的实体 / 关系合并,数量至少提升 50%。
第三步:兜底优化(通用)
- 增加 TextUnit 的数量:如果文档太长,拆更多小片段,每个片段都做实体提取(别合并太多内容);
- 用开源 LLM 本地化提取:如果用 OpenAI API 有字数限制,换本地化的 LLM(比如 DeepSeek-R1、Qwen-7B),能处理更长文本,提取更多实体;
- 人工补充实体 / 关系:对核心领域(比如小说网站的 “仙侠题材”),手动加 “实体别名表”(比如 “修仙”=“修真”=“炼气”),避免漏提。
三、总结
要让 GraphRAG 匹配更多实体 / 关系,核心是 “提取阶段提全、检索阶段召回全”:
- 提取时:优化切分、写明确的提取 Prompt、启用实体解析、降低过滤阈值;
- 检索时:扩展实体遍历深度、放宽相似度阈值、优化问题改写、合并多轮检索;
- 最终目标:既多匹配,又通过重排序保证精准(别为了数量引入太多无关内容)。
比如针对小说网站的 GraphRAG,按这套优化后,查 “穿越甜宠文的女主有哪些” 时,能匹配到 “女主名字 + 身份 + 男主关系 + 核心剧情” 等更多实体 / 关系,推荐的小说也会更精准。
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)