~/tools / 모델 파일과 채팅 템플릿 / Ollama Template Tester
Ollama Template Tester — Ollama TEMPLATE을 실행해 프롬프트를 그대로 확인
Ollama 모델의 TEMPLATE(ollama show --template의 출력 또는 Modelfile의 내용)을 붙여 넣고 대화, tools, 프롬프트를 더하면 Ollama가 모델에 넘기는 텍스트를 그대로 볼 수 있습니다. 특수 토큰과 줄바꿈까지 그대로 보여 줍니다. 이 도구는 Go의 템플릿 규칙, Ollama의 데이터(messages, tool calls, tools, think), Ollama가 템플릿을 실행하는 세 가지 방식을 써서 Ollama와 같은 방법으로 템플릿을 실행합니다. 또한 Ollama가 붙여 넣은 TEMPLATE을 쓰는지 GGUF 파일 안의 채팅 템플릿을 쓰는지, 그리고 tools나 thinking 요청을 Ollama가 거부하는 때는 언제인지도 알려 줍니다. 데이터는 브라우저 밖으로 나가지 않습니다.
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
이 템플릿에 대해
- 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는 TEMPLATE이 아니라 Ollama에 내장된 렌더러를 씁니다.
대화가 컨텍스트(num_ctx)보다 길면 Ollama는 system 메시지와 마지막 메시지는 남기고 가장 오래된 메시지부터 버립니다. 이 도구는 토큰을 세지 않으므로 항상 대화 전체를 보여 줍니다.
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
이럴 때 사용
- Modelfile용으로 쓰고 있는 TEMPLATE을 ollama create 전에 확인하기: 줄바꿈, 특수 토큰, system 메시지, tool calls, tool 결과
- TEMPLATE을 바꿔도 효과가 없는 이유와, Ollama가 TEMPLATE과 GGUF 파일의 채팅 템플릿 중 무엇을 쓰는지 알아보기
- tools가 있는 긴 대화에서 모델이 실제로 받는 내용을 보고, 잘못되거나 빠진 tool calls의 원인 찾기
사용법
- 상자에 템플릿을 붙여 넣습니다(가지고 있는 모델의 템플릿은 ollama show --template <model>로 출력됩니다). 예시에서 시작해도 됩니다.
- /api/chat을 골라 messages와 tools를 API와 같은 형태의 JSON으로 편집하거나, /api/generate를 골라 prompt, system, suffix를 입력합니다. think를 쓴다면 설정합니다.
- 결과를 읽습니다. 필요하면 공백을 표시합니다. 내 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의 소스 코드에는 모델을 실행하지 않고 프롬프트를 돌려주는 디버그 옵션 _debug_render_only가 있습니다(프롬프트는 _debug_info.rendered_template으로 돌아옵니다). 이 도구를 확인할 때도 사용했습니다. API 문서에는 없으므로 바뀔 수 있습니다. 도구가 curl 명령을 만들어 줍니다.
.Messages를 쓰는 템플릿과 .Prompt를 쓰는 템플릿은 무엇이 다른가요?
템플릿이 .Messages를 쓰면 Ollama는 대화 전체를 넘겨 한 번 실행합니다. 쓰지 않으면 턴마다 .System, .Prompt, .Response를 넘겨 한 번씩 실행하며, 마지막 턴에서는 {{ .Response }} 뒤에서 템플릿을 잘라 내므로 모델이 거기서부터 이어 씁니다. 어느 방식으로 실행되었는지는 도구에 표시됩니다.
Ollama가 "does not support tools"나 "does not support thinking"이라고 답하는 이유는 무엇인가요?
Ollama는 사용하는 템플릿이 tools를 지원하지 않으면(TEMPLATE은 .Tools를 쓰면 지원합니다) 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 }}을 쓰세요.
내 템플릿이 어딘가로 전송되나요?
아니요. 모든 것이 브라우저 안에서 실행됩니다.