最近 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|>
專案網址:
https://github.com/donma/TinyNotebook/
如果可以就幫我 Star and Fork :)
--
The bug existed in all possible states. Until I ran the code.
如果這篇文章有幫助到您幫我分享一下,讓我有寫下去的動力...