Skip to content

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
GPT-2/GPT-4 Byte-Level BPE + tiktoken Regex: Modern Standardın Anatomisi
🪙 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ı#

  1. Tarihsel kontekst: GPT-2 (2019) → GPT-3 → GPT-3.5 (cl100k) → GPT-4o (o200k)
  2. Byte-level BPE mantığı: UTF-8 byte'lar → 256 base vocab
  3. Niye byte-level: UNK eliminasyonu + reversibility
  4. GPT-2 regex pattern'i satır satır:
    's|'t|...
  5. GPT-4 cl100k regex: değişiklikler ve sebepleri
  6. GPT-4o o200k: 200K vocab + multilingual genişleme
  7. tiktoken library: API ve Rust performansı
  8. Token counting — niye API çağrısı öncesi şart
  9. Türkçe maliyet ekonomisi — gerçek sayılar
  10. Llama-3'ün tiktoken'a geçişi — sebep ve etki
  11. Special tokens: ChatGPT chat format'ı
  12. 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
encoder.json
dosyasında
"Ġand": 290
gibi entry'ler vardır — bu aslında
" and"
(space + "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]))
 
# Usage
byte_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)) == x
her zaman. Round-trip garantili. WordPiece (UNK üretebilir) ve klasik BPE'de (Unicode'da OOV) bu garanti yok.

3.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
İstanbul'da
için bu pattern
'da
match etmez (sadece sıralı 7 form var).

Token 8:
?\p{L}+
#

  • ?
    = opsiyonel space
  • \p{L}
    = Unicode letter category (her dildeki harf)
  • +
    = 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} = 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}]+
#

  • Whitespace, letter, digit OLMAYAN karakterler (yani punctuation, symbols)
"!" → matches "!" "!!!" → matches "!!!" " -" → matches " -"

Token 11:
\s+(?!\S)
#

  • Whitespace ending at end-of-string (negative lookahead: not followed by non-whitespace)
"hello " → trailing whitespace match

Token 12:
\s+
#

  • Any whitespace (catch-all)

Etkileri#

  1. Space token'a önek olarak gelir:
    merhaba
    tek token (vocab'da
    Ġmerhaba
    olarak). Bu vocab'ı 2x büyütmüş gibi (her word'ün hem solo hem space-prefixed versiyonu var).
  2. Number splitting: "2026-05-12" → ["2026", "-", "05", "-", "12"] (4 token).
  3. Apostrophe English-only: Türkçe
    'da
    ,
    'nın
    ayrı token olur.
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#

  1. (?i:...)
    — case-insensitive apostroflar. "It's" ve "it's" aynı işlenir.
  2. [^\r\n\p{L}\p{N}]?\p{L}+
    — letter'lar opsiyonel pre-char ile match (whitespace yerine). Bu Çince, Japonca gibi whitespace'siz dilleri better handle.
  3. \p{N}{1,3}
    — 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"["1,000,000" → ["1", ",000", ",000"] etc.).
  4. [\r\n]*
    — punctuation sonrası newline'lar ekli.
  5. \s*[\r\n]+
    — explicit newline handling.

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 tiktoken
import tiktoken
 
# Encoding seçimi
enc = tiktoken.get_encoding("o200k_base")
# Alternatif: tiktoken.encoding_for_model("gpt-4o")
 
# Encode
text = "İstanbul Boğazı'nda balıkçı tekneleri sallanıyor."
tokens = enc.encode(text)
print(tokens)
# [4234, 23456, ...] (token IDs)
 
print(len(tokens)) # 9 (approx)
 
# Decode
decoded = 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ırma
encodings = ["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#

tiktokenHF tokenizers
ImplementationRustRust
OpenAI native❌ (load gerekir)
Custom training
Speed3-6x fasterSlower
Vocab formattiktoken/BPEtokenizer.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ı#

TokenizerTokenToken/wordToken/char
r50k (GPT-2)~7202.400.40
cl100k (GPT-4)~5101.700.28
o200k (GPT-4o)~4301.430.24
Llama-3 128K~4401.470.24
Trendyol-LLM 32K~3601.200.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ı#

  1. Türkçe-balanced tokenizer: TR-only modellerde o200k yerine custom (Trendyol-LLM pattern).
  2. Bigger vocab: o200k → o500k (henüz yok ama trend).
  3. Multilingual-balanced training: corpus'ta Türkçe oranı artır.
  4. 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çe
turkish_text = """İstanbul'un kalbinde Boğaz'ı geçen vapurlar...""" # 300 words
estimate_api_cost(turkish_text, "gpt-4o", n_calls=1_000_000)
# Token: 430
# Per call: $0.001075
# 1M calls: $1,075
 
# İngilizce equivalent
english_text = """In the heart of Istanbul, ferries crossing the Bosphorus...""" # 300 words
estimate_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:
    tokenizers
    library, tiktoken-compatible format.

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)#

  • <|im_start|>
    : 100264
  • <|im_end|>
    : 100265
  • <|endoftext|>
    : 100257

Tüm encoding'lerde aynı mı?#

Hayır. r50k_base'de bu token'lar yok (sadece
<|endoftext|>
ID 50256). GPT-2 chat formatı kullanmıyordu, sonradan eklendi.

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
<|im_end|>
string'i geçerse, naive tokenizer onu special token olarak yorumlayabilir → prompt injection.
Çözüm: tiktoken
allowed_special
ve
disallowed_special
parametreleri:
tokens = 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
's
,
't
gibi sadece İngilizce apostroflar match ediyor. Türkçe için doğru regex pattern'i yaz.
'da
,
'de
,
'ta
,
'te
,
'nın
,
'nin
,
'nun
,
'nün
,
'ya
,
'ye
,
'yi
,
'yu
,
'yü
gibi suffix'leri match etsin.

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}
limit'inin sayısal reasoning'e etkisini açıkla. 1234 + 5678 = ? sorusu için modelin "fertility" değişir mi?

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")
ne döner? Niye
get_encoding("cl100k_base")
ile aynı sonuç?

Egzersiz 6#

Production chat sistemde
<|im_end|>
token'ı kullanıcı input'unda görünürse ne olur? Güvenlik açısından problem ne ve nasıl önlersin?
✅ 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