# Özel Chat Template (Jinja2) Bir dil modelinin `system`, `user`, `assistant` ve `tool` rollerini ayırt edebilmesi ve tool calling (function calling) yapabilmesi için hazırlanmış Jinja2 sohbet şablonu. ## Chat template nedir? Dil modelleri mesaj listesi göremez; yalnızca düz metin (token dizisi) işler. Kod tarafında şöyle bir yapı kullanılır: ```python [ {"role": "user", "content": "Merhaba"}, {"role": "assistant", "content": "Selam!"} ] ``` Chat template bu yapıyı modelin anlayacağı düz metne çevirir: ``` <|im_start|>mustafa Merhaba<|im_end|> <|im_start|>AI Selam!<|im_end|> ``` Her model eğitim sırasında belirli bir biçim görür; çıkarımda da aynı biçimi bekler. Biçim uyuşmazsa model beklenmedik davranır. ## Bu şablonun özellikleri | Özellik | Açıklama | |---|---| | Rol dönüşümü | `user` → `mustafa`, `assistant` → `AI` | | Araç tanımları | `tools` listesi sistem bloğuna JSON olarak gömülür | | Araç çağrısı | Assistant mesajındaki `tool_calls` alanı `` etiketleriyle sarmalanır | | Çoklu çağrı | Model aynı turda birden fazla araç çağırabilir | | Araç sonucu | `tool` rolü `` etiketleriyle sarmalanır | | Üretim istemi | `add_generation_prompt` ile son satır açık bırakılır | | Doğrulama | Bilinmeyen rol gelirse hata fırlatılır | ## Rol eşlemesi Şablon, standart rol adlarını kendi adlarına çevirir: | Standart (kodda kullanılan) | Şablonda üretilen | |---|---| | `system` | `system` | | `user` | **`mustafa`** | | `assistant` | **`AI`** | | `tool` | `tool` | Bu sayede kod tarafında OpenAI/Hugging Face standardı korunur; dönüşümü şablon yapar. Model değiştirildiğinde uygulama kodunu değiştirmek gerekmez. ## Örnek çıktı **Girdi:** ```python messages = [ {"role": "system", "content": "Sen yardımcı bir asistansın."}, {"role": "user", "content": "Ankara'da hava nasıl?"}, {"role": "assistant", "content": None, "tool_calls": [ {"function": {"name": "get_weather", "arguments": {"city": "Ankara"}}} ]}, {"role": "tool", "content": '{"sehir": "Ankara", "sicaklik_c": 27}'}, {"role": "assistant", "content": "Ankara'da hava 27°C."}, ] ``` **Çıktı:** ``` <|im_start|>system Sen yardımcı bir asistansın. Kullanabileceğin araçlar: {"name": "get_weather", "description": "Bir şehrin güncel hava durumunu döndürür.", "parameters": {...}} Bir aracı çağırmak için şu biçimi kullan: {"name": "araç_adı", "arguments": {...}} <|im_end|> <|im_start|>mustafa Ankara'da hava nasıl?<|im_end|> <|im_start|>AI {"name": "get_weather", "arguments": {"city": "Ankara"}} <|im_end|> <|im_start|>tool {"sehir": "Ankara", "sicaklik_c": 27} <|im_end|> <|im_start|>AI Ankara'da hava 27°C.<|im_end|> ``` ## Kullanım ### Hugging Face tokenizer ile ```python from transformers import AutoTokenizer tokenizer = AutoTokenizer.from_pretrained("model-adi") tokenizer.chat_template = open("chat_template.jinja", encoding="utf-8").read() metin = tokenizer.apply_chat_template( messages, tools=tools, add_generation_prompt=True, # çıkarımda True, eğitimde False tokenize=False, ) ``` Şablonu modelle birlikte yayınlamak için `chat_template.jinja` dosyasını model deposuna eklemek yeterlidir. ### Doğrudan Jinja2 ile ```python from jinja2 import Environment env = Environment() env.globals["raise_exception"] = lambda m: (_ for _ in ()).throw(ValueError(m)) env.policies["json.dumps_kwargs"] = {"ensure_ascii": False, "sort_keys": False} sablon = env.from_string(open("chat_template.jinja", encoding="utf-8").read()) print(sablon.render(messages=messages, tools=tools, add_generation_prompt=True)) ``` `ensure_ascii=False` ayarı önemlidir: Türkçe karakterlerin `\u015f` gibi kaçış dizilerine dönüşmesini engeller ve gereksiz token harcanmasını önler. ## `add_generation_prompt` nedir? Aynı şablon iki farklı amaçla kullanılır: **Eğitimde (`False`)** — konuşma tamamlanmıştır, model bunu öğrenecektir: ``` <|im_start|>mustafa Nasılsın?<|im_end|> <|im_start|>AI İyiyim!<|im_end|> ``` **Çıkarımda (`True`)** — son satır açık bırakılır, model buradan devam eder: ``` <|im_start|>mustafa Nasılsın?<|im_end|> <|im_start|>AI ``` Bu açık satır olmazsa model ne yapacağını bilemez; kendi kullanıcı mesajı uydurabilir veya konuşmayı sonlandırabilir. ## Test ```bash pip install jinja2 python test_template.py ``` Test scripti beş senaryoyu kontrol eder: 1. Basit konuşma (araçsız) 2. Üretim istemi davranışı 3. Tam tool calling akışı (çok turlu, çoklu çağrı) 4. Sistem mesajı olmadan araç kullanımı 5. Geçersiz rol reddi Ayrıca sekiz doğrulama yapar: HTML kaçışı olmaması, Türkçe karakterlerin korunması, rol dönüşümleri, etiket sarmalama ve üretilen JSON'ların ayrıştırılabilir olması. ## Dosyalar | Dosya | İçerik | |---|---| | `chat_template.jinja` | Şablonun kendisi | | `test_template.py` | Test ve doğrulama scripti | | `README.md` | Bu dosya | ## Lisans MIT