MOOSSin
選單

全部文章 · 開源工具

Ollama:在自己的機器上跑語言模型,以及一個會回空白的坑

Ollama 讓你用一行指令下載並執行開源語言模型,提供本機的 REST API 和 OpenAI 相容端點。這篇講我實際用它的方式:整理新聞要逐段引用、當雲端模型的後備、給儀表板寫摘要,還有會思考的模型在相容端點上回空白的那個問題。先從「為什麼要在自己電腦上養一個 AI」講起。

第一次在自己的電腦上跑起一個語言模型的時候,我做了一件很蠢的事:把網路線拔掉,然後再問它一個問題。它回答了。我盯著螢幕看了好幾秒,有一種很難形容的感覺,像是發現家裡那台老舊的收音機其實會自己講話。

那個工具是 Ollama。它是一個 MIT 授權的工具,把開源語言模型的下載、量化版本管理和推論包成一個服務。ollama pull 抓模型,ollama run 對話,背景的服務在本機提供 REST API,另外還有一組 OpenAI 相容的端點,讓原本對 OpenAI API 寫的程式改個網址就能用。我機器上放著三個模型:gemma4 的 e4b 量化版、qwen3.5 的 4b、qwen3 的 8b,幾個專案各自透過 API 用它們。

為什麼要在自己電腦上養一個

雲端的模型更聰明,這沒什麼好爭的。本機的小模型會犯錯、會慢、會在你問它稍微難一點的問題時開始胡說。那為什麼還要養?

我的理由不是隱私那種大道理,雖然那也算。我的理由是控制:我知道它看到了什麼,我知道它的輸入是我給的、沒有別的東西混進去,我可以在它輸出之前和之後都加上我自己的檢查。雲端模型像一個很聰明但你管不到的顧問;本機模型像一個能力普通但完全聽你指揮的助理。很多工作需要的是後者。

拿它整理資料時,讓它只能引用

小模型最大的風險是編造。它會很有自信地告訴你一個數字,那個數字在原文裡根本不存在。所以我讓它整理新聞時的規則是:先由程式把原文切成編號的段落,模型只能引用編號;每個它寫出來的事實裡出現的數字和英文名稱,都必須出現在它引用的那一段;標題和摘要裡的數字與名稱必須出現在來源。不合格的事實剔除,合格的太少就帶著原因重試一次,仍然不行就標成待整理。

這套做法有點像考試時規定「答案要標明出自課本第幾頁」。學生沒辦法憑印象亂寫,因為每一句都要對得回去。這套檢查只有在我控制模型輸入的時候做得到,這是我堅持本機的主要理由。

當雲端模型的後備

有些判斷我交給雲端的模型,但每次真的呼叫都要另外核准,因為那是要錢的,而且是那種你不注意就會累積的錢。沒核准的時候由本機的 Ollama 回答,結果記為 fallback,永遠不算正式採信。

每日摘要原本會請它寫一段散文,後來改成開關而且預設關閉:事實清單照常產生,散文想要的那天再開。理由很誠實,事實清單我每天看,散文不一定。一個每天產生但沒人看的東西,就只是在浪費顯卡的電。

會思考的模型在相容端點上回空白

這一段是這篇文章存在的理由之一,因為我找了很久。

gemma4、qwen3、qwen3.5 這幾個模型有「思考」模式,回答之前會先在內部推理一段。透過 Ollama 的 OpenAI 相容端點呼叫時,送 think: false 會被忽略,模型把整個回答都花在思考上,回傳的內容是空字串,沒有錯誤。你的程式收到一個完全正常的回應,狀態碼 200,內容是空的。你會先懷疑自己的提示詞,再懷疑網路,再懷疑模型壞了,最後才懷疑到參數。

修法是改送 reasoning_effort: 'none'。這行寫在我的程式裡,旁邊有註解說明為什麼,因為三個月後我一定會看著它想「這是什麼」然後想刪掉它。

一張顯卡,大家搶

Ollama 會把模型載進顯卡的記憶體並保留一段時間。同一張卡上還有語音模型或其他推論工作時,它們會互相排擠,載入時間可以差到一倍以上。這不是 Ollama 的問題,但排程要知道:模型不會同時跑得好,先後順序要自己安排。

這跟宿舍的浴室一樣。一間浴室,四個人,早八的時候大家都要用,你可以吵,也可以排時間表。排時間表比較不傷感情。

小劇場:它會取代雲端嗎

「所以你現在都用本機的模型,不用 ChatGPT 了?」

「沒有,難的問題還是問雲端的。本機的模型負責那些重複、量大、需要被檢查的工作。」

「那不是很麻煩,兩邊都要維護?」

「是麻煩。但這樣分工之後,雲端的錢花在值得的地方,本機的顯卡做它做得好的事。」

「你講得好像在管理員工。」

「某種程度上是。一個聰明但按次收費的顧問,和一個普通但住在你家的助理。你不會什麼事都找顧問。」

預設只聽本機,維持這樣

Ollama 預設只綁本機迴路位址。它的 API 沒有認證,任何能連到那個埠的程式都能用你的顯卡跑任何模型,還能問它任何問題。除非有明確的理由,不要把它開給區域網路,你不會想在某天發現室友的電腦一直在用你的顯卡寫作業。

我為什麼堅持本機

我丟給它的東西沒有一樣是機密,但把它們全部送去雲端,我會失去對「模型看到了什麼、回答依據什麼」的掌握。速度和品質上本機小模型有差距,我用檢查規則和人來補。

還有那個拔掉網路線它還會回答的瞬間。那個感覺到現在還在,每次啟動它的時候都會想起來。

它底下是什麼

Ollama 在 2023 年出現,那一年開源語言模型突然變得能在家用電腦上跑,但跑起來很麻煩:要自己編譯推論引擎、自己找量化過的權重、自己寫載入程式。Ollama 把這些包起來,底下的推論引擎是 llama.cpp,模型格式是 GGUF,這兩個名字你在 Ollama 的日常使用裡幾乎不會看到,但它們才是真正在算的東西。

它有一個叫 Modelfile 的東西,語法刻意模仿 Dockerfile:FROM 一個基底模型,SYSTEM 設系統提示,PARAMETER 調溫度和上下文長度,然後 ollama create 就得到一個你自己的模型名字。這個設計很聰明,因為會用 Docker 的人一看就懂,而會用 Docker 的人剛好是最可能在自己電腦上跑模型的那群。

模型名字後面的 4b、8b 是參數量,q4、q8 這類字尾是量化程度,數字越小檔案越小、跑得越快、也越笨一點。8 GB 的顯卡大概可以舒服地跑 4b 到 8b 的量化模型,再大就要開始跟系統記憶體借了。

常見的三個誤會

第一個誤會是「本機模型免費所以沒有成本」。電費是成本,顯卡壽命是成本,你等它回答的時間也是成本。它省的是 API 帳單和資料外流的風險,不是所有成本。

第二個誤會是「小模型只是大模型的縮小版」。它們的能力不是等比例縮小的。小模型在格式化輸出、分類、抽取這類任務上可以很好,在需要世界知識和長推理的任務上會突然崩掉。知道它的形狀,用在對的地方。

第三個誤會是「模型載入一次就一直在」。Ollama 預設在閒置幾分鐘後把模型從顯卡卸掉,下一次呼叫要重新載入。這是為了把顯卡讓給別人,但如果你的工作是每十分鐘呼叫一次,你會一直在付載入的成本。keep_alive 參數可以調,知道它存在就好。

一個週末可以試的小練習

裝 Ollama,ollama pull qwen3.5:4b(或任何一個幾 GB 的小模型)。先用 ollama run 跟它聊兩句感受一下速度。然後做這篇講的那個練習:找一段新聞,自己把它切成三段並編號一二三,貼給模型,要求它「用三句話摘要,每句後面標明依據第幾段」。看它標得對不對,把它標的段落打開比對。

你會發現它有時候會標一個根本沒講那件事的段落。這就是為什麼我的規則是「程式去比對,不信模型的標」。再試一次,用 API 呼叫,對相容端點送 think: false,看回來的內容是不是空的;換成 reasoning_effort: 'none' 再送一次。這兩次呼叫會讓你對「相容端點」這四個字有一個很具體的認識。

後記

拔掉網路線的那個晚上,我後來想,那種感覺其實不是驚訝於技術,是驚訝於「這件事居然在我的桌上發生」。前幾年這種能力只存在於某幾家公司的機房裡,現在它在我的顯卡上,用著我的電,聽著我的指令。它不聰明,但它是我的。這個「是我的」,大概就是整篇文章真正想講的東西。

官方網站:ollama.com

閱讀偏好

返回全部文章作者與內容更正

留言(0)

還沒有留言。讀完有想法,歡迎留下第一則。

留言經站長審核後才會顯示。暱稱和留言會公開,請不要寫下電話、地址等個人資料;資料怎麼處理,請見隱私權政策。