~/tools / Tệp mô hình và mẫu chat / Hugging Face Chat Template Tester

Hugging Face Chat Template Tester — Render chat template của Hugging Face và xem chính xác prompt

Dán một chat template của Hugging Face (Jinja) hoặc toàn bộ tokenizer_config.json của mô hình, thêm messages và tools, rồi xem chính xác đoạn prompt mà apply_chat_template(..., tokenize=False) của transformers tạo ra. Công cụ chạy Jinja2 với cùng thiết lập sandbox như transformers, nên văn bản, lỗi và số dòng đều giống như trong Python. Dữ liệu không rời khỏi trình duyệt của bạn.

Ví dụ (viết riêng cho công cụ này)

Dán template Jinja (chat_template.jinja), hoặc toàn bộ tokenizer_config.json hay chat_template.json trong các tệp của mô hình trên Hugging Face.

Một danh sách JSON các tin nhắn, giống danh sách bạn truyền cho apply_chat_template.

Một danh sách JSON các định nghĩa tool (JSON Schema). Để trống nếu không dùng tool.

Thêm phần mở đầu của lượt trợ lý vào cuối, để mô hình viết câu trả lời (nếu template hỗ trợ).

Để ngỏ tin nhắn cuối cùng để mô hình viết tiếp (prefill). Không thể dùng cùng add_generation_prompt.

Các giá trị khác được truyền cho apply_chat_template dưới dạng đối số từ khóa, là một đối tượng JSON, chẳng hạn {"enable_thinking": false}. Các biến mà template đọc được liệt kê bên dưới kết quả.

Tùy chọn khác
Token đặc biệt

transformers truyền các token đặc biệt của tokenizer cho template. Chúng được điền sẵn khi bạn dán tokenizer_config.json.

Cho các template hỗ trợ documents (RAG): một danh sách JSON các đối tượng như {"title": "…", "text": "…"}.

Thời gian mà strftime_now() trả về. Để trống để dùng thời gian hiện tại.

Văn bản prompt

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

# Tools

You can call these functions:
<tools>
{"type": "function", "function": {"name": "get_weather", "description": "Get the current weather in a city.", "parameters": {"type": "object", "properties": {"city": {"type": "string", "description": "City name"}}, "required": ["city"]}}}
</tools>

To call one, reply with JSON inside <tool_call></tool_call>.<|im_end|>
<|im_start|>user
What's the weather in Paris?<|im_end|>
<|im_start|>assistant

<tool_call>
{"name": "get_weather", "arguments": {"city": "Paris"}}
</tool_call><|im_end|>
<|im_start|>user
<tool_response>
{"temperature": 22}
</tool_response><|im_end|>
<|im_start|>assistant
688 ký tự

Về template này

Các biến nó đọc
Do apply_chat_template đặt: add_generation_prompt, messages, tools
Token đặc biệt: không có
Khác: không có
Dùng {% generation %}
Không

Kiểm tra trong Python

Chạy đoạn này để so sánh với transformers. Thay MODEL_ID bằng mô hình của bạn, hoặc truyền template của bạn bằng chat_template=.

from transformers import AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained("MODEL_ID")
messages = [
    {'role': 'system', 'content': 'You are a helpful assistant.'},
    {'role': 'user', 'content': "What's the weather in Paris?"},
    {'role': 'assistant', 'content': '', 'tool_calls': [{'type': 'function', 'function': {'name': 'get_weather', 'arguments': {'city': 'Paris'}}}]},
    {'role': 'tool', 'name': 'get_weather', 'content': '{"temperature": 22}'},
]
tools = [
    {'type': 'function', 'function': {'name': 'get_weather', 'description': 'Get the current weather in a city.', 'parameters': {'type': 'object', 'properties': {'city': {'type': 'string', 'description': 'City name'}}, 'required': ['city']}}},
]
text = tokenizer.apply_chat_template(
    messages,
    tools=tools,
    add_generation_prompt=True,
    tokenize=False,
)
print(text)

Kết quả là văn bản trước khi tách token. Sau đó transformers tách token với add_special_tokens=False, nên token đặc biệt chỉ xuất hiện ở nơi template viết ra chúng.

Khi có tools và mô hình có template tên là tool_use, transformers dùng template đó. Bạn cũng có thể chọn template theo tên.

messages, tools và documents được đọc giống module json của Python: số nguyên thành int và số có dấu thập phân thành float, điều này có thể thay đổi cách template in chúng.

Đã kiểm tra vào 2026-11-09 với transformers 5.22.2 và Jinja2 3.1.6 (Python 3.14). transformers: chat template · Mã nguồn transformers

Mọi thứ chạy trong trình duyệt của bạn. Nội dung bạn dán không bị gửi đi hay lưu lại.

Hầu hết các mô hình mở trên Hugging Face đều kèm một chat template: một chương trình Jinja nhỏ biến danh sách tin nhắn thành văn bản mà mô hình thực sự đọc. Thiếu một dấu cách, token BOS bị lặp hai lần hoặc prompt sinh sai đều làm thay đổi những gì mô hình nhìn thấy, và template rất khó đọc nếu không chạy nó. Công cụ này chạy template theo cách của transformers. Chúng tôi đã chuyển Jinja2 3.1.6 sang JavaScript: bộ phân tích từ vựng, bộ phân tích cú pháp, quy tắc về biến nào nhìn thấy được ở đâu, gộp hằng số, sandbox mà transformers dùng, mọi bộ lọc và phép kiểm tra có sẵn, cùng với cách hoạt động riêng của Python đối với chuỗi, số, sắp xếp và thông báo lỗi. Trên nền đó, công cụ theo apply_chat_template trong transformers 5.22.2: các token đặc biệt như bos_token, template tool_use khi có tools, add_generation_prompt, continue_final_message, documents, reasoning_content và các đoạn {% generation %}. Chúng tôi đã render chat template của 39 mô hình mở (Qwen, Llama, Mistral, Gemma, Phi, DeepSeek, gpt-oss và các mô hình khác) với 15 kiểu hội thoại, và cả 585 kết quả đều khớp với transformers. Hơn 20,000 template thử nghiệm khác cũng khớp, kể cả lỗi và số dòng, trừ một vài template dùng bộ lọc random, vốn cho kết quả ngẫu nhiên cả trong Python.

Trường hợp dùng

  • Xem chính xác prompt mà mô hình nhận được trước khi tinh chỉnh hoặc triển khai: token BOS và EOS, dấu cách, ngắt dòng và prompt sinh
  • Tìm các công tắc mà template đọc, chẳng hạn enable_thinking, và xem chúng thay đổi điều gì
  • Gỡ lỗi chat template bạn đang viết, với lỗi và số dòng, tools, documents và continue_final_message

Cách dùng

  1. Dán một chat template, hoặc toàn bộ tokenizer_config.json hay chat_template.json của mô hình, hoặc chọn một ví dụ.
  2. Chỉnh sửa messages và tools (cùng các danh sách JSON mà bạn truyền trong Python), và đặt add_generation_prompt cùng các tùy chọn khác.
  3. Đọc văn bản prompt và các biến mà template dùng, rồi sao chép mã Python để kiểm tra cùng đầu vào đó trong transformers.

Hỏi đáp

Kết quả có giống apply_chat_template không?

Nó giống apply_chat_template(..., tokenize=False), tức là văn bản trước khi tách token. Token đặc biệt, add_generation_prompt, continue_final_message, tools và documents được xử lý như trong transformers 5.22.2. Công cụ không chuyển văn bản thành token IDs.

bos_token và eos_token lấy từ đâu?

Trong Python, chúng lấy từ tokenizer. Khi bạn dán tokenizer_config.json, công cụ đọc chúng từ đó. Nếu không, hãy nhập chúng trong "Tùy chọn khác".

{% generation %} làm gì?

Một số template bao phần trả lời của trợ lý trong {% generation %} … {% endgeneration %}. transformers dùng các đoạn này cho return_assistant_tokens_mask, chẳng hạn để chỉ huấn luyện trên các token của trợ lý. Công cụ tô sáng chúng trong kết quả.

vLLM, llama.cpp hay các máy chủ khác có cho ra cùng văn bản không?

Phần mềm khác có thể render cùng một template bằng engine khác hoặc thiết lập khác, nên kết quả có thể khác. Công cụ này theo transformers.

Vì sao một biến như enable_thinking lại nằm trong mục Khác?

Template đọc nó, nhưng apply_chat_template không đặt nó. Hãy truyền nó như một biến bổ sung (ví dụ {"enable_thinking": false}) để thay đổi kết quả, giống như bạn truyền enable_thinking=False trong Python.

Template của tôi có bị gửi đi đâu không?

Không. Mọi thứ chạy trong trình duyệt của bạn.

Liên quan