GraphRAG 数据清洗:脏数据进图谱前先过三道关
GraphRAG 数据清洗脏数据进图谱前先过三道关【免费下载链接】graphragA modular graph-based Retrieval-Augmented Generation (RAG) system项目地址: https://gitcode.com/GitHub_Trending/gr/graphrag把一批刚抓下来的文本丢进 GraphRAG流水线跑完打开产出的实体表同一个公司出现了 Microsoft、MICROSOFT 和带转义符号的三种写法一批关系的描述是空的图导进 Gephi 里就是一团毛球分不清谁是主节点、谁是噪声。这种事我见得多了说说我验证过的处理顺序——工具都在仓库里不用你自己造轮子。GraphRAG 的关系表第一次载入 Gephi节点和边杂乱无章时数据质量问题先表现为这种毛球先把文本过一遍HTML转义与控制字符实体分裂最常见的来源是格式差异不是真实实体。大模型输出里会带amp;、quot;这类 HTML 转义原始文本里还藏着零宽字符和控制字符。不处理它们Microsoft 和 Microsoft 会永远是两个节点后面做多少去重都白费。仓库里现成的是 string.pygraphrag/index/utils/string.py中的clean_str先html.unescape还原转义再去掉首尾空白最后用一条正则把 \x00-\x1f、\x7f-\x9f 区间的控制字符清掉。你写自己的预处理步骤时对实体名和描述字段直接调它就行别自写一套转义处理规则。怎么确认做对了重跑后打开实体表检索名字里含、或不可见字符的行之前是脏的、现在是空的这一关就算过。过滤掉无效行和空值大模型不会 100% 按格式输出典型情况是某行实体缺了描述字段或者 id 是 NaN。这种行进到关系表里就成了能连上但没有任何信息的幽灵节点。仓库里有两个工具配合用dicts.pygraphrag/index/utils/dicts.py的dict_has_keys_with_types一次校验字段存在性和类型inplaceTrue时顺手把值转成目标类型is_null.pygraphrag/index/utils/is_null.py的is_null判空值。有个细节值得注意它同时覆盖None和 float 的 NaN只写is None会把 NaN 行漏过去脏数据又回来了。用法上先校验、后过滤把不通过的行剔除或补齐。被剔除的行最好记一条日志回头排查时会很省事。让主岛自己浮出来最大连通分量筛选文本清干净之后图通常长这样一个大岛、几个小岛、一堆散点。社区检测在这种结构上跑小岛自成社区报告被一堆边角话题稀释。核心工具是 stable_lcc.pygraphrag/graphs/stable_lcc.py里的stable_lcc四步动作先把所有节点名归一化反转义、转大写、去空白顺手把大小写不一致的重复节点合并再过滤到最大连通分量LCC散落的小岛直接不要然后统一边方向、去掉反向重复边最后固定排序输出。stable的含义是打乱输入行的顺序输出的行序也不变重跑结果不漂移。配置文件里对应cluster_graph这一段cluster_graph: max_cluster_size: 10 use_lcc: true seed: 0use_lcc控制是否走 LCC 筛选max_cluster_size控制单个社区的最大规模seed是随机种子。打开后 relationships 表行数会明显下降用 connected_components.pygraphrag/graphs/connected_components.py数的连通分量个数应该变成 1。经过 LCC 筛选和分层 Leiden 社区检测后原本零散的节点清晰聚成一个个高内聚的彩色社区再剪枝然后看社区效果LCC 只解决了岛的问题解决不了岛内噪声度为 1、2 的节点和弱连接边不影响图的连通性但会拖累社区划分的稳定性。prune_graph.pygraphrag/index/operations/prune_graph.py干的就是这件事——按阈值剪掉低度节点和弱边让剩下的图收紧。效果怎么看把 snapshot_graphml.pygraphrag/index/operations/snapshot_graphml.py产出的 graphml 快照导进 Gephi在 Network Overview 里各跑一次 Average Degree 和 Leiden algorithm平均度上来了、Gephi 的 Leiden 划分和流水线输出的划分一致说明图结构健康了。Gephi 的 Network Overview 面板Average Degree 与 Leiden algorithm 两项统计是清洗后最直观的体检指标验证清洗效果看结构指标 别凭感觉看结构指标。下表是一个噪声较多的小语料上观察到的典型量级不是普适数字但方向一致指标清洗前三道关之后同一实体的写法数大小写/转义差异多个并存归一化合并为 1 个连通分量个数多个岛1 个主岛无效实体行缺字段 / NaN散落表中全部过滤或补齐关系表行序随输入顺序变化固定排序可复现这四项收敛之后再去谈检索效果才有意义。仓库里 unified-search-app/ 自带一个本地对比界面同一个问题同时问 local search 和 global searchunified-search-app 对比页面local search 与 global search 对同一问题并排作答脏图谱拖累的答案一眼可见效果还不够好的时候实体重复依然严重问题往往不在后处理而在抽取提示词。仓库的 prompt_tunegraphrag/prompt_tune/目录里有自动调优机制让大模型从你的数据里反推实体类型列表和描述汇总提示词。配套指南在 docs/prompt_tuning/调优前后的提示词都留有对照可以直接抄作业。社区划分还不稳定先查max_cluster_size和seed社区上限太小划分会乱跳种子随机每次跑都不一样。想更客观就用 modularity.pygraphrag/graphs/modularity.py对两组参数分别算模块度选分数高的一组比凭感觉靠谱。下一步建议先用仓库自带的 Operation Dulce 小数据集docs/data/operation_dulce/把整条流水线完整跑一遍把上表四项指标记下来确认工具链在你的环境里稳定再换成自己的数据跑。【免费下载链接】graphragA modular graph-based Retrieval-Augmented Generation (RAG) system项目地址: https://gitcode.com/GitHub_Trending/gr/graphrag创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考