目錄標題
- RAG本地知識庫問答——基于OCR和文本解析器的新一代RAG引擎:RAGFlow 認識和源碼剖析
- RAGflow 主要功能:
- 一、RAGflow 簡介
- 1.1 允許用戶上傳并管理自己的文檔(文檔類型可以是任意類型)
- 1.2 RAGFlow的4個特色
- 1.2.1 AI 模型的智能文檔處理系統
- 1.2.2 包含各種不同模板的智能文檔處理系統
- 1.2.3 文檔處理的可視化和可解釋性——文本切片過程可視化,支持手動調整
- 1.2.4 讓用戶隨時查看 LLM 是基于哪些原文來生成答案的
- 1.3 RAGFlow 的核心 DeepDoc:視覺處理和解析器
- 1.3.1 視覺處理
- 1.3.2 文本解析器
- 1.4 // 待更 。。。。。。。。。。。。。。。。。
- 二、 對ragflow-main/deepdoc的源碼剖析
- 2.1 ragflow-main/deepdoc/vision
- 2.1.1 deepdoc/vision/ocr.py
- 三、 對ragflow-main/rag的拆解
- 3.1 ragflow-main/rag/app
- 3.1.1 app/paper.py中pdf(側重OCR方法)、chunk(側重文本解析器)的實現
- 王、RAGflow 安裝軟硬件條件檢查
1.【LangGraph】智能體工作流的新基石
https://agent.csdn.net/684111f0606a8318e85b81e4.html
2. 基于LangChain+LLM的本地知識庫問答:從企業單文檔問答到批量文檔問答
https://blog.csdn.net/v_JULY_v/article/details/131552592
3. RAG知識庫問答LangChain+LLM的二次開發:商用時的典型問題及其改進方案
https://blog.csdn.net/v_JULY_v/article/details/135257848
RAG本地知識庫問答——基于OCR和文本解析器的新一代RAG引擎:RAGFlow 認識和源碼剖析
RAGflow 主要功能:
(1) "Quality in, quality out"基于深度文檔理解,能夠從各類復雜格式的非結構化數據中提取真知灼見。真正在無限下文(token)的場景下快速完成大海撈針測試。(2)基于模板的文本切片不僅僅是智能,更重要的是可控可解釋。多種文本模板可供選擇(3)有理有據、最大程度降低幻覺(hallucination)文本切片過程可視化,支持手動調整。有理有據:答案提供關鍵引用的快照并支持追根溯源。(4)兼容各類異構數據源支持豐富的文件類型,包括 Word 文檔、PPT、excel 表格、txt 文件、圖片、PDF、影印件、復印件、結構化數據、網頁等。(5)全程無憂、自動化的 RAG 工作流全面優化的 RAG 工作流可以支持從個人應用乃至超大型企業的各類生態系統。大語言模型 LLM 以及向量模型均支持配置。基于多路召回、融合重排序。提供易用的 API,可以輕松集成到各類企業系統。
一、RAGflow 簡介
有關 Dify 的簡介,可以查看我之前分享的 《在 Ubuntu24.04 LTS 上 Docker Compose 部署 Dify 社區版 1.0.1》文章。RAGFlow是一款基于深度文檔理解(deepdoc)構建的開源 RAG引擎。其中,深度文檔理解,是 RAGFlow 對文檔解析的一個解決方案,它包含兩個組成部分:視覺處理和解析器。其中視覺處理是通過OCR,布局識別,表結構識別來完成圖像,PDF,表格的識別的。針對PDF、DOCX、EXCEL和PPT四種文檔格式,都有相應的解析器。能夠從各類復雜格式的非結構化數據中提取信息,文本切片過程可視化,還支持手動調整。支持豐富的文件類型,包括 Word 文檔、PPT、excel 表格、txt 文件、圖片、PDF、影印件、復印件、結構化數據、網頁等。更重要的是,他還集成了各種嵌入模型,rerank模型,提供易用的 API,可以輕松集成到各類企業系統。RAGflow 官網地址:https://ragflow.io/
下邊我們來看看 RAGFlow 這款產品,相比目前市面上已有的各類開源方案,都有哪些特點
1.1 允許用戶上傳并管理自己的文檔(文檔類型可以是任意類型)
首先, RAGFlow 是一款完整的 RAG 解決方案,它允許用戶上傳并管理自己的文檔,文檔類型可以是任意類型,例如 PDF、Word、PPT、Excel、當然也包含 TXT
在完成智能解析之后,讓數據以正確地格式進入到數據庫,然后用戶可以采用任意大模型對自己上傳的文檔進行提問
也就是說,包含了如下完整的端到端流程
1.2 RAGFlow的4個特色
其次,RAGFlow 的最大特色,就是多樣化的文檔智能處理,保證用戶的數據從 Garbage In Garbage Out 變為 Quality In Quality Out
為了做到這一點, RAGFlow 沒有采用現成的 RAG 中間件,而是完全重新研發了一套智能文檔理解系統,并以此為依托構建 RAG 任務編排體系
這個系統的特點包含以下4個點
1.2.1 AI 模型的智能文檔處理系統
它是一套基于 AI 模型的智能文檔處理系統:對于用戶上傳的文檔,它需要自動識別文檔的布局,包括標題,段落,換行等等,還包含難度很大的圖片和表格。
對于表格來說,不僅僅要識別出文檔中存在表格,還會針對表格的布局做進一步識別,包括內部每一個單元格,多行文字是否需要合并成一個單元格,等等,并且表格的內容還會結合表頭信息處理,確保以合適的形式送到數據庫,從而完成 RAG 針對這些細節數字的“大海撈針”
1.2.2 包含各種不同模板的智能文檔處理系統
它是一套包含各種不同模板的智能文檔處理系統:不同行業不同崗位所用到的文檔不同,行文格式不同,對文檔查閱的需求也不同。比如:
- 會計一般最常接觸到的憑證,發票,Excel報表
查詢的一般都是數字,如:看一下上月十五號發生哪些憑證,總額多少?上季度資產負債表里面凈資產總額多少?合同臺賬中下個月有哪些應付應收? - 作為一個HR平時接觸最龐雜的便是候選人簡歷
且查詢最多的是列表查詢,如:人才庫中985/211的3到5年的算法工程師有哪些?985 碩士以上學歷的人員有哪些?趙玉田的微信號多少?香秀哪個學校的來著? - 作為科研工作者接觸到最多的可能是就是論文了,快速閱讀和理解論文,梳理論文和引文之間的關系成了他們的痛點
這樣看來憑證/報表、簡歷、論文的文檔結構是不一樣的,查詢需求也是不一樣的,那處理方式肯定是不一樣
因此RAGFlow 在處理文檔時,給了不少的選擇:Q&A,Resume,Paper,Manual,Table,Book,Law,通用(當然,這些分類還在不斷繼續擴展中,處理過程還有待完善)…
1.2.3 文檔處理的可視化和可解釋性——文本切片過程可視化,支持手動調整
智能文檔處理的可視化和可解釋性:用戶上傳的文檔到底被處理成啥樣了,如:分割了多少片,各種圖表處理成啥樣了,畢竟任何基于 AI 的系統只能保證大概率正確,作為系統有必要給出這樣的空間讓用戶進行適當的干預,作為用戶也有把控的需求
特別是對于 PDF,行文多種多樣,變化多端,而且廣泛流行于各行各業,對于它的把控尤為重要,RAGFlow不僅給出了處理結果,而且可以讓用戶查看文檔解析結果并一次點擊定位到原文,對比和原文的差異,可增、可減、可改、可查
1.2.4 讓用戶隨時查看 LLM 是基于哪些原文來生成答案的
最后, RAGFlow 是一個完整的 RAG 系統,而目前開源的 RAG,大都忽視了 RAG 本身的最大優勢之一:可以讓 LLM 以可控的方式回答問題,或者換種說法:有理有據、消除幻覺
由于隨著模型能力的不同,LLM 多少都會有概率會出現幻覺,在這種情況下, **一款 RAG 產品應該隨時隨地給用戶以參考,讓用戶隨時查看 LLM 是基于哪些原文來生成答案的,這需要同時生成原文的引用鏈接,并允許用戶的鼠標 hover 上去即可調出原文的內容,甚至包含圖表。**如果還不能確定,再點一下便能定位到原文
一言以蔽之,答案提供關鍵引用的快照并支持追根溯源
————————————————
1.3 RAGFlow 的核心 DeepDoc:視覺處理和解析器
RAGFlow 引擎的核心的是 DeepDoc,它由視覺處理和解析器兩部分組成
1.3.1 視覺處理
模型在視覺層面具備以下能力
- OCR(Optical Character Recognition,光學字符識別)
由于許多文檔都是以圖像形式呈現的,或者至少能夠轉換為圖像,因此OCR是文本提取的一個非常重要、基本,甚至通用的解決方案
python deepdoc/vision/t_ocr.py --inputs=path_to_images_or_pdfs --output_dir=path_to_store_result
AI寫代碼
輸入可以是圖像或 PDF 的目錄,或者單個圖像、PDF文件,可以查看文件夾 path_to_store_result ,其中有演示結果位置的圖像,以及包含 OCR 文本的 txt 文件
- 布局識別(Layout recognition)
來自不同領域的文件可能有不同的布局,如報紙、雜志、書籍和簡歷在布局方面是不同的。只有當機器有準確的布局分析時,它才能決定這些文本部分是連續的還是不連續的,或者這個部分需要表結構識別(Table Structure Recognition,TSR)來處理,或者這個部件是一個圖形并用這個標題來描述
它包含 10 個基本布局組件,涵蓋了大多數情況:
- 文本、標題
- 配圖、配圖標題
- 表格、表格標題
- 頁頭、頁尾
- 參考引用、公式
且可以通過以下命令查看布局檢測結果:
python deepdoc/vision/t_recognizer.py --inputs=path_to_images_or_pdfs --threshold=0.2 --mode=layout --output_dir=path_to_store_result
輸入可以是圖像或PDF的目錄,或者單個圖像、PDF 文件,可以查看文件夾 path_to_store_result,其中有顯示檢測結果的圖像,如下所示:
3. TSR(Table Structure Recognition,表結構識別)
數據表是一種常用的結構,用于表示包括數字或文本在內的數據。表的結構可能非常復雜,比如層次結構標題、跨單元格和投影行標題
當然,除了 TSR,他們還將內容重新組合成 LLM 可以很好理解的句子
TSR 任務有 5 個標簽:
- 列
- 行
- 列標題
- 行標題
- 合并單元格
你可以通過以下命令查看表結構識別結果:
python deepdoc/vision/t_recognizer.py --inputs=path_to_images_or_pdfs --threshold=0.2 --mode=tsr --output_dir=path_to_store_result
輸入可以是圖像或PDF的目錄,或者單個圖像、PDF 文件。您可以查看文件夾 path_to_store_result,其中包含圖像和 html 頁面,這些頁面展示了以下檢測結果:
————————————————
1.3.2 文本解析器
PDF、DOCX、EXCEL 和 PPT 4種文檔格式都有相應的解析器。最復雜的是 PDF 解析器,因為 PDF 具有靈活性。PDF 解析器的輸出包括:
- 在 PDF 中有自己位置的文本塊(頁碼和矩形位置)。
- 帶有 PDF 裁剪圖像的表格,以及已經翻譯成自然語言句子的內容。
- 圖中帶標題和文字的圖
————————————————
1.4 // 待更 。。。。。。。。。。。。。。。。。
二、 對ragflow-main/deepdoc的源碼剖析
2.1 ragflow-main/deepdoc/vision
2.1.1 deepdoc/vision/ocr.py
總的來講,OCR 類整合了文本檢測和識別功能。在初始化時,它會嘗試從本地或遠程下載模型,并實例化TextRecognizer 和 TextDetector
- 首先,transform 西數用于對數據進行一系列操作
def transform(data, ops=None):""" transform """if ops is None:ops = []for op in ops:data = op(data)if data is None:return Nonereturn data
- create_operators 函數根據配置創建操作符列表
- Load model 函數加載ONNX模型,并根據設備類型選擇合適的推理提供者(CPU或GPU)
- TextRecognizer 類用于識別文本框中的文宇
它在初始化時加載模型,并定義了多種圖像預處理方法,如resize_norm_img,用于調整和標準化輸入圖像,最終填充到一個固定大小的張量中
resizenorm_img-VL,類似于上面的resize_norm_img,但它直接將圖像調整為制定的形狀,并進行歸一化處理
resize_norm_img_srn
srn_other_inputs
process_image_srn
resize_norm_img_sar
resize_norm_img_spin
resize_norm_img_svtr
resize_norm_img_abinet
norm_img_can
這些方法根據不同的圖像形狀和需求對圖像進行調整和歸一化處理
最后的__call__方法則是識別的入口,處理輸入圖像并返回識別結果
TextDetector 類用于檢測圖像中的文本框
它在初始化時加載模型,并定義了圖像預處理和后處理的方法,如 order_points_clockwise、clip_det-res 等,__call__方法是檢測的入口,處理輸入圖像并返回檢測結果
2.1.2 deepdoc/vision/recognizer.py
————————————————
三、 對ragflow-main/rag的拆解
https://blog.csdn.net/v_JULY_v/article/details/137711599?ops_request_misc=&request_id=&biz_id=102&utm_term=RAGFLOW_IMAGE=infiniflow/ragfl&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-4-137711599.142^v102^pc_search_result_base1&spm=1018.2226.3001.4187
3.1 ragflow-main/rag/app
3.1.1 app/paper.py中pdf(側重OCR方法)、chunk(側重文本解析器)的實現
在 paper.py 文件中,主要就兩個主要實現
- 一個pdf的類——即class Pdf(PdfParser),側重用OCR的方法
- 一個chunk函數——詳見上文2.2.2 pdf_parser.py中對PlainParser類的實現
對于前者class Pdf(PdfParser),call_方法是一個主要的入口點,用于處理OCR(光學字符識別) 和布局分析
-
該方法首先調用 callback 函數通知OCR 開始,然后調用self.–images__方法處理圖像
def __call__(self, filename, binary=None, from_page=0,to_page=100000, zoomin=3, callback=None):callback(msg="OCR is running...")self.__images__(filename if not binary else binary,zoomin,from_page,to_page,callback)callback(msg="OCR finished.")
-
接下來,使用timer 記錄布局分析的時問,并調用_layouts_rec方法進行布局分析
from timeit import default_timer as timerstart = timer()self._layouts_rec(zoomin)callback(0.63, "Layout analysis finished")print("layouts:", timer() - start)
————————————————
版權聲明:本文為博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
原文鏈接:https://blog.csdn.net/v_JULY_v/article/details/137711599
————————————————
王、RAGflow 安裝軟硬件條件檢查
(1)官方支持x86 CPU和Nvidia GPU 硬件,其他 ARM 等硬件官方截至目前尚未暫不作為正式支持硬件。(2)Linux 操作系統內核不建議低于6.0 的 LTS 版本;Windows 操作系統不建議低于 Win10 專業版 22H2 或 Window Server 2025 最新穩定版。(3)CPU 大于等于 8核(x86);一會有杠精要抬杠說官方是不少于4核,親咱們是Dify和RAGflow安裝同一臺機子。(4)RAM 大于等于 32 GB 。(5)磁盤 大于等于 512 GB 。(6)Docker 大于等于 28.1.1 ,并且 Docker Compose 大于等于 2.35.1 。(7)Git 大于等于 2.43.0 。
————————————————