Wend看源码-RAGFlow(上)

前言

        最近在github上搜罗Rag相关项目的时候,我根据star 搜索到了目前star 最高的一些RAG 项目 ,其中稳居榜首的就是RAGFlow。

RAG stars:>1000 language:Python pushed:>2025-01-01

github RAG 相关项目搜索结果

        为了系统性的学习RAG 技术栈,除了对RAG 进行一些系统性的学习总结外,浏览一些高质量的RAG 开源项目也是一种非常好的学习方式。这些项目凝结了开发者们的智慧与经验,能让我更直观地了解技术的实际应用和实现逻辑。

        既然RAGFlow能获得这么高的关注度,想必在技术实现和功能设计上有其独到之处。所以,我打算以它为研究对象,深入探究其内部机制,开启我的 RAG 技术学习之旅。接下来,就和我一起走进rag-flow的世界,看看它到底有哪些过人之处吧。

RAGFlow 项目简介

        RAGFlow 是一款基于深度文档理解构建的开源 RAG(检索增强生成)引擎。它为各种规模的企业提供了一套精简的 RAG 工作流程,通过结合大语言模型(LLM),利用来自各类复杂格式数据的可靠引用,为用户提供真实可信的问答能力。 (官网介绍)

RAGFlow 架构简介

RAGFlow系统架构

        RAGFlow 作为一款基于深度文档理解构建的开源 RAG 引擎,不仅遵循了 Naive RAG 的基本流程,还融合了 Advanced RAG 的先进方法,并在文档预处理和分块等关键环节进行了优化,形成了一套高效且强大的系统架构。

     回顾Navie RAG 基础架构        

        在学习RAGFlow 系统架构之前,我们先复习一下RAG 的最基础架构Naive RAG,Naive RAG 作为 RAG 技术的基础架构,其核心流程可分为索引、检索和生成三个主要阶段。

  • 索引阶段
    • 文档预处理:对原始文档进行初步清理和转换,去除噪声信息,为后续处理做准备。

    • 文档分块:将文档划分为较小的、易于处理的文本块,便于后续的向量化和索引构建。

    • 向量化:将每个文本块转换为向量表示,以便在高维空间中进行相似度计算。

    • 构建索引:根据向量表示构建索引结构,以便快速检索相关文本块。

  • 检索阶段
    • 问题向量化:将用户提出的问题转换为向量表示。

    • 检索 top-k 个相关答案:在索引中查找与问题向量最相似的 top-k 个文本块。

  • 生成阶段
    • 组合上下文:将检索到的文本块组合成上下文信息。

    • 使用大模型回答结果:将上下文信息输入到大语言模型(LLM)中,生成最终的回答。

RAGFlow 的 Advanced RAG 架构

        RAGFlow在Naive RAG的基础上,引用了Advanced RAG的预检索方法-Multi-way Recall 多路召回,和后检索方法 Re-rank,形成了一套经典的Advanced RAG架构。

  • 预检索方法 - Multi-way Recall 多路召回

    • Multi-way Recall 多路召回是一种基于多种策略的检索方法,通过结合不同的召回策略,可以提高检索的召回率和准确性。RAGFlow 采用多路召回策略,从多个角度对问题进行检索,确保能够找到更多相关的文本块。例如,在 ragflow/rag/nlp/search.py 中,可能会实现多种检索算法,通过不同的权重和规则来召回相关文本块。

  • 后检索方法 - Re-rank

    • Re-rank 是在多路召回的基础上,对召回的文本块进行重新排序的过程。通过使用更复杂的排序算法和特征,可以提高检索结果的相关性和准确性。在 ragflow/rag/nlp/search.py 中,rerank 函数可能会根据关键词相似度、向量相似度等多种特征对召回的文本块进行重新排序,从而得到更优的检索结果。

