脏数据怎么变成可用的知识图谱:GraphRAG 管道里四道数据清洗关卡的实操路径

发布时间:2026/9/1 11:36:22
脏数据怎么变成可用的知识图谱:GraphRAG 管道里四道数据清洗关卡的实操路径 脏数据怎么变成可用的知识图谱GraphRAG 管道里四道数据清洗关卡的实操路径【免费下载链接】graphragA modular graph-based Retrieval-Augmented Generation (RAG) system项目地址: https://gitcode.com/GitHub_Trending/gr/graphragGraphRAG 是微软开源的图结构 RAG 系统它把原始文本切块、抽取实体关系、聚成社区最终产出可检索的知识图谱。如果你的原始数据里混着 HTML 转义符、空字段和一次性噪声实体本文带你逐个看懂管道中 clean_str 文本清洗、空值拦截、prune_graph 图剪枝和分块重叠这四个内置环节分别在哪里起作用、怎么验证效果读完可以直接对照自己的数据排查质量问题。 场景一叠从 Wiki 导出的 CSV跑完管道却搜不出东西假设你从内部 Wiki 导出一批 CSV每行是一篇文章。你的目标是跑完索引管道让全局搜索能回答某项目有哪些关联人物和事件这类问题。但数据是典型的二手数据正文里留着amp;、#39;这样的 HTML 转义符个别行文本列是空的还有一些只被提及过一次的边角人物。直接跑管道不会报错但结果会很难看实体表里混着JOHN#39;S和JOHNS两个同一个人向量表里有空文本占位社区报告里一半章节在讨论一次性提及的噪声节点。GraphRAG 的处理思路不是让你先写一套清洗脚本而是把清洗动作分布在管道的固定关卡里数据每经过一关就过滤一次。下面按数据流向走一遍这四道关卡。 实体名和描述上的脏字符clean_str 在抽取环节统一擦除什么时候会遇到LLM 做实体抽取时输出的是形如(entity, Name, TYPE, 描述)的元组字符串。如果原文带 HTML 转义、首尾空格或控制字符这些脏字符会原样进入实体名——之后BUSH和BUSH带尾随空格就成了两个节点。项目能力核心函数是 packages/graphrag/graphrag/index/utils/string.py 里的clean_str逻辑就三步先strip()去首尾空白再html.unescape还原转义字符最后用正则删掉\x00-\x1f和\x7f-\x9f区间的不可见控制字符。它不需要你调用packages/graphrag/graphrag/index/operations/extract_graph/graph_extractor.py 的_process_result在解析每条 LLM 输出时对实体名、实体类型、实体描述、关系的源/目标节点和边描述逐个执行了clean_str(...).upper()也就是说所有进图的名字都强制统一为大写 无脏字符。怎么验证索引跑完后直接看输出目录的entities.parquet搜一下amp;、#这类片段正常情况应该一条都搜不到再抽查几个长实体名确认没有尾随空格。# clean_str 的完整实现只有三行核心逻辑 result html.unescape(input.strip()) return re.sub(r[\x00-\x1f\x7f-\x9f], , result) 空文本和字段类型不对的行在向量化和入库前拦下来什么时候会遇到CSV 里某行的文本列是空字符串或 NaNJSON 里某条记录缺了text字段。这类行如果流到向量模型那里轻则浪费一次请求重则整批报错。项目能力所有输入格式最终都会被归一成同一张documents表id/text/title/creation_date/raw_data五个字段见 docs/index/inputs.md。空值拦截靠 packages/graphrag/graphrag/index/utils/is_null.py 的is_null——它同时判断None和浮点NaNpandas 读空单元格给的是 NaN 而不是 None只判None是常见坑。packages/graphrag/graphrag/index/operations/embed_text/run_embed_text.py 在入口处直接用它短路空输入返回空结果不产生任何向量调用。字段结构校验则由 packages/graphrag/graphrag/index/utils/dicts.py 的dict_has_keys_with_types完成先查字段是否存在再尝试类型转换任何一步失败整行判为不合格。怎么验证跑完管道后对比两处的行数——输入 CSV 的行数、输出documents.parquet的行数、输出text_units.parquet的行数。空文本行会被排除在 text_units 之外这个差值就是你被拦下来的脏行数。✂️ 孤立节点和弱边prune_graph 与 stable_lcc 给社区检测喂干净输入什么时候会遇到实体抽取对长尾内容特别慷慨跑出来的图里常常有成片的孤立点和互不相连的碎块。社区检测Leiden 算法在这种图上会切出大量无意义的微型社区社区报告质量随之下降。项目能力两道关卡配合工作。第一道是 packages/graphrag/graphrag/index/operations/prune_graph.py 的prune_graph支持按节点出现频次min_node_freq、节点度数min_node_degree、边权重百分位min_edge_weight_pct删节点删边还能砍掉度数最高的自我中心节点remove_ego_nodes或只保留最大连通分量lcc_only。第二道是 packages/graphrag/graphrag/graphs/stable_lcc.py 的stable_lcc在社区聚类入口packages/graphrag/graphrag/index/operations/cluster_graph.py对边表做四件事节点名归一化HTML 还原、大写、去空格、只留最大连通分量、把每条边的方向统一成字典序小的在前、去重后排序——最后一步保证同样的边表输入永远得到同样的输出社区划分可复现。怎么验证剪枝参数在settings.yaml里配置最小片段如下prune_graph: min_node_freq: 2 # 只出现 1 次的节点直接删除 min_edge_weight_pct: 40 # 删掉权重低于 40 百分位的弱边 remove_ego_nodes: false lcc_only: true验证方法是跑两次开/关lcc_only或调整min_node_freq对比entities.parquet和relationships.parquet的行数变化再抽查被删节点是否确实都是低价值实体。下图是社区结构在可视化软件中的典型样子剪枝后大图会更聚团 分块大小和重叠怎么设别让关键概念被切断什么时候会遇到切块chunking阶段按固定 token 数把长文切成 text unit。两个高频问题一是文档开头的标题、作者这类元信息只落在第一个块里后面的块全部失忆二是overlap设为 0 时恰好跨块边界的实体描述会被拦腰截断LLM 看到的句子不完整抽取质量明显变差。项目能力切块行为由input块和切块参数控制完整说明在 docs/index/inputs.md。prepend_metadata会把选定的字段以key: value形式复制到每个块开头overlap控制相邻块共享的 token 数input: type: csv text_column: article title_column: headline chunks: size: 1200 overlap: 100 prepend_metadata: [title]怎么验证看输出text_units.parquet的size列——启用prepend_metadata后除了尾块之外每个块的长度应稳定一致说明元信息没占掉内容空间把overlap从 0 调到size的 5%~10% 各跑一次对比实体描述被截断的条数搜描述末尾是半个词的行。 排障自查清单可观察的症状常见根因处理办法实体表里出现#39;、amp;或带前后空格的名字原文 HTML 转义未还原或绕过了_process_result的解析路径确认走的是标准extract_graph工作流自定义 DataFrame 输入时自己先过一遍clean_strtext_units行数远少于预期、部分文档消失文本列为空字符串或 NaN被is_null拦截属正常拦截检查 CSV 里text_column指向的列是否确实非空社区报告里全是三五个节点的微型社区长尾实体未剪枝图里碎块太多提高min_node_freq如 2~3开启lcc_only: true两次索引同样的数据社区划分不一致边表方向未归一、存在反向重复边确认cluster_graph链路生效内部会调stable_lcc做去重和排序靠后的 text unit 丢失标题/作者上下文未开启prepend_metadata元信息只在首块在切块配置里把title等字段加入prepend_metadata 速查关键配置项与下一步配置/函数位置作用clean_strpackages/graphrag/graphrag/index/utils/string.py转义还原、去控制字符、去首尾空白抽取环节自动调用is_nullpackages/graphrag/graphrag/index/utils/is_null.py同时判 None 与 NaN向量调用前短路空输入dict_has_keys_with_typespackages/graphrag/graphrag/index/utils/dicts.py字段存在性 类型转换双重校验prune_graphpackages/graphrag/graphrag/index/operations/prune_graph.py按频次/度数/边权重剪枝可选lcc_onlystable_lccpackages/graphrag/graphrag/graphs/stable_lcc.py最大连通分量 边归一化保证社区划分可复现chunks.size / overlap / prepend_metadata见 docs/index/inputs.md控制切块大小、重叠与元信息复制下一步建议用仓库自带的 Operation Dulce 示例数据集跑一遍完整流程原始材料和配置都在 docs/data/operation_dulce/跑完后对照entities.parquet、communities.parquet验证本文提到的每个清洗环节切块行为的更多细节可以接着读 docs/index/inputs.md 和管道总览 docs/index/default_dataflow.md。【免费下载链接】graphragA modular graph-based Retrieval-Augmented Generation (RAG) system项目地址: https://gitcode.com/GitHub_Trending/gr/graphrag创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考