Embedding
Anlamın sayılarla temsili
Metin, görsel veya sesin anlamını yakalayan vektör temsili.
Bir embedding modeli, "kral" gibi bir kelimeyi alır ve sabit uzunlukta bir vektör olarak temsil eder. Bu vektör, kelimenin anlamını kodlar — örneğin "kral" ve "kraliçe" embedding'leri birbirine yakındır.
Anlamsal arama, öneri sistemleri, kümeleme, RAG — hepsinin temelinde embedding'ler bulunur. Modern modeller: OpenAI text-embedding-3, Cohere Embed v3, Voyage, BGE, Jina.
Model seçimi kritiktir: dil desteği, vektör boyutu (256–3072), bağlam penceresi (maksimum giriş token sayısı) ve maliyet (1M token başına $0.02–0.13) modelden modele değişir. Yanlış model seçimi = zayıf arama = başarısız RAG.
12 megapiksellik bir fotoğrafı 1536 sayıya indiriyorsun, ama bu 1536 sayı hâlâ "kedi mi köpek mi?" sorusunu cevaplayacak kadar bilgi taşıyor. Embedding tam olarak budur: ayrıntıyı azaltır, anlamı korur. Kayıplı sıkıştırmadır — ama doğru bilgiyi koruyacak şekilde kayıp yaşatır.
Bir Slack mesaj arşivi düşün. "Geçen ay deploy hatasından bahsetmiştim" diye arama yapıyorsun. Klasik arama, "deploy" ve "hata" kelimelerini içeren mesajları getirir — ancak "Cuma günü release patladı" mesajını getirmez (kelimeler farklı, anlam aynı).
Embedding tabanlı arama ise sorgunu bir vektöre dönüştürür; her mesajın vektörü zaten hazırdır. Kosinüs benzerliği ile en yakın 20 mesaj döndürülür — "release patladı" da bunların içinde olur.
from openai import OpenAI
import numpy as np
client = OpenAI()
def embed(text: str) -> np.ndarray:
resp = client.embeddings.create(
model="text-embedding-3-small",
input=text,
)
return np.array(resp.data[0].embedding)
def cosine(a: np.ndarray, b: np.ndarray) -> float:
return float(np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b)))
v_king = embed("king")
v_queen = embed("queen")
v_potato = embed("potato")
print(cosine(v_king, v_queen)) # ≈ 0.78 (anlamsal olarak yakın)
print(cosine(v_king, v_potato)) # ≈ 0.23 (anlamsal olarak uzak)- Anlamsal arama (tam metin aramasının ötesinde)
- RAG için veri parçalarını (chunk) indeksleme
- Öneri sistemleri (kullanıcı/ürün benzerliği)
- Yinelenen içerik tespiti (birebir aynı olmayan ama benzer içerikler)
- Sınıflandırma için özellik (feature) olarak kullanma
- Tam metin eşleşmesi gereken durumlar (slug, ID, kullanıcı adı)
-
Yapısal sorgular (
WHERE created_at > Xgibi) - Kararların açıklanabilir olması gereken durumlar
- Model maliyeti yüksek ve veri nadiren değişiyorsa — önbellekleme yapmayı unutma
Embed edip unutmak
Embedding modelini güncellediğinde tüm vektörleri yeniden oluşturman gerekir. Eski ve yeni vektörler aynı uzayda değildir. Bu yüzden bir geçiş (migration) planı şarttır.
Parçalamayı (chunking) hafife almak
Tüm dokümanı tek bir vektör olarak embed etmek detay kaybına yol açar. 50 sayfayı tek bir vektöre sıkıştırmak istemezsin. Doğru parçalama kritik öneme sahiptir.
Türkçe için tek dilli model kullanmak
Sadece İngilizce için eğitilmiş modeller Türkçe performansında zayıf kalır. Cohere multilingual veya BGE-m3 gibi çok dilli modeller tercih edilmelidir.