建置本地端 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


礙於篇幅的關係,本系列規劃用底下幾篇文章來說明。


參考網站

留言