用 Gemma 4 + Haystack 搭一個本地 Agent:丟地圖進去辨識城市、抓即時天氣、查 GitHub repo——不送一個 token 到雲端。核心技巧是 SearchableToolset 動態工具發現,讓 context 不爆炸。
目錄+
Stefano Fiorucci 在 2026-04-21 貼了一個 Haystack + Gemma 4 的 notebook,主角是一個完全跑在本地的 Agent:丟一張地圖圖片進去,它自己辨識城市、拉即時天氣、列出景點推薦。最後一段還接上 GitHub MCP,讓 Agent 在 83 個工具裡動態挑需要的,而不是把所有 schema 塞進 context。
這不是 demo 玩具。Gemma 4 是 Google DeepMind 在 2026-04-02 發布的開源模型家族(Apache 2.0),26B-A4B 版本實際 active 參數只有 3.8B,跑速接近 4B 模型,但知識量是 26B 的水準。搭上 Haystack 的 SearchableToolset,context 管理問題才算真正解決。
Gemma 4 在本地推理的位置
Gemma 4 有四個 size:E2B、E4B(手機/筆電邊緣)、26B-A4B(MoE,消費級工作站首選)、31B(最強但吃 VRAM)。
26B-A4B 的設計邏輯:總參數 25.2B,但每次推理只啟動 3.8B active 參數(MoE 架構,128 個 expert 每次只用其中 8 個)。結果是:你拿到接近 26B 的知識密度,但推理成本接近 4B。256K context window,原生支援 function calling 和 structured JSON output。
E2B 和 E4B 更激進——128K context,額外支援 audio 和 video 輸入,設計目標是完全離線的邊緣設備。
在本地 agent 的場景,Gemma 4 26B-A4B 是這個 notebook 的首選:function calling 是原生的,不需要 prompt hacking;MoE 架構讓它在消費級 GPU 上跑起來不那麼痛苦。
Notebook 的四層結構
這個 Haystack cookbook notebook 把複雜度分成四層,每層都能獨立跑:
第一層:RAG Pipeline 用 Ollama 本地跑 Gemma 4 E4B(4.5B effective 參數),接 Wikipedia API,問有關搖滾樂團的問題。入門用,驗證環境。
第二層:Multimodal 圖像分析 餵一份 PDF 研究論文進去,Agent 提取圖表並用 vision 能力分析——Gemma 4 所有 size 都支援 image input(variable aspect ratio + resolution),E2B/E4B 還另外支援 video 和 audio。
第三層:Weather Agent 丟一張地圖圖片,Agent 辨識城市名稱,然後呼叫 Python Weather API 拿即時天氣資料。這段的關鍵不是 vision,是 tool-use loop:Haystack Agent 把 LLM 的回應和 tool 呼叫接成一個自動循環,執行工具、把結果回饋給模型,直到產出最終答案。
第四層:GitHub Search Agent(重點) 接上 GitHub MCP server,問題來了:GitHub MCP 暴露了幾十個 tool,每個 tool 都有 JSON schema,全部塞進 context 會截斷。這就是 SearchableToolset 出場的原因。
SearchableToolset:解決 context 爆炸的正確方式
這是 Haystack 2.25.0 新加的功能,核心邏輯很直接:
不要一次給 Agent 所有工具。
SearchableToolset 讓 Agent 一開始只拿到一個叫 search_tools 的函式。Agent 需要什麼工具,就用 keyword search(BM25 演算法)去查工具目錄,找到匹配的 schema 後才載入。這樣 context 裡永遠只有「當前這個步驟需要的工具」,不是整個目錄。
from haystack.tools import SearchableToolset
from haystack_integrations.tools.mcp import MCPToolset
# 從 GitHub MCP server 拿所有工具
mcp_toolset = MCPToolset(...)
# 包成 SearchableToolset,Agent 動態發現需要的工具
toolset = SearchableToolset(catalog=mcp_toolset.tools)
agent = Agent(
chat_generator=OllamaChatGenerator(model="gemma4:26b"),
tools=toolset,
)
實際效果:Agent 問「找跟 Haystack 相關的 GitHub repo」,它先呼叫 search_tools("repository search"),找到 search_repositories schema,載入,執行,拿到結果,回答。整個過程 context 只增加了用到的那幾個工具的 schema,沒有爆炸。
Stefano 在 tweet 裡說「h/t @vladblagoje」,那是 Haystack 的核心貢獻者 Vladimír Blagoje,SearchableToolset 這個設計方向就是他主導的。
為什麼這個組合值得注意
本地 LLM + MCP 的組合已經有人在玩了,但「context 管理」一直是沒被認真處理的問題。你接上 GitHub MCP、Slack MCP、Jira MCP,工具總數輕鬆破百,塞進 prompt 就截斷,截斷就幻覺,幻覺就報錯。
SearchableToolset 的 BM25 approach 不完美——keyword matching 不懂語義,如果工具名稱和使用者的問法差太多,可能搜不到對的工具。但它解決了 90% 的實際場景,而且不需要另外跑 embedding model。
Gemma 4 的貢獻是:原生 function calling 讓工具呼叫不需要 prompt engineering。舊的方式是把工具 schema 塞在 system prompt 裡,用特定格式「教」模型怎麼呼叫——這很脆,模型版本一換格式就壞。Gemma 4 的 function calling 是訓練進去的,<|tool> token 是模型原生的語言,不是外掛的 convention。
本地 + 開源 + 原生 function calling + 動態工具發現,這四件事同時成立,是 2026 年 Q2 之前才有的組合。
Notebook 在 haystack.deepset.ai/cookbook 可以直接跑。 需要本地有 Ollama,下載 gemma4:26b(約 16GB),剩下的 pip install 就能跑起來。context 管理問題你已經知道怎麼解了。