引言#
在構建信息檢索和生成式 AI 應用時,Retrieval-Augmented Generation (RAG) 模型憑藉其能夠從知識庫中檢索相關信息並生成準確答案的強大能力,受到越來越多開發者的青睞。然而,實現端到端的本地 RAG 服務,需求的不只是合適的模型,還需要集成強大的用戶界面和高效的推理框架。
在構建本地 RAG 服務時,利用易於部署的 Docker 方式,可以極大簡化模型管理和服務集成。這裡我們依賴 Open WebUI 提供的用戶界面與模型推理服務,再通過 Ollama 來引入 bge-m3
embedding 模型以實現文檔向量化方式的檢索功能,從而幫助 Qwen2.5 完成更精準的答案生成。
本文我們將討論如何通過 Docker 快速啟動 Open WebUI,同步 Ollama 的 RAG 能力,並結合 Qwen2.5 模型實現高效的文檔檢索與生成系統。
項目概覽#
該項目將使用以下關鍵工具:
- Open WebUI : 提供用戶與模型交互的 web 界面。
- Ollama : 用於管理 embedding 和大語言模型的模型推理任務。其中 Ollama 中的
bge-m3
模型將用於文檔檢索,Qwen2.5 將負責回答生成。 - Qwen2.5 : 模型部分使用阿里推出的 Qwen 2.5 系列,為檢索增強生成服務提供自然語言生成。
為了實現 RAG 服務,我們需要以下步驟:
- 部署 Open WebUI 作為用戶交互界面。
- 配置 Ollama 以高效調度 Qwen2.5 系列模型。
- 使用 Ollama 配置的名為
bge-m3
的 embedding 模型實現檢索向量化處理。
部署 Open WebUI#
Open WebUI 提供了一個簡潔的 Docker 化解決方案,用戶無需手動配置大量依賴,直接通過 Docker 啟動 Web 界面。
首先,伺服器上需要確保已經安裝了 Docker,如果沒有安裝,可以通過以下命令進行快速安裝:
curl https://get.docker.com | sh
然後創建一個目錄用於保存 Open WebUI 的數據,這樣數據不會在項目更新後丟失:
sudo mkdir -p /DATA/open-webui
接下來,我們可以通過以下命令來啟動 Open WebUI:
docker run -d -p 3000:8080 \
--add-host=host.docker.internal:host-gateway \
-v /DATA/open-webui:/app/backend/data \
--name open-webui \
--restart always \
ghcr.io/open-webui/open-webui:main
如果想要運行支持 Nvidia GPU 的 Open WebUI,可以使用以下命令:
docker run -d -p 3000:8080 \
--gpus all \
--add-host=host.docker.internal:host-gateway \
-v /DATA/open-webui:/app/backend/data \
--name open-webui \
--restart always \
ghcr.io/open-webui/open-webui:cuda
這裡我們將 Open WebUI 的服務暴露在機器的 3000 端口,可以通過瀏覽器訪問 http://localhost:3000
即可使用(遠程訪問則使用公網 ip,開放 3000 端口)。/DATA/open-webui 是數據存儲目錄,你可以根據需要調整這個路徑。
當然除了 Docker 安裝方式外,你也可以通過 pip、源碼編譯、Podman 等方式安裝 Open WebUI。更多安裝方式請參考 Open WebUI 官方文檔。
基礎設置#
- 輸入要註冊的帳號信息,設置強密碼!!!
Important
第一個註冊的用戶將被自動設置為系統管理員,所以請確保你是第一個註冊的用戶。
- 點擊左下角頭像,選擇管理面板
- 點擊面板中的設置
- 關閉允許新用戶註冊(可選)
- 點擊右下角保存
配置 Ollama 和 Qwen2.5#
部署 Ollama#
在本地伺服器上安裝 Ollama。目前 Ollama 提供多種安裝方式,請參考 Ollama 的官方文檔 下載安裝最新的 0.3.11
版本(Qwen2.5 在該版本才開始支持)。安裝細節可以參考我之前寫的一篇文章:Ollama:從入門到進階。
啟動 Ollama 服務(如果是 Docker 方式啟動則不需要,但必須暴露 11434 端口):
ollama serve
Ollama 服務啟動後,可以通過訪問地址 http://localhost:11434
連接到 Ollama 服務。
Ollama Library 提供了語義向量模型 ( bge-m3
) 以及各大文本生成模型(包括 Qwen2.5)。下一步我們將配置 Ollama 以適應本項目對文檔檢索和問答生成的需求。
下載 Qwen2.5 模型#
通過 Ollama 安裝 Qwen2.5,你可以直接在命令行中運行 ollama pull
命令來下載 Qwen2.5 模型,比如要下載 Qwen2.5 的 72B 模型,可以使用以下命令:
ollama pull qwen2.5:72b
該命令將從 Ollama 的模型倉庫抓取 Qwen2.5 模型,並準備運行環境。
Qwen2.5 提供了多種模型尺寸,包括 72B、32B、14B、7B、3B、1.5B、0.5B 等,你可以根據自己的需求和 GPU 顯存大小選擇合適的模型。我採用的是 4x V100 的伺服器,所以可以直接選擇 72B 模型。如果要求吐字速度快且能接收微小的性能損失的話,可以使用 q4_0
量化版本 qwen2.5:72b-instruct-q4_0
;如果能接受吐字速度慢一些,可以使用 qwen2.5:72b-instruct-q5_K_M
。對於 4x V100 的伺服器,雖然 q5_K_M
模型的 token 生成明顯卡頓,但是為了試驗一下 Qwen2.5 的性能,我還是選擇了 q5_K_M
模型。
對於顯存較少的個人電腦,推薦使用 14B 或 7B 模型,通過以下命令下載:
ollama pull qwen2.5:14b
或者
ollama pull qwen2.5:7b
如果你同時啟動好了 Open WebUI 和 Ollama 服務,那麼也可以在管理面板中下載模型。
下載 bge-m3 模型#
在 Ollama 中下載 bge-m3
模型,該模型用於文檔向量化處理。在命令行中運行以下命令下載模型(或者在 Open WebUI 界面下載):
ollama pull bge-m3:latest
到這裡,我們已經完成了 Ollama 的配置,接下來我們將在 Open WebUI 中配置 RAG 服務。
RAG 集成與配置#
在 Open WebUI 中配置 Ollama 的 RAG 接口#
訪問 Open WebUI 管理界面#
啟動 Open WebUI 之後,你可以直接通過 Web 瀏覽器訪問服務地址,登錄你的管理帳戶,然後進入管理面板。
設置 Ollama 接口#
在 Open WebUI 的管理面板中,點擊設置,你會看到外部連接的選項,確保 Ollama API 的地址為 host.docker.internal:11434
,然後點擊右邊的 verify connection 按鈕確認 Ollama 服務是否正常連接。
設置語義向量模型#
在 Open WebUI 的管理面板中,點擊設置,接著點擊文檔,依次完成以下步驟:
- 設置語義向量模型引擎為 Ollama。
- 設置語義向量模型為
bge-m3:latest
。 - 其餘設置可以保持默認,這裡我設置了文件最大上傳大小為 10MB,最大上傳數量為 3,Top K 設置為 5,塊大小和塊重疊分別設置為 1500 和 100,並開啟 PDF 圖像處理。
- 點擊右下角保存。
測試 RAG 服務#
現在,你已經實現了完整的本地 RAG 系統。你可以在 Open WebUI 的主界面中輸入任意自然語言問題,然後上傳響應文檔,系統會調用語義向量模型向量化文檔,再使用 Qwen2.5 模型檢索文檔生成答案並返回給用戶。
在 Open WebUI 的用戶聊天界面,上傳你要檢索的文檔,然後輸入你的問題,點擊發送,Open WebUI 將會調用 Ollama 的 bge-m3
模型進行文檔向量化處理,然後調用 Qwen2.5 模型進行問答生成。
這裡我上傳了一個簡單的 txt
文件(由 GPT 生成的文本),內容如下:
# 奇幻森林的冒險
## 引言
在一個遙遠的王國邊界,有一片神秘的奇幻森林,傳說中棲息著許多奇異的生物和古老的魔法。很少有人敢於進入,因為進入森林的人都沒有再回來過。故事的主人公是一個年輕的冒險者,他名叫艾文。
## 第一章:艾文的決定
艾文是一個熱愛冒險和探索的年輕人,他從小就聽過很多關於奇幻森林的故事。儘管家人和朋友都勸他不要去,但他堅定地認為,自己注定要揭開這片森林的秘密。一天清晨,他收拾好行囊,帶著勇氣和好奇心,向森林進發。
### 1.1 出發前的準備
在出發前,艾文去了城裡最有名的圖書館,查閱了關於奇幻森林的資料。他發現,有一本古老的手稿記錄了進入森林的路線,以及如何避開其中一些危險的生物。艾文將這本手稿複印在自己的筆記本上,準備在需要的時候參考。
### 1.2 第一次穿越
艾文剛進入森林就感覺到這裡的氣息與外界完全不同。空氣中彌漫著濃郁的花香,還有隱隱約約的奇怪聲音。穿越森林的第一天,艾文沒有遇到什麼危險,但他能感覺到,有什麼東西在暗中觀察他。
## 第二章:神秘生物
第二天,艾文繼續深入森林。然而,他沒走多遠,就遇到了一隻奇異的生物。這是一隻會發光的小鹿,全身散發著柔和的藍色光芒。起初,艾文感到驚訝和畏懼,但這隻小鹿卻沒有攻擊他的意思,還帶著他走向一個隱秘的洞穴。
### 2.1 洞穴中的秘密
在洞穴中,艾文發現了一塊古老的石板,石板上刻有一些奇怪的符號。小鹿似乎知道這些符號的含義,帶著艾文一步一步地解讀。原來,這些符號記載著一種強大的魔法,可以幫助他在森林中找到失落的寶藏。
### 2.2 獲得幫助
艾文決定接受小鹿的幫助,解開這些符號的秘密。他們在洞穴中度過了幾天,艾文學會了如何利用森林中的資源製作藥劑和武器。通過這些,他在森林中的生存能力大大提高。
## 第三章:最終的試煉
在小鹿的指引下,艾文終於來到了森林的深處,那裡有一個古老的祭壇。據說,只有最勇敢的冒險者才能通過祭壇的試煉,獲得最終的寶藏。
### 3.1 面對恐懼
祭壇周圍佈滿了各種陷阱和幻覺。艾文必須面對自己內心深處的恐懼,才能通過這些障礙。最終,他用智慧和勇氣克服了一切,獲得了進入祭壇的資格。
### 3.2 發現寶藏
在祭壇的中心,艾文發現了一顆閃閃發光的寶石。據傳,這顆寶石擁有改變命運的力量。艾文拿起寶石,感受到了其中的強大力量。他知道,這不僅僅是一件珍寶,還有可能是破解奇幻森林秘密的關鍵。
## 結論
艾文成功地揭開了奇幻森林的部分秘密,成為了傳說中的英雄。他的冒險故事也激勵了更多年輕的冒險者,帶著勇氣和智慧,踏上探索未知世界的旅程。
然後分別提了三個問題:
- 艾文在森林中遇到的奇異生物是什麼?
- 艾文在洞穴中找到的古老石板上刻的是什麼?
- 艾文在祭壇中心發現了什麼寶藏?
下圖是回答結果:
總結#
借助 Open WebUI 和 Ollama,我們可以輕鬆搭建一個高效、直觀的本地 RAG 系統。通過將 bge-m3
語義向量模型用於文本向量化,再結合 Qwen2.5 生成模型,用戶可以在一個統一的 Web 界面中進行文檔檢索與增強生成任務的高效互動。不但保護了數據隱私,還大幅提升了生成式 AI 的本地化應用能力。