RagFlow 知识图谱实践与优化方案探索

背景介绍

在2024年,我曾撰写过 RagFlow 源码全流程深度解析,对 RagFlow 的完整 RAG 流程进行了深入剖析。自那时起,RagFlow 经历了多轮迭代演进,不仅增强了 Agent 能力,更是在知识图谱支持方面取得了显著进展。

最近,RagFlow 公众号发布了 RAGFlow 0.16.0 特性总览,详细介绍了 RagFlow 对知识图谱机制的优化。本文将对 RagFlow 的知识图谱实现流程与机制进行深入分析,帮助读者更好地理解其实现细节,从而更有效地利用 RagFlow 的相关功能。

RagFlow 产品页面

首先,让我们了解当前产品页面的配置选项,以便更好地理解实现细节。

截至2025年4月,RagFlow 的 Web 页面中,知识图谱配置页面提供以下维度的配置:

图片

  • 实体类型:知识图谱的核心在于实体与关系的提取,选择具有实际业务价值的实体类型至关重要,这直接影响知识图谱的准确性;

  • 方法:支持 Light 和 General 两种模式。Light 模式采用 LightRAG 的实体抽取 prompt,而 General 模式则采用微软 GraphRAG 的 prompt,后者更全面但消耗更多 token;

  • 实体归一化:用于合并相同实体,提升知识图谱的准确性。该功能自 RagFlow 0.9 版本引入,在 RagFlow 0.16 中支持手动关闭,因为实体重复判断基于大模型,会消耗大量 token;

  • 社区报告生成:基于 GraphRAG 引入的功能,通过生成社区实体和关系的摘要来提升社区召回准确性。社区摘要的生成同样依赖大模型,会消耗大量 token,在 RagFlow 0.16 中支持可选关闭;

从产品设计可以看出,RagFlow 在 GraphRAG 的基础上进行了多项优化,特别是在减少大模型 token 消耗方面做了重要权衡。下面将详细介绍具体的实现方案。

GraphRAG 方案

RagFlow 的知识图谱实现基于 GraphRAG 方案,并在此基础上进行了优化。要理解 RagFlow 的实现,首先需要了解 GraphRAG 的基本原理,详细内容可参考微软的论文 From Local to Global: A GraphRAG Approach to Query-Focused Summarization。该方案的核心流程如下图所示:

图片

左侧部分是从原始文档到知识图谱的构建流程,右侧是基于知识图谱的社区构建与摘要生成。核心环节包括:

  • 实体和关系抽取(Text Chunks -> Entities and Relations):此环节是从原始的文档中提取实体和关系,目前是利用大模型直接抽取完成的,上面提到的 Light 和 General 的区别影响的就是这部分抽取的 prompt;

  • 知识图谱构建(Entities and Relations -> Knowledge Graph):此环节是直接将实际和关系构建为知识图谱,属于标准操作;

  • 社区构建(Knowledge Graph -> Graph Communities):此环节是使用社区检测算法将图划分为强连接节点的社区,GraphRAG 使用的是 Leiden 社区检测算法;

  • 社区摘要生成(Graph Communities -> Community Summaries):此环节是基于社区的实体和关系生成对应的摘要,这样才能更精准地召回对应的社区,上面提到的社区报告生成的可选开关就是关闭这部分摘要的生成;

  这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】

RagFlow 知识图谱构建实现方案

RagFlow 在 GraphRAG 方案的基础上进行了优化和扩展,下面详细介绍具体实现细节。

构建整体流程

RagFlow 的知识图谱构建完整流程在 graphrag/general/index.py 的 run_graphrag() 方法中实现,包含以下环节:

  1. 基于文档分片构建知识图谱,包括实体和关系的抽取,以及知识图谱的生成;

  2. 知识图谱合并,将新生成的知识图谱与原有知识图谱进行合并;

  3. 知识图谱的实体合并,减少实体重复,提升准确性;

  4. 基于知识图谱构建社区,包括社区构建与摘要生成;

实现代码如下:

async def run_graphrag(
    row: dict,
    language,
    with_resolution: bool,
    with_community: bool,
    chat_model,
    embedding_model,
    callback,
):
    # 获取文档分片

    tenant_id, kb_id, doc_id = row["tenant_id"], str(row["kb_id"]), row["doc_id"]
    chunks = []
    for d in settings.retrievaler.chunk_list(
        doc_id, tenant_id, [kb_id], fields=["content_with_weight", "doc_id"]
    ):
        chunks.append(d["content_with_weight"])

    # 构建知识图谱

    subgraph = await generate_subgraph(
        LightKGExt
        if row["parser_config"]["graphrag"]["method"] != "general"
        else GeneralKGExt,
        tenant_id,
        kb_id,
        doc_id,
        chunks,
        language,
        row["parser_config"]["graphrag"]["entity_types"],
        chat_model,
        embedding_model,
        callback,
    )
    if not subgraph:
        return

    # 合并知识图谱

    subgraph_nodes = set(subgraph.nodes())
    new_graph = await merge_subgraph(
        tenant_id,
        kb_id,
        doc_id,
        subgraph,
        embedding_model,
        callback,
    )
    assert new_graph is not None

    if not with_resolution or not with_community:
        return

    # 可关闭的实体合并机制

    if with_resolution:
        await resolve_entities(
            new_graph,
            subgraph_nodes,
            tenant_id,
            kb_id,
            doc_id,
            chat_model,
            embedding_model,
            callback,
        )

    # 可关闭的社区发现机制

    if with_community:
        await extract_community(
            new_graph,
            tenant_id,
            kb_id,
            doc_id,
            chat_model,
            embedding_model,
            callback,
        )
    return

实体与关系抽取

知识图谱构建的基础是实体与关系的抽取。在 GraphRAG 方案中,通过精心设计的 prompt 和 Few-Shot 机制,利用大模型完成实体和关系的抽取。

这部分对应的实现在 graphrag/general/graph_extractor.py 中的 _process_single_content() 方法中完成,GraphRAG 为实体与关系提取设计了一个精巧的 prompt, 并通过 Few Shot 的机制进行了必要的优化,从 Few Shot 可以大致了解提取的实体与关系的格式:

图片

根据上面看到的 example,大模型的结果是文本对应的实体和关系,并使用分隔符进行连接,之后在 _entities_and_relations() 方法中使用基于分隔符进行切分,即可得到对应的实体和关系。

知识图谱生成与合并

实体和关系抽取完成后,RagFlow 基于 networkx 生成知识图谱,并与知识库中原有知识图谱进行合并。

知识图谱生成通过调用 networkx 的 add_node() 和 add_edge() 方法实现,具体实现可参考 graphrag/general/index.py 中的 generate_subgraph() 方法。

知识图谱合并在 graph_merge() 中完成,处理逻辑如下:

  1. 节点存在时,将新节点的描述信息叠加至原有节点;

  2. 关系存在时,将新关系的描述信息、权重和关键词叠加至原有关系;

知识图谱的实体合并

实体合并是知识图谱构建的重要环节,重复实体会降低检索准确性。RagFlow 在 graphrag/entity_resolution.py 中实现实体合并,采用两步策略:

  1. 初步相似度判断:使用编辑距离等工程手段筛选相似实体,基于 editdistance 实现;

  2. 大模型相似度判断:确定最终的实体合并结果;

初步相似度判断主要用于减少候选实体对的数量。虽然基于大模型的相似度判断准确性更高,但会带来较大的计算开销,这也是 RagFlow 提供手动关闭选项的主要原因。

社区构建

RagFlow 的社区构建基于 Leiden 算法实现,该算法通过模块度优化生成高质量的社区划分。具体实现原理可参考论文 From Local to Global: A GraphRAG Approach to Query-Focused Summarization。实现位于 graphrag/general/leiden.py。

社区构建基于 graspologic 的 hierarchical_leiden 实现:

def _compute_leiden_communities(
        graph: nx.Graph | nx.DiGraph,
        max_cluster_size: int,
        use_lcc: bool,
        seed=0xDEADBEEF,
) -> dict[int, dict[str, int]]:

    results: dict[int, dict[str, int]] = {}
    if is_empty(graph):
        return results
    if use_lcc:
        graph = stable_largest_connected_component(graph)

    # 多层级社区划分

    community_mapping = hierarchical_leiden(
        graph, max_cluster_size=max_cluster_size, random_seed=seed
    )
    for partition in community_mapping:
        results[partition.level] = results.get(partition.level, {})
        results[partition.level][partition.node] = partition.cluster

    return results

社区摘要生成

社区摘要生成基于社区中实体和关系的描述信息,完全依赖大模型实现。通过精心设计的 prompt,生成能够代表社区核心内容的文本,提升检索和召回准确性。

相关 prompt 在 graphrag/general/community_report_prompt.py 中定义,核心内容如下:

图片

输入为实体和关系数据,大模型生成社区摘要和关键见解,提升社区召回的准确性。

知识图谱检索

知识图谱构建完成后,RagFlow 利用知识图谱增强 RAG 检索。以 /dify/retrieval 接口为例,检索实现如下:

ranks = settings.retrievaler.retrieval(
    question,
    embd_mdl,
    kb.tenant_id,
    [kb_id],
    page=1,
    page_size=top,
    similarity_threshold=similarity_threshold,
    vector_similarity_weight=0.3,
    top=top,
    rank_feature=label_question(question, [kb])
)

