GPT-2/GPT-4 Byte-Level BPE + tiktoken Regex: Anatomy of the Modern Standard
Birth of GPT-2 byte-level BPE (Radford 2019), the secret of the regex pre-tokenizer, GPT-3.5 cl100k, GPT-4o o200k, Llama-3's return to tiktoken. tiktoken Rust performance, token counting for prompt engineering, Turkish cost economics, comparison of encoding regimes.
Şükrü Yusuf KAYA
60 min read
Advanced🪙 Modern LLM standardı — her token bir kuruş
GPT-2 (Radford 2019) tokenization'da paradigma kıran bir tasarım yaptı: tüm metin UTF-8 byte'lara çevrilir, sonra regex ile pre-tokenize, sonra byte-level BPE. Sonuç: hiçbir UNK, hiç başarısız encoding, tam reversibility, multilingual ready. GPT-3, GPT-3.5 (cl100k), GPT-4o (o200k), Llama-3 hepsi bu pattern'i izledi. tiktoken Rust library production'da fiili standart. 60 dakika sonra: byte-level BPE'yi mimarisinden anlayacak, GPT-4'ün regex pattern'ini parse edebileceksin, API çağrısı öncesi token sayısı hesaplayıp Türkçe için %X daha pahalı olduğunu kanıtlayabileceksin.
Ders Haritası#
- Tarihsel kontekst: GPT-2 (2019) → GPT-3 → GPT-3.5 (cl100k) → GPT-4o (o200k)
- Byte-level BPE mantığı: UTF-8 byte'lar → 256 base vocab
- Niye byte-level: UNK eliminasyonu + reversibility
- GPT-2 regex pattern'i satır satır:
's|'t|... - GPT-4 cl100k regex: değişiklikler ve sebepleri
- GPT-4o o200k: 200K vocab + multilingual genişleme
- tiktoken library: API ve Rust performansı
- Token counting — niye API çağrısı öncesi şart
- Türkçe maliyet ekonomisi — gerçek sayılar
- Llama-3'ün tiktoken'a geçişi — sebep ve etki
- Special tokens: ChatGPT chat format'ı
- Egzersizler + summary + FAQ
1. Tarihsel Kontekst: 2019'dan 2026'ya#
GPT-2 (Radford et al., 2019)#
"Language Models are Unsupervised Multitask Learners" — OpenAI Blog 2019. Tokenizer:
- Vocab: 50,257 tokens
- Algorithm: Byte-level BPE (yeni tasarım)
- Pre-tokenizer: regex pattern (aşağıda)
- Encoding: Bytes-to-unicode mapping → bytes never lost
İlk paper'da resmi adı yoktu, sonradan "r50k_base" veya "gpt2" olarak anıldı.
GPT-3 (2020)#
Vocab değişmedi — GPT-2 tokenizer'ı aynen kullanıldı. Sadece model büyüdü (1.5B → 175B).
Codex / GPT-3.5 (2022)#
- p50k_base: GPT-3'le aynı vocab ama whitespace handling iyileştirildi (kod için).
- p50k_edit: edit endpoint için.
GPT-3.5-turbo / GPT-4 (2023)#
- cl100k_base: 100,256 token vocab. Tamamen yeni.
- Regex pattern güncellendi (özellikle apostrophe handling).
- Multilingual ciddi iyileştirildi.
GPT-4o (2024)#
- o200k_base: 200,019 token vocab. cl100k'nın 2x'i.
- Türkçe, Arapça, Hintçe, Çince, Japonca fertility ciddi düştü.
- Regex pattern minor changes.
Llama-3 (2024)#
- Meta tiktoken'a geçti. Vocab 128K, cl100k benzeri ama Meta-trained.
- SentencePiece terk edildi.
2026 trendi#
Byte-level BPE + tiktoken-style regex = fiili modern standard. Türkiye'de Trendyol-LLM, kendi Türkçe LLM'leri bu pattern'le geliyor.
2. Byte-Level BPE Mantığı#
Klasik BPE (Modül 6.2-6.3) ile başlangıç#
Vocabulary'i karakterlerle başlatırız. Türkçe için: ASCII (~128) + Türkçe harfler (~10) = ~140 base.
Sorun: ne kadar karakter destekleyeceğiz?#
- Latin chars
- Cyrillic, Greek, Arabic, Hebrew, Chinese, Japanese, Korean, Thai, ...
- Emojis (U+1F000+)
- Symbols (math, currency, dingbats)
- Private use areas (PUA)
Tüm Unicode = 149,000+ char (Unicode 15.1). Hepsini vocab'a koyamayız (vocab her token için embedding parameter harcar).
GPT-2 çözümü: UTF-8 byte-level#
Her metin UTF-8 ile encode edilir → byte stream (0-255).
"Merhaba" → UTF-8 bytes: M = 0x4D = 77 e = 0x65 = 101 r = 0x72 = 114 h = 0x68 = 104 a = 0x61 = 97 b = 0x62 = 98 a = 0x61 = 97
ASCII Türkçe için 1 byte/char. Türkçe-özel chars (ÇĞİÖŞÜçğıöşü) 2 byte/char.
"İstanbul" → İ (0xC4 0xB0) + s (0x73) + t (0x74) + a (0x61) + n (0x6E) + b (0x62) + u (0x75) + l (0x6C) = 9 bytes (İ özel, 2 byte; diğerleri ASCII, 1 byte each)
Base vocab: 256 byte#
Her byte (0-255) bir token olarak vocab'da yer alır. Garanti edilmiş universal coverage: HİÇBİR metin başarısız encode edilemez.
Bytes-to-Unicode trick (GPT-2 özel)#
Byte 0-31 ve 127 "non-printable". Bunlar Unicode printable karakterlere remap edilir (encoding kolaylığı için):
byte 0 → 'Ā' (U+0100) byte 1 → 'ā' (U+0101) ... byte 32 → 'Ġ' (U+0120) # space! byte 65 → 'A' (kendisi) ...
Bu mapping pratik bir trick — vocab dosyası "human-readable" görünür ama aslında byte indirection. GPT-2 dosyasında gibi entry'ler vardır — bu aslında (space + "and").
encoder.json"Ġand": 290" and"Sonuç: BPE üzerinde ilerle#
256 byte vocab'ı kararlı şekilde, sonra BPE merges üzerinde çalış. Merges byte-pairs üzerinde olabilir:
(0x4D, 0x65) → "Me" pair ("Me", 0x72) → "Mer" pair ...
Sonunda 50K vocab'a ulaşılır (GPT-2). Hiçbir token UNK'lı değil — base 256 byte her zaman kapsam.
python
def bytes_to_unicode(): """ GPT-2'nin bytes-to-unicode trick'i. Non-printable byte'ları printable Unicode'a remap eder. """ bs = ( list(range(ord("!"), ord("~") + 1)) + list(range(ord("¡"), ord("¬") + 1)) + list(range(ord("®"), ord("ÿ") + 1)) ) cs = bs[:] n = 0 for b in range(256): if b not in bs: bs.append(b) cs.append(256 + n) n += 1 return dict(zip(bs, [chr(c) for c in cs])) # Usagebyte_encoder = bytes_to_unicode()print(byte_encoder[32]) # 'Ġ' (space remapped)print(byte_encoder[65]) # 'A' text = "Merhaba"utf8_bytes = text.encode("utf-8")remapped = "".join(byte_encoder[b] for b in utf8_bytes)print(remapped)# 'Merhaba' (all ASCII, no remapping needed) text2 = " merhaba"utf8_bytes2 = text2.encode("utf-8")remapped2 = "".join(byte_encoder[b] for b in utf8_bytes2)print(remapped2)# 'Ġmerhaba' (space → Ġ)GPT-2'nin bytes-to-unicode trick'i
3. Byte-Level'in Üç Süper Gücü#
3.1 Hiçbir UNK#
Her metin garantili encode edilir. Production sisteminde invariant: tokenizer asla başarısız olmaz.
3.2 Lossless / reversible#
decode(encode(x)) == x3.3 Multilingual ready#
Her dil bytes'lara düşer. Yeni dil için vocab eğitmek gerekmez — base 256 byte zaten kapsam (sadece daha çok token harcar). Vocab eğitilmiş diller daha verimli, ama coverage garanti.
Trade-off#
Multi-byte chars (Türkçe, Çince, Arapça) byte cost'u var:
- ASCII char: 1 byte → potentially 1 token
- Türkçe char (ÇĞİ etc.): 2 byte → 2 token (eğer vocab'da merge yoksa)
- Çince char: 3 byte → 3 token
- Emoji: 4 byte → 4 token
Bu, multilingual model'lerde vocab size'ı büyütmek için motivasyon (cl100k → o200k).
4. GPT-2 Regex Pre-tokenizer Satır Satır#
Pattern (Python regex)#
GPT2_PATTERN = r"""'s|'t|'re|'ve|'m|'ll|'d| ?\p{L}+| ?\p{N}+| ?[^\s\p{L}\p{N}]+|\s+(?!\S)|\s+"""
Bu pattern OpenAI'nin tüm tokenizer kalitesinin gizli kahramanı. Parse edelim:
Token 1-7: İngilizce apostroflar#
's | 't | 're | 've | 'm | 'll | 'd
- "it's" → ["it", "'s"]
- "don't" → ["don", "'t"]
- "I'm" → ["I", "'m"]
- "they're" → ["they", "'re"]
- "we've" → ["we", "'ve"]
- "he'll" → ["he", "'ll"]
- "we'd" → ["we", "'d"]
Sorun: Bu sadece İngilizce. Türkçe için bu pattern match etmez (sadece sıralı 7 form var).
İstanbul'da'daToken 8: ?\p{L}+#
?\p{L}+- = opsiyonel space
? - = Unicode letter category (her dildeki harf)
\p{L} - = bir veya daha fazla
+
Sonuç: opsiyonel space + harfler. Word match'in temeli.
" merhaba" → matches " merhaba" "merhaba" → matches "merhaba" "İstanbul" → matches "İstanbul"
Token 9: ?\p{N}+#
?\p{N}+- \p{N} = Unicode digit category
- Sayılar grup olarak
"2026" → matches "2026" " 14:32" → matches " 14", sonra ":" non-letter, sonra "32"
Token 10: ?[^\s\p{L}\p{N}]+#
?[^\s\p{L}\p{N}]+- Whitespace, letter, digit OLMAYAN karakterler (yani punctuation, symbols)
"!" → matches "!" "!!!" → matches "!!!" " -" → matches " -"
Token 11: \s+(?!\S)#
\s+(?!\S)- Whitespace ending at end-of-string (negative lookahead: not followed by non-whitespace)
"hello " → trailing whitespace match
Token 12: \s+#
\s+- Any whitespace (catch-all)
Etkileri#
- Space token'a önek olarak gelir: tek token (vocab'da
merhabaolarak). Bu vocab'ı 2x büyütmüş gibi (her word'ün hem solo hem space-prefixed versiyonu var).Ġmerhaba - Number splitting: "2026-05-12" → ["2026", "-", "05", "-", "12"] (4 token).
- Apostrophe English-only: Türkçe ,
'daayrı token olur.'nın
python
import regex # 'regex' module, not 'import re' (\p{L} needs Unicode property support) GPT2_PATTERN = regex.compile( r"""'s|'t|'re|'ve|'m|'ll|'d| ?\p{L}+| ?\p{N}+| ?[^\s\p{L}\p{N}]+|\s+(?!\S)|\s+""") text = "İstanbul'da 2026'da Boğaziçi'nde kahve içtim."matches = GPT2_PATTERN.findall(text)for m in matches: print(repr(m))# 'İstanbul'# "'"# 'da'# ' '# '2026'# "'"# 'da'# ' Boğaziçi'# "'"# 'nde'# ' kahve'# ' içtim'# '.' # Notice: 'da, 'nde Türkçe suffixleri ayrı token oluyor.# Apostrofu kelimeden ayırıyor, sonra suffix ayrı match. # English için:text_en = "I can't believe it's working!"print(GPT2_PATTERN.findall(text_en))# ['I', ' can', "'t", ' believe', ' it', "'s", ' working', '!']GPT-2 regex pattern demo — Türkçe vs İngilizce
5. GPT-4 cl100k_base — Modern Standard#
Pattern (modern, updated)#
CL100K_PATTERN = r"""(?i:'s|'t|'re|'ve|'m|'ll|'d)|[^\r\n\p{L}\p{N}]?\p{L}+|\p{N}{1,3}| ?[^\s\p{L}\p{N}]+[\r\n]*|\s*[\r\n]+|\s+(?!\S)|\s+"""
Değişiklikler GPT-2'den#
- — case-insensitive apostroflar. "It's" ve "it's" aynı işlenir.
(?i:...) - — letter'lar opsiyonel pre-char ile match (whitespace yerine). Bu Çince, Japonca gibi whitespace'siz dilleri better handle.
[^\r\n\p{L}\p{N}]?\p{L}+ - — sayılar max 3 digit chunks. "2026" artık ["202", "6"] olabilir (vocab'a göre). Bu büyük sayıları tutarlı tokenize eder ("1", ",000", ",000"] etc.).
\p{N}{1,3} - — punctuation sonrası newline'lar ekli.
[\r\n]* - — explicit newline handling.
\s*[\r\n]+
Niye max 3 digit#
GPT-3.5'ten önce büyük sayılar tutarsız tokenize edilirdi (1234567 farklı bölünürdü). Max 3 digit limit ile:
"1234567" → ["123", "456", "7"] veya ["1,234,567"] eğer comma var
Mathematical reasoning için kritik: model "1234 + 5678" gibi aritmetiği token-pattern olarak öğrenebilir.
Vocab değişiklikleri#
- 50K → 100K (yaklaşık 2x)
- Multilingual coverage dramatically artırıldı: Çince, Japonca, Korece, Arapça single token coverage çok daha iyi
- Türkçe için minor improvement (TR vocab share GPT-2'ye göre ~2x ama hâlâ İngilizce-dominant)
tiktoken adı#
import tiktoken enc = tiktoken.get_encoding("cl100k_base")
GPT-3.5-turbo ve GPT-4 (orijinal) bu encoding'i kullandı.
6. GPT-4o o200k_base — 200K Vocab, Multilingual Patlama#
Vocab boyutu#
- cl100k: 100,256
- o200k: 200,019 (~2x)
Pattern (very similar to cl100k, minor tweaks)#
Ana mantık aynı, bazı edge case'ler iyileştirildi.
Multilingual dramatic improvement#
OpenAI public blog'a göre (May 2024):
- Çince: cl100k vs o200k → ~%40 token reduction
- Japonca: %35 reduction
- Korece: %30 reduction
- Arapça: %35 reduction
- Türkçe: ~%20 reduction
- Hintçe: %50 reduction
- Vietnamca: %45 reduction
Türkçe örnek#
Sentence: "İstanbul Boğazı'nda balıkçı tekneleri sallanıyor."
- GPT-2 (50K): ~18 token
- cl100k (GPT-4): ~12 token
- o200k (GPT-4o): ~9 token
- Trendyol-LLM TR (32K, TR-balanced): ~7 token
o200k Türkçe için gerçekten kullanılabilir seviyeye geldi. Türkiye için OpenAI API maliyeti 2x düştü (sadece tokenizer iyileştirmesi sayesinde).
tiktoken adı#
enc = tiktoken.get_encoding("o200k_base")
GPT-4o, GPT-4o-mini bu encoding'i kullanır.
7. tiktoken Library — Rust Performansı, Python API'si#
python
# pip install tiktokenimport tiktoken # Encoding seçimienc = tiktoken.get_encoding("o200k_base")# Alternatif: tiktoken.encoding_for_model("gpt-4o") # Encodetext = "İstanbul Boğazı'nda balıkçı tekneleri sallanıyor."tokens = enc.encode(text)print(tokens)# [4234, 23456, ...] (token IDs) print(len(tokens)) # 9 (approx) # Decodedecoded = enc.decode(tokens)print(decoded)# 'İstanbul Boğazı'nda balıkçı tekneleri sallanıyor.' # Tek tek token görüntüleme (debugging)for tid in tokens: print(f"{tid}: {enc.decode([tid])!r}")# 4234: ' İstanbul'# 23456: ' Boğazı'# 567: "'"# 234: 'nda'# ... # Çoklu encoding karşılaştırmaencodings = ["r50k_base", "p50k_base", "cl100k_base", "o200k_base"]for name in encodings: e = tiktoken.get_encoding(name) tokens = e.encode(text) print(f"{name}: {len(tokens)} tokens")# r50k_base: 18 tokens (GPT-2)# p50k_base: 18 tokens (Codex)# cl100k_base: 12 tokens (GPT-3.5/4)# o200k_base: 9 tokens (GPT-4o)tiktoken pratik kullanım
Performans#
- Rust-backed, 3-6x faster than HuggingFace tokenizers (her ikisi de Rust ama tiktoken daha optimize)
- 1M token/sec single thread (Apple M2 benchmark)
- Token counting çok hızlı, prompt engineering pipeline'lara fit
tiktoken vs HuggingFace tokenizers#
| tiktoken | HF tokenizers | |
|---|---|---|
| Implementation | Rust | Rust |
| OpenAI native | ✅ | ❌ (load gerekir) |
| Custom training | ❌ | ✅ |
| Speed | 3-6x faster | Slower |
| Vocab format | tiktoken/BPE | tokenizer.json |
Kullanım kararı:
- OpenAI API ile çalışıyorsan: tiktoken.
- Kendi model'in için: HuggingFace tokenizers (training + serving).
8. Token Counting — Niye Production-Critical#
Sebep 1: API Cost Hesaplama#
OpenAI fiyatlandırması token başı. Örnek (GPT-4o, 2026 May):
- Input: $2.50 / 1M token
- Output: $10.00 / 1M token
API call öncesi token sayısı bilinmezse, maliyet öngörülemez.
Sebep 2: Context Window Yönetimi#
- GPT-4o: 128K token context
- Long input → truncation gerekli (eski mesajları kes)
def truncate_to_window(messages, max_tokens=120000, encoding="o200k_base"): enc = tiktoken.get_encoding(encoding) total = 0 kept = [] for msg in reversed(messages): n = len(enc.encode(msg["content"])) if total + n > max_tokens: break kept.insert(0, msg) total += n return kept
Sebep 3: Streaming Cost Estimation#
Generate sırasında token sayısı real-time tracked, stopping criterion olarak kullanılabilir.
Sebep 4: Multi-Turn Memory#
Conversation history token sayısı büyür. ChatGPT-style chat'te her turn'de eski context'i ne kadar tutacağına karar verirken token counting şart.
Pratik formül: messages → token count#
ChatGPT-style chat format için per-message overhead var:
def num_tokens_from_messages(messages, model="gpt-4o"): """OpenAI'ın resmi formülü.""" enc = tiktoken.encoding_for_model(model) if model in {"gpt-3.5-turbo-0613", "gpt-4-0314", "gpt-4-0613", "gpt-4o"}: tokens_per_message = 3 # <|im_start|>{role}\n{content}<|im_end|>\n tokens_per_name = 1 else: tokens_per_message = 4 num_tokens = 0 for message in messages: num_tokens += tokens_per_message for key, value in message.items(): num_tokens += len(enc.encode(value)) if key == "name": num_tokens += tokens_per_name num_tokens += 3 # Every reply is primed with <|start|>assistant<|message|> return num_tokens messages = [ {"role": "system", "content": "Sen yardımsever bir Türkçe asistansın."}, {"role": "user", "content": "Merhaba, nasılsın?"}, ] n = num_tokens_from_messages(messages) print(f"Total tokens: {n}") # ~20 token print(f"Cost: ${n * 2.5 / 1_000_000:.6f}") # ~$0.00005
9. Türkçe Maliyet Ekonomisi — Gerçek Sayılar#
Test: 1 sayfalık Türkçe metin (300 kelime)#
"İstanbul'un kalbinde, Boğaz'ın iki yakasını birleştiren köprülerin altından geçen vapurlar, sabahın erken saatlerinde yolcularını bir yakadan diğerine taşırken, balıkçılar günün ilk avlarını çıkarmaya başlıyorlar..." [300 kelime, ~1800 karakter]
Token sayıları#
| Tokenizer | Token | Token/word | Token/char |
|---|---|---|---|
| r50k (GPT-2) | ~720 | 2.40 | 0.40 |
| cl100k (GPT-4) | ~510 | 1.70 | 0.28 |
| o200k (GPT-4o) | ~430 | 1.43 | 0.24 |
| Llama-3 128K | ~440 | 1.47 | 0.24 |
| Trendyol-LLM 32K | ~360 | 1.20 | 0.20 |
Maliyet karşılaştırması (GPT-4o, 2026 May fiyatları, 1M call)#
1M call × 430 input token = 4.3 × 10^8 token Cost: 4.3 × 10^8 × $2.5/10^6 = $1,075
Eğer Türkçe-balanced model (Trendyol-LLM) ile aynı içerik:
1M call × 360 input token = 3.6 × 10^8 token Cost equivalent rate: 3.6 × 10^8 × $2.5/10^6 = $900
%16 maliyet tasarrufu sadece tokenizer'dan.
İngilizce vs Türkçe#
Aynı 300-kelime equivalent İngilizce metin:
- o200k (GPT-4o): ~240 token (Türkçe 430'a karşı)
İngilizce token başına 1.8x daha verimli. Türkçe LLM kullanıcıları aynı bilgi için 1.8x daha çok ödüyor. Bu Türkçe LLM pazarının yapısal problemi.
Çözüm yolları#
- Türkçe-balanced tokenizer: TR-only modellerde o200k yerine custom (Trendyol-LLM pattern).
- Bigger vocab: o200k → o500k (henüz yok ama trend).
- Multilingual-balanced training: corpus'ta Türkçe oranı artır.
- Prompt optimization: gereksiz Türkçe açıklamalar yerine İngilizce reasoning.
python
import tiktoken def estimate_api_cost(text, model="gpt-4o", n_calls=1): """OpenAI API maliyet tahmini.""" enc = tiktoken.encoding_for_model(model) n_tokens = len(enc.encode(text)) # 2026 May fiyatları rates = { "gpt-4o": {"input": 2.5e-6, "output": 10e-6}, "gpt-4o-mini": {"input": 0.15e-6, "output": 0.6e-6}, "gpt-4-turbo": {"input": 10e-6, "output": 30e-6}, } rate = rates.get(model, rates["gpt-4o"]) input_cost = n_tokens * rate["input"] * n_calls print(f"Model: {model}") print(f"Input tokens: {n_tokens}") print(f"Per-call cost: ${n_tokens * rate['input']:.6f}") print(f"For {n_calls} calls: ${input_cost:.2f}") return n_tokens, input_cost # Türkçeturkish_text = """İstanbul'un kalbinde Boğaz'ı geçen vapurlar...""" # 300 wordsestimate_api_cost(turkish_text, "gpt-4o", n_calls=1_000_000)# Token: 430# Per call: $0.001075# 1M calls: $1,075 # İngilizce equivalentenglish_text = """In the heart of Istanbul, ferries crossing the Bosphorus...""" # 300 wordsestimate_api_cost(english_text, "gpt-4o", n_calls=1_000_000)# Token: 240# Per call: $0.0006# 1M calls: $600 print("Türkçe 1.79x daha pahalı!")API maliyet hesaplama: Türkçe ekonomisi
10. Llama-3'ün tiktoken'a Geçişi (2024)#
Llama-2 (2023): SentencePiece BPE 32K#
Meta'nın gelenekselleşmiş seçimi. Multilingual zayıflık.
Llama-3 (2024): tiktoken-style BPE 128K#
Geriye dönüş mu? Aslında ileri:
- SP'nin getirdiği avantajlar (▁ marker, byte fallback) artık önemli değil (byte-level BPE same coverage).
- 4x daha büyük vocab + Meta-trained multilingual corpus → tüm dillerde fertility ciddi düştü.
- Implementation: library, tiktoken-compatible format.
tokenizers
Türkçe fertility comparison#
Llama-2 (SP BPE 32K): 2.4 token/word Llama-3 (tiktoken 128K): 1.6 token/word (-33%) Llama-3.1 (same 128K): 1.6 token/word
Sonuç: Türkçe için Llama-3 önemli upgrade#
Llama-2'den Llama-3'e geçiş aynı zamanda maliyet/performans açısından kazanç. Llama-3 ile aynı Türkçe prompt'u 33% daha az token ile yapabiliyorsun → inference cost düşer, context'e daha çok sığar.
Eko-sistem etkisi#
Meta'nın tiktoken-style'a geçmesi fiili standard olarak konfirme etti. 2025-2026'da yeni LLM'lerin çoğu bu pattern'i benimsedi:
- Mistral
- Cohere Command R
- Anthropic Claude (tokenizer details kapalı, ama benzer pattern)
- Trendyol-LLM (custom variant)
11. ChatGPT Chat Format Special Tokens#
OpenAI chat template special tokens (cl100k, o200k)#
<|im_start|> # <message_start> <|im_end|> # <message_end> <|im_sep|> # <message_separator> <|endoftext|> # <document_end>
Chat format örneği#
<|im_start|>system Sen yardımsever bir asistansın.<|im_end|> <|im_start|>user Merhaba!<|im_end|> <|im_start|>assistant Merhaba! Nasıl yardımcı olabilirim?<|im_end|>
Token IDs (cl100k)#
- : 100264
<|im_start|> - : 100265
<|im_end|> - : 100257
<|endoftext|>
Tüm encoding'lerde aynı mı?#
Hayır. r50k_base'de bu token'lar yok (sadece ID 50256). GPT-2 chat formatı kullanmıyordu, sonradan eklendi.
<|endoftext|>Custom special tokens (chat-finetuning için)#
Open source modeller (Llama-3-Instruct, Mistral-Instruct) farklı format kullanır:
- Llama-3-Instruct: ,
<|begin_of_text|>,<|start_header_id|>,<|end_header_id|><|eot_id|> - Mistral-Instruct: ,
[INST],[/INST],<s></s>
Tehlike: special token leak#
Kullanıcı input'unda string'i geçerse, naive tokenizer onu special token olarak yorumlayabilir → prompt injection.
<|im_end|>Çözüm: tiktoken ve parametreleri:
allowed_specialdisallowed_specialtokens = enc.encode("merhaba <|im_end|> dünya", disallowed_special="all") # Raises error — special token in user input not allowed
12. Egzersizler#
Egzersiz 1#
GPT-2 regex pattern'i , gibi sadece İngilizce apostroflar match ediyor. Türkçe için doğru regex pattern'i yaz. , , , , , , , , , , , , gibi suffix'leri match etsin.
's't'da'de'ta'te'nın'nin'nun'nün'ya'ye'yi'yu'yüEgzersiz 2#
Bytes-to-unicode trick'i niye GPT-2'de var ama modern cl100k'da resmi olarak kullanılmıyor? (İpucu: tiktoken artık raw bytes ile çalışıyor.)
Egzersiz 3#
\p{N}{1,3}Egzersiz 4#
1M Türkçe API call'unun (gpt-4o, ortalama 500 input token) dolar maliyetini hesapla. Aynı içerik o200k yerine cl100k ile kaç % daha pahalı olurdu?
Egzersiz 5#
tiktoken.encoding_for_model("gpt-3.5-turbo")get_encoding("cl100k_base")Egzersiz 6#
Production chat sistemde token'ı kullanıcı input'unda görünürse ne olur? Güvenlik açısından problem ne ve nasıl önlersin?
<|im_end|>✅ Ders 6.6 Özeti — Modern LLM Tokenization Standardı
GPT-2 byte-level BPE + regex pre-tokenizer = modern LLM tokenization'ın temeli. UTF-8 byte üzerinde 256 base vocab + BPE merges sayesinde hiç UNK olmadan multilingual kapsamı. cl100k (100K) → o200k (200K) → Llama-3 (128K) evrim. tiktoken Rust library production fiili standardı. Türkçe için maliyet etkisi: aynı içerik İngilizce'den 1.8x daha pahalı (token başına). o200k bu farkı GPT-2'ye göre %40 azalttı. Production'da: her API çağrısı öncesi token sayımı, chat format special tokens için injection koruması, user-input'tan special tokens filter. Modül 6.7'de Special Tokens, Chat Templates ve ChatML konuları ile devam edeceğiz.
Sıradaki Ders: Special Tokens + Chat Templates + ChatML#
Modül 6.7'de: Modern LLM'lerin "chat" formatlarının altındaki tokenization katmanı — ChatML, Llama-3 instruct format, Mistral [INST], Hugging Face chat templates, role embedding'leri, system prompt anatomisi, multi-turn memory'de token economy.
Frequently Asked Questions
Yes, ~3-6x faster (Rust impl more aggressively optimized). BUT HF tokenizers more flexible (training your own model, custom logic). Production OpenAI workflow: tiktoken. Custom model serving: HF tokenizers.
Yorumlar & Soru-Cevap
(0)Yorum yazmak için giriş yap.
Yorumlar yükleniyor...
Related Content
Module 0: Course Framework & Workshop Setup
Who Is an LLM Engineer? The AI Engineering Career Ladder from Junior to Staff
Start LearningModule 0: Course Framework & Workshop Setup
Course Philosophy: Why This Path, Why This Order — The Skeleton of an 8-Month Curriculum
Start LearningModule 0: Course Framework & Workshop Setup