Ollama 概述
Ollama
是一個快速執行 LLM
(Large Language Models,大語言模型)的簡便工具。透過 Ollama
,使用者無需複雜的環境配置,即可輕鬆與大語言模型對話互動。
本文將解析 Ollama
的整體架構,並詳細講解使用者在與 Ollama
進行對話時的具體處理流程。
Ollama 整體架構
Ollama
使用了經典的 CS(Client-Server)架構,其中:
Client 透過命令列的方式與使用者互動。
Server 可以透過命令列、桌面應用(基於 Electron 框架)、Docker 其中一種方式啟動。無論啟動方式如何,最終都呼叫同一個可執行檔案。
Client 與 Server 之間使用 HTTP 進行通訊。
Ollama Server
有兩個核心部分:
ollama-http-server
:負責與客戶端進行互動。llama.cpp
:作為 LLM 推理引擎,負責載入並執行大語言模型,處理推理請求並返回結果。ollama-http-server
與llama.cpp
之間也是透過 HTTP 進行互動。
說明:llama.cpp
是一個獨立的開源專案,具備跨平臺和硬體友好性,可以在沒有 GPU、甚至是樹莓派等裝置上執行。
Ollama 儲存結構
Ollama
本地儲存預設使用的資料夾路徑為 $HOME/.ollama
,檔案結構如下圖所示:
檔案可分為三類:
日誌檔案:包括記錄了使用者對話輸入的
history
檔案,以及logs/server.log
服務端日誌檔案。金鑰檔案:id_ed25519 私鑰和 id_ed25519.pub 公鑰。
模型檔案:包括
blobs
原始資料檔案,以及manifests
後設資料檔案。
後設資料檔案,例如圖中的 models/manifests/registry.ollama.ai/library/llama3.2/latest
檔案內容為:
如上圖所示,manifests
檔案是 JSON 格式,檔案內容借鑑了雲原生和容器領域中的 OCI spec 規範,manifests
中的 digest 欄位與 blobs
相對應。
Ollama 對話處理流程
使用者與 Ollama
進行對話的大致流程如下圖所示:
使用者透過 CLI 命令列執行
ollama run llama3.2
開啟對話(llama3.2
是一種開源的大語言模型,你也可以使用其它 LLM)。準備階段:
CLI 客戶端向
ollama-http-server
發起 HTTP 請求,獲取模型資訊,後者會嘗試讀取本地的manifests
後設資料檔案,如果不存在,則響應 404 not found。當模型不存在時,CLI 客戶端會向
ollama-http-server
發起拉取模型的請求,後者會去遠端儲存倉庫下載模型到本地。CLI 再次請求獲取模型資訊。
互動式對話階段:
CLI 先向
ollama-http-server
發起一個空訊息的/api/generate
請求,server 會先在內部進行一些 channel(go 語言中的通道)處理。如果模型資訊中包含有 messages,則列印出來。使用者可以基於當前使用的模型和 session 對話記錄儲存為一個新的模型,而對話記錄就會被儲存為 messages。
正式進入對話:CLI 呼叫
/api/chat
介面請求ollama-http-server
,而ollama-http-server
需要依賴llama.cpp
引擎載入模型並執行推理(llama.cpp
也是以 HTTP server 的方式提供服務)。此時,ollama-http-server
會先向llama.cpp
發起/health
請求,確認後者的健康狀況,然後再發起/completion
請求,得到對話響應,並最終返回給 CLI 顯示出來。
透過上述步驟,Ollama
完成了使用者與大語言模型的互動對話。
總結
Ollama
透過整合 llama.cpp
推理引擎,並進一步封裝,將複雜的 LLM
技術變得觸手可及,為開發者和技術人員提供了一個高效且靈活的工具,很好地助力了各種應用場景下的大語言模型推理與互動。
參考資料: