GraphRAG 知识图谱数据清洗完整实操:3步把脏数据洗干净
【免费下载链接】graphragA modular graph-based Retrieval-Augmented Generation (RAG) system项目地址: https://gitcode.com/GitHub_Trending/gr/graphrag
GraphRAG 用原始文本构建知识图谱,而图的质量取决于数据洗得干不干净。这篇文章沿着一条数据从入库到出图的路径走,讲清楚文本标准化、字段校验、图结构降噪三步,帮你把知识图谱的数据清洗做完整。
1️⃣ 入库前,先跑一遍脏数据自检清单
原始数据常见三种脏法,每类都对应一个下游后果:
- 文本乱码:HTML 转义符、不可见控制字符、首尾空格。后果:
O'Reilly和O'Reilly会被抽成两个节点,同一个实体被拆散,描述和关系跟着碎片化。 - 字段缺失或类型不对:实体记录缺
title,字段里混进浮点数。后果:空值直接进图,下游操作当场报错,一条坏记录污染一批结果。 - 孤立节点和弱连接:LLM 偶尔会抽取上下文里不成立的关系,还有大量低频孤立节点。后果:社区检测把图切碎,社区报告变散,全局检索的答案失去焦点。
这三类能认出来,清洗就成功了一半。
2️⃣ 第1步:文本标准化,先把实体名洗成同一副面孔
这一步做的事:把实体名和关系描述里的 HTML 转义还原掉,剥掉控制字符和首尾空格。
去这里看:packages/graphrag/graphrag/index/utils/string.py里的clean_str。它在packages/graphrag/graphrag/index/operations/extract_graph/graph_extractor.py中被调用,每次从模型输出里解析出实体和关系时都会过一遍。
from graphrag.index.utils.string import clean_str raw = " Operation&Dulce\x01" print(clean_str(raw)) # "Operation&Dulce"顺序是:strip 去首尾空白,html.unescape还原&这类实体,再用正则清掉\x00-\x1f等不可见字符。同一实体不再以多种面目出现,后面的去重和度数统计才真正生效。
3️⃣ 第2步:字段校验,把残缺记录拦在图外面
这一步做的事:对每条抽取记录检查字段是否齐全、类型是否对得上,不通过就丢弃,不让它进图。
去这里看:packages/graphrag/graphrag/index/utils/dicts.py里的dict_has_keys_with_types,传入一组(字段,类型)配对,缺字段或类型转不了就返回 False;packages/graphrag/graphrag/index/utils/is_null.py里的is_null则同时接住None和NaN。校验失败时先查这两处。
口径建议:必填字段按你自己的 schema 定,通常是实体名、类型、描述。别把只在部分数据源里才有的字段也设为必填,否则整批都会被拒。
4️⃣ 第3步:stable_lcc 加剪枝,给图结构降噪
这一步做的事:图建好后,把不连通的碎岛、低度节点、低权重边裁掉。
去这里看:packages/graphrag/graphrag/graphs/stable_lcc.py里的stable_lcc,它在packages/graphrag/graphrag/index/operations/cluster_graph.py做社区检测前被调用——先归一化节点名,只保留最大连通分量,再对反向边去重、排序,保证同一批边每次都产出同样的结果。
想剪得更狠,用packages/graphrag/graphrag/index/operations/prune_graph.py,配置项定义在packages/graphrag/graphrag/config/models/prune_graph_config.py:
prune_graph: min_node_freq: 1 min_node_degree: 2 min_edge_weight_pct: 40 lcc_only: truemin_node_degree: 2表示关联数不足 2 的节点会被移除,min_edge_weight_pct: 40表示只保留权重排在前 60% 的边。拿不准就先用默认值,剪太狠会把真实关系一起裁掉。
5️⃣ 清洗后怎么验证:一张对比表,四个调参位
| 维度 | 清洗前 | 清洗后 |
|---|---|---|
| 同名实体 | O'Reilly与O'Reilly各是一个节点 | 归一化后合并,描述集中在同一节点 |
| 残缺记录 | 空值进图,下游报错 | 在校验层被拦下 |
| 孤立节点与弱边 | 碎岛把社区切碎,报告发散 | 按度数与权重阈值剪枝 |
| 检索体验 | 噪声实体混入,答案容易跑偏 | 实体图更干净,社区报告更聚焦 |
调参位:
- 分块:
size默认 1200、overlap默认 100,定义在packages/graphrag-chunking/graphrag_chunking/chunking_config.py;上下文窗口小的模型把 size 调下来 - 必填字段:按业务 schema 定,宁少勿滥
- 剪枝阈值:社区结果里还看到孤立节点时,把
min_node_degree往上抬一档 - 验证习惯:每次清洗完打开 output 下的
entities.parquet和community_reports.parquet,确认没误伤重要实体
动手之前
三步走完,脏数据就不会以原样进图了。最省事的验证办法:拿官方示例数据集 Operation Dulce 完整跑一遍管道,对比清洗前后的实体和关系产出,效果比任何理论都直观。
【免费下载链接】graphragA modular graph-based Retrieval-Augmented Generation (RAG) system项目地址: https://gitcode.com/GitHub_Trending/gr/graphrag
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考