~/tools / 模型檔案與聊天範本 / Ollama Template Tester

Ollama Template Tester — 執行 Ollama TEMPLATE,看到完整提示詞

貼上 Ollama 模型的 TEMPLATE(來自 ollama show --template 或你的 Modelfile),再加入對話、tools 或提示詞,就能看到 Ollama 交給模型的完整文字,連特殊 token 和換行都一清二楚。本工具依照 Ollama 的做法執行範本:使用 Go 的範本規則、Ollama 的資料(messages、tool calls、tools、think),以及 Ollama 執行範本的三種方式。它也會告訴你 Ollama 究竟會使用你的 TEMPLATE,還是 GGUF 檔案內的聊天範本,以及 Ollama 在什麼情況下會拒絕要求 tools 或 thinking 的請求。所有內容都不會離開你的瀏覽器。

範例

ollama show --template <model> 會印出你已有模型的範本。Modelfile 中 TEMPLATE 後面三重引號之間的文字也可以使用。

請求

與 /api/chat 相同的格式:role、content,以及可選的 thinking、tool_calls、tool_name 與 images。

與 /api/chat 中 tools 相同的格式。留空表示不使用 tools。

進階:模型的 SYSTEM 與其 GGUF 聊天範本

Modelfile 中的 SYSTEM 那一行。當第一則訊息不是 system 訊息時(在 /api/generate 中,則是 system 為空時),Ollama 會加入它。

貼上後,就能看到 Ollama 使用 TEMPLATE 還是這一個。GGUF Metadata Viewer 可以顯示它。

模型收到的內容

<|im_start|>system
You are a helpful assistant.

# Tools

You may call one or more functions to assist with the user query.

You are provided with function signatures within <tools></tools> XML tags:
<tools>
{"type": "function", "function": {get_weather Get the current weather for a city {object <nil> <nil> [city] {"city":{"type":"string","description":"City name"}}}}}
</tools>

For each function call, return a json object with function name and arguments within <tool_call></tool_call> XML tags:
<tool_call>
{"name": <function-name>, "arguments": <args-json-object>}
</tool_call><|im_end|>
<|im_start|>user
What is the weather in Tokyo?<|im_end|>
<|im_start|>assistant
<tool_call>
{"name": "get_weather", "arguments": {"city":"Tokyo"}}
</tool_call><|im_end|>
<|im_start|>user
<tool_response>
{"temperature": 20}
</tool_response><|im_end|>
<|im_start|>assistant
It is 20°C in Tokyo.<|im_end|>
<|im_start|>user
Thanks!<|im_end|>
<|im_start|>assistant
954 個字元,955 位元組

關於這個範本

Ollama 的執行方式
整段對話放入 .Messages,執行一次
使用的名稱
$, $i, $last, arguments, content, function, messages, name, prompt, response, role, system, toolcalls, tools
支援的功能(就 Ollama 而言)
tools

用你自己的 Ollama 驗證

請將 MODEL 換成你的模型名稱。_debug_render_only 是 Ollama 原始碼中的除錯選項,不在 API 文件中,因此可能會改變。提示詞會在回應的 _debug_info.rendered_template 中。

curl -s http://localhost:11434/api/chat -d '{"model":"MODEL","messages":[{"role":"system","content":"You are a helpful assistant."},{"role":"user","content":"What is the weather in Tokyo?"},{"role":"assistant","content":"","tool_calls":[{"function":{"name":"get_weather","arguments":{"city":"Tokyo"}}}]},{"role":"tool","content":"{\"temperature\": 20}","tool_name":"get_weather"},{"role":"assistant","content":"It is 20°C in Tokyo."},{"role":"user","content":"Thanks!"}],"tools":[{"type":"function","function":{"name":"get_weather","description":"Get the current weather for a city","parameters":{"type":"object","properties":{"city":{"type":"string","description":"City name"}},"required":["city"]}}}],"stream":false,"_debug_render_only":true}'

Modelfile 中有 RENDERER 或 PARSER 那一行的模型,以及 gpt-oss,使用的是 Ollama 內建的 renderer,而不是 TEMPLATE。

當對話比上下文(num_ctx)還長時,Ollama 會捨棄最舊的訊息,但保留 system 訊息與最後一則訊息。本工具不計算 token,因此一律顯示完整對話。

對於 qwen3 模型與 deepseek-r1,Ollama 會從最後一則 user 訊息之前的 assistant 訊息中移除 <think>…</think>。本工具不會。

印出整則訊息或 {{ .Messages }} 時,Ollama 會顯示記憶體位址(0xc…),而且每次都不同。本工具則顯示佔位符。

currentDate 與 yesterdayDate 使用你電腦上今天的日期。Ollama 使用伺服器上的日期。

於 2026-11-09 對照 Ollama 的原始碼(v0.40.15)、Go 的 text/template 與 Ollama 0.40.11 檢查: Ollama: Template · template.go

一切都在你的瀏覽器中執行,不會傳送到任何地方。

Ollama 以模型的 TEMPLATE 將對話轉成模型讀取的文字,TEMPLATE 以 Go 的範本語言撰寫:{{ range .Messages }}、{{ .Role }}、{{ .Content }}、{{ if .Tools }} 等等。一個小錯誤,例如少了換行、{{- 修剪過頭,或是欄位名稱不存在,就會改變模型看到的內容,或讓每個請求都失敗。本工具依照 Ollama 的方式執行你的範本。它遵循 Go 的 text/template 規則(修剪標記、變數、range、with、比較、printf、錯誤訊息),傳入與 Ollama 相同的資料(System、帶有 Role、Content、Thinking、ToolCalls、ToolName 與 ToolCallID 的 Messages、Tools、Think、ThinkLevel、IsThinkSet、Prompt、Suffix、Response),也具備 Ollama 的額外函式(json、currentDate、yesterdayDate、toTypeScriptType)。它還複製了 Ollama 準備資料的方式:system 訊息會合併到 .System,相同 role 的連續訊息以空白行相連,第一則訊息不是 system 訊息時會加入模型的 SYSTEM,圖片則變成 [img-0]、[img-1] 等。完全不使用 .Messages 的範本會以較舊的方式執行,每一輪各執行一次,使用 .Prompt 與 .Response,而兩者都沒用到的範本,Ollama 會為它加上 {{ .Response }}。自 Ollama 0.40 起,模型也可以在 GGUF 檔案內附帶聊天範本(tokenizer.chat_template),Ollama 會依兩者各自能做的事來挑選:tools、thinking 與 fill-in-the-middle。在進階設定中貼上 GGUF 聊天範本,工具就會告訴你 Ollama 會使用哪一個。我們以三種方式檢查了這個工具:與 Go 自己的 text/template(Go 1.26.6)執行 Ollama 範本程式碼的 243 個案例比對,其中包含 Ollama 的 20 個內建範本,輸出與其測試結果一致;對這台電腦上的 Ollama 0.40.11 送出 330 個 /api/generate 請求;以及對 qwen2.5:7b 和我們用自己的 TEMPLATE 建立的模型送出 49 個 /api/chat 請求。輸出與錯誤訊息都相符。

這個工具的核心邏輯以 MIT 授權開放原始碼。 github.com/seigo5555/toolkitbox-lib/src/ollama-template.ts

使用情境

  • 在執行 ollama create 之前,檢查你為 Modelfile 撰寫的 TEMPLATE:換行、特殊 token、system 訊息、tool calls 與 tool 結果
  • 找出修改 TEMPLATE 卻沒有效果的原因,以及 Ollama 使用的是它還是 GGUF 檔案中的聊天範本
  • 在含有 tools 的長對話中,確切看到模型收到什麼,以排查錯誤或遺漏的 tool calls

使用方法

  1. 將範本貼到文字框中(ollama show --template <model> 會印出你已有模型的範本),或從範例開始。
  2. 選擇 /api/chat,以與 API 相同格式的 JSON 編輯 messages 與 tools;或選擇 /api/generate,填入 prompt、system 與 suffix。若要使用 think,請設定它。
  3. 閱讀結果,需要時可顯示空白字元。若要與你自己的 Ollama 比對,請以你的模型名稱執行底部的 curl 指令。

FAQ

我改了 TEMPLATE,輸出卻沒有變。為什麼?

自 Ollama 0.40 起,模型可以有兩個範本:Modelfile 中的 TEMPLATE,以及 GGUF 檔案內的聊天範本。Ollama 會挑選能做更多事的那個(tools、thinking、fill-in-the-middle)。在我們以 Ollama 0.40.11 進行的測試中,以 qwen2.5:7b 建立的模型,沒有 tools 的 TEMPLATE 被忽略了,因為 qwen2.5:7b 的 GGUF 聊天範本支援 tools。伺服器記錄的 "template selection" 那一行會顯示選擇結果(selected=go_template 或 selected=gguf_chat_template);為伺服器設定 OLLAMA_GO_TEMPLATE=1,只要模型有 TEMPLATE,Ollama 就會使用它。

如何看到我的 Ollama 實際建立的提示詞?

Ollama 的原始碼中有一個除錯選項 _debug_render_only,它會直接回傳提示詞,而不執行模型(以 _debug_info.rendered_template 回傳)。我們用它來檢查這個工具。它不在 API 文件中,因此可能會改變。工具會為你組出 curl 指令。

使用 .Messages 的範本與使用 .Prompt 的範本有什麼差別?

如果範本使用 .Messages,Ollama 會以整段對話執行一次。如果沒有,Ollama 會每一輪各執行一次,傳入 .System、.Prompt 與 .Response,最後一輪則在 {{ .Response }} 之後截斷範本,讓模型從那裡接著寫。工具會顯示使用了哪一種方式。

為什麼 Ollama 會回答 "does not support tools" 或 "does not support thinking"?

當所使用的範本不支援 tools 時(TEMPLATE 只要使用 .Tools 就算支援),Ollama 會拒絕帶有 tools 的請求;當範本沒有 thinking 部分時,則會拒絕將 think 設為 true 或某個等級的請求。對於有 thinking 部分的範本,若請求沒有設定 think,Ollama 會自動開啟 think。工具兩種情況都會顯示。

我提示詞中的 tools 看起來不像 JSON。是工具的錯誤嗎?

大概不是。在 Go 的範本中,值只有在其型別本身是這樣定義時才會以 JSON 輸出。Ollama 的 .Tools、整個 tool 與 .Function.Arguments 會以 JSON 輸出,但 .Function 則以 Go 自己的格式輸出。在我們的測試中,qwen2.5:7b 的範本使用 {{ .Function }},而 Ollama 0.40.11 傳給模型的文字類似 {get_weather Get the weather {object <nil> <nil> [city] {…}}}。如果想要 JSON,請使用 {{ json .Function }}。

我的範本會被傳送到任何地方嗎?

不會。一切都在你的瀏覽器中執行。

相關工具