~/tools / Tệp mô hình và mẫu chat / Ollama Template Tester
Ollama Template Tester — Chạy TEMPLATE của Ollama và xem chính xác prompt
Dán TEMPLATE của một mô hình Ollama (từ ollama show --template hoặc Modelfile của bạn), thêm một cuộc hội thoại, tools hoặc một prompt, và xem chính xác đoạn văn bản mà Ollama đưa cho mô hình: cả token đặc biệt lẫn ngắt dòng. Công cụ chạy template giống cách Ollama làm, với quy tắc template của Go, dữ liệu của Ollama (messages, tool calls, tools, think) và ba cách Ollama chạy một template. Nó cũng cho bạn biết Ollama có dùng TEMPLATE của bạn hay dùng chat template bên trong tệp GGUF, và khi nào Ollama từ chối một yêu cầu có tools hoặc thinking. Không có gì rời khỏi trình duyệt của bạn.
ollama show --template <model> in ra template của mô hình bạn đang có. Đoạn văn bản giữa ba dấu nháy sau TEMPLATE trong một Modelfile cũng dùng được.
Cùng dạng với /api/chat: role, content, và tùy chọn thinking, tool_calls, tool_name và images.
Cùng dạng với tools trong /api/chat. Để trống nếu không dùng tools.
Nâng cao: SYSTEM của mô hình và chat template GGUF của nó
Dòng SYSTEM của Modelfile. Ollama thêm nó khi message đầu tiên không phải là system message (trong /api/generate, khi system trống).
Dán vào để xem Ollama dùng TEMPLATE hay cái này. GGUF Metadata Viewer hiển thị được nó.
Những gì mô hình nhận được
<|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
Về template này
- Cách Ollama chạy nó
- Một lần, với toàn bộ cuộc hội thoại trong .Messages
- Các tên nó dùng
- $, $i, $last, arguments, content, function, messages, name, prompt, response, role, system, toolcalls, tools
- Những gì nó hỗ trợ (theo Ollama)
- tools
Kiểm tra bằng Ollama của riêng bạn
Thay MODEL bằng tên mô hình của bạn. _debug_render_only là một tùy chọn gỡ lỗi trong mã nguồn của Ollama, không có trong tài liệu API, nên có thể thay đổi. Phản hồi có prompt trong _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}'Các mô hình có dòng RENDERER hoặc PARSER trong Modelfile, và gpt-oss, dùng các renderer tích hợp sẵn trong Ollama, không dùng TEMPLATE.
Khi cuộc hội thoại dài hơn ngữ cảnh (num_ctx), Ollama bỏ các message cũ nhất nhưng giữ các system message và message cuối cùng. Công cụ này không đếm token, nên luôn hiển thị toàn bộ cuộc hội thoại.
Với các mô hình qwen3 và deepseek-r1, Ollama xóa <think>…</think> khỏi các assistant message trước user message cuối cùng. Công cụ này thì không.
In cả một message hoặc {{ .Messages }} cho ra địa chỉ bộ nhớ trong Ollama (0xc…), thay đổi mỗi lần. Công cụ hiển thị một chỗ giữ chỗ.
currentDate và yesterdayDate dùng ngày hôm nay trên máy tính của bạn. Ollama dùng ngày trên máy chủ.
Đã kiểm tra vào 2026-11-09 so với mã nguồn của Ollama (v0.40.15), text/template của Go và Ollama 0.40.11: Ollama: Template · template.go
Mọi thứ chạy trong trình duyệt của bạn. Không có gì được gửi đi đâu cả.
Ollama biến một cuộc hội thoại thành văn bản mà mô hình đọc bằng TEMPLATE của mô hình, được viết bằng ngôn ngữ template của Go: {{ range .Messages }}, {{ .Role }}, {{ .Content }}, {{ if .Tools }} và nhiều thứ khác. Một lỗi nhỏ, chẳng hạn thiếu một ngắt dòng, một {{- cắt quá nhiều hoặc một tên trường không tồn tại, sẽ làm thay đổi những gì mô hình nhìn thấy hoặc khiến mọi yêu cầu đều thất bại. Công cụ này chạy template của bạn giống cách Ollama làm. Nó tuân theo quy tắc text/template của Go (dấu cắt khoảng trắng, biến, range, with, phép so sánh, printf, các thông báo lỗi), truyền cùng dữ liệu mà Ollama truyền (System, Messages với Role, Content, Thinking, ToolCalls, ToolName và ToolCallID, Tools, Think, ThinkLevel, IsThinkSet, Prompt, Suffix, Response) và có các hàm bổ sung của Ollama (json, currentDate, yesterdayDate, toTypeScriptType). Nó cũng sao chép cách Ollama chuẩn bị dữ liệu: các system message được gộp vào .System, các message liên tiếp của cùng một role được nối bằng một dòng trống, SYSTEM của mô hình được thêm vào khi message đầu tiên không phải là system message, và hình ảnh trở thành [img-0], [img-1] và cứ thế. Một template không bao giờ dùng .Messages sẽ chạy theo cách cũ, mỗi lượt một lần với .Prompt và .Response, và với một template không dùng cả hai thì Ollama thêm {{ .Response }}. Từ Ollama 0.40, một mô hình cũng có thể mang chat template bên trong tệp GGUF (tokenizer.chat_template), và Ollama chọn một trong hai tùy theo mỗi bên làm được gì: tools, thinking và fill-in-the-middle. Hãy dán chat template của GGUF vào phần Nâng cao và công cụ sẽ cho bạn biết Ollama dùng cái nào. Chúng tôi đã kiểm tra công cụ theo ba cách: so với text/template của chính Go (Go 1.26.6) chạy mã template của Ollama trên 243 trường hợp, trong đó có 20 template có sẵn của Ollama, với kết quả kiểm thử của chúng mà công cụ khớp; so với Ollama 0.40.11 trên máy tính này với 330 yêu cầu /api/generate; và với 49 yêu cầu /api/chat tới qwen2.5:7b và tới các mô hình do chúng tôi tạo bằng TEMPLATE của riêng mình. Đầu ra và các thông báo lỗi đều khớp.
Phần xử lý chính của công cụ này là mã nguồn mở theo giấy phép MIT. github.com/seigo5555/toolkitbox-lib/src/ollama-template.ts
Trường hợp dùng
- Kiểm tra một TEMPLATE bạn đang viết cho Modelfile trước khi chạy ollama create: ngắt dòng, token đặc biệt, system message, tool calls và kết quả của tool
- Tìm hiểu vì sao đổi TEMPLATE không có tác dụng, và Ollama dùng nó hay dùng chat template trong tệp GGUF
- Xem chính xác mô hình nhận được gì trong một cuộc hội thoại dài có tools, để gỡ lỗi các tool calls sai hoặc thiếu
Cách dùng
- Dán một template vào ô (ollama show --template <model> in ra template của mô hình bạn đang có), hoặc bắt đầu từ một trong các ví dụ.
- Chọn /api/chat và chỉnh sửa messages và tools dưới dạng JSON, cùng dạng với API, hoặc chọn /api/generate và điền prompt, system và suffix. Đặt think nếu bạn dùng nó.
- Đọc kết quả, hiển thị khoảng trắng nếu cần. Để so với Ollama của riêng bạn, hãy chạy lệnh curl ở cuối với tên mô hình của bạn.
Hỏi đáp
Tôi đã đổi TEMPLATE nhưng đầu ra không đổi. Vì sao?
Từ Ollama 0.40, một mô hình có thể có hai template: TEMPLATE trong Modelfile và chat template bên trong tệp GGUF. Ollama chọn cái làm được nhiều hơn (tools, thinking, fill-in-the-middle). Trong thử nghiệm của chúng tôi với Ollama 0.40.11, một TEMPLATE không có tools đã bị bỏ qua trong một mô hình tạo từ qwen2.5:7b, vì chat template GGUF của qwen2.5:7b hỗ trợ tools. Log của máy chủ cho thấy lựa chọn ở dòng "template selection" (selected=go_template hoặc selected=gguf_chat_template), và đặt OLLAMA_GO_TEMPLATE=1 cho máy chủ khiến Ollama dùng TEMPLATE bất cứ khi nào mô hình có một TEMPLATE.
Làm sao xem được prompt mà Ollama của tôi thực sự tạo ra?
Mã nguồn của Ollama có một tùy chọn gỡ lỗi, _debug_render_only, trả về prompt thay vì chạy mô hình (dưới dạng _debug_info.rendered_template). Chúng tôi đã dùng nó để kiểm tra công cụ này. Nó không có trong tài liệu API nên có thể thay đổi. Công cụ tạo sẵn lệnh curl cho bạn.
Template dùng .Messages khác template dùng .Prompt ở điểm nào?
Nếu template dùng .Messages, Ollama chạy nó một lần với toàn bộ cuộc hội thoại. Nếu không, Ollama chạy nó mỗi lượt một lần với .System, .Prompt và .Response, và ở lượt cuối thì cắt template sau {{ .Response }}, để mô hình viết tiếp từ đó. Công cụ cho biết cách nào đã được dùng.
Vì sao Ollama trả lời "does not support tools" hoặc "does not support thinking"?
Ollama từ chối một yêu cầu có tools khi template nó dùng không hỗ trợ tools (một TEMPLATE hỗ trợ tools khi nó dùng .Tools), và từ chối một yêu cầu có think đặt là true hoặc một mức khi template không có phần thinking. Với template có phần thinking, Ollama bật think khi yêu cầu không đặt nó. Công cụ hiển thị cả hai trường hợp.
Các tools trong prompt của tôi trông không giống JSON. Đó có phải lỗi của công cụ không?
Có lẽ không. Trong template của Go, một giá trị chỉ được in ra dạng JSON khi kiểu của nó quy định như vậy. .Tools của Ollama, cả một tool và .Function.Arguments được in ra dạng JSON, nhưng .Function được in theo định dạng riêng của Go. Trong thử nghiệm của chúng tôi, template của qwen2.5:7b dùng {{ .Function }}, và Ollama 0.40.11 đã gửi cho mô hình văn bản như {get_weather Get the weather {object <nil> <nil> [city] {…}}}. Hãy dùng {{ json .Function }} nếu bạn muốn JSON.
Template của tôi có được gửi đi đâu không?
Không. Mọi thứ chạy trong trình duyệt của bạn.