来自工业界的知识库 RAG 服务(二),RagFlow 源码全流程深度解析

背景介绍

前面介绍过 有道 QAnything 源码解析,通过深入了解工业界的知识库 RAG 服务,得到了不少调优 RAG 服务的新想法。

因此本次趁热打铁,额外花费一点时间,深入研究了另一个火热的开源 RAG 服务 RagFlow 的完整实现流程,希望同样有所收获。

项目概述

框架设计

首先依旧可以先从框架图入手,与 常规的 RAG 架构 进行一些比较
请添加图片描述

可以看到右侧知识库被明显放大,同时最右侧详细介绍了文件解析的各种手段,比如 OCRDocument Layout Analyze 等,这些在常规的 RAG 中可能会作为一个不起眼的 Unstructured Loader 包含进去,可以猜到 RagFlow 的一个核心能力在于文件的解析环节。

官方文档 中也反复强调 Quality in, quality out, 反映出 RAGFlow 的独到之处在于细粒度文档解析。

另外 介绍文章 中提到其没有使用任何 RAG 中间件,而是完全重新研发了一套智能文档理解系统,并以此为依托构建 RAG 任务编排体系,也可以理解文档的解析是其 RagFlow 的核心亮点。

源码结构

首先可以看到 RagFlow 的源码结构:
请添加图片描述
对应模块的功能如下:

  • api 为后端的 API
  • web 对应的是前端页面
  • conf 为配置信息
  • deepdoc 对应的就是文件解析模块

从代码结构就能看出文件解析 deepdoc 在 RAGFlow 中一等公民角色

另外相关的技术栈如下:

  • Web 服务是基于 Flask 实现,这个在 2024 年来看稍微有一点点过时了
  • 业务数据库使用的是 MySQL
  • 向量数据库使用的是 ElasticSearch ,奇怪的是公司有自己的向量数据库 infinity 竟然默认没有用上
  • 文件存储使用的是 MinIO

正如前面介绍的因为没有使用 RAG 中间件,比如 langchainllamaIndex,因此实现上与常规的 RAG 系统会存在一些差异

源码解析

文件加载的支持

常规的 RAG 服务都是在上传时进行文件的加载和解析,但是 RAGFlow 的上传仅仅包含上传至 MinIO,需要手工点击触发文件的解析。
请添加图片描述
根据实际体验,以及网络上的反馈了解到 RAGFlow 的解析相当慢,估计资源开销也比较大,因此也能理解为什么采取二次手工确认的产品方案了。

实际的文件解析通过接口 /v1/document/run 进行触发的,实际的处理是在 api/db/services/task_service.py 中的 queue_tasks() 中完成的,此方法会根据文件创建一个或多个异步任务,方便异步执行。实现如下所示:

def queue_tasks(doc, bucket, name):
    def new_task():
        nonlocal doc
        return {
   
            "id": get_uuid(),
            "doc_id": doc["id"]
        }
    tsks = []
    # pdf 文件的解析,根据不同的类型设置单个任务最多处理的页数

    # 默认单个任务处理 12 页 pdf,pager 类型的 pdf 一个任务处理 22 页,其他 pdf 不分页

    if doc["type"] == FileType.PDF.value:
        file_bin = MINIO.get(bucket, name)
        do_layout = doc["parser_config"].get("layout_recognize", True)
        pages = PdfParser.total_page_number(doc["name"], file_bin)
        page_size = doc["parser_config"].get("task_page_size", 12)
        if doc["parser_id"] == "paper":
            page_size = doc["parser_config"].get("task_page_size", 22)
        if doc["parser_id"] == "one":
            page_size = 1000000000
        if not do_layout:
            page_size = 1000000000
        page_ranges = doc["parser_config"].get("pages")
        if not page_ranges:
            page_ranges = [(1, 100000)]
        for s, e in page_ranges:
            s -= 1
            s = max(0, s)
            e = min(e - 1, pages)
            for p in range(s, e, page_size):
                task = new_task()
                task["from_page"] = p
                task["to_page"] = min(p + page_size, e)
                tsks.append(task)

    # 表格数据单个任务处理 3000 行

    elif doc["parser_id"] == "table":
        file_bin =
<think>好的,我需要帮助用户找到RAGFlow v0.17.2版本的源码解析或相关文档。用户已经提供了一些引用资料,我需要先仔细分析这些信息。 首先,引用[1]提到用户可以通过GitHub的README_zh.md获取安装教程,并建议直接查看项目仓库。用户可能已经知道如何安装,但现在需要源码分析。引用[2]介绍了RAGFlow的基本信息和安装步骤,但未提及具体版本的文档。引用[3]则说明了升级到v0.17.2的原因,但同样没有直接提供源码解析的链接。 接下来,我应该考虑用户可能无法在官方文档中找到特定版本的详细解读。通常,开源项目的版本更新可能不会每个版本都有详细的教程,但用户可能需要查看官方仓库的发布说明或提交记录。 根据引用[1],GitHub仓库的README可能有相关链接。但用户需要的是v0.17.2的源码分析,所以建议用户查看GitHub的Release页面,那里可能有版本更新日志和源码变动。此外,项目的Wiki或文档目录可能包含更深入的信息。 另外,用户可能需要自行分析源码结构,比如核心模块如文档解析、检索增强生成(RAG)流程、模型集成部分。例如,文档解析可能在`src/document_processing`目录,RAG逻辑在`src/retrieval`或`src/rag`目录。模型集成部分可能涉及与DeepSeek-R1或其他LLM的交互代码。 如果官方文档不足,建议用户参考社区讨论,如GitHub Issues、论坛或Slack群组,开发者或社区成员可能分享过相关解析。此外,查看提交历史,特别是与v0.17.2相关的commit,可以了解具体的代码改动,比如修复了检索为空时的错误处理,如引用[3]所述。 最后,用户可能需要自行编写文档,通过代码注释和模块结构来理解源码。如果时间允许,参与社区贡献或提问可能获得更直接的帮助。</think>关于RAGFlow v0.17.2版本的源码解析与学习路径,建议按照以下步骤进行: ### 一、源码获取与版本确认 1. 通过Git命令切换至v0.17.2分支: ```bash git clone https://github.com/infiniflow/RAGFlow.git cd RAGFlow git checkout v0.17.2 ``` 该版本重点优化了空检索场景下的rerank模型异常处理逻辑[^3] ### 、核心模块解析 #### 1. 文档解析层 - 路径:`src/document_processing/` - 核心类:`DocParser`(支持PDF/Word/Markdown等格式解析) - 关键技术:基于Apache Tika的格式解析器,集成LayoutPDFParser实现复杂版式解析 #### 2. RAG流程引擎 - 路径:`src/retrieval/` - 核心模块: ```python class RAGEngine: def __init__(self): self.retriever = VectorRetriever() # 向量检索模块 self.reranker = RerankModel() # 重排序模型 self.generator = LLMAdapter() # 大语言模型适配层 ``` 检索流程符合公式:$$ \text{Relevance} = \alpha \cdot \text{Similarity} + \beta \cdot \text{RerankScore} $$ #### 3. 模型集成层 - DeepSeek-R1集成接口:`src/models/deepseek_adapter.py` - 关键配置项: ```yaml model_providers: deepseek: api_base: "http://localhost:8080/v1" api_key: "your-key" rerank_model: "bge-reranker-large" ``` ### 三、调试与学习建议 1. **断点调试**:在`src/retrieval/pipeline.py`的`execute_rag_flow`方法设置断点,观察检索-重排序-生成的全流程 2. **日志分析**:启动服务时添加`--log-level DEBUG`参数,可获取各阶段的中间结果 3. **单元测试**:运行`tests/retrieval/test_empty_result.py`验证空检索场景处理逻辑 ### 四、扩展学习资源 1. 官方API文档:`docs/api-reference.md`(含各模块接口说明) 2. 架构设计图:`docs/architecture.drawio`(需用DrawIO打开) 3. 版本变更记录:`CHANGELOG.md`中查看v0.17.2的具体修改点
评论 24
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

易迟

高质量内容创作不易,支持下

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值