yazılar
Makine Metni Nasıl Okur? Token ve Embedding
Sunum slaytları →Bu yazı bir serinin parçası: Doğal Dille Veritabanına Soru Sormak — Sıfırdan Text-to-SQL Asistanı. Hedef: “İstanbul’da kaç müşteri var?” diye yazınca doğru SQL’i üretip çalıştıran, hata yaparsa kendi düzelten bir asistan kurmak.
Eğitim slaytları → Ders 1 — Temsil
Bir dil modeline “İstanbul’da kaç müşteri var?” diye sorduğumuzda ne oluyor? Model harfleri, kelimeleri, cümleyi bizim gibi mi görüyor? Hayır. Bu seride veriyle konuşan bir asistan kuracağız; ama önce modelin metni nasıl sayıya çevirdiğini anlamamız gerekiyor. Çünkü bir LLM aslında metinle değil, sayılarla çalışır.
İki temel kavram var: token ve embedding. Biri metni parçalara böler, diğeri o parçalara anlam yükler.
Token: Metni Parçalara Bölmek
Model bir cümleyi kelime kelime değil, token denen parçalar hâlinde okur. Token bazen bir kelimedir, bazen kelimenin bir parçası, bazen tek bir noktalama işareti.
Neden kelime değil de token? Çünkü dünyadaki tüm kelimeleri bir sözlüğe sığdıramazsın — her dil, her yazım hatası, her yeni terim… Bunun yerine model, sık geçen parçalardan oluşan sabit bir “alfabe” kullanır ve her kelimeyi bu parçalardan kurar. “koşuyordum” kelimesini görmese bile “koş”, “uyor”, “dum” parçalarından anlayabilir.
Python’da tiktoken ile bunu canlı görebiliriz:
import tiktoken
enc = tiktoken.get_encoding("cl100k_base")
metin = "İstanbul'da kaç müşteri var?"
tokenlar = enc.encode(metin)
print("Token sayısı:", len(tokenlar))
print("Token ID'leri:", tokenlar)
# Her token'ın karşılığını geri çöz
for t in tokenlar:
print(t, "->", repr(enc.decode([t])))
Çıktıda gördüğün şey şu: cümlemiz bir avuç tam sayıya dönüştü. Model için “İstanbul” bir şehir değil, birkaç token ID’sinden ibaret. İlginç bir detay: Türkçe kelimeler İngilizceye göre daha çok token’a bölünür — çünkü bu alfabeler çoğunlukla İngilizce metinle eğitilmiştir. Bu, Türkçe kullanımın neden biraz daha “pahalı” (daha çok token = daha çok maliyet) olduğunu da açıklıyor.
Kendiniz deneyin: tiktokenizer.vercel.app — cümlenizi yazın, hangi parçalara bölündüğünü renk renk görün. Türkçe bir cümleyle İngilizce karşılığını yan yana deneyin, token farkını gözlemleyin.
Embedding: Parçalara Anlam Yüklemek
Token, metni sayıya çevirdi ama bu sayılar sadece birer kimlik numarası — “İstanbul” = 4832 gibi. Bu numaralar anlam taşımaz; 4832 ile 4833’ün birbirine yakın olması, kelimelerin de yakın olduğu anlamına gelmez.
İşte embedding burada devreye giriyor. Embedding, her kelimeyi (ya da cümleyi) çok boyutlu bir uzayda bir nokta olarak temsil eder — örneğin 384 sayıdan oluşan bir vektör. Bu uzayın sihirli özelliği şu: anlamca yakın şeyler, uzayda da birbirine yakın durur.
- “kral” ile “kraliçe” yakındır.
- “müşteri” ile “kullanıcı” yakındır.
- “müşteri” ile “muz” uzaktır.
Yani embedding, kelimenin anlamını sayılara gömer (İngilizcesi “embed” — gömmek). Bir cümlenin embedding’ini alıp başka bir cümleyle karşılaştırdığımızda, aralarındaki açıyı ölçerek “bunlar ne kadar benzer?” sorusuna sayısal bir cevap verebiliriz. Bu ölçüye kosinüs benzerliği deniyor.
Kavramsal olarak şöyle görünür:
from sentence_transformers import SentenceTransformer, util
model = SentenceTransformer("paraphrase-multilingual-MiniLM-L12-v2")
cumleler = [
"İstanbul'da kaç müşteri var?",
"İstanbul şehrindeki kullanıcı sayısı nedir?", # aynı anlam, farklı kelimeler
"En pahalı ürün hangisi?", # tamamen farklı konu
]
vektorler = model.encode(cumleler)
print("Benzerlik (1 ve 2):", util.cos_sim(vektorler[0], vektorler[1])) # yüksek
print("Benzerlik (1 ve 3):", util.cos_sim(vektorler[0], vektorler[2])) # düşük
İlk iki cümle neredeyse hiç ortak kelime içermiyor ama embedding uzayında birbirine çok yakınlar — çünkü aynı şeyi soruyorlar. Üçüncüsü ise uzakta. Anahtar kelime aramasının (kelime eşleşmesi) yakalayamayacağı bu “anlam yakınlığı”, ilerideki derslerin temelini oluşturacak.
Görselleştirin: projector.tensorflow.org — kelime vektörlerinin 3 boyutlu uzayda nasıl kümelendiğini döndürüp inceleyebilirsiniz.
Neden Bunları Öğrendik?
Çünkü kuracağımız asistanın iki ayağı da bu iki kavrama basıyor:
- Token → Modelin metni nasıl “gördüğünü” ve maliyeti (token = para) anlamamızı sağlıyor.
- Embedding → İlerideki RAG dersinde (Ders 3), kullanıcının sorusuna anlamca en yakın veritabanı tablolarını bulmak için tam olarak bunu kullanacağız. “Doğru tabloyu bulma” işi, aslında bir embedding yakınlık problemi.
Sıradaki yazıda ilk gerçek adımı atıyoruz: bir dil modeline şemayı verip ilk SQL sorgumuzu ürettireceğiz — ve modelin ilk halüsinasyonuyla tanışacağız.
Seri: