深入解析 RAGFlow:文件上傳到知識庫的完整流程

在 RAGFlow 這樣的檢索增強生成(RAG)系統中,知識庫是其核心。用戶上傳的文檔如何高效、可靠地轉化為可檢索的知識,是系統穩定運行的關鍵。今天,我們就來深入探討 RAGFlow 中文件上傳到知識庫的完整流程,揭秘其背后的任務調度機制。

1. 概覽:文件上傳到知識庫的生命周期

RAGFlow 的文件上傳并非簡單的文件存儲,而是一個涉及前端交互、后端 API、消息隊列、后臺服務和多個數據存儲組件的復雜協作過程。它確保了文檔從原始文件到結構化知識的平穩轉換。

2. 核心參與者 (Actors & Components)

在深入流程之前,我們先認識一下這場“幕后之旅”中的主要參與者:

  • 用戶 (User): 觸發文件上傳操作。
  • 前端 (Frontend): RAGFlow 的 Web 界面,負責用戶交互和文件傳輸。
  • 后端 API (Backend API): 基于 Flask 構建,提供各種 RESTful 接口,包括文件上傳。
    • document_app.py: 處理文檔相關的 API 請求。
    • file_service.py: 負責文件的物理存儲和數據庫記錄。
    • document_service.py: 管理文檔的數據庫記錄和處理狀態。
    • task_service.py: 負責任務的創建、管理和排隊。
  • Redis (Message Queue): 作為任務隊列,實現任務的異步處理和解耦。
  • 任務執行器 (Task Executor - task_executor.py): 獨立的后臺服務,從 Redis 隊列中消費任務并執行實際的文檔處理工作。
  • 對象存儲 (Object Storage - e.g., MinIO): 存儲原始上傳文件和處理過程中生成的圖片等二進制數據。
  • 文檔存儲 (Document Store - e.g., Elasticsearch/Infinity): 存儲經過處理的文檔塊(chunks)及其向量,供檢索使用。

3. 詳細流程:一步步揭秘

步驟 1: 用戶發起文件上傳 (Frontend)

用戶在 RAGFlow 的 Web 界面上選擇文件并點擊上傳按鈕,同時指定文件要上傳到哪個知識庫(kb_id)。

步驟 2: 文件上傳到后端 API (/v1/document/upload)

前端將文件數據和知識庫 ID (kb_id) 打包成 multipart/form-data 格式,通過 HTTP POST 請求發送到后端 API 的 /v1/document/upload 路由。

步驟 3: 文件存儲與文檔記錄創建 (FileService)

后端 document_app.py 中的 /upload 路由接收到請求后,會調用 FileService.upload_document
FileService 會執行以下操作:

  • 將上傳的原始文件存儲到對象存儲中(例如 MinIO)。
  • 在數據庫中為該文件創建一條新的 Document 記錄,包含文件的元數據(如名稱、大小、類型、存儲位置等),并將其初始處理狀態設置為待處理(例如 progress=0)。

此時,后端 API 會立即響應前端上傳成功,用戶界面會顯示文件已上傳。但請注意,文件此時尚未被解析和索引。

步驟 4: 后臺任務調度 (ragflow_server.py -> DocumentService.update_progress)

這是整個流程中任務調度的核心。RAGFlow 的主服務器 (ragflow_server.py) 啟動時,會啟動一個獨立的后臺線程,該線程會每隔 6 秒調用一次 DocumentService.update_progress() 方法。

DocumentService.update_progress() 的職責是:

  • 掃描數據庫中所有狀態為“未完成” (progress < 1) 的文檔。
  • 對于新上傳的文檔(其 Document 記錄已存在但尚未有對應的 Task 記錄),它會識別出這些文檔需要進行初始處理。
步驟 5: 任務創建與排隊 (TaskService.queue_tasks)

DocumentService.update_progress() 識別出需要處理的文檔時,它會(間接地)觸發 TaskService.queue_tasks 函數。
TaskService.queue_tasks 會根據文檔類型和配置,生成一個或多個具體的處理任務(Task 記錄),例如:

  • 對于 PDF 文件,可能會根據頁碼范圍生成多個任務。
  • 對于 Excel 文件,可能會根據行范圍生成多個任務。
  • 這些 Task 記錄會被插入到數據庫中。
  • 最關鍵的是,這些 Task 消息會被推送到 Redis 消息隊列中。
步驟 6: 任務消費與處理 (task_executor.py)

獨立的 task_executor.py 服務會持續監聽 Redis 消息隊列。一旦有新的任務消息到達,它就會立即消費該任務。

步驟 7: 分塊、嵌入與索引

task_executor 消費任務后,會執行實際的文檔處理:

  • 對象存儲中獲取原始文件二進制數據。
  • 根據文檔類型和解析器配置,將文件內容進行分塊 (Chunking)
  • 對每個文本塊進行嵌入 (Embedding),生成向量表示。
  • 將處理后的文本塊、向量以及其他元數據(如關鍵詞、問題、標簽等)插入到文檔存儲中(例如 Elasticsearch 或 Infinity),使其可被檢索。
  • 在處理過程中,task_executor 會不斷更新 Task 記錄的 progressprogress_msg,將處理進度反饋回數據庫。
步驟 8: 可選:RAPTOR/GraphRAG 任務排隊

如果知識庫配置了更高級的解析方法(如 RAPTOR 或 GraphRAG),并且初始分塊任務已完成,DocumentService.update_progress() 在下一次掃描時會檢測到這一點,并觸發 TaskService.queue_raptor_o_graphrag_tasks,將新的 RAPTOR 或 GraphRAG 任務推送到 Redis 隊列。task_executor 會再次消費這些任務并執行相應的復雜處理。

步驟 9: 狀態更新

task_executor 在完成每個任務后,會更新 Task 記錄的狀態。DocumentService.update_progress() 也會匯總所有相關任務的進度,最終標記文檔為“已完成”或“失敗”。

時序圖

sequenceDiagramactor Userparticipant Frontendparticipant BackendAPI as Backend API (Flask)participant FileServiceparticipant DocumentServiceparticipant Redisparticipant TaskExecutor as Task Executorparticipant ObjectStorage as Object Storage (MinIO)participant DocumentStore as Document Store (ES/Infinity)participant RagflowServer as Ragflow Server (Background Thread)User->>Frontend: 1. Upload File (file, kb_id)Frontend->>BackendAPI: 2. POST /v1/document/upload (file, kb_id)BackendAPI->>FileService: 3. upload_document(file, kb_id)FileService->>ObjectStorage: 3.1. Store FileFileService->>DocumentService: 3.2. insert(document_metadata)DocumentService-->>FileService: Document Record CreatedFileService-->>BackendAPI: Upload SuccessBackendAPI-->>Frontend: 4. Upload Success ResponseFrontend->>User: File Uploaded (UI Update)loop Every 6 secondsRagflowServer->>DocumentService: 5. update_progress()DocumentService->>DocumentService: 5.1. get_unfinished_docs()alt Document has no tasks (Newly Uploaded)DocumentService->>TaskService: 5.2. queue_tasks(doc, bucket, name, priority)TaskService->>Redis: 5.3. queue_product(initial_task_message)endendTaskExecutor->>Redis: 6. Consume Task MessageTaskExecutor->>ObjectStorage: 7.1. Get File BinaryTaskExecutor->>TaskExecutor: 7.2. Perform Chunking & EmbeddingTaskExecutor->>DocumentStore: 7.3. Insert Chunks & VectorsTaskExecutor->>DocumentService: 7.4. set_progress(task_id, progress, msg)DocumentService-->>TaskExecutor: Task Progress Updatedalt All initial tasks for document completedRagflowServer->>DocumentService: 8. update_progress() (next iteration)DocumentService->>DocumentService: 8.1. get_unfinished_docs()DocumentService->>TaskService: 8.2. queue_raptor_o_graphrag_tasks(doc, type, priority) (if configured)TaskService->>Redis: 8.3. queue_product(advanced_task_message)TaskExecutor->>Redis: 9. Consume Advanced Task MessageTaskExecutor->>TaskExecutor: 10. Perform RAPTOR/GraphRAG ProcessingTaskExecutor->>DocumentStore: 10.1. Insert Advanced Chunks/GraphTaskExecutor->>DocumentService: 10.2. set_progress(task_id, progress, msg)DocumentService-->>TaskExecutor: Advanced Task Progress UpdatedendDocumentService->>DocumentService: 11. Update Document Overall Status (e.g., DONE)

將代碼放入https://www.processon.com/mermaid中,查看流程

在這里插入圖片描述

總結

RAGFlow 的知識庫文件上傳流程是一個精心設計的異步系統。它將文件接收、存儲、任務調度和實際處理解耦,通過 Redis 消息隊列和后臺定時任務實現了高效、可擴展的文檔處理能力。這種架構不僅保證了用戶體驗的流暢性(上傳后立即響應),也確保了后臺處理的健壯性和可恢復性。

希望這篇博客能幫助您更清晰地理解 RAGFlow 的內部工作原理!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/88195.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/88195.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/88195.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

cad_recognition 筆記

Hubch/cad_recognition | DeepWiki https://github.com/Hubch/cad_recognition winget install python.python.3.10 python -m venv venv micromamba activate ./venv pip install paddleocr2.9.0 pip install poetry pip install moviepy1.0.3 下次要用conda建環境 或者…

基于odoo17的設計模式詳解---構建模式

大家好&#xff0c;我是你的Odoo技術伙伴。在Odoo開發中&#xff0c;創建一個簡單的記錄可能只需要一行 self.env[res.partner].create({name: New Partner})。但如果我們要創建一個復雜的對象&#xff0c;比如一個包含了特定上下文、具有多個可選配置、并且需要執行一系列關聯…

暑假算法日記第四天

目標?&#xff1a;刷完靈神專題訓練算法題單 階段目標&#x1f4cc;&#xff1a;【算法題單】滑動窗口與雙指針 LeetCode題目:2953. 統計完全子字符串1016. 子串能表示從 1 到 N 數字的二進制串其他: 今日總結 往期打卡 2953. 統計完全子字符串 跳轉: 2953. 統計完全子字符串…

Linux 常用命令大全(2025簡明版)

&#x1f9ed; 一、文件和目錄操作命令說明ls列出目錄內容ls -l以列表形式顯示&#xff08;含權限&#xff09;cd /path切換目錄pwd顯示當前路徑mkdir dir創建目錄mkdir -p dir/subdir遞歸創建目錄rm file刪除文件rm -r dir刪除目錄&#xff08;遞歸&#xff09;rm -rf dir強制…

React Ref 指南:原理、實現與實踐

前言 React Ref&#xff08;引用&#xff09;是React中一個強大而重要的概念&#xff0c;它為我們提供了直接訪問DOM元素或組件實例的能力。雖然React推崇聲明式編程和數據驅動的理念&#xff0c;但在某些場景下&#xff0c;我們仍需要直接操作DOM或訪問組件實例。本文將深入探…

4.權重衰減(weight decay)

4.1 手動實現權重衰減 import torch from torch import nn from torch.utils.data import TensorDataset,DataLoader import matplotlib.pyplot as plt def synthetic_data(w,b,num_inputs):Xtorch.normal(0,1,size(num_inputs,w.shape[0]))yXwbytorch.normal(0,0.1,sizey.shap…

OpenCV開發-初始概念

第一章 OpenCV核心架構解析1.1 計算機視覺的基石OpenCV&#xff08;Open Source Computer Vision Library&#xff09;作為跨平臺計算機視覺庫&#xff0c;自1999年由Intel發起&#xff0c;已成為圖像處理領域的標準工具。其核心價值體現在&#xff1a;跨平臺性&#xff1a;支持…

LeetCode 930.和相同的二元子數組

給你一個二元數組 nums &#xff0c;和一個整數 goal &#xff0c;請你統計并返回有多少個和為 goal 的 非空 子數組。 子數組 是數組的一段連續部分。 示例 1&#xff1a; 輸入&#xff1a;nums [1,0,1,0,1], goal 2 輸出&#xff1a;4 解釋&#xff1a; 有 4 個滿足題目要求…

【論文解讀】Referring Camouflaged Object Detection

論文信息 論文題目&#xff1a;Referring Camouflaged Object Detection 論文鏈接&#xff1a;https://arxiv.org/pdf/2306.07532 代碼鏈接&#xff1a;https://github.com/zhangxuying1004/RefCOD 錄用期刊&#xff1a;TPAMI 2025 論文單位&#xff1a;南開大學 ps&#xff1a…

Spring中過濾器和攔截器的區別及具體實現

在 Spring 框架中&#xff0c;過濾器&#xff08;Filter&#xff09; 和 攔截器&#xff08;Interceptor&#xff09; 都是用于處理 HTTP 請求的中間件&#xff0c;但它們在作用范圍、實現方式和生命周期上有顯著區別。以下是詳細對比和實現方式&#xff1a;核心區別特性過濾器…

CANFD 數據記錄儀在新能源汽車售后維修中的應用

一、前言隨著新能源汽車市場如火如荼和新能源汽車電子系統的日益復雜&#xff0c;傳統維修手段在面對復雜和偶發故障時往往捉襟見肘&#xff0c;CANFD 數據記錄儀則憑借其獨特優勢&#xff0c;為售后維修帶來新的解決方案。二、 詳細介紹在新能源汽車領域&#xff0c;CANFD 數據…

某當CRM XlsFileUpload存在任意文件上傳(CNVD-2025-10982)

免責聲明 本文檔所述漏洞詳情及復現方法僅限用于合法授權的安全研究和學術教育用途。任何個人或組織不得利用本文內容從事未經許可的滲透測試、網絡攻擊或其他違法行為。使用者應確保其行為符合相關法律法規,并取得目標系統的明確授權。 前言: 我們建立了一個更多,更全的…

自然語言處理與實踐

文章目錄Lesson1&#xff1a;Introduction to NLP、NLP 基礎與文本預處理1.教材2.自然語言處理概述(1)NLP 的定義、發展歷程與應用場景(2)NLP 的主要任務&#xff1a;分詞、詞性標注、命名實體識別、句法分析等2.文本預處理3.文本表示方法&#xff1a;詞向量表示/詞表征Lesson2…

CSS揭秘:9.自適應的橢圓

前置知識&#xff1a;border-radius 用法前言 本篇目標是實現一個橢圓&#xff0c;半橢圓&#xff0c;四分之一橢圓。 一、圓形和橢圓 當我們想實現一個圓形時&#xff0c;通常只要指定 border-radius 為 width/height 的一半就可以了。 當我們指定的border-radius的值超過了 w…

善用關系網絡:開源AI大模型、AI智能名片與S2B2C商城小程序賦能下的成功新路徑

摘要&#xff1a;本文聚焦于關系在個人成功中的關鍵作用&#xff0c;指出關系即財富&#xff0c;善用關系、拓展人脈是成功的重要途徑。在此基礎上&#xff0c;引入開源AI大模型、AI智能名片以及S2B2C商城小程序等新興技術工具&#xff0c;探討它們如何助力個體在復雜的關系網絡…

2025年滲透測試面試題總結-2025年HW(護網面試) 34(題目+回答)

安全領域各種資源&#xff0c;學習文檔&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各種好玩的項目及好用的工具&#xff0c;歡迎關注。 目錄 2025年HW(護網面試) 34 一、網站信息收集 核心步驟與工具 二、CDN繞過與真實IP獲取 6大實戰方法 三、常…

螢石全新上線企業AI對話智能體,開啟IoT人機交互新體驗

一、什么是螢石AI對話智能體&#xff1f;如何讓設備聽得到、聽得懂&#xff1f;這次螢石發布的AI對話Agent&#xff0c;讓設備能進行自然、流暢、真人感的AI對話智能體&#xff0c;幫助開發者打造符合業務場景的AI對話智能體能力&#xff0c;實現全雙工、實時打斷、可擴展、對話…

智紳科技:以科技為翼,構建養老安全守護網

隨著我國老齡化進程加速&#xff0c;2025年60歲以上人口突破3.2億&#xff0c;養老安全問題成為社會關注的焦點。智紳科技作為智慧養老領域的領軍企業&#xff0c;以“科技賦能健康&#xff0c;智慧守護晚年”為核心理念&#xff0c;通過人工智能、物聯網、大數據等技術融合&am…

矩陣系統源碼部署實操指南:搭建全解析,支持OEM

矩陣系統源碼部署指南矩陣系統是一種高效的數據處理框架&#xff0c;適用于大規模分布式計算。以下為詳細部署步驟&#xff0c;包含OEM支持方案。環境準備確保服務器滿足以下要求&#xff1a;操作系統&#xff1a;Linux&#xff08;推薦Ubuntu 18.04/CentOS 7&#xff09;硬件配…

基于python的個人財務記賬系統

博主介紹&#xff1a;java高級開發&#xff0c;從事互聯網行業多年&#xff0c;熟悉各種主流語言&#xff0c;精通java、python、php、爬蟲、web開發&#xff0c;已經做了多年的畢業設計程序開發&#xff0c;開發過上千套畢業設計程序&#xff0c;沒有什么華麗的語言&#xff0…