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
英文地址,請注明出處:http://en.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文…