[C#] 不走 Ollama,我用 C# + llama.cpp 把 Gemma 4 本地跑起來

  • 108
  • 0

最近 Google  的 Gemma4 風風火火,之前我都是透過 ollama 去連線本地模型

一直都想測試看看能不能自己透過C# 去直接讀取模型,我就想說試試看,於是這測試專案就誕生了..

Gemma 4 系列裡,最小入口是 E2B,所以我選了 gemma-4-E2B-it-Q4_K_M.gguf,而且官方文件也直接列出它可以跑在 llama.cpp 這類本機推論工具上

如果看官方提供的 Q4_0 記憶體估算,Gemma 4 E2B 大約是 3.2 GB 等級,這種尺寸就很適合拿來做第一次本機實驗

原本使用 LLamaSharp ,但是一直遇到問題,於是最後我是直接使用 llama.cpp 這專案直接透過C# 去呼叫

Gemma 官方文件本身也把 llama.cpp 列在本機執行選項裡,所以乾脆直接調用看看

該做的介紹在 Github 上 README 都寫了,這邊就說說心得跟數據

得先說實話,這裡面,我有 80% 是透過我寫的蝦去完成的,另外 15% 是透過在我盯在電腦前面改的

大概 5% 是我手動去調整,這中間也踩了一些坑,
 


1. 光是一開始使用 LLamaSharp  因為還不支持新模型

然後看到 llama.cpp 瘋狂再更新一個晚上從 b8662 => b867x 就知道全世界都在為了 Gemma4 在瘋狂修改

這裡面還有遇到 Qwen 跟 Gemma4 呼叫的一些問題,反正最後也都是靠 AI 幫忙解決了


2. 串流輸出這件事,我有刻意繞開 Razor Pages handler,直接用 Minimal API 做 /api/chat 原因其實很實際

因為一般 Razor Pages 會經過完整 MVC pipeline,回應比較容易被 buffer 而這裡的寫法是直接停用 response buffering

接著一段一段把 token 寫到 response stream,還會在每次寫入後 FlushAsync(),這種做法效果就有出來

不是等整段都算完才一次吐出來,而是 token 生成到哪裡,畫面就可以先看到哪裡

 

3. 這次選 Gemma 4 E2B 來測,不是因為它一定最強,而是他現在很夯大家都說很猛

第一次先把最小模型在 C# + llama.cpp 這條路上跑通,不過我也順便用了 Qwen2.5/Qwen3 進行測試,也都是可以使用


看一下主要結果:

Web 端,我給他一份資料,請他幫我產生一頁式網站


Console 端 


最後說個我的感覺

用 AI 寫程式很快,真的蠻爽的,但是很多地方不能無腦的給 AI 做啥寫啥,很容易寫偏,不過這專案

也讓我去理解模型的運作,包含 ContextSize 還有Gemma 4 模板和舊 Gemma 不一樣

而且 token 必須精準:

<|turn>
<turn|>
<|channel>
<channel|>

之前一度用了錯的格式,模型就不正常,反正這都不提了

你有興趣 fork 下來,綁你的 AI 工具都可以去改我這專案,幫你的系統加入一個本地端 AI去輔助

專案網址:

https://github.com/donma/TinyNotebook/

如果可以就幫我 Star and Fork  :)

-

本文首發於 不走 Ollama,我用 C# + llama.cpp 把 Gemma 4 本地跑起來

-

---

The bug existed in all possible states.
Until I ran the code.