← 返回文章列表

基於BM25檢索演算法構建RAG智慧文件問答助手--學習和實踐

從 BM25 檢索到文件問答,記錄環境配置、依賴問題與實踐結果。

本篇文章記錄DataWhale微學習中課程—從零打造RAG檢索系統

推一波DataWhale的學習內容,可以關注DataWhale公眾號,選擇自己喜歡的內容

學習內容原作者的公眾號: 從零打造RAG檢索系統:BM25讓檢索快到飛起 github倉庫地址: XiaokeAILabs

文章重點是瞭解RAG檢索的基礎,執行作者程式碼測試工具效果

1、RAG及相關基礎概念

1.1、什麼是RAG

RAG(Retrieval-Augmented Generation,檢索增強生成)是一種結合檢索和自然語言生成的技術,旨在提高生成模型的效能和效果。RAG的基本思想是在生成模型的輸入中同時包含檢索到的相關資訊,從而提高生成模型的生成質量和準確性。

想起之前使用過Langchain結合ChatGLM3-6B模型,實現過一個智慧漏洞問答系統,用的應該就是RAG,不過當時對這些概念並不瞭解。

在日常使用中的kimi、豆包和加入聯網功能的DeepSeek,應該都應用到了這種技術,不過他們的實現原理和演算法應該更加複雜,實現細節上可能也有不同。

1.2、RAG的基本流程

RAG的基本流程還是比較簡單的,可以分成兩個階段:

  1. 索引階段:預處理並儲存文件資料,構建檢索索引
  2. 查詢階段:接收使用者查詢,檢索相關文件,將文件資訊作為生成模型的輸入,生成相應的回答

1.3、RAG系統核心元件

想要實現一個完整的RAG過程需要上傳並處理額外的文件和資料,這些資料可以是文字、影象、音訊、影片等。然後要對這些資料進行處理,比如對文字進行分詞、去除停用詞、向量化……

之後要構建檢索索引,這一步可以使用多種演算法,比如BM25、TF-IDF、向量檢索等。

最後就是生成模型,根據使用者輸入的資訊,檢索額外資料,將檢索到的資訊與使用者查詢結合,透過LLM生成最終答案。

核心部分可以分成

  1. 資料處理
  2. 檢索索引
  3. 生成模型

當然這是我自己的概括,不準確

1.4、BM25演算法

BM25(Best Matching 25)是一種經典的資訊檢索演算法,是基於Okapi TF-IDF演算法的改進版本,旨在解決Okapi TF-IDF演算法的一些不足之處。它被廣泛應用於資訊檢索領域的排名函式,用於估計文件D與使用者查詢Q之間的相關性。BM25是一種基於機率檢索框架的改進,特別是在處理長文件和短查詢時表現出色。它旨在評估一組查詢項與文件的相關性,併為每個文件計算一個分數,該分數決定了文件在搜尋結果中的排名。BM25的核心思想是基於詞頻(TF)和逆文件頻率(IDF),同時還引入了文件的長度資訊來計算文件D和查詢Q之間的相關性。目前被廣泛運用的搜尋引擎ES就內建了BM25演算法進行全文檢索。

具體計算公式就不詳細介紹了。

除了BM25,還有很多其他的檢索演算法,比如TF-IDF、向量檢索、語義檢索等。

2、基於BM25的RAG檢索系統執行

2.1、環境配置

環境配置的過程一波三折,可能用linux環境執行更好?

Python版本: 3.10+

環境管理工具: conda

開啟cmd,使用下面的命令直接建立環境

conda create --name RAG python=3.10

2.2、git專案到本地

原作者的github倉庫地址XiaokeAILabs

可以使用下面的指令直接git到本地

git clone https://github.com/li-xiu-qi/XiaokeAILabs.git

2.3、安裝依賴

先進入專案中的xiaoke_doc_assist_by_bm25資料夾,然後在該目錄下進入cmd

首先使用下面的指令安裝依賴

pip install -r requirements.txt

安裝完成後在當前目錄下建立 .env 檔案,檔案內容可以複製 .env.example 中的

這裡要配置呼叫模型的API,我之前在矽基流動免費領過額度,所以跟作者一樣使用矽基流動的API和金鑰

如果使用矽基流動,直接修改 API_KEY=your_api_key

bm25_rag

也可以使用其他平臺的API,比如 OpenAI、火山等,要修改 API_KEY 和 BASE_URL

配置好後還要下載MinerU模型,用於高質量PDF解析

在當前目錄下使用下面指令,如果開了IDE也可以直接執行python檔案

python download_mineru_models.py

bm25_rag

2.4、執行專案

在當前目錄下使用下面指令執行專案

streamlit run main.py

當然,這只是開始,我們仍舊有很多潛在的依賴沒有安裝,由於不知道安裝啥,只能一遍遍執行啟動專案的指令,根據報錯資訊安裝,直到最後專案成功啟動。

總的來說,缺啥補啥,最後會執行成功的。

下面是我的辛路歷程

1、缺少magic-pdf

bm25_rag

檢查後這裡需要升級magic-pdf

使用指令

pip install --upgrade magic-pdf

bm25_rag

2、缺少paddle bm25_rag

安裝paddle

pip install paddle

但是還會報錯,缺少paddle的依賴 bm25_rag

安裝依賴

pip install common dual tight data prox

安裝之後發現還是報錯

bm25_rag

搜尋發現paddle太老了,應該升級安裝paddlepaddle

安裝指令

pip install --upgrade paddlepaddle

3、缺少cv2

bm25_rag

安裝依賴

pip install opencv-python

bm25_rag

4、缺少ultralytics

bm25_rag

安裝依賴

pip install ultralytics

bm25_rag

5、缺少doclayout_yolo

bm25_rag

安裝依賴

pip install doclayout_yolo

bm25_rag

6、缺少pycocotools

bm25_rag

安裝依賴

pip install pycocotools

bm25_rag

7、缺少detectron2

bm25_rag

安裝依賴

這個依賴的安裝可以參考部落格Windows11安裝detectron2全流程記錄帖(含torch安裝)

這個過程中可能會報錯,缺少ninja

使用下面指令安裝

pip install ninja

還會報錯要安裝Microsoft C++ Build Tools,可能是缺少C++編譯器?

如果有這個報錯點選連線,安裝就行,在安裝的時候一定要勾選C++桌面開的部分

解決上面兩個問題後安裝應該不會有問題

8、缺少timm

bm25_rag

安裝依賴

pip install timm

bm25_rag

9、缺少unimernet

bm25_rag

安裝依賴

pip install unimernet

bm25_rag

10、缺少paddleocr bm25_rag

安裝依賴

pip install paddleocr

bm25_rag

11、缺少rapid_table

bm25_rag

安裝依賴

pip install rapid_table

12、缺少struct_eqtable

bm25_rag

安裝依賴

pip install struct_eqtable

bm25_rag

13、缺少Stemmer

bm25_rag

安裝依賴

pip install PyStemmer

bm25_rag

現在應該能正常執行專案了?

在執行起來之後,我嘗試上傳檔案,還有一個報錯安裝依賴

bm25_rag

安裝依賴

pip install rapidocr_onnxruntime

bm25_rag

現在確實可以執行了

3、專案效果

在執行完成後,我上傳了自己桌面上的一個論文,經過測試可以成功解析,但是不能夠檢索內容並餵給大模型,還沒找到原因。

之後我用作者提供的測試論文,發現可以成功執行。

貼一張圖:

bm25_rag

4、總結

這是一個非常簡單(可能也沒那麼簡單),但是非常有意思的RAG檢索系統,但是可以作為一個學習的起點,瞭解RAG檢索的基本流程和原理。

在實際應用中,RAG檢索系統的實現可能會更加複雜,需要考慮更多的因素,比如資料處理、檢索索引、生成模型等。

現在執行專案還會有很多問題,後續我也會發現原因,或許實踐構建一個自己的RAG檢索系統?

關於這篇文章的日期

保留舊站原始文章標註的日期;實際開始寫作的時間可能更早。

原始日期: 2025-03-11 10:06:21 +0800