本篇將建構一個LLM 服務,並用簡單的程式呼叫LLM
Ollama 是什麼 ?
Ollama 是一個本地運行的 LLM 服務,可以把大型語言模型變成本地 API。
它會管理模型下載、加載和運行,並提供 HTTP 或 Python 接口給程式呼叫。
支援多模型管理,並能自動利用 GPU 或 CPU 加速推論。
開發者可以用它做聊天機器人、RAG 或 Agent,而不用管底層推論細節。總之,它就像「本地版的 OpenAI API」,方便把 LLM 整合到應用中。
Ollama 讓使用LLM 變得非常方便,並考量之後會引用RAG 來加強回答的精確度,所以採用Ollama 作為LLM 服務。
本篇會照以下步驟進行:
- 安裝Ollama
- 下載、用Ollama 加載模型
- 寫python 程式呼叫LLM
安裝Ollama
我使用Linux Ubuntu 來當作Server,參考官方的安裝教學:
https://docs.ollama.com/linux
curl -fsSL https://ollama.com/install.sh | sh安裝好之後,設定讓Ollama 可以監聽內網來的Request。
使用systemctl 來做永久性設定,即使服務重啟之後也保留設定值:
# 打開設定畫面
systemctl edit ollama
# 加上設定後退出
> [Service]
> Environment="OLLAMA_HOST=0.0.0.0"
# reload設定、重啟服務
systemctl daemon-reload
systemctl restart ollama先在內部檢查socket 連線狀態,看到 *:11434 代表設定生效,Socket 正在11434 上監聽來自任何IP 的request
ss -lntp | grep 11434/d6dbc0e4-b802-4911-b405-1a2f9e6fbbda/1767938278.png.png)
用同內網電腦的瀏覽器輸入網址 IP:11434,看到:Ollama is running 就代表Ollama 有在跑
/d6dbc0e4-b802-4911-b405-1a2f9e6fbbda/1768274588.png.png)
下載、用Ollama 加載模型
準備好Ollama 之後就要啟用模型,本篇使用Llama-3.1-Taiwan 8B 模型。此模型是基於 Meta Llama-3 做繁體中文Fine-Tuning 的開源 LLM 模型,以提升對於繁體中文的處理品質。其實Ollama 也可以下指令直接把model pull 下來,但本篇先使用hugging face CLI 工具下載。
下載模型
# url: https://huggingface.co/yentinglin/Llama-3.1-Taiwan-8B-Instruct/tree/main
# 1. 先安裝Hugging face 的CLI 工具
curl -LsSf https://hf.co/cli/install.sh | bash
# 2. 下載model
hf download yentinglin/Llama-3.1-Taiwan-8B-Instruct
# 檔案會跑到huggingface 的快取資料夾,有存取權限問題
# 3. 先創個資料夾
mkdir -p ~/models/llama3.1-tw
# 4. 將檔案複製到 ~/model
cp -L /home/user/.cache/huggingface/hub/models--yentinglin--Llama-3.1-Taiwan-8B-Instruct/snapshots/7a0e2caca6d8e7919130fe7574a35db2ad3875b5/* ~/models/llama3.1-tw/加載、運行模型
Model 下載完之後,就是要告訴Ollama 要跑哪一個模型。因為Ollama 可以同時跑很多模型,所以要寫一個叫做Modelfile 的檔案,裡面宣告、設定使用的模型跟參數,類似設定檔。再下指令給Ollama 定義服務名稱跟這個設定檔,所以當我呼叫Ollama 並指定名稱,Ollama 就知道我是要用哪個模型。
# 1. 進去目錄裡建立Modelfile
cd ~/models/llama3.1-tw
vi Modelfile
>FROM .
>PARAMETER temperature 0.7
>PARAMETER top_p 0.9
# 2. 運行模型
ollama create llama3.1-tw
# 這寫的"llama3.1-tw" 就是服務名稱,後面呼叫ollama 帶這個名字
# 因為當前目錄中有一個Modelfile,所以ollama 會自己抓這個檔案來當設定檔/d6dbc0e4-b802-4911-b405-1a2f9e6fbbda/1768202888.png.png)
輸入 ollama list 可以看到現在有什麼模型可以呼叫
/d6dbc0e4-b802-4911-b405-1a2f9e6fbbda/1768205268.png.png)
寫python 程式呼叫LLM
在Windows 上打開PyCharm 左下角的Terminal,在.venv (虛擬環境) 中安裝Ollama 套件
/d6dbc0e4-b802-4911-b405-1a2f9e6fbbda/1767928879.png.png)
因為Ollama 在遠端機器,所以要先用client 指定遠端主機位置。再來進行簡單的單次對話。
傳給LLM 的訊息,稱為提示詞(Prompt)。其中又以Role 分成兩個種類:
- system: 系統提示詞 system prompt,開發者設定,敘明要怎麼約束LLM 的行為/語氣/安全邊界。
- user: 使用者提示詞 user prompt,在不違反system prompt 前提下回覆使用者。
import ollama
# 指定遠端
client = ollama.Client(
host='http://192.168.0.XXX:11434'
)
# 取得回應
response = client.chat(
model="llama3.1-tw", # 輸入ollama 中設定的model name
messages=[
{"role": "system", "content": "你是一個很有幫助的AI 助手,用繁體中文回答問題"},
{"role": "user", "content": "酷拉皮卡是誰?"}
]
)
print('user: 酷拉皮卡是誰?')
print(f'ai: {response["message"]["content"]}')原來待在船上這麼久不下來,是去演其他動漫嗎…
是說排球少年也沒這種劇情吧 XD
/d6dbc0e4-b802-4911-b405-1a2f9e6fbbda/1767929411.png.png)
結語
到這裡可以成功單次對話了。但如果你重複呼叫model,會發現他不記得剛剛說的話。因為目前程式結構下,每次對話都是獨立的,所以模型不會知道你剛剛問甚麼,以及他剛剛講了什麼。所以下篇要進行多次對話。
references:
[Project TAME] Llama-3-Taiwan 模型:Taiwan-LLM 模型系列再更新 | by Simon Liu | Medium
Day9 - 選擇適合你的中文local LLM - iT 邦幫忙::一起幫忙解決難題,拯救 IT 人的一天