文档预处理优化

        除了引入 Advanced RAG 的预检索和后检索方法,RAGFlow 在文档预处理过程时也进行了优化,以提高数据处理的质量。

  • Document layout Analyze (文档版式分析):文档版式分析通过YOLO目标检测框架识别文档中的10种基本布局组件(文本、标题、图片、表格、页眉页脚等),能够准确理解文档的结构层次和阅读顺序;实现的具体代码参考:deepdoc\vision\layout_recognizer.py文件。

    • 文档版式分析识别文档中的 10 种基本布局组件:

    • labels = ["_background_",  # 背景"Text",          # 正文"Title",         # 标题"Figure",        # 图片"Figure caption", # 图片说明"Table",         # 表格"Table caption", # 表格说明"Header",        # 页眉"Footer",        # 页脚"Reference",     # 参考文献"Equation",      # 公式
      ]
  • Table Structure Recognition (表格结构识别):表格结构识别专门处理复杂表格,识别行、列、标题和合并单元格等5种表格组件,并将表格内容转换为HTML格式或自然语言描述。实现的具体代码参考:deepdoc\vision\table_structure_recognizer.py文件。

    • 表格结构识别识别 5 种表格组件:

    • labels = ["table",                        # 表格整体"table column",                 # 列"table row",                    # 行"table column header",          # 列标题"table projected row header",   # 行标题"table spanning cell",          # 合并单元格
      ]
  • 两个模块采用ONNX Runtime推理引擎,支持CPU/GPU并行加速,通过与OCR结果融合,实现从非结构化文档到结构化数据的智能转换。这套系统使RAGFlow能够像人类一样理解文档的视觉结构,为后续的知识提取、检索和问答提供了准确的结构化基础,特别适合处理学术论文、技术手册、财务报表等复杂文档格式。

文档分块优化

        与常规架构不同的是,RAGFlow 的文档分块是根据不同的场景进行分块,它的分块策略包括:

模板名称适用场景支持格式分块策略
General通用文档MD、DOCX、PDF、TXT、图片等基于Token数量的朴素分块
Q&A问答数据集XLSX、CSV、TXT问答对分块
Resume简历文档DOCX、PDF、TXT结构化字段分块
Manual技术手册PDF层次化章节分块
Table表格数据XLSX、CSV表格行分块
Paper学术论文PDF章节语义分块
Book书籍文档DOCX、PDF、TXT层次化章节分块
Laws法律法规DOCX、PDF、TXT条款分块
Presentation演示文稿PDF、PPTX页面级分块
Picture图片文档JPG、PNG、GIF等图片分块
One整文档多种格式单块分块
Audio音频文档音频格式转录分块

        RAGFlow 的文档分块模块还根据不同的场景自实现了一些算法策略,所有算法都保存在nlp/_init_.py 文件中,它实现的算法包括:

  • Naive Merge Algorithm(朴素合并算法)

    • 实现函数:naive_merge(), naive_merge_with_images(), naive_merge_docx()

    • 核心思想:基于 Token 数量的简单合并策略

    • 算法流程:

      • 根据指定分隔符切分文本段落

      • 逐段合并,直到达到设定的 Token 阈值(默认128)

      • 支持图片和文本的同步合并

      • 分隔符:支持自定义分隔符(默认:\n。;!?)

  • Hierarchical Merge Algorithm(层次化合并算法)

    • 实现函数:hierarchical_merge()

    • 核心思想:基于文档结构层次的智能合并

    • 算法流程:

      • 使用正则模式识别文档层级结构(BULLET_PATTERN)

      • 按层级分类段落(标题、章节、条款等)

      • 利用二分搜索建立层级关系

      • 按结构层次合并相关内容

  • Bullet Pattern Recognition(项目符号模式识别)

    • 实现函数:bullets_category(), qbullets_category()

    • 支持模式:

      • 中文模式:第X章、第X节、第X条、(一)、(二)等

      • 英文模式:Chapter X、Section X、Article X等

      • 数字模式:1.、1.1、1.1.1等多级编号

      • 问答模式:专门用于Q&A文档的问题识别

  • Title Frequency Analysis(标题频率分析)

    • 实现函数:title_frequency()

    • 功能:分析文档中标题的频率分布,确定最适合的分块层级

  • 内容类型特定算法

    • JSON分块:递归式JSON结构保持分块

    • 表格分块:行级或批次级分块

    • 图像分块:图文同步分块

    • 邮件分块:头部信息与正文分离

  • 算法设计亮点

    • 自适应性:根据文档类型自动选择最优分块策略

    • 语义完整性:优先保持语义单元的完整性

    • 多模态支持:同时处理文本、图片、表格等多种内容

    • 可配置性:丰富的参数配置选项

    • 性能优化:使用缓存、并发等技术提升处理效率

任务调度架构优化

        RAGFlow 采用分布式异步任务调度系统,基于 Redis队列和多进程并发,实现高效的文档处理任务分发。通过分布式架构、异步处理和智能优化实现了高效、可靠的文档处理任务管理,能够处理大规模文档集合的并发处理需求。

核心组件

  • 任务执行器(Task Executor):rag/svr/task_executor.py

  • 任务服务(Task Service):api/db/services/task_service.py

  • Redis队列系统:基于Redis Streams实现

  • 任务数据模型:api/db/db_models.py

处理流程

  • 任务收集(Collect):检查未确认的消息、从队列获取新任务、验证任务有效性

  • 任务处理(do_handle_task):

    • 任务类型分发:RAPTOR 分层摘要处理、知识图谱构建、标准分块处理

    • 分块处理流程:获取文档二进制数据、调用对应的分块器、并发上传图片到Minio

  • 任务监控与状态报告:采用心跳机制

优势

  • 智能负载均衡

    • 多队列支持:支持不同优先级的任务队列

    • 动态扩缩容:可动态增加或减少任务执行器

    • 资源限制:细粒度的并发控制和资源管理

  • 故障恢复

    • 任务状态持久化:任务状态保存在数据库中

    • 断点续传:支持任务执行中断后的恢复

    • 死信处理:处理无法完成的异常任务

  • 性能优化

    • 异步I/O:基于trio异步框架,高并发处理

    • 内存管理:支持内存监控和快照

    • 批量操作:批量插入文档存储,提高吞吐量

查询分析优化

RAGFlow 查询分析优化流程

        接下来让我们看一下RAG Flow 的查询分析优化流程。

  • 文本规范化:
# 中英文间添加空格
def add_space_between_eng_zh(txt):txt = re.sub(r'([A-Za-z]+[0-9]+)([\u4e00-\u9fa5]+)', r'\1 \2', txt)# 噪声词过滤
def rmWWW(txt):# 去除中文助词:什么、哪里、怎么、如何等# 去除英文虚词:what、who、how、the、a、an等
  • 语言识别:
def isChinese(line):# 自动识别中英文混合文本# 基于非英文字符比例判断(≥70%为中文)
  • 智能分词策略
    • 粗粒度分词:基于词典的最优路径分词

    • 细粒度分词:针对复杂词汇的二次分割

    • 权重计算:基于TF-IDF的词汇重要性评分

  • 权重计算策略
query_fields = ["title_tks^10",         # 标题权重最高 标题匹配权重×10"important_kwd^30",     # 重要关键词 权重×30"question_tks^20",      # 问题匹配 权重×20"content_ltks^2",       # 正文内容 权重×2"content_sm_ltks"       # 细粒度内容
]
  • 多轮对话查询完善

def full_question(tenant_id, llm_id, messages):# 将不完整的多轮对话转换为完整问题# 例:用户:"他的母亲是谁?" → "唐纳德·特朗普的母亲是谁?"# 时间相对转换:今天/昨天/明天 → 具体日期
  • 关键词自动提取

def keyword_extraction(chat_mdl, content, topn=3):# 使用LLM从查询中提取最重要的关键词# 保持原语言,用英文逗号分隔# 用于查询扩展和相关性提升
  • 跨语言查询支持

def cross_languages(tenant_id, llm_id, query, languages=[]):# 将查询翻译为多种目标语言# 保持格式和技术术语准确性# 支持批量翻译,用###分隔
  • 知识图谱查询重写

def query_rewrite(self, llm, question, idxnms, kb_ids):# 提取答案类型关键词(answer_type_keywords)# 提取查询实体(entities_from_query)# 基于实体类型池进行语义理解
  • 混合相似度计算

