当前位置: 首页 > news >正文

【RAGFlow代码详解-14】知识图谱处理

系统架构

知识图谱处理流水线由 graphrag/general/index.py 中的 run_graphrag() 函数编排,实现子图生成、图合并、实体解析、社区检测四阶段工作流程。

在这里插入图片描述
具有代码实体的知识图谱处理管道

系统通过 settings.docStoreConn 以多个索引形式存储图形数据:

  • 序列化 nx.node_link_data 的全局图
  • 每个文档 knowledge_graph_kwd: “subgraph” 的子图
  • 带有 knowledge_graph_kwd 的实体块 :“实体”
  • 关系 knowledge_graph_kwd: “relation” 块
  • 社区报告 knowledge_graph_kwd: “community_report”

核心处理类

图提取器实现

提取系统是围绕抽象 Extractor 类构建的,具有通过配置选择的两个具体实现:

在这里插入图片描述

提取器类层次结构

generate_subgraph() 函数实例化适当的提取器:

Selection logic from graphrag/general/index.py:60-65
extractor = (LightKGExt if "method" not in row["kb_parser_config"].get("graphrag", {}) or row["kb_parser_config"]["graphrag"]["method"] != "general"else GeneralKGExt)

两个提取器都使用 trio.open_nursery() 以及 call 和 handle_single_relationship_extraction()handle_single_entity_extraction() 函数同时处理块。

图作和存储

图形数据流经 graphrag/utils.py 中的几个实用函数:

具有函数名称的图形存储管道

GraphChange 数据类跟踪修改:

  • removed_nodes: Set[str]
  • added_updated_nodes: Set[str]
  • removed_edges: Set[Tuple[str, str]]
  • added_updated_edges: Set[Tuple[str, str]]

实体解析系统

EntityResolution 类使用字符串相似性和 LLM 确认合并相似实体:
在这里插入图片描述

实体解析处理流程

EntityResolution.__call__() 方法使用并发处理 with trio.Semaphore(max_concurrent_tasks) 来限制并行 LLM 调用和 trio。Lock() 来协调结果更新。

相似性检测使用不同的算法:

  • 英文文本:editdistance.eval() 用于字符级相似性
  • 非英语文本:字符集与可配置阈值重叠
  • 数字感知:_has_digit_in_2gram_diff() 防止错误匹配

管道执行和并发

任务编排

run_graphrag() 函数通过分布式锁定协调完整的处理流水线:

在这里插入图片描述
使用函数调用执行管道

并发控制和资源管理

系统使用 trio 异步原语实现多个并发控制:

元件并发控制目的
chat_limiter = trio.CapacityLimiter(10)LLM 请求速率限制防止压倒性的 LLM API
RedisDistributedLock(f"graphrag_task_{kb_id}")进程间同步防止并发图修改
trio.Semaphore(max_concurrent_tasks)实体解析批处理控制并行实体解析
trio.open_nursery()并发块处理并行化嵌入生成

在这里插入图片描述

具有控制原语的并发架构

chat_limiter 是全局定义的,并在所有图形处理作中共享,以防止违反 API 速率限制。

社区检测和报告

莱顿算法集成

CommunityReportsExtractor 使用 Leiden 算法进行分层社区检测:

在这里插入图片描述

社区检测实施流程

leiden.run() 函数返回一个分层结构:

Return format from leiden.run()
results_by_level = {level: {community_id: {"weight": normalized_weight,"nodes": [node_list]}}
}

社区报告生成

每个社区都通过以下方式 CommunityReportsExtractor.__call__() 生成结构化报告:

目的数据源
title社区标识符从实体分析生成的 LLM
summary执行概况实体关系和描述
rating影响严重性 (0-10)社区重要性的法学硕士评估
findings关键见解列表实体属性和关系模式
entities成员实体名称社区节点成员资格
weight社区重要性成员的规范化 PageRank 总和

报告存储为块, knowledge_graph_kwd: "community_report" 以便在问答期间检索。

性能优化和缓存

基于 Redis 的缓存系统

系统使用 REDIS_CONN 实现多级缓存,用于昂贵的作:

在这里插入图片描述
多级缓存架构

处理优化

系统通过多种机制优化性能:

优化实现位置
并发 LLM 调用trio.open_nursery() 与 chat_limitergraphrag/general/extractor.py 105-108
批处理文档作es_bulk_size = 每个插入 4 个块graphrag/utils.py 517-525
文本截断truncate(ck, int(self._llm.max_length*0.8))graphrag/general/extractor.py 107
图重建rebuild_graph() 用于增量更新 graphrag/utils.py 605-647
嵌入矢量化np.array(json.loads(bin)) 反序列化graphrag/utils.py 129

它可以 chat_limiter = trio.CapacityLimiter(10) 防止 LLM API 不堪重负,同时允许在整个图形处理管道中控制并发性。

配置和定制

解析器配置

GraphRAG 是通过知识库解析器设置配置的:

Example configuration structure
kb_parser_config = {"graphrag": {"method": "general",  # or "light""entity_types": ["organization", "person", "location"],"with_resolution": True,"with_community": True}
}

提取方法

系统支持两种提取方法:

  • 轻量级 :使用 LightKGExt 快速、轻量级提取
  • 常规 :使用具有高级功能的 GeneralKGExt 进行全面提取

方法选择由配置决定:

From graphrag/general/index.py:60-63
extractor = (LightKGExt if "method" not in row["kb_parser_config"].get("graphrag", {}) or row["kb_parser_config"]["graphrag"]["method"] != "general"else GeneralKGExt)
http://www.dtcms.com/a/351264.html

相关文章:

  • Linux之SELinux 概述、SSH 密钥登录、服务器初始化
  • IUV5G专网排障(下)
  • 开源大模型本地部署
  • [Mysql数据库] 知识点总结3
  • 基于Android的电影院订票选座系统、基于Android的电影院管理系统app#基于Android的电影在线订票系统
  • 玩转QEMU硬件模拟器 - vexpress-a9开发板模拟开发
  • 深入浅出理解支持向量机:从原理到应用,解锁分类算法的核心密码
  • 宝石组合(蓝桥杯)
  • UX 设计入门终章:让洞察落地!用用户流程图、IA 和旅程图,设计用户与产品的互动故事
  • 介绍一下 bev fusion 网络结构
  • 微服务-27.配置管理-什么是配置管理
  • FULL OUTER JOIN 的作用与使用场景(检查表与表是否存在不同记录)
  • UML 时序图中交互片段操作符的详细解析与 C/C++ 实现示例
  • 五、VSCODE SSH连接linux服务器免密登录
  • Java中 0.05 + 0.01 ≠ 0.06 揭秘浮点数精度陷阱
  • VSCode: 从插件安装到配置,如何实现 Ctrl+S 保存时,完全按照 .eslintrc.js 中的 ESLint 规则自动格式化代码
  • vscode 配置 + androidStudio配置
  • Easy Voice Recorder Pro v2.9.3 简单易用的专业音频录制工具应用
  • 开发手札:UnrealEngine编辑器开发
  • 基于stm32的物联网OneNet火灾报警系统
  • Java面试指南‌——事务:数据库世界的超级英雄联盟
  • OpenSCA开源社区每日安全漏洞及投毒情报资讯|22th-24th Aug. , 2025
  • MySQL基本语法及与JAVA程序建立连接
  • 设计模式七大原则附C++正反例源码
  • 学习嵌入式的第三十八天
  • 【网络安全】XSS漏洞——PortSwigger靶场-DOM破坏
  • 常见的 Loader 和 Plugin?
  • 观察者模式 (Observer Pattern)与几个C++应用例子
  • Visual Basic 数据类型应用示例
  • EasyExcel 3.x 导出动态表头,动态sheet页