前言
????????最近在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 | 技術手冊 | 層次化章節分塊 | |
Table | 表格數據 | XLSX、CSV | 表格行分塊 |
Paper | 學術論文 | 章節語義分塊 | |
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