def hybrid_similarity(self, avec, bvecs, atks, btkss, tkweight=0.3, vtweight=0.7):# 向量相似度(70%) + 词汇相似度(30%)# 平衡语义理解和精确匹配
  • 性能优化

    • 智能缓存:LLM结果缓存,避免重复计算

    • 批量处理:同时处理多个查询变换

    • 阈值控制:相似度阈值过滤无关结果

    • 长度限制:关键词数量限制(32个)防止查询过长

    • 分层匹配:从粗到细的多层匹配策略

参考文献

https://github.com/infiniflow/ragflow

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/87967.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/87967.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LangChain实现RAG检索增强

1:启动vllm的openai兼容server: export VLLM_USE_MODELSCOPETrue python -m vllm.entrypoints.openai.api_server --model qwen/Qwen-7B-Chat-Int4 --trust-remote-code -q gptq --dtype float16 --gpu-memory-utilization 0.6 2:构建向量数据库 from langchain_…

Redis基础(6):SpringDataRedis

SpringDataRedis简介 SpringData是Spring中专门进行数据操作的模块,包含了对于各种数据库的集成。其中对Redis的集成模块叫做SpringDataRedis(官网地址:Spring Data Redis)。其最核心的特点就是提供了不同Redis客户端的整合&…

B. Shrinking Array/缩小数组

B. Shrinking Array让我们称一个数组 b 为 i 美丽 ,如果它至少包含两个元素,并且存在一个位置 |bi−bi1|≤1 使得 |x| (其中 x 是 #10# #11# 的绝对值)。给定一个数组 a ,只要它至少包含两个元素,你就可以执行以下操作&#xff1a…

【学习笔记】Linux系统中SSH服务安全配置

一、背景知识 以ubuntu为例,查看ssh服务是否安全并配置,执行 ssh -V ssh的配置文件路径:/etc/ssh/sshd_config 二、SSH服务配置文件 1.端口和监听设置 Port 22 含义:指定SSH服务监听的端口号(默认是22&#xff09…

FastAPI + Tortoise-ORM + Aerich 实现数据库迁移管理(MySQL 实践)

在 FastAPI 项目中,Tortoise-ORM 是一个轻量的异步 ORM 框架,适用于 async/await 场景。结合数据库迁移工具 Aerich,可以优雅地管理数据库表结构演进,本文将通过完整流程演示如何在 MySQL 环境下使用。📦 一、环境准备…

7.7日 实验03-Spark批处理开发(2)

使用Spark处理数据文件检查数据检查$DATA_EXERCISE/activations里的数据&#xff0c;每个XML文件包含了客户在指定月份活跃的设备数据。拷贝数据到HDFS的/dw目录样本数据示例&#xff1a;<activations><activation timestamp"1225499258" type"phone&q…

C语言可变参数感悟

#include <stdio.h> #include <stdarg.h> #if 1 /* *在C语言中&#xff0c;可变参函数是指参数数量不固定的函数&#xff0c;比如printf\scanf *可变参函数的语法&#xff1a; *返回类型 函数名&#xff08;固定函数&#xff0c;.....) { //函数体 } *1、包含头文件…

LeetCode 1248.统计优美子数组

给你一个整数数组 nums 和一个整数 k。如果某个连续子数组中恰好有 k 个奇数数字&#xff0c;我们就认为这个子数组是「优美子数组」。 请返回这个数组中 「优美子数组」 的数目。 示例 1&#xff1a; 输入&#xff1a;nums [1,1,2,1,1], k 3 输出&#xff1a;2 解释&#xf…

FastAPI Docker环境管理脚本使用指南

作者: 源滚滚AI编程 创建时间: 2025年07月08日 版本: v1.0.0 文档状态: 完成 版权声明 本文档由源滚滚AI编程创作,版权所有。未经作者书面许可,不得复制、分发或用于商业用途。 免责声明 本文档仅用于技术交流和学习目的。作者不对使用本文档内容导致的任何问题承担责任。…

前端常见 HTTP 状态码

作为前端开发者&#xff0c;与后端 API 交互时&#xff0c;HTTP 状态码是判断请求成败的关键信号。理解常见状态码的含义、责任归属及应对策略&#xff0c;能极大提升调试效率和团队协作。以下是关键状态码的详细解析&#xff1a; 首先说一下如何查看状态码&#xff1a; 如上图…

深度解析C语言内存函数(小米面试题)

目录 一、memcpy1.1 代码演示1.2 memcpy的模拟实现 二、memmove2.1 代码演示2.2 模拟实现&#xff08;小米面试题&#xff09; 三、memset3.1 代码演示3.2 总结 四、memcmp4.1 代码演示4.2 总结 总结 一、memcpy &#xff08;memory copy 内存复制&#xff09; 之前文章中写的…

DK124反激式开关电源芯片

18W 高性能交直流转换芯片 特性 DK124 是一款离线式开关电源芯片&#xff0c;最大输出功率达到 24W。内部集成了 PWM 控制器、700V 功率管和初级峰值电流检测电路&#xff0c;并采用了可以省略辅助供电绕组的专利自供电技术&#xff0c;极大简化了外围应用电路&#xff0c;减…

商品销售数据分析实验

进入虚拟机&#xff0c;启动HDFS和Yarn1.创建表 hive show databases; use test;销售订单表create table t_dml (detail_id bigint,sale_date date, province string,city string,product_id bigint,cnt bigint,amt double )row format delimited fields terminated by ,;商品…

PH热榜 | 2025-07-08

1. TensorBlock Forge 标语&#xff1a;人工智能模型的API 介绍&#xff1a;Forge是一个快速且安全的工具&#xff0c;让你可以跨不同供应商连接和运行AI模型 产品网站&#xff1a; 立即访问 Product Hunt&#xff1a; View on Product Hunt 票数&#xff1a; &#x1f53a…

2025-01)electronjs-v11.2.0升级到新版本electronjs-v37.2.0记录,node版本记录,淘宝镜像配置记录,升级记录

背景:由于22年使用electronjs开发的自助机客户端几年没去维护,现在有需求要修改,电脑也换新了,node环境也没,直接把electron从 之前的 11.2.0 版本 升级到了37.2.0版本,升级最主要的目的是升级谷歌浏览器内核,升级后谷歌浏览器内核直接从87升级到了138,可以支持谷歌最新…

iQOO手机怎样相互远程控制?其他手机可以远程控制iQOO吗?

iQOO是Vivo同一品牌下的产品&#xff0c;它们两款手机都可以使用手机内置的远程控制功能。具体做法是&#xff0c;打开控制端的iQOO手机的【设置】【快捷与辅助】、【远程协助】&#xff0c;然后输入被控端的电话号码&#xff0c;等被控端的手机接受远程协助后&#xff0c;就可…

【入门级-C++程序设计:3、程序基本语句-多层循环语句】

1、定义&#xff1a; 在 C 中&#xff0c;多层循环&#xff08;嵌套循环&#xff09;是指在一个循环体内包含另一个或多个循环语句。它常用于处理多维数据结构&#xff08;如二维数组&#xff09;、复杂的迭代逻辑&#xff08;如矩阵运算、图形打印、组合遍历等&#xff09;。多…

四、jenkins自动构建和设置邮箱

一、jenkins自动构建什么自动构建、有啥用&#xff1a;触发方式代码提交&#xff08;Git push&#xff09;定时任务&#xff08;如每天凌晨构建&#xff09;手动点击等方式&#xff08;立即执行&#xff09;执行内容从 Git/SVN 拉取最新代码运行编译&#xff08;如 Maven/Gradl…

【深度学习新浪潮】深入解析LLM关键概念:架构、优化与最新研究进展

1. Transformer架构与注意力机制 概念解析 Transformer是LLM的核心架构,由编码器和解码器组成,其核心创新是自注意力机制,通过计算输入序列中每个位置的关联权重,动态聚焦关键信息。自注意力机制的计算复杂度为O(n),在处理长序列时成为性能瓶颈。 代码示例:基础Transfo…

RAGflow图像解析与向量化分析

RAGflow图像解析与向量化分析 注:需要提前部署好ragflow,才方便一 一对应代码,部署教程:rag部署教程,这样才会方便后续更改 1. 图像解析流程 RAGflow通过多种解析器处理不同类型的文档,其中图像解析是一个重要组成部分。以下是RAGflow处理图像的主要流程: 1.1 PDF文…