# 可选开启知识图谱检索

if use_kg:
    ck = settings.kg_retrievaler.retrieval(question,
                                            [tenant_id],
                                            [kb_id],
                                            embd_mdl,
                                            LLMBundle(kb.tenant_id, LLMType.CHAT))
    # 知识图谱检索的内容插入常规检索的最前面,知识图谱检索优先展示

    if ck["content_with_weight"]:
        ranks["chunks"].insert(0, ck)

检索流程在 graphrag/search.py 中实现,具体步骤如下:

  1. 查询重写:调用 query_rewrite 方法,使用大模型提取问题中的实体类型关键词和实体;

  2. 实体与关系检索:通过关键词和实体类型检索相关实体,通过原始问题检索相关关系;

  3. 路径分析:从关键词检索到的实体出发,获取 N 跳邻居,实现相似度衰减;

  4. 结果融合与评分:融合关键词检索、实体类型检索和关系检索结果,确定最终得分;

  5. 结果排序与截断:按相似度和 PageRank 乘积排序,截取前 N 个结果;

  6. 社区检索:调用 community_retrival() 方法检索相关社区报告;

  7. 结果组合:将实体、关系和社区报告组合为最终结果;

总结

本文详细介绍了 RagFlow 知识图谱的构建与检索流程。整体实现基于 GraphRAG 方案,并在此基础上进行了多项优化。RagFlow 提供了灵活的配置选项,如社区摘要和实体合并的可选关闭,使用户能够在效果与性能之间进行权衡。这些优化使得 RagFlow 的知识图谱功能更加实用和高效。

  这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】

一、大模型风口已至:月薪30K+的AI岗正在批量诞生

2025年大模型应用呈现爆发式增长,根据工信部最新数据:

国内大模型相关岗位缺口达47万

初级工程师平均薪资28K

70%企业存在"能用模型不会调优"的痛点

真实案例:某二本机械专业学员,通过4个月系统学习,成功拿到某AI医疗公司大模型优化岗offer,薪资直接翻3倍!

二、如何学习大模型 AI ?


🔥AI取代的不是人类,而是不会用AI的人!麦肯锡最新报告显示:掌握AI工具的从业者生产效率提升47%,薪资溢价达34%!🚀

由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。

但是具体到个人,只能说是:

“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。

这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。

我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

1️⃣ 提示词工程:把ChatGPT从玩具变成生产工具
2️⃣ RAG系统:让大模型精准输出行业知识
3️⃣ 智能体开发:用AutoGPT打造24小时数字员工

📦熬了三个大夜整理的《AI进化工具包》送你:
✔️ 大厂内部LLM落地手册(含58个真实案例)
✔️ 提示词设计模板库(覆盖12大应用场景)
✔️ 私藏学习路径图(0基础到项目实战仅需90天)

 

第一阶段(10天):初阶应用

该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。

*   大模型 AI 能干什么?
*   大模型是怎样获得「智能」的?
*   用好 AI 的核心心法
*   大模型应用业务架构
*   大模型应用技术架构
*   代码示例:向 GPT-3.5 灌入新知识
*   提示工程的意义和核心思想
*   Prompt 典型构成
*   指令调优方法论
*   思维链和思维树
*   Prompt 攻击和防范
*   …

第二阶段(30天):高阶应用

该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。

*   为什么要做 RAG
*   搭建一个简单的 ChatPDF
*   检索的基础概念
*   什么是向量表示(Embeddings)
*   向量数据库与向量检索
*   基于向量检索的 RAG
*   搭建 RAG 系统的扩展知识
*   混合检索与 RAG-Fusion 简介
*   向量模型本地部署
*   …

第三阶段(30天):模型训练

恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。

到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?

*   为什么要做 RAG
*   什么是模型
*   什么是模型训练
*   求解器 & 损失函数简介
*   小实验2:手写一个简单的神经网络并训练它
*   什么是训练/预训练/微调/轻量化微调
*   Transformer结构简介
*   轻量化微调
*   实验数据集的构建
*   …

第四阶段(20天):商业闭环

对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。

*   硬件选型
*   带你了解全球大模型
*   使用国产大模型服务
*   搭建 OpenAI 代理
*   热身:基于阿里云 PAI 部署 Stable Diffusion
*   在本地计算机运行大模型
*   大模型的私有化部署
*   基于 vLLM 部署大模型
*   案例:如何优雅地在阿里云私有部署开源大模型
*   部署一套开源 LLM 项目
*   内容安全
*   互联网信息服务算法备案
*   …

学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。

如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