2. ünite / 10 · 4 saat
Gömmeler ve anlamsal benzerlik
Metni sayı vektörüne çevirmek, kosinüs benzerliği, en yakın komşu araması ve yüksek boyutu düzlemde görmek.
Bu ünitenin sonunda
- Gömme vektörünün ne olduğunu ve nereden geldiğini açıklamak
- Kosinüs benzerliğini elle ve kodla hesaplamak
- Bir soruya en yakın cümleleri vektör aramasıyla bulmak
- Öğretim gömmesinin sınırını (yüzey ve anlam farkı) göstermek
Ders notları
Gömme (embedding), bir metni sabit uzunlukta bir sayı vektörüne çeviren fonksiyondur. İyi bir gömme modelinde anlamca yakın metinler uzayda yakın düşer: "batarya kaç volta inebilir" ile "hücre gerilimi alt sınırı" farklı kelimelerle aynı şeyi sorar ve vektörleri benzer olur.
Benzerliği ölçmek
Kosinüs benzerliği iki vektör arasındaki açıya bakar, uzunluğa değil: 1 aynı yön, 0 ilgisiz, negatif zıt yön demektir. Vektörler birim uzunluğa getirilmişse kosinüs basit bir nokta çarpımıdır; vektör veritabanları bu yüzden çoğu zaman normalize vektör saklar.
Bu dersteki öğretim gömmesi
Gerçek gömme modelleri milyarlarca cümleyle eğitilmiş sinir ağlarıdır ve bir sağlayıcının API'si ya da açık bir model üzerinden çağrılır. Bu sayfa hiçbir dış servise istek göndermediği için simülasyonlar küçük bir öğretim gömmesi kullanır: metni kelime gövdelerine ve harf üçlülerine böler, her özelliği sabit bir karma fonksiyonuyla 64 boyuttan birine atar ve toplar (hashing trick).
- Deterministiktir: aynı metin her zaman aynı vektörü verir, eğitim gerekmez.
- Yüzey örtüşmesini yakalar: ortak kelime ya da ek paylaşan cümleler yakın düşer.
- Anlamı yakalamaz: eş anlamlı ama farklı yazılan cümleler uzak kalabilir. Bu sınırı simülasyonda bilerek göreceksin.
Düzlemde görmek
64 boyut ekrana sığmaz. PCA, verinin en çok yayıldığı iki yönü bulur ve noktaları bu düzleme izdüşürür. İzdüşümde yakın görünen iki nokta gerçekte uzak olabilir; mesafeyi her zaman tam vektörde ölç.
Simülasyon
Öğretim modeli: bu sayfadaki simülasyonlar gerçek bir dil modeli değildir. Küçük, deterministik, tarayıcıda çalışan modellerdir; kavramı göstermek için yazıldılar. Site hiçbir dış LLM servisine istek göndermez.
Gömme ve benzerlik: 2B izdüşüm görüntüleyici
Ders notlarından alınmış cümleler öğretim amaçlı bir gömme fonksiyonuyla 64 boyutlu vektörlere çevrilir ve PCA ile düzleme izdüşürülür. Bir soru yaz: noktası haritada belirir, en yakın üç cümle kosinüs benzerliğiyle listelenir. Özellik türünü (kelime, harf üçlüsü) değiştir ve komşuların nasıl değiştiğine bak.
3B gömme uzayı: 64 boyuttan üç eksene
Aynı öğretim gömmesi bu kez PCA ile üç eksene izdüşürülür; her nokta bir ders notu cümlesi, renk notun konusudur. Sorunu yaz: sorgu noktası uzayda yerine kayar, en yakın k cümleye kosinüs puanlı çizgiler uzanır. Sürükleyerek döndür, iki parmakla yakınlaş; 2B düğmesi üçüncü ekseni bastırıp 2B görüntüleyicinin düzlemine iner.
Kendin dene
Gömme görüntüleyicide "LiPo hücre gerilimi en az kaç volt olmalı?" sorusunun en yakın üç cümlesine bak. Sonra aynı soruyu "Batarya kaç volta kadar boşaltılabilir?" diye yeniden yaz: komşular değişti mi, neden? Özellik türünü "Yalnız harf üçlüsü" yapıp ekleri farklı kelimelerin nasıl yakınlaştığını gözle. Bulduğun bir başarısızlığı (anlamca yakın ama uzak düşen cümle) not et.
Kod
Bunları kendi bilgisayarında çalıştır. Anahtar ANTHROPIC_API_KEY ortam değişkeninden okunur; koda asla yazma.
# Anthropic gömme uç noktası sunmaz; burada açık kaynak, çok dilli bir model yerelde çalışır.
# pip install sentence-transformers numpy
import numpy as np
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2")
sentences = [
"LiPo hücre 3,0 V altına indirilmemelidir.",
"I2C hattında SDA veri, SCL saat hattıdır.",
"PID denetleyicide türev terim aşımı azaltır.",
"Dönem projesi 12. haftanın cuma günü teslim edilir.",
]
# normalize_embeddings=True: her vektörün boyu 1, kosinüs = iç çarpım
E = model.encode(sentences, normalize_embeddings=True)
def search(query, k=2):
q = model.encode([query], normalize_embeddings=True)[0]
scores = E @ q
order = np.argsort(-scores)[:k]
return [(round(float(scores[i]), 3), sentences[i]) for i in order]
print(search("Batarya kaç volta kadar boşaltılabilir?"))
print(search("Proje teslim tarihi ne?"))const dot = (a, b) => a.reduce((s, x, i) => s + x * b[i], 0)
const norm = (a) => Math.sqrt(dot(a, a))
// Kosinüs: yönlere bakar, boya bakmaz; -1 ile 1 arasında
const cosine = (a, b) => dot(a, b) / (norm(a) * norm(b) || 1)
// Oyuncak 4 boyutlu vektörler: [elektrik, batarya, denetim, ders kuralı]
const docs = {
ohm: [0.9, 0.2, 0.1, 0.0],
lipo: [0.4, 0.9, 0.0, 0.1],
pid: [0.1, 0.0, 0.95, 0.0],
kurallar: [0.0, 0.0, 0.1, 0.95],
}
function nearest(query, k = 2) {
return Object.entries(docs)
.map(([id, v]) => [id, +cosine(query, v).toFixed(3)])
.sort((x, y) => y[1] - x[1])
.slice(0, k)
}
console.log(nearest([0.3, 0.8, 0.0, 0.0])) // batarya sorusu
console.log(nearest([0.0, 0.1, 0.0, 1.0])) // teslim tarihi sorusuSık yapılan hatalar
- PCA izdüşümündeki görsel mesafeyi gerçek benzerlik sanmak: arama tam vektörde yapılır.
- Farklı gömme modellerinin vektörlerini aynı dizinde karıştırmak: boyutlar ve uzaylar uyuşmaz.
- Belgeleri bir modelle, soruları başka bir modelle gömmek.
- Benzerlik eşiğini bir kez seçip veri değişince yeniden ölçmemek.
Yazılım mühendisliği bağlantısı
Gömme bir sürümlü artefakttır: model değişirse tüm dizin yeniden üretilir.
- Dizinde her vektörün yanında gömme modelinin adı ve sürümü saklansın; karışık sürüm sorgusu hata versin.
- Küçük bir altın küme (soru ve beklenen en yakın belge) tut ve gömme değişikliğinden sonra isabet oranını otomatik ölç.
Kendini sına
İki birim vektörün nokta çarpımı 0,92. Kosinüs benzerliği kaçtır?
Kosinüs benzerliği neden vektör uzunluğundan bağımsızdır?
Bu dersteki öğretim gömmesi hangi durumda yanılır?
Belgeleri yeni bir gömme modeline geçirirken ne yapılmalı?