拓冰建站拓冰建站
首页 / 资讯中心 / 正文

告别脏数据:GraphRag 三步数据清洗跑通实录

告别脏数据GraphRag 三步数据清洗跑通实录【免费下载链接】graphragA modular graph-based Retrieval-Augmented Generation (RAG) system项目地址: https://gitcode.com/GitHub_Trending/gr/graphrag把一整个文档库丢给 GraphRag 建图实体名里带着amp;之类的 HTML 转义、同一对关系大小写不同被记成两条、图上还散落着孤立碎片——这些都会让后续 local search 和 global search 的返回变得难以阅读。好消息是清洗动作已经内建在索引管线里落在三个代码点clean_str字符串净化、is_null空值判定、stable_lcc稳定最大连通分量。读完本文你能说清每一步在流程中的位置、配置里对应哪些参数、以及用哪些输出文件验证清洗真的生效。它卡在流程的哪一环GraphRag 的默认索引管线是一条按序执行的 workflow 链读入文档 → 切分文本单元text unit→ LLM 抽取实体与关系 → 汇总去重 → 聚类出社区。清洗动作不是一条独立的清洗工作流而是嵌在三个必经节点里切分前保证文本干净、抽取时净化每个字段、聚类前修剪图结构。图1GraphRag 索引管线运行过程清洗逻辑分布在切分、抽取与聚类环节docs/img/pipeline-running.png拆开看核心实现逐点讲clean_str抽取环节的文本净化器它负责把 LLM 返回的实体名、实体类型、关系描述里的 HTML 转义和控制字符去掉。实现在 packages/graphrag/graphrag/index/utils/string.pydef clean_str(input: Any) - str: Clean an input string by removing HTML escapes, control characters... if not isinstance(input, str): return input result html.unescape(input.strip()) return re.sub(r[\x00-\x1f\x7f-\x9f], , result) # 剥掉不可见控制字符调用点见 packages/graphrag/graphrag/index/operations/extract_graph/graph_extractor.py——每个实体和关系字段落库前都会过一遍它。放在抽取环节是因为脏字符一旦写进entities.parquet后面所有检索都拿不到干净的实体名。is_null嵌入环节的空值守门员它判断一个值是不是空None或NaN实现在 packages/graphrag/graphrag/index/utils/is_null.pydef is_null(value: Any) - bool: Check if value is null or is nan. def is_none() - bool: return value is None def is_nan() - bool: return isinstance(value, float) and math.isnan(value) return is_none() or is_nan()文本嵌入embed text流程会先拿它拦一道字段为空就直接跳过不浪费一次 embedding API 调用。放在嵌入环节是因为脏空值传进向量库后会生成无意义的向量污染检索召回。stable_lcc聚类环节的图结构修剪器它把关系表修剪成稳定最大连通分量stable largest connected component实现在 packages/graphrag/graphrag/graphs/stable_lcc.py五步动作def stable_lcc(relationships, source_columnsource, target_columntarget): edges[source_column] edges[source_column].apply(_normalize_name) # 1. HTML反转义大写去空白 edges edges[edges[source_column].isin(lcc_nodes) ...] # 2. 只留最大连通分量 edges edges.drop_duplicates(subset[source_column, target_column]) # 4. 去重 return edges.sort_values([source_column, target_column]) # 5. 确定性排序注意第 1 步复用了和clean_str同样的归一化思路html.unescape(name).upper().strip()这意味着 Operation Dulce 和 operation dulce 在裁剪时会合并成同一个节点。调用点在 packages/graphrag/graphrag/index/operations/cluster_graph.py 的聚类入口。放在聚类前是因为 Leiden 社区检测对孤立碎片和重复边极其敏感不先修剪社区切分就会偏。跟着配一遍清洗逻辑没有独立开关但影响它的参数都在config.yaml里。跑graphrag init生成配置后确认以下字段chunking: size: 1200 # 每个文本单元的 token 上限决定送入 LLM 抽取的粒度 overlap: 100 # 相邻块重叠 token 数避免实体描述被拦腰截断 encoding_model: cl100k_base # 计量 token 用的编码器须与切分行为一致 prepend_metadata: [title] # 每块前缀拼入的元数据字段帮 LLM 识别上下文 snapshots: graphml: true # 建图完成后导出 graphml供 Gephi 做可视化核验 # 其余参数保持默认切分参数直接决定clean_str处理多少条文本snapshots.graphml打开后packages/graphrag/graphrag/index/workflows/finalize_graph.py 会在管线尾部多写一份graph.graphml这是后面验证的关键。怎么确认没白配三步验证由快到慢看日志关键字。索引过程中应依次出现Workflow started: create_base_text_units、chunker progress: N/M、Workflow completed: finalize_graph说明切分与汇总环节都正常走完。查输出表。打开output/下的text_units.parquet和entities.parquet抽几行检查text与title列不应再有\x00一类控制字符或amp;残留。用 Gephi 比对。把graph.graphml拖进 Gephi用 Network Overview 面板检查边分布清洗后重复边应已合并、孤立碎片应已裁掉。图2在 Gephi 的 Network Overview 面板核对 GraphRag 清洗后的图谱结构docs/img/viz_guide/gepi-network-overview-settings.png高频异常排查路径entities.parquet里同一实体出现大小写两种写法确认抽取走的是extract_graph路径LLM 返回经clean_str归一化若用了 NLP 抽取路径归一化逻辑不同需人工比对。text_units.parquet行数异常偏多或单块过大对照chunking.size与overlapoverlap接近size会让块数翻倍。graph.graphml节点数远小于原始实体数这是stable_lcc裁掉了最大连通分量之外的孤立节点属预期行为若业务上需要保留碎片需自行在cluster_graph前后补数据。想继续往下走扩展入口在config.yaml的workflows字段——它可以覆盖整条 workflow 链你把自己的清洗逻辑写成一个自定义 workflow 插进去即可接入方式见 docs/index/overview.md。清洗是索引管线的第一公里下一站值得看的是实体汇总去重finalize_entities如何合并不同文本单元里抽出的同名实体那是实体层二次清洗所在。延伸阅读docs/index/inputs.md输入文档到文本单元的完整链路说明docs/index/outputs.md各输出表字段定义验证清洗结果时逐列对照docs/visualization_guide.mdGephi 加载 graphml 的完整操作步骤packages/graphrag/graphrag/index/workflows/create_base_text_units.py切分工作流源码看块如何写入 text_units 表【免费下载链接】graphragA modular graph-based Retrieval-Augmented Generation (RAG) system项目地址: https://gitcode.com/GitHub_Trending/gr/graphrag创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门