建置本地端 Ollama 服務及 LLM 知識庫所需的環境設置
# 使用生成式 AI 結合 RAG 技術實做屬於自己的 LLM 知識庫系列文章
在上一篇文章中簡單介紹了這系列文章的目標與執行流程,今天這篇文章將記錄,開發 Gen AI 的 LLM 知識庫系統所需的環境設置,以下是我在開發過程中所使用的環境說明:
- 作業系統:Windows 10 企業版 LTSC
- Docker Desktop: Docker Desktop 4.38.0(181591)
- Word Embedding 模型:snowflake-arctic-embed2
- LLM 模型:Google Gemini
- 開發語言:NET Core 8
- 使用套件:Semantic Kernel
Ollama 是什麼?
Ollama 是個很方便的開源 LLM 框架,讓你可以在本地端輕鬆跑像 Llama 3、Mistral、Gemma 這些熱門的大語言模型,支援 Mac、Linux、Windows 多平台,重點是它已經把模型設定、權重下載、環境配置這些麻煩事都打包好了。
你也可以直接在開發環境上面安裝,但你知道的,有時候環境設定真的是地雷一堆,踩到就很 OOXX,所以我個人是直接使用 Docker 來裝,因此這篇文章會記錄用 Docker 來安裝 Ollama 的流程。
Docker 環境要求
因為需要在 Windows 環境下跑 Linux 容器,所以第一步必須先安裝好 Docker + WSL2(Windows Subsystem for Linux),這兩個部分的設定可以參考 在 WSL 2 上開始使用 Docker 遠端容器 或是 使用WSL2在Windows下快速打造Linux開發環境(含Docker) 這兩篇。
設定完之後啟動 Docker,如果成功,會看到類似下面這樣的畫面,若到這邊代表我們已經可以在開發機執行 Linux Docker Container 摟。
Docker Desktop 設定畫面 |
另外,由於 WSL2 本質上是在 Windows 裡面跑一個 Linux 子系統,在設定完成之後,系統會在 Windows 的檔案總管中建立兩個額外的網路位置,因此我們可以直接透過 UNC 路徑(類似 \\wsl$ 開頭的路徑)來存取 WSL 裡的檔案,這對於要搬資料或編輯某些設定檔來說非常方便,不用每次都開終端機來下指令修改或取得檔案。
Linux 子系統網路資料夾 |
舉例來說,本文下方用到的 Docker 指令中,因為有掛載 Volume,因此這些資料就可以直接透過 \\wsl$\docker-desktop\mnt\docker-desktop-disk\data\docker\volumes 來查看 (※註,不同版本的 Docker Desktop 路徑有差異,可以參考 StackOverflow 這篇 Issue ) ,下圖是實際掛載成功後的示意圖。
Docker 指令掛載的本地端資料夾路徑 |
安裝本地端 LLM 執行環境
安裝 Ollama
接著透過下面這行指令(CPU Only)把 Ollama 的 Image拉取到本地端並執行,等容器成功跑起來後,可以直接用瀏覽器執行 http://localhost:11434 ,若成功安裝應該要可以看到 Ollama is running 的描述。這邊要注意一下,這時候我們只是把整個大語言模型所需的執行環境架好,還沒安裝任何模型,所以它現在還沒辦法真的生成內容(LLM)或執行詞嵌入(Word Embedding)喔,至於什麼是詞嵌入?這個就讓我保留在下一篇分享吧。
docker run -d -v ollama:/root/.ollama -p 11434:11434 --name ollama ollama/ollama
安裝視覺化界面
完成 Ollama 安裝之後,其實就可以透過 API 來操作,比如下面這兩個 API 可以查詢目前安裝的版本和模型資訊,其它更多指令可以參考官方文件。
curl http://localhost:11434/api/version
# 取得版本資訊回應結果 {"version":"0.6.6"}
curl http://localhost:11434/api/tags
# 取得模型資訊回應結果
{
"models": [
{
"name": "snowflake-arctic-embed2:latest",
"model": "snowflake-arctic-embed2:latest",
"modified_at": "2025-02-26T03:54:07.7495676Z",
"size": 1160296718,
"digest": "5de93a84837d0ff00da872e90830df5d973f616cbf1e5c198731ab19dd7b776b",
"details": {
"parent_model": "",
"format": "gguf",
"family": "bert",
"families": [
"bert"
],
"parameter_size": "566.70M",
"quantization_level": "F16"
}
}
]
}
不過嘛~人類畢竟是視覺動物,有 UI 來操作總是比較直覺且簡單,這時候就要感謝大神們寫的 Open WebUI,讓我們可以用漂亮的網頁介面來操作 Ollama,這邊一樣是透過容器下載來用,完成後使用瀏覽器執行 http://localhost:3000。接著會要求你建立管理員帳號,照著說明執行即可。
docker run -d -p 3000:8080 --add-host=host.docker.internal:host-gateway -v open-webui:/app/backend/data --name open-webui --restart always ghcr.io/open-webui/open-webui:main
Open WebUI 初始化設定 |
下載模型
我們已經有了執行環境了也安裝好使用者介面了,但這個時候因為還沒有安裝任何模型,沒有模型所以是沒辦法進行對話的,但模型怎麼來?
在這個年代,AI 模型一日三變,自己訓練似乎已經不太符合效應了,因此就讓我們偷懶一下直接到 Hugging Face(一個超佛心的開源平台,這裡有蠻多預先訓練好的 AI 模型,並供大家下載使用)。
Open WebUI 功能介面 |
因為我們等等要測試文字生成跟詞嵌入的功能,所以這邊各挑了一個模型來用,你也可以根據自己的需求選其他模型來玩。
- 詞嵌入模型:snowflake-arctic-embed2,Snowflake 推出支援繁體中文的 Emadding 模型。
- 語言模型:phi3,這是微軟出的小語言模型,但由於我的執行環境效能有限,因此這邊下載完畢後僅展示一下如何在 Open WebUI 上使用推論的功能,後續的文章實作並不會串接本地端的語言模型。
如果想透過 Open WebUI 操作模型安裝的話,請在登入後點右上角頭像 → 管理員控制台 → 設定 → 模型 → 再點右上角的下載 Icon,就會跳出一個 Dialog 視窗,這時候輸入你要的模型名稱,接著再點下載 Icon 就開始下載了(下載時間會根據你選的模型大小跟網路速度有所不同,可能要等一下)。
透過 UI 下載模型 |
又或者你可以直接透過 Ollama 的 API 直接下載模型,相關語法如下。
curl http://localhost:11434/api/pull -d '{"name": "phi3"}'
curl http://localhost:11434/api/pull -d '{"name": "snowflake-arctic-embed2"}'
測試語言模型
模型下載後切換到(下圖紅框處)指定的模型後送出我們的問題就行了,Open WebUI 實在是太酷了,一行程式都不用寫就得到了一個自己的 ChatGPT 了,只是 phi3 的回應能力實在是尚待加強,所以一個好的語言模型還真的是很重要呢 XD。
測試嵌入模型
由於嵌入模型的輸出是一個數值的陣列,沒有辦法使用 UI 來呈現,因此可以透過 Postman 發送請求或者使用底下的語法來進行測試。
curl http://localhost:11434/api/embed \
-H "Content-Type: application/json" \
-d "{\"model\": \"snowflake-arctic-embed2\", \"input\": \"台灣總統\"}"
Postman 執行畫面 |
安裝向量資料庫
因為後續實作需要把文字經過詞嵌入轉換成向量後儲存起來,這邊我就參考了黑大整理的 RAG 基礎 - 常見向量資料庫整理,最後選用的是開源的 Qdrant 向量資料庫來儲存,下載語法如下。
docker run -d -v ollama:/root/.ollama -p 6333:6333 --name qdrant qdrant/qdrant:latest
Docker Compose.yml
因為我們要啟動的不只是一個 Docker 服務,通常這種情況下會建議用 docker-compose
把所有需要的服務打包在一個設定檔裡一起啟動,這樣管理起來比較方便。但這邊我有稍微調整一下 Volume 掛載的設定,讓資料可以直接掛載到 docker-compose.yml
所在資料夾內的一個子資料夾,這樣比較方便我自己管理,相關語法可參考 Github。
礙於篇幅的關係,本系列規劃用底下幾篇文章來說明。
- 前言及流程規劃。
- 建置本地端 Ollama 服務及 LLM 知識庫所需的環境設置。
- 蝦咪系 Word Embedding?詞嵌入模型概念及實作。
- Hello Gemini,串接第一個 Gemini 生成式 AI。
- 做個有記憶力的 AI 機器人,實作對話記憶。
- 來跟 AI 玩玩角色扮演吧,提示工程(Prompt engineering)實作。
- 解決 AI 幻覺,讓 RAG 幫你吧。
- AI 也能認識你是誰喔,實作自定義 Function。
- 來吧,開始建立基於生成式 AI 的 KM 系統了。
- 番外篇 - 我想換個生成模型呢。
留言
張貼留言
您好,我是 Lawrence,這裡是我的開發筆記的網誌,如果你對我的文章有任何疑問或者有錯誤的話,歡迎留言讓我知道。