2026年5月25日 星期一

Ollama 學習筆記 : Gemma 4 模型測試 (gemma4:e4b)

在前面的測試中, 安裝 Ollama 後第一個下載執行的模型是 gemma4, 但只是做了簡單的對話而已, 本篇旨在對此模型做進一步測試.

本系列全部測試文章索引參考 :


以下摘要整理 Gemini 關於 gemma4 的描述 :

Gemma 4 是 Google 最新釋出的全新世代旗艦級開源大語言模型 (由 Gemini 3 技術下放打造), 採用 Apache 2.0 授權, 允許完全自由商用. 此模型最大的突破在於把原本屬於雲端旗艦的 AI 模型 (例如 Gemini 1.5/2.0 Pro) 的原生全模態 (文字/圖片/音訊) 與類似 DeepSeek-R1 的內建思維鏈推理完美融合, 並且在架構上首次引進了混合專家 (MoE) 與高效的有效參數 (Effective Parameters) 技術, 把小模型的智商推向了全新巔峰. 

Gemma 4 具有如下特點 : 
  • 會思考的開源大腦 (Native Reasoning) :
    Gemma 4 全系列都支援 thinking 模式, 在回答複雜的數學, 科學或軟體工程代碼時, 它會先進行內部邏輯推演 (Chain-of-Thought), 想通了才動手. 這讓它在軟體工程解題測試上的成功率飆升, 抓 Bug 和重構 Python 程式碼的實力直逼一線雲端大模型. 
  • 原生全模態感知 (能看能聽) :
    底層原生支援全模態感知, 不僅能精準做圖片 OCR, 解讀複雜商業圖表, 偵測網頁 UI 元素, 甚至支援音訊原生輸入 (其音訊編碼器比上一代縮小了 77%). 
  • 強悍的 Agent 與工具呼叫能力 :
    經過極其嚴格的 Function Calling 優化後, 在像 Claude Code, OpenClaw 或是 Android Studio 新版的本地 AI 代理工作流中, 它輸出 JSON 的穩定度極高, 不會輕易導致 Agent 介面崩潰, 是目前最適合拿來當 Local Coding Agent 後台的小模型. 
  • 快如閃電的多詞元預測 (MTP) 技術 : 
    Gemma 4 內建了專用的草稿模型進行推測解碼 (Speculative Decoding), 這讓它的吐字速度非常驚人, 即便是開啟 Thinking 模式依然能維持極度順暢的生成體驗. 
  • 恐怖的 128K 超長上下文記憶 :
    此模型支援高達 128,000 個 Token 的上下文, 即使是把一整套複雜的 Python 專案架構完全塞給它, 也能完全離線地保持脈絡記憶.
不過 Gemma 4 也有一些缺點 :
  • 靜態記憶體開銷高於預期 :
    Gemma 4 採用了先進的每層嵌入 (PLE)技術來壓縮核心運算, 雖然它的有效活躍參數很低, 但因為它包含了龐大的靜態嵌入表與龐大的 128K KV 快取空間, 它在剛載入顯卡時的 VRAM 佔用率會比傳統純文字 8B 模型稍微吃滿一點點. 
  • 複雜思考會拉長首字反應時間 (Time-to-First-Token) :
    因為模型內建了推理機制, 當提出一個非常困難的程式邏輯題時, 它會在背景面壁思索一小段時間, 這時候 GPU 雖然在瘋狂運算, 但畫面上可能要等個 1~2 秒才會開始吐字, 可能會讓人誤以為它卡住了. 
總評 : Gemma 4 是全面進化的全能全模態大師, 我們可以將網頁設計截圖丟給它叫它直接生成 HTML/CSS 碼, 也可以作 Claude Code 後台, 全自動為 Python 專案生成程式碼與除錯, 還能丟錄音檔或語音叫它離線做精準摘要與理解. 

Gemma 4 的系列模型參考 :





之前我用 Ollama 原生介面下載的應該是 8B 參數, 經 Q4_K_M 量化後大小為 9.6 GB 的 e4b 版, 可用 ollama show 指令來確認 :

PS C:\Users\USER> ollama show gemma4   
  Model
    architecture        gemma4
    parameters          8.0B
    context length      131072
    embedding length    2560
    quantization        Q4_K_M
    requires            0.20.0

  Capabilities
    completion
    vision
    audio
    tools
    thinking

  Parameters
    temperature    1
    top_k          64
    top_p          0.95

  License
    Apache License
    Version 2.0, January 2004
    ...

如果要在 CLI 介面下載執行, 指令如下 :

ollama run gemma4:e4b  

以下多模態測試使用 Ollama 原生介面, 首先測試車牌辨識, 選擇模型 gemma4, 輸入 "請辨識這張車牌號碼", 按輸入框中的 + 鈕, 上傳車牌圖片後按提交鈕 :




經過快速的推理思考後, 直接回覆正確之車牌號碼 :




下面是從 TVBS 新聞網站下載的貨車圖片, 上傳給 gemma4 看看能否辨識車牌 :





果然不同凡響, 正確辨識出  9487-XD. 

接下來請它描述有名的 Lenna 圖 : 

"請描述這張圖片, 此圖非常有名, 你知道是甚麼圖嗎?"






描述得很詳盡, 但它不知道這是有名的 Lenna 圖, 經我提示 "是影像處理書籍上經常出現的模特兒 Lenna 的照片" 後才恍然大悟 :






Gemma 4 回應內容真的蠻有深度的. 

接下來上傳一張貓咪圖片 "請描述這張圖片內容" :




結果成功地辨識出三隻小貓, 這比 llama3.2-vision 模型厲害 : 




接下來考驗它能否看懂 K 線圖, 我上傳一張用 kbar 模組繪製的 K 線圖 :




結果如下 :







居然還能解盤, 真是厲害. 

Ollama 學習筆記 : Llamma 模型測試 (llama3.2-vision:11b)

今天繼續用 Ollama 測試本地模型, 本篇旨在測試 Meta 釋出的第一款原生多模態大語言模型 llama3.2-vision, 也是開源 AI 發展史上的重要里程碑. 它最大的特色是讓 Llama 家族正式擺脫純文字的限制, 具備了看圖思考的能力. 

本系列全部測試文章索引參考 :


在 Ollama 生態系中預設執行的通常是 llama3.2-vision:11b (110億參數), 經過 4-bit 量化後檔案大小約為 7.8 GB, 此體積可完整塞進 RTX 3060 12GB 的 VRAM, 是個人桌機體驗本地端視覺 AI 的主力首選. 

llama3.2-vision 的核心強項如下 : 
  • 優秀的圖表與文檔理解 :
    Llama 3.2-Vision 在解讀商業圖表 (如折線圖, 圓餅圖), 流程圖, 學術統計圖, 以及含有複雜排版的 PDF 文檔時表現極為強悍. 在官方基準測試中, 它在圖表和細節分析上甚至超越了部分同量級的商業閉源模型 (如 Claude 3 Haiku).
  • 強大的光學字元辨識 (OCR) :
    不論是印刷體還是清晰的手寫字, 它能非常精準地將圖片中的文字與表格數據抓取出來並轉換成 Markdown 格式. 
  • 影像定位與物件偵測 : 
    它不僅能看懂照片裡有什麼, 還能根據你的文字描述, 指出物件在圖片中的大概位置或方位. 
  • 完美契合 12GB VRAM 顯卡 :
    7.8 GB 的模型大小, 載入後大約佔用 8~9 GB VRAM, 留下約 3GB 的緩衝空間來儲存聊天上下文, 這使得在本地端丟照片給它時, 生成和解析的速度非常流暢, 不需要耗時等待. 
但 也存在一些缺點 :
  • 程式與高難度邏輯能力偏弱 :
    由於核心技能都聚焦在視覺和基礎對話, 如果把它當作寫 Python 的大腦或拿去跑 Claude Code 這類高強度 Agent 任務, 它會因為邏輯不夠硬核或工具呼叫格式錯誤而卡死.
  • 複雜圖表偶爾會有幻覺 :
    雖然它很擅長看圖, 但在面對資訊量極度爆炸, 字體極小, 或是線條密密麻麻的複雜金融 K 線圖電路圖時, 它還是有一定機率會胡言亂語. 
  • 純文字智商相比同體積模型無優勢 :
    如果純粹拿它來進行文字對話, 寫作或推理, 它的純文字能力基本上就是 Llama 3.1 8B 的水準, 在面對純文字高難度任務時表現會遜於同等體積的 Phi 4 (14B) 或 Qwen 3.5. 
總之, llama3.2-vision 擅長處理圖表資料, 但文字對話較弱且容易有幻覺. 另外, llama3.2-vision 的多模態只限於 "文字+圖片", 無法處理語音, 而且圖片需直接上傳, 給它圖片網址是無法處理的. 




下載執行此模型 :

PS C:\Users\USER> ollama run llama3.2-vision:11b    
pulling manifest
pulling 9999d473417a: 100% ▕██████████████████████████████████████████▏ 7.8 GB
pulling 715415638c9c: 100% ▕██████████████████████████████████████████▏  269 B
pulling d3ed60b91757: 100% ▕██████████████████████████████████████████▏ 6.0 KB
pulling fcc5a6bec9da: 100% ▕██████████████████████████████████████████▏ 7.7 KB
pulling fefc914e46e6: 100% ▕██████████████████████████████████████████▏   32 B
pulling 1506fb8a7284: 100% ▕██████████████████████████████████████████▏  564 B
verifying sha256 digest
writing manifest
success

先來測試其圖片辨識能力, 我用谷歌搜尋圖片找到下面這張 NBX-3388 車牌, 可以拿來測試看看 llama3.2-vision 是否可辨識出號碼 :


多模態測試不適合使用 CLI 介面, 應該使用 Ollama 原生介面, 選則模型 llama3.2-vision, 輸入 "請辨識這張車牌號碼", 按輸入框中的 + 鈕, 上傳或貼上車牌圖片後提交 :




結果如下, 正確辨識出號碼為 NBX-3388 :




但它說這是巴西車牌顯然是幻想 + 胡扯 : 

"這張車牌號碼是來自巴西。巴西的車牌號碼由兩部分組成:區域代碼和序號。區域代碼是用來識別車牌所屬的州的三位數字,序號則是用來識別車牌的四位數字。

在這張車牌號碼中,區域代碼是「NBX」,序號是「3388」。因此,這張車牌號碼的完整代碼是「NBX-3388」。這張車牌號碼可能是屬於巴西的某個州,例如巴西利亞(Brasília)或聖保羅(São Paulo)等。"


接下來我上傳一張 Lenna 的照片要求它描述, 參考 :





描述如下 : 

"這照片是一個女性的頭像,她的頭戴著一頂白色的帽子,帽子上有兩個小的羽毛,帽子的頂部有一個小的圓形鏡子。照片中女性的頭部和肩膀被拍攝到了。女性的頭髮是黑色的,長得很長,從她的頭頂延伸到她的肩膀。她的臉部是白色的,臉部的輪廓清晰,眼睛的位置正確,鼻子和嘴巴的形狀也正確。她的頭部的輪廓是圓的,沒有任何凸凹。她的頭髮的顏色是黑色的,長得很長,從她的頭頂延伸到她的肩膀。她的臉部的輪廓是白色的,臉部的輪廓清晰,眼睛的位置正確,鼻子和嘴巴的形狀也正…"

形容人家很正呵呵. 

我在貓咪圖片網站隨機找了一張可愛的貓貓圖 :






先叫它描述一下看到甚麼 :




描述如下 : 

"這張圖片是一個小貓的照片。貓的毛色是白色的,毛髮長得很長,從他的頭頂延伸到他的肩膀。他的眼睛是黑色的,瞳孔很大,鼻子和嘴巴的形狀也正確。他的頭部的輪廓是圓的,沒有任何凸凹。他的耳朵是小的,很軟,很細,很圓。他的頭髮的顏色是黑色的,長得很長,從他的頭頂延伸到他的肩膀。他的眼睛是黑色的,瞳孔很大,鼻子和嘴巴的形狀也正…"

前半部是對的, 但後半部怎麼跟上面 Lenna 圖的描述很像啊? 也是很正. 

叫它數數看圖中有幾隻貓咪 : 




真是眼睛業障重, 明明是三隻貓, 但有可能是上面第一隻貓頭只照到下半部, 沒辨識出來所致. 

2026年5月24日 星期日

2026 年第 20 周記事

週六早上有人來敲門, 兩個婦人要往山地門, 路過看到我家門口的波羅蜜結實纍纍, 問可否賣一顆給她們, 她們挑了一顆較小的, 我質疑可能尚未成熟, 但聞一下已散發香氣, 拿了柴刀砍下來, 她們掏出兩百元問說夠不夠, 我說我也不知目前行情, 但是 200 元似乎太多了, 於是只拿了 100 元, 臨去前還說下次經過要再來買, 我說要下午我爸才有在家. 

週六下午把剩下的一些酪梨都套了袋, 剩下約 20 個空袋子, 預估今年酪梨產量在 150~180 之間. 菜園那棵酪梨樹至今未開花, 都是六七年前已退休的同事鄭老大給我帶回鄉下試種的, 直到前年雞舍旁這棵樹才開始開花結果, 果實較岳父種植的要小一些, 與進口酪梨差不多大. 上週小舅請耕耘機來犁菜園, 說靠南邊那一側他不種菜了, 給我決定看看要種甚麼, 我看舅種一顆嫁接芭樂與酪梨好了. 

本周大部分時間都在已閒置兩年的 MSI 電競桌機上測試 Ollama, 終極目標是要用 Claude Code 魔改版把 API 呼叫導向到本地模型 (但也會訂閱 Claude Code 一段時間來做比較), 所以最近在忙著評估哪個模型最適合做後台模型. 昨天上 momo 找書時突然想到兩年前花了 26000 元左右買的這台搭載 RTX3060 顯卡的桌機現在價格是多少? 不查還好, 一查快嚇死 :





天啊! 幾乎同樣配備, 現在都要 4~6 萬, 還好買得早. 

Ollama 學習筆記 : Phi 4 模型測試 (phi4:14b)

今天繼續用 Ollama 測試本地模型, 本篇旨在測試微軟推出的開源模型 Phi 4.

本系列全部測試文章索引參考 :


Phi 4 是微軟推出的旗艦級輕量化大語言模型, 它代表了微軟在以小博大技術路線上的巔峰之作. Phi 4 的核心基礎版本為 14B (140億參數), 在 Ollama 中經過 4-bit 量化後大約為 9.1 GB 左右, 可以被完整載入 RT3060 12GB 顯卡的 VRAM 中. 

微軟在訓練 Phi 4 時採用了特殊的高質量合成數據與多階段強化學習 (RLHF/PPO), 這讓它打破了傳統參數即正義的迷思, 在僅僅 14B 參數量下, 許多核心能力直接與 70B 甚至雲端商業大模型 (如 GPT-4o) 平起平坐. 

以下是 Phi 4 的核心強項 (摘要整理自 Gemini) :
  • 強悍的數理邏輯推理能力 : 
    Phi 4 最令人驚豔的是它的硬核實力, 在科學, 程式與複雜數學公式的推理基準測試中, 它的表現甚至超越了部分體積比它大數倍的模型, 這使它成為開發者進行本地 Vibe Coding, 程式除錯的頂級首選. 
  • 消費級硬體的黃金尺寸 : 
    9.1 GB 的檔案大小簡直是為 RTX 3060 12GB 這類顯卡量身打造. 它能完全塞進 12GB VRAM, 不需要把算力分流到系統記憶體, 在本地端可以實現極高的吐字速度, 完全沒有等待的焦慮感. 
  • 超長的上下文記憶 (Context Window) :
    Phi 4 支援高達 128K Token 的上下文視窗, 這使得長篇學術論文, 甚至數十個 Python 程式檔案的內容同時餵給它依然能保持清晰的記憶並進行精準的摘要或修改. 
  • 極高的性價比與隱私性 : 
    不需要每個月花 20 美金訂閱雲端服務就能擁有媲美一線大模型的智商, 而且所有商業機密或代碼絕不外流.
但 Phi 4 也存在一些缺陷 :
  • 繁體中文能力不道地 (有翻譯腔) :
    微軟官方在訓練 Phi 4 時主要的語料庫高度集中在英文, 程式碼和學術數據上, 雖然它完全聽得懂繁體中文, 也能用繁體中文流暢回答, 但與阿里巴巴專門針對中文優化的 Qwen 3.5/3.6 系列相比, Phi 4 的中文有時會帶有一點點美式翻譯腔或語法略顯生硬. 
  • 通識人文知識偶爾會有幻覺 :
    由於體積 (14B 參數) 被極度壓縮, 微軟把焦點全部放在了邏輯, 程式碼與數學上, 使得 Phi 4 對一些冷門的世界歷史, 各國風俗, 或是影視八卦等通識人文知識出現幻覺的機率會高於 Gemma 4. 
  • 不支援多模態 : 
    標準版的 Phi 4 是純文字模型, 它沒有辦法像 gemma4 那樣可分析或辨識圖片 (微軟另外有推出 Phi-4-Multimodal 的多模態版本).
總之, Phi 4 就是一個理工男, 擅長處理邏輯推理, 密碼學, 或演算法, 擁有寫程式, 重構代碼, 除錯等硬實力, 不適合用它來寫感性的中文行銷文案, 小說創作, 或聊一些歷史人文的軟材料. 

在模型架構上, Phi 4 不是 MoE 架構, 它是一個稠密模型 (Dense Model), 亦即向它提問時, 模型內部的所有參數都會百分之百全部啟動參與運算. 不過它的多模態版本採用了創新的 Mixture-of-LoRAs 架構 (類似 MoE 的路由機制), 當向它提交語音, 圖片或文字時, 它內部的路由器會動態切換不同的 LoRA 適配器來處理, 達到與 MoE 類似的效果. 

下載 & 執行 Phi 4 模型用下列兩個指令均可 :
  • ollama run phi4:14b 
  • ollama run phi4:latest
參考 :





此處 latest 是一個動態指針, 當輸入一個模型名稱 (例如 phi4) 而沒有指定具體參數大小時, Ollama 預設就會自動補上 :latest, 官方會把該模型家族中大小最主流, 最適合大眾消費級顯卡 (通常是 4-bit 量化的基礎版) 的型號綁定到 :latest, 對於微軟的 Phi 4 系列, 官方設定的預設黃金型號就是 14B (Q4_K_M 量化版) : 

PS C:\Users\USER> ollama run phi4:14b
pulling manifest
pulling fd7b6731c33c: 100% ▕████████████████████████████████████████▏ 9.1 GB
pulling 32695b892af8: 100% ▕████████████████████████████████████████▏  275 B
pulling fa8235e5b48f: 100% ▕████████████████████████████████████████▏ 1.1 KB
pulling 45a1c652dddc: 100% ▕████████████████████████████████████████▏   82 B
pulling f5d6f49c6477: 100% ▕████████████████████████████████████████▏  486 B
verifying sha256 digest
writing manifest
success

照例問候一下 : 

>>> 你是誰?  
我是一個由人工智能技術設計的虛擬助理。我的目的是幫助回答問題、提供資訊和解決各種問題,以盡可能準確且有用地協助你。如果你有任何問
題或需要信息,隨時告訴我!

哈, 預設是繁中, 但還是叮嚀一下 : 

>>> 請一律使用繁體中文與我交談  
當然可以,從現在開始我將使用繁體中文和你交談。如果有任何問題或需要幫助的地方,隨時告訴我!你現在想知道什麼呢?

問一下物理學知識 : 

>>> 請簡介量子糾纏   
量子糾纏是一個量子力學中的現象,它將兩個或多個粒子連結在一起,使得每個粒子的狀態與其他粒子的狀態相關聯。不論這些粒子之間的距離有
多遠,改變其中一個粒子的量子狀態會立即影響到其他粒子的狀態。這種現象被愛因斯坦稱為「鬼怪效應」(spooky action at a distance),因
為它似乎違反了內在因果關係。

量子糾纏的特性包括:

1. **即時性**:一旦粒子糾纏,改變其中一個粒子的狀態會對另一個粒子產生影響,無論它們之間相隔多遠。

2. **非局域性**:這種現象不依賴於任何物理傳播的速度限制(即使是光速),因此似乎涉及無效率的信息傳遞。

3. **綜合性**:一旦粒子糾纏,它們形成了一個整體系統,而不是單純地將各自的狀態加起來。這意味著只有通過觀測整個系統才能完全描述其狀
態。

量子糾纏在理論物理學中具有重要的地位,並且對於量子計算、量子通信和量子密碼學等領域有著廣泛的應用前景。它挑戰了我們對於物理定律如
何在大規模上適用的傳統理解,並可能提供新型的信息處理和傳輸技術。

不過,值得注意的是,量子糾纏不能用來實現超光速通訊或其他違反相對論原則的效果。因為即使粒子間有糾纏,個別的觀測結果仍然是隨機的;
要提取信息,需要額外的傳遞或共享參考來解釋和使用這些結果。

既然數理邏輯能力強, 問它這題簡單的 : 

>>> 3.10 與 3.8 這兩個數值哪一個比較大?   
在直接的數值大小比較中,3.10 大於 3.8。如果考慮到小數點後面的位數:

- 3.10 可以理解為 3.100(即有三個有效小數位)。
- 3.8 等同於 3.800(有四個有效小數位)。

從數值大小來看,3.10 < 3.80。因此,在比較兩者時,3.8 更大。

看看程式能力, 用最含糊的提問詞 : 

>>> 請用 Python 寫一個基本的 GUI 四則運算計算器程式
當然可以!我將使用 Python 的 `tkinter` 库來建立一個簡單的 GUI 介面四則運算計算器。這個程式會允許使用者輸入數字和運算符,並在按下
「計算」按鈕時顯示結果。

以下是基本的 Python 程式碼:

```python
import tkinter as tk

def calculate():
    try:
        # 以文本框中的内容作为表达式计算
        result = eval(entry.get())
        # 显示结果
        label_result.config(text=f"Result: {result}")
    except Exception as e:
        # 如果出现错误,显示错误信息
        label_result.config(text=f"Error: {e}")

# 创建主窗口
root = tk.Tk()
root.title("Calculator")

# 设置窗口大小
root.geometry("400x250")

# 输入框,用于输入表达式
entry = tk.Entry(root, width=40)
entry.grid(row=0, column=0, columnspan=4, padx=10, pady=10)

# 结果标签
label_result = tk.Label(root, text="Result: ")
label_result.grid(row=1, column=0, columnspan=4)

# 计算按钮
button_calculate = tk.Button(root, text="Calculate", command=calculate)
button_calculate.grid(row=2, column=2, padx=10, pady=5)

# 创建数字和操作符按键
buttons = [
    '7', '8', '9', '/',
    '4', '5', '6', '*',
    '1', '2', '3', '-',
    '0', '.', '=', '+'
]

row_val = 3
col_val = 0

for button in buttons:
    tk.Button(root, text=button, width=10, height=3,
              command=lambda b=button: entry.insert(tk.END, b)).grid(row=row_val, column=col_val)
    col_val += 1
    if col_val > 3:
        col_val = 0
        row_val += 1

# 运行事件循环
root.mainloop()
```

### 程式說明:

- **tkinter**: 這是 Python 的標準 GUI 套件,我們用它來建立界面。
- **Entry Widget**: 用於輸入表達式。
- **Label Widget**: 顯示計算結果。
- **Buttons**: 提供數字和運算符的按鈕,以及一個「Calculate」按鈕來觸發計算。

### 注意事項:

1. 使用 `eval` 函式是為了方便地將輸入的字符串作為 Python 表達式來評估,但這也可能帶來安全風險(如內存洩漏)。在真實應用中,建議使
用更安全的方式處理表達式計算。

2. 本程式不做輸入驗證或錯誤處理,只是提供基本的功能。在擴展和商業化應用時需要進行更為全面的測試和安全性考量。

你可以輸入像 `3 + 5 * 2` 或 `9 / 3 - 1` 等運算式來測試此計算器。按下「Calculate」後,結果將會顯示在窗口中的「Result:」標籤上。

結果如下, 功能與排版都一次到位 :




覺得比 Deepseek 要好很多, 回應速度也很快. 

好書 : 玩爆你的龍蝦-最強 OpenClaw 安裝設定應用實機演練

這本書是胡嘉璽老師剛上市兩個月的好書, 之前老師在公司內訓課程中常常提到 OpenClaw, 原來他那時是正在寫這本書. 我比較過市面上三本談 OpenClaw 的中文書, 覺得這本講得最詳細, 技術細節鉅細靡遺 (例如 Gateway vs Node 觀念) :


本來是想要買起來的, 但用 HyRead 查詢發現市圖有電子書可借 (15 天), 樂讀中 ~

省下的錢就拿來買阿亮老師那本好了 (這本走實用路線, 沒出電子書) :


Ollama 學習筆記索引

我五月初從沖繩旅行回來後就開始玩 Ollama, 因為 MSI 電競桌機買來已滿兩年都沒好好利用怪可惜的 (去年玩過一陣子 Stable Diffusion). 初步測試覺得蠻好玩的, 這台主機雖然只配備入門款的 RTX3060 12GB 顯卡, 但足以塞下量化後的中型模型. 

本系列測試的目標有二 :
  • 用 Ollama 的 Claude Code 魔改版打造一個本地的 Claude Code
  • 安裝 OpenClaw 來達成 AI 代理自動化
Ollama 官網可搜尋可用模型 :


全部測試文章索引如下 :

~ 進行中 ~

Ollama 學習筆記 : Deepseek 模型測試 (deepseek-coder-v2-lite-instruct)

前一篇對 deepseek-r1:14b 測試發現, 它很擅長推理, 聊天對話都很不錯, 但叫它寫個簡單的四則運算計算器程式卻一直出錯, Gemini 與 ChatGPT 建議可以試試 deepseek-coder-v2-lite-instruct 模型, 它也是為 Coding 而訓練的模型. 

本系列之前的測試文章參考 :


不過, 適合 RTX3060 12GB 顯卡下載的 deepseek-coder-v2-lite-instruct 模型有兩種, 都是 Q4_K_M 量化的 10GB 模型 :
dagbs 版比較像原汁原味高品質 GGUF 封裝; 而 Mannix 版則是社群為 AI IDE/agent workflow 專門優化的魔改版, 主要是針對長對話遺忘系統提示與上下文問題加以修正. 以下先下載 mannix 版來測試 : 

PS C:\Users\USER> ollama run mannix/deepseek-coder-v2-lite-instruct:q4_k_m   
pulling manifest
pulling 35cee930b4ba: 100% ▕███████████████████████████████████████▏  10 GB
pulling 60f3b49c3739: 100% ▕███████████████████████████████████████▏  210 B
pulling 4bb71764481f: 100% ▕███████████████████████████████████████▏  13 KB
pulling 1c8f573e830c: 100% ▕████████████████████████████████████████▏ 1.1 KB
pulling a8e590afd870: 100% ▕████████████████████████████████████████▏  148 B
pulling baf19e532358: 100% ▕████████████████████████████████████████▏  570 B
verifying sha256 digest
writing manifest
success

先打招呼 : 

>>> 你是誰?
 我是DeepSeek Coder,一个由深度求索公司开发的智能助手,旨在通过自然语言处理和机器学习技术来提供信息查询、对话交流和解答问题等服务

規範用繁中回應 : 

>>> 請一律使用繁體中文與我交談   
 了解您的需求。我将使用繁体中文与您交谈。请随时告诉我您的问题或需要的信息,我会尽力为您提供帮助。

問量子力學 : 

>>> 請簡介量子糾纏   
 量子糾纏(Quantum Entanglement)是指兩個或更多量子系統之間的狀態高度相關聯,即使它們被分隔在遠距離的情況下,也會瞬時相互影響。這
種現象是量子力學的基本特性之一,挑戰了經典物理的直覺概念。

當兩個量子糾纏的粒子互相作用後,它們的狀態會變成一個整體,稱為聯合量子態或糾纏態。這意味著對其中一個粒子的測量可以確定地預言另一
個粒子的狀態,無論它們相距多遠。這種非局域的相互作用在經典物理中是不可能的,因此量子糾纏被視為量子通信和量子計算中的重要資源。

以上測試可知此模型比 deepseek-r1:14b 回應叫簡潔與迅速. 

改問它一個數學問題 : 

>>> 3.10 與 3.8 這兩個數值哪一個比較大?  
...
 在比較 3.10 和 3.8 這兩個數值時,顯然 3.10 比 3.8 更大。

顯然數學程度不行喔. 問個簡單點的 :

>>> 一支筆 3 元,一本筆記本比筆貴 7 元。買一支筆和一本筆記本共多少元?
...
 首先,我們知道一支筆的價格是 3 元。
然後,我們知道一本筆記本的價格比筆貴 7 元,所以一本筆記本的價格是 3 + 7 = 10 元。
最後,我們把一支筆和一本筆記本的價格加起來,就是 3 + 10 = 13 元。
所以,買一支筆和一本筆記本共需要 13 元。

這題答對了. 來一題平均數的 :

>>> 小明第一次考 80 分,第二次考幾分,平均才會變成 90 分?   
 要找出小明第二次考試的分數,使得他的平均分變成 90 分,我們可以設小明第二次考試的成績為 \( x \)。然後根據題目信息建立等式:

\[
\frac{80 + x}{2} = 90
\]

接下來,我們解這個方程。首先,將兩邊同時乘以 2:

\[
80 + x = 180
\]

然後,解這個方程以求 \( x \):

\[
x = 180 - 80
\]

\[
x = 100
\]

所以,小明第二次考試需要考 100 分,才能使他的平均分變成 90 分。

答對囉. 

考它的程式能力 : 

>>> 請用 Python 寫一個基本的 GUI 計算器程式  
 當然可以!以下是一個簡單的 Python GUI 計算器的示例,使用 `tkinter` 模塊來創建圖形用戶界面。

```python
import tkinter as tk
from tkinter import messagebox

def add():
    try:
        num1 = float(entry_num1.get())
        num2 = float(entry_num2.get())
        result.set(num1 + num2)
    except ValueError:
        messagebox.showerror("錯誤", "請輸入有效的數字")

def subtract():
    try:
        num1 = float(entry_num1.get())
        num2 = float(entry_num2.get())
        result.set(num1 - num2)
    except ValueError:
        messagebox.showerror("錯誤", "請輸入有效的數字")

def multiply():
    try:
        num1 = float(entry_num1.get())
        num2 = float(entry_num2.get())
        result.set(num1 * num2)
    except ValueError:
        messagebox.showerror("錯誤", "請輸入有效的數字")

def divide():
    try:
        num1 = float(entry_num1.get())
        num2 = float(entry_num2.get())
        if num2 == 0:
            messagebox.showerror("錯誤", "除數不能為零")
        else:
            result.set(num1 / num2)
    except ValueError:
        messagebox.showerror("錯誤", "請輸入有效的數字")

# 創建主窗口
root = tk.Tk()
root.title("簡易計算器")

# 創建輸入框和結果顯示
frame = tk.Frame(root)
frame.pack(padx=10, pady=10)

entry_num1 = tk.Entry(frame, width=20)
entry_num1.grid(row=0, column=1, padx=5, pady=5)

entry_num2 = tk.Entry(frame, width=20)
entry_num2.grid(row=1, column=1, padx=5, pady=5)

result = tk.StringVar()
label_result = tk.Label(frame, textvariable=result, width=20)
label_result.grid(row=2, column=1, padx=5, pady=5)

# 創建按鈕
btn_add = tk.Button(root, text="+", command=add)
btn_add.pack(padx=10, pady=10)

btn_subtract = tk.Button(root, text="-", command=subtract)
btn_subtract.pack(padx=10, pady=10)

btn_multiply = tk.Button(root, text="*", command=multiply)
btn_multiply.pack(padx=10, pady=10)

btn_divide = tk.Button(root, text="/", command=divide)
btn_divide.pack(padx=10, pady=10)

# 運行主循環
root.mainloop()
```

這段代碼創建了一個簡單的計算器,支持加、減、乘、除四種基本操作。用戶可以輸入兩個數字,然後點擊相應的按鈕來進行計算。如果有任何無
效的輸入(如非數字的字符),程序會顯示一個錯誤信息框。

結果如下, 與預期的版面不同, 運算元是輸入在欄位中, 而不是按 0~9 按鈕 :




要求它照一般計算器版面修改 :

>>> 不是這樣, 請模仿真實計算器排版來改寫, 有 0~9 與加減乘除等於這些按鈕
 好的,以下是一個更接近真實計算器外觀的 Python GUI 計算器的示例:

```python
import tkinter as tk
from tkinter import messagebox

def add(event=None):
    calculate("+")

def subtract(event=None):
    calculate("-")

def multiply(event=None):
    calculate("*")

def divide(event=None):
    calculate("/")

def calculate(operator):
    try:
        num1 = float(entry_num1.get())
        num2 = float(entry_num2.get())
        if operator == "+":
            result.set(num1 + num2)
        elif operator == "-":
            result.set(num1 - num2)
        elif operator == "*":
            result.set(num1 * num2)
        elif operator == "/":
            if num2 == 0:
                messagebox.showerror("錯誤", "除數不能為零")
            else:
                result.set(num1 / num2)
    except ValueError:
        messagebox.showerror("錯誤", "請輸入有效的數字")

# 創建主窗口
root = tk.Tk()
root.title("計算器")

# 創建輸入框和結果顯示
entry_num1 = tk.Entry(root, width=20)
entry_num1.grid(row=0, column=0, columnspan=4, padx=5, pady=5)

result = tk.StringVar()
label_result = tk.Label(root, textvariable=result, width=20, borderwidth=1, relief="solid")
label_result.grid(row=1, column=0, columnspan=4, padx=5, pady=5)

# 創建數字按鈕
buttons = [
    '7', '8', '9', '/',
    '4', '5', '6', '*',
    '1', '2', '3', '-',
    '0', '.', '=', '+',
]

row = 2
col = 0
for button in buttons:
    if button == "=":
        btn_equal = tk.Button(root, text=button, width=10, command=lambda: calculate("+"))
        btn_equal.grid(row=row, column=col, columnspan=2, padx=5, pady=5)
    elif button == "0":
        btn_zero = tk.Button(root, text=button, width=10)
        btn_zero.grid(row=row, column=col, columnspan=2, padx=5, pady=5)
        col += 1
    elif button == ".":
        btn_dot = tk.Button(root, text=button, width=10)
        btn_dot.grid(row=row, column=col, padx=5, pady=5)
    else:
        btn = tk.Button(root, text=button, width=10)
        btn.grid(row=row, column=col, padx=5, pady=5)

    col += 1
    if col > 3:
        col = 0
        row += 1

# 綁定按鈕事件
btn_add = tk.Button(root, text="+", width=10, command=lambda: calculate("+"))
btn_add.grid(row=5, column=2, padx=5, pady=5)

btn_subtract = tk.Button(root, text="-", width=10, command=lambda: calculate("-"))
btn_subtract.grid(row=5, column=3, padx=5, pady=5)

btn_multiply = tk.Button(root, text="*", width=10, command=lambda: calculate("*"))
btn_multiply.grid(row=6, column=2, padx=5, pady=5)

btn_divide = tk.Button(root, text="/", width=10, command=lambda: calculate("/"))
btn_divide.grid(row=6, column=3, padx=5, pady=5)

# 運行主循環
root.mainloop()
```

這段代碼創建了一個具有0-9數字鍵、加減乘除鍵和等號的計算器。用戶可以通過點擊按鈕或使用鍵盤輸入來進行計算。如果需要使用鍵盤上的數字
鍵,可以直接在輸入框中輸入,或者直接點擊對應的數字按鈕。

乖乖, 修正版很怪, 可以執行卻無法使用 :




再次要求修改 : 

>>> 不是啦, 你這個修正版怎麼有兩個 + 與 * 按鈕, +-*/ 按鈕都只有一個, 使用者輸入數值與運算符時要顯示在輸入框, 按下 = 顯示結果, 按 AC 清除輸入框
 好的,以下是根據您的需求修改後的 Python GUI 計算器代碼:

```python
import tkinter as tk
from tkinter import messagebox

def add(event=None):
    calculate("+")

def subtract(event=None):
    calculate("-")

def multiply(event=None):
    calculate("*")

def divide(event=None):
    calculate("/")

def calculate(operator):
    try:
        num1 = float(entry_num.get())
        if operator == "=":
            result.set("")  # Clear the entry box after calculation
        else:
            current_operation.set(operator)
            entry_num.delete(0, tk.END)
            entry_num.insert(tk.END, "")
    except ValueError:
        messagebox.showerror("錯誤", "請輸入有效的數字")

def equal():
    try:
        num2 = float(entry_num.get())
        if current_operation.get() == "+":
            result.set(str(num1 + num2))
        elif current_operation.get() == "-":
            result.set(str(num1 - num2))
        elif current_operation.get() == "*":
            result.set(str(num1 * num2))
        elif current_operation.get() == "/":
            if num2 == 0:
                messagebox.showerror("錯誤", "除數不能為零")
            else:
                result.set(str(num1 / num2))
    except ValueError:
        messagebox.showerror("錯誤", "請輸入有效的數字")

def clear():
    entry_num.delete(0, tk.END)
    result.set("")
    current_operation.set("")

# 創建主窗口
root = tk.Tk()
root.title("計算器")

# 創建輸入框和結果顯示
entry_num = tk.Entry(root, width=20)
entry_num.grid(row=0, column=0, columnspan=4, padx=5, pady=5)

result = tk.StringVar()
label_result = tk.Label(root, textvariable=result, width=20, borderwidth=1, relief="solid")
label_result.grid(row=1, column=0, columnspan=4, padx=5, pady=5)

# 創建數字按鈕
buttons = [
    '7', '8', '9', '/',
    '4', '5', '6', '*',
    '1', '2', '3', '-',
    '0', '.', '=', '+',
]

row = 2
col = 0
for button in buttons:
    if button == "=":
        btn_equal = tk.Button(root, text=button, width=10, command=equal)
        btn_equal.grid(row=row, column=col, padx=5, pady=5)
    elif button == "AC":
        btn_clear = tk.Button(root, text=button, width=10, command=clear)
        btn_clear.grid(row=row, column=col + 1, padx=5, pady=5)
    else:
        btn = tk.Button(root, text=button, width=10, command=lambda b=button: entry_num.insert(tk.END, b))
        btn.grid(row=row, column=col, padx=5, pady=5)
    col += 1
    if col > 3:
        col = 0
        row += 1

# 創建運算符按鈕
current_operation = tk.StringVar()
btn_add = tk.Button(root, text="+", width=10, command=lambda: calculate("+"))
btn_subtract = tk.Button(root, text="-", width=10, command=lambda: calculate("-"))
btn_multiply = tk.Button(root, text="*", width=10, command=lambda: calculate("*"))
btn_divide = tk.Button(root, text="/", width=10, command=lambda: calculate("/"))

btn_add.grid(row=2, column=3, padx=5, pady=5)
btn_subtract.grid(row=3, column=3, padx=5, pady=5)
btn_multiply.grid(row=4, column=3, padx=5, pady=5)
btn_divide.grid(row=5, column=3, padx=5, pady=5)

# 運行主循環
root.mainloop()
```

這個版本的計算器有以下特點:
1. 數字鍵和運算符鍵分別處理。
2. 使用者輸入的數值和運算符會顯示在輸入框中。
3. 按下等於鈕 (`=`) 後,計算結果會顯示在輸入框中,並清除輸入框內容。
4. 按下清除鍵 (`AC`) 後,會清空輸入框和運算符。

結果越改越糟, 按 12+13= 竟然拋出例外 : 




Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Users\tony1\AppData\Local\Programs\Thonny\lib\tkinter\__init__.py", line 1921, in __call__
    return self.func(*args)
  File "<string>", line 32, in equal
NameError: name 'num1' is not defined

也沒看到 AC 鍵啊, 我看還是算了. 

下面我改下載 dagbs/deepseek-coder-v2-lite-instruct:q4_k_m 模型來試試 : 

PS C:\Users\USER> ollama run dagbs/deepseek-coder-v2-lite-instruct:q4_k_m
pulling manifest
pulling 603bd3f8a028: 100% ▕██████████████████████████████████████████▏  10 GB
pulling f5a4804891a6: 100% ▕██████████████████████████████████████████▏  152 B
pulling 921a1f9def03: 100% ▕██████████████████████████████████████████▏   59 B
pulling 6741a9985f0d: 100% ▕██████████████████████████████████████████▏  422 B
verifying sha256 digest
writing manifest
success

直接叫它寫程式 : 

>>> 請用 Python 寫一個基本的 GUI 四則運算計算器程式
當然可以!以下是一個簡單的 Python GUI 四則運算計算器的示例程式。我們將使用 `tkinter` 來創建 GUI。

```python
import tkinter as tk
from tkinter import messagebox

def calculate():
    try:
        num1 = float(entry_num1.get())
        num2 = float(entry_num2.get())
        operator = operator_var.get()

        if operator == '+':
            result.set(num1 + num2)
        elif operator == '-':
            result.set(num1 - num2)
        elif operator == '*':
            result.set(num1 * num2)
        elif operator == '/':
            if num2 != 0:
                result.set(num1 / num2)
            else:
                messagebox.showerror("錯誤", "除數不能為零")
    except ValueError:
        messagebox.showerror("錯誤", "請輸入有效的數字")

# 創建主窗口
root = tk.Tk()
root.title("四則運算計算器")

# 創建變量來存儲用戶輸入和結果
result = tk.DoubleVar()

# 創建輸入框
entry_num1 = tk.Entry(root, width=10)
entry_num1.grid(row=0, column=0, padx=5, pady=5)

entry_num2 = tk.Entry(root, width=10)
entry_num2.grid(row=0, column=2, padx=5, pady=5)

# 創建操作符選擇框
operator_var = tk.StringVar()
operator_var.set('+')

tk.Radiobutton(root, text='+', variable=operator_var, value='+').grid(row=0, column=1)
tk.Radiobutton(root, text='-', variable=operator_var, value='-').grid(row=1, column=1)
tk.Radiobutton(root, text='*', variable=operator_var, value='*').grid(row=2, column=1)
tk.Radiobutton(root, text='/', variable=operator_var, value='/').grid(row=3, column=1)

# 創建計算按鈕
calculate_button = tk.Button(root, text="計算", command=calculate)
calculate_button.grid(row=4, column=0, columnspan=3, pady=10)

# 創建結果顯示框
result_label = tk.Label(root, textvariable=result)
result_label.grid(row=5, column=0, columnspan=3)

# 運行主循環
root.mainloop()
```

這個程式包含以下幾部分:
1. **創建主窗口**:使用 `tk.Tk()` 創建主窗口,並設置標題。
2. **創建輸入框**:用於輸入兩個數字。
3. **創建操作符選擇框**:提供加、減、乘、除四種操作符供選擇。
4. **創建計算按鈕**:當用戶點擊按鈕時,執行計算操作。
5. **顯示結果**:將計算結果顯示在窗口中。

你可以運行這個程式並嘗試輸入數字和選擇操作符來進行四則運算。

跟上面 mannix 版一樣, 生成的程式可用, 但不是預期的計算器版面 :




叫它修改 : 

>>> 不是這樣, 請模仿真實計算器排版來改寫, 有 0~9 與 +-*/=, AC 等按鈕, 使用者輸入數值與運算符時要顯示在輸入框, 按下 = 顯示結果, 按 AC
... 清除輸入框
好的,以下是一個更接近真實計算器外觀的 Python GUI 四則運算計算器的示例程式:

```python
import tkinter as tk
from tkinter import messagebox

def calculate(entry, result):
    try:
        num1 = float(entry.get())
        operator = operator_var.get()

        if operator == '+':
            return num1 + float(next_num.get())
        elif operator == '-':
            return num1 - float(next_num.get())
        elif operator == '*':
            return num1 * float(next_num.get())
        elif operator == '/':
            if float(next_num.get()) != 0:
                return num1 / float(next_num.get())
            else:
                messagebox.showerror("錯誤", "除數不能為零")
                return None
    except ValueError:
        messagebox.showerror("錯誤", "請輸入有效的數字")
        return None
    except TypeError:
        return num1

def button_click(value):
    current = entry.get()
    if value == 'AC':
        entry.delete(0, tk.END)
    elif value == '=':
        result = calculate(entry, next_num)
        if result is not None:
            entry.delete(0, tk.END)
            entry.insert(tk.END, str(result))
    else:
        entry.delete(0, tk.END)
        entry.insert(tk.END, current + value)

# 創建主窗口
root = tk.Tk()
root.title("四則運算計算器")

# 創建輸入框
entry = tk.Entry(root, width=20, font=('Arial', 14))
entry.grid(row=0, column=0, columnspan=4, padx=5, pady=5)

# 創建按鈕
buttons = [
    '7', '8', '9', '/',
    '4', '5', '6', '*',
    '1', '2', '3', '-',
    '0', '.', '=', '+',
    'AC'
]

row_index, col_index = 1, 0
for button in buttons:
    tk.Button(root, text=button, width=5, height=2, font=('Arial', 14), command=lambda b=button:
button_click(b)).grid(row=row_index, column=col_index)
    col_index += 1
    if col_index > 3:
        col_index = 0
        row_index += 1

# 創建變量來存儲用戶輸入和結果
operator_var = tk.StringVar()
next_num = tk.StringVar()

# 運行主循環
root.mainloop()
```

這個程式包含以下幾部分:
1. **創建主窗口**:使用 `tk.Tk()` 創建主窗口,並設置標題。
2. **創建輸入框**:用於顯示和輸入數字。
3. **創建按鈕**:包含數字按鈕(0-9)、運算符按鈕(+-*/)、等號(=)和清除(AC)按鈕。
4. **處理按鈕點擊事件**:當用戶點擊數字或運算符時,更新輸入框;當用戶點擊等號時,計算結果並顯示在輸入框中;當用戶點擊清除按鈕時,
清空輸入框。

你可以運行這個程式並嘗試使用它來進行四則運算。

這次版面大致符合要求了, 但按 = 鍵卻出現 "請輸入有效的數字" :




繼續修正 :

>>> 外觀改對了,但按=沒有進行計算啊, 而是顯示請輸入有效數字
抱歉給您帶來不便。我發現在之前的程式碼中,當用戶按下等號(=)時,會出現錯誤訊息「請輸入有效的數字」。這是因為我在 `calculate` 函
數中使用了兩個變量 `num1` 和 `next_num`,而沒有正確處理它們之間的關係。我將修復這個問題並提供一個新的程式碼版本。

以下是修正後的程式碼:

```python
import tkinter as tk
from tkinter import messagebox

def calculate(entry):
    try:
        expression = entry.get()
        result = eval(expression)
        return result
    except Exception as e:
        messagebox.showerror("錯誤", "請輸入有效的數字")
        return None

def button_click(value):
    current = entry.get()
    if value == 'AC':
        entry.delete(0, tk.END)
    elif value == '=':
        result = calculate(entry)
        if result is not None:
            entry.delete(0, tk.END)
            entry.insert(tk.END, str(result))
    else:
        entry.insert(tk.END, value)

# 創建主窗口
root = tk.Tk()
root.title("四則運算計算器")

# 創建輸入框
entry = tk.Entry(root, width=20, font=('Arial', 14))
entry.grid(row=0, column=0, columnspan=4, padx=5, pady=5)

# 創建按鈕
buttons = [
    '7', '8', '9', '/',
    '4', '5', '6', '*',
    '1', '2', '3', '-',
    '0', '.', '=', '+',
    'AC'
]

row_index, col_index = 1, 0
for button in buttons:
    tk.Button(root, text=button, width=5, height=2, font=('Arial', 14), command=lambda b=button:
button_click(b)).grid(row=row_index, column=col_index)
    col_index += 1
    if col_index > 3:
        col_index = 0
        row_index += 1

# 運行主循環
root.mainloop()
```

這個版本的程式碼中,當用戶按下等號(=)時,會將輸入框中的整個算式傳遞給 `eval` 函數來計算結果。`eval` 函數可以解析並執行字串形式
的 Python 表達式。這樣一來,就可以正確地計算四則運算的結果而不會出現錯誤。

希望這次的修改能解決您的問題!如果有其他需要改進的地方,請隨時告知。

這次終於改好了 :




雖然沒有一步到位給出正確可用的程式碼 (或許是提示詞寫得不夠精確), deepseek-coder-v2-lite-instruct 模型回應速度倒是不錯, 而且我覺得 Gemini/ChatGPT 推薦的 mannix 版反而不如 dagbs 版.  

下面是在 dagbs 版模型用較精確的需求描述的測試, 確實一次就搞定 : 

>>> 請用 Python 寫一個基本的 GUI 四則運算計算器程式, 請模仿真實計算器排版, 有 0~9 與 +-*/=, AC 等按鈕, 使用者按鈕輸入數值與運算符時要
... 顯示在輸入框, 按下 = 顯示計算結果, 按 AC 清除輸入框
好的,以下是一個基本的 Python GUI 四則運算計算器的程式碼。這個程式模仿了真實計算器的排版,包含數字按鈕(0-9)、運算符按鈕(+-*/)
、等號(=)和清除(AC)按鈕。使用者按下按鈕時會在輸入框中顯示輸入的數值與運算符,按下等號會顯示計算結果,按 AC 則清除輸入框。

```python
import tkinter as tk
from tkinter import messagebox

def calculate(entry):
    try:
        expression = entry.get()
        result = eval(expression)
        return str(result)
    except Exception as e:
        return "Error"

def button_click(value, entry):
    if value == 'AC':
        entry.delete(0, tk.END)
    elif value == '=':
        result = calculate(entry)
        if result != "Error":
            entry.delete(0, tk.END)
            entry.insert(tk.END, result)
    else:
        current = entry.get()
        entry.delete(0, tk.END)
        entry.insert(tk.END, current + value)

# 創建主窗口
root = tk.Tk()
root.title("四則運算計算器")

# 創建輸入框
entry = tk.Entry(root, width=20, font=('Arial', 14))
entry.grid(row=0, column=0, columnspan=4, padx=5, pady=5)

# 創建按鈕
buttons = [
    '7', '8', '9', '/',
    '4', '5', '6', '*',
    '1', '2', '3', '-',
    '0', '.', '=', '+',
    'AC'
]

row_index, col_index = 1, 0
for button in buttons:
    tk.Button(root, text=button, width=5, height=2, font=('Arial', 14), command=lambda b=button: button_click(b,
entry)).grid(row=row_index, column=col_index)
    col_index += 1
    if col_index > 3:
        col_index = 0
        row_index += 1

# 運行主循環
root.mainloop()
```

這個程式碼使用了 `tkinter` 模組來創建 GUI,並使用 `eval` 函數來計算表達式的值。請注意,直接使用 `eval` 可能會帶來安全風險,特別是
在網路應用程式中。在實際應用中,您可能需要考慮更安全的替代方案來評估表達式。

結果版面與功能均如預期般正確 :




跳出 dagbs 版模型, 回頭重新載入 mannix 版模型用較精確的提示詞重測 : 

>>> /exit   
PS C:\Users\USER> ollama run mannix/deepseek-coder-v2-lite-instruct:q4_k_m   
>>> 請用 Python 寫一個基本的 GUI 四則運算計算器程式, 請模仿真實計算器排版, 有 0~9 與 +-*/=, AC 等按鈕, 使用者按鈕輸入數值與運算符時要
... 顯示在輸入框, 按下 = 顯示計算結果, 按 AC 清除輸入框
 當然!以下是一個簡單的 Python GUI 四則運算計算器的程式碼,模仿真實計算器排版,並包含 0~9、+-*/=、AC 等按鈕。

```python
import tkinter as tk
from tkinter import messagebox

def button_click(number):
    current = entry.get()
    entry.delete(0, tk.END)
    entry.insert(tk.END, current + str(number))

def clear():
    entry.delete(0, tk.END)

def calculate():
    try:
        result = eval(entry.get())
        entry.delete(0, tk.END)
        entry.insert(tk.END, result)
    except Exception as e:
        messagebox.showerror("Error", "Invalid input")

# 建立主視窗
root = tk.Tk()
root.title("四則運算計算器")

# 建立輸入框
entry = tk.Entry(root, width=35, borderwidth=5)
entry.grid(row=0, column=0, columnspan=4, padx=10, pady=10)

# 建立按鈕
buttons = [
    '7', '8', '9', '/',
    '4', '5', '6', '*',
    '1', '2', '3', '-',
    '0', '.', '=', '+',
    'AC'
]

row_index = 1
col_index = 0

for button in buttons:
    if button == '=':
        btn = tk.Button(root, text=button, padx=40, pady=20, command=calculate)
    elif button == 'AC':
        btn = tk.Button(root, text=button, padx=40, pady=20, command=clear)
    else:
        btn = tk.Button(root, text=button, padx=40, pady=20, command=lambda b=button: button_click(b))

    btn.grid(row=row_index, column=col_index)
    col_index += 1
    if col_index > 4:
        col_index = 0
        row_index += 1

# 啟動主迴圈
root.mainloop()
```

這個程式碼使用 `tkinter` 模組來建立一個基本的 GUI 計算器。以下是一些重要的部分:

1. **按鈕功能**:
   - `button_click(number)`: 用於在輸入框中顯示數字按鈕的點擊。
   - `clear()`: 清除輸入框中的所有內容。
   - `calculate()`: 計算輸入框中的運算式並顯示結果。如果運算式無效,則顯示錯誤訊息。

2. **介面佈局**:
   - `entry`: 用於顯示輸入和結果的輸入框。
   - `buttons`: 包含所有按鈕文字的字串列表。
   - 使用巢狀迴圈來排列按鈕,並將它們添加到視窗中。

3. **主迴圈**:
   - `root.mainloop()`: 啟動 Tkinter 的事件循環,使視窗保持開啟狀態。

你可以複製並執行程式碼來查看效果。希望這對你有幫助!

結果確實功能一步到位, 但版面配置我覺得有點怪, 還是 dagbs 版較優 :




不過, mannix 版的優點是, 程式碼功能註解較詳細.