Embedding
Anlamı sayıya çeviren temsil
Bir metin, görsel veya sesin anlamını yakalayan vektör temsili.
Bir embedding modeli "kral" gibi bir kelimeyi alır ve onu sabit uzunlukta bir vektör olarak çıktılar. Bu vektör, kelimenin anlamını saklar — "kral" ve "kraliçe" embedding'leri benzerdir.
Anlamsal arama, öneri, kümeleme, RAG — hepsinin altında embedding'ler var. Modern modeller: OpenAI text-embedding-3, Cohere Embed v3, Voyage, BGE, Jina.
Embedding modeli seçimi kritik: dil desteği, boyut (256-3072), bağlam penceresi (girdiye sığacak en fazla token), maliyet (1M token başına $0.02-0.13) modelden modele değişir. Yanlış model = kötü arama = kötü RAG.
Resmi 12 megapikselden 1536 sayıya sıkıştırıyorsun ama o 1536 sayı, "kedi mi köpek mi" sorusuna cevap verecek kadar bilgi taşıyor. Embedding tam olarak budur: detayı atar, anlamı saklar. Kayıplı sıkıştırma — ama doğru şeyi kaybediyor.
Slack mesaj arşivi. "Geçen ay deploy hatasından bahsetmiştim" diye arama yapıyorsun. Klasik arama "deploy" + "hata" anahtar kelimelerini içeren mesajları döner — ama "Cuma günü release patladı" mesajını döndürmez (kelimeler farklı, anlam aynı).
Embedding tabanlı arama: senin sorguna 1536 boyutlu bir vektör üretir; her mesajın vektörü zaten hazır. Kosinüs benzerliği ile en yakın 20 mesaj döner — "release patladı" da içinde.
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 (yakın anlam)
print(cosine(v_king, v_potato)) # ≈ 0.23 (uzak anlam)- Anlamsal arama (tam metin aramasının ötesi)
- RAG için parça (chunk) indeksleme
- Öneri sistemleri (kullanıcı/ürün benzerliği)
- Yinelenen tespiti (yakın ama birebir aynı olmayan içerik)
- Sınıflandırma için özellik olarak kullanma
- Tam metin eşleşmesi (slug, ID, kullanıcı adı)
- Yapısal sorgular (
WHERE created_at > X) - Açıklanabilir karar gerektiğinde
- Model maliyeti yüksek ve veri çok az değişiyor — önbelleklemeyi unutma
Embed et, unut
Embedding modelini güncellediğinde tüm vektörleri yeniden hesaplamak gerekir. Eski ve yeni vektörler aynı uzayda değildir. Göç (migration) planı şart.
Parçalamayı (chunking'i) hafife almak
Tüm dokümanı tek vektörle embed edersen detay kaybolur. 50 sayfayı 1 vektöre sıkıştırmak istemezsin. Uygun parçalama şart.
Türkçe için tek dilli model kullanmak
Sadece İngilizce için eğitilmiş model, Türkçe'de zayıftır. Cohere multilingual ya da BGE-m3 gibi çok dilli modelleri tercih et.