Embedding Semantik Arama Vektör RAG LLM NLP Yapay Zeka Sözlük

Embedding Modelleri Nedir? Metin Benzerliği ve Semantik Aramanın Temelleri

person Yapay Zeka Uzmanı

Google’da “kredi kartı faizi hesaplama” yazıyorsunuz. Çıkan sonuçların başlıklarında bu ifade tam geçmiyor: “aylık kredi maliyeti”, “tüketici kredisi faiz oranı”, “borç hesaplama aracı”… Yine de aradığınız tam da bu. Nasıl?

Cevap embedding. Arama motoru kelimelerin kendisini değil, anlamını eşleştiriyor. Metin sayısal koordinatlara dönüşüyor; anlam bakımından yakın metinler bu uzayda da birbirine yakın duruyor.

Bu yazıda embedding modellerinin ne olduğunu, nasıl çalıştığını, hangi modellerin öne çıktığını ve Python’da nasıl kullanacağınızı ele alıyoruz.

Embedding nedir?

Embedding, bir metni (kelime, cümle ya da belge) n-boyutlu sayısal bir vektöre dönüştürmektir. Bu vektörler metnin anlamını matematiksel bir uzayda nokta olarak temsil eder. Anlam bakımından yakın metinler bu uzayda birbirine yakın, uzak olanlar birbirinden uzak konumlanır.

“Anlam koordinatı” gibi düşünebilirsiniz. “Elma” ile “armut” aynı nokta değildir; ama her ikisi de “bisiklet” ya da “uzay mekiği”nden çok daha yakın mesafededir.

Sözlük tanımı: Embedding, doğal dil öğelerini (kelime, cümle, belge) sabit boyutlu gerçek sayılar vektörüne dönüştüren bir fonksiyondur. Anlam bilgisini sayısal geometriye çevirir.

Neden sayıya ihtiyaç var? Bilgisayar kelime anlamıyor

Klasik arama motorları BM25 gibi algoritmalar kullanır. Aradığınız kelime belgede geçiyorsa ilgili, geçmiyorsa ilgisiz sayılır. Ama “kalp krizi” ile “miyokard enfarktüsü” aynı şeydir; BM25 bunu bilmez.

One-hot encoding kelimeleri birbirinden tamamen bağımsız binary vektörler olarak temsil eder. Yüz bin kelimelik bir sözlükte “kedi” bir konumda 1, geri kalan konumlarda 0’dır. Bu yapı anlam ilişkisini taşımaz; “kedi” ile “pisi” arasındaki mesafe, “kedi” ile “uçak” arasındaki mesafeyle aynıdır.

Word2Vec bu problemi 2013’te kısmen çözdü. Bağlamdan öğrenen sinir ağı mimarisi, “Kral - Erkek + Kadın = Kraliçe” gibi anlamsal aritmetiğe kapı araladı. Ancak Word2Vec bağlam duyarsızdır: “banka” kelimesinin “nehir kıyısı”nda mı yoksa “finans kurumu”nda mı kullanıldığını ayırt edemez.

Modern embedding modelleri bu sorunu aştı.

Embedding nasıl üretilir?

Transformer tabanlı encoder modeller

Günümüz embedding modellerinin büyük çoğunluğu Transformer mimarisine dayalı encoder modellerdir. BERT ve türevleri, bir cümleyi her tokenin hem önceki hem sonraki tokenleri gördüğü çift yönlü dikkat mekanizmasıyla işler.

Semantik benzerlik için kullanılan bi-encoder mimarisi iki metni bağımsız olarak encode eder. Her biri ayrı bir vektör üretir; benzerlik bu vektörler arasındaki mesafe ile ölçülür. Büyük ölçekte hızlı çalışır, çünkü belgeleri önceden hesaplayıp saklayabilirsiniz.

Cümle embedding ile kelime embedding farkına dikkat edin. Kelime embedding belirli bir tokenin vektörünü üretirken, cümle embedding tüm girişi tek bir noktada özetler. RAG ve semantik arama uygulamalarında genellikle cümle ya da belge embedding kullanılır.

Popüler embedding modelleri (2025-2026)

ModelBoyutMTEB SkoruAçık Kaynak?Çok Dilli?
OpenAI text-embedding-3-small1536 (ayarlanabilir)~62HayırKısmi
OpenAI text-embedding-3-large3072 (ayarlanabilir)~64HayırKısmi
Cohere Embed v3 (multilingual)1024~63HayırEvet (100+ dil)
voyage-3 (Voyage AI)1024~68HayırKısmi
BAAI/bge-m31024~64EvetEvet (100+ dil)

voyage-3, MTEB İngilizce liderlik tablosunda uzun süre üst sıralarda yer aldı. BAAI/bge-m3 ise Türkçe dahil 100’den fazla dilde çalışan açık kaynak seçenek olarak üretimde yaygın biçimde kullanılıyor.

Metin embedding süreci: kelimeler ve cümleler yüksek boyutlu vektör uzayında birbirine yakın veya uzak parıldayan noktalara dönüşür

Kosinüs benzerliği: anlamı ölçmek

İki vektörü karşılaştırmak için en yaygın metrik kosinüs benzerliğidir. Vektörlerin büyüklüğü değil, aralarındaki açı ölçülür. Açı küçüldükçe benzerlik 1’e yaklaşır; büyüdükçe 0’a, tam zıt yönlerde ise -1’e düşer.

from sentence_transformers import SentenceTransformer
from sklearn.metrics.pairwise import cosine_similarity

model = SentenceTransformer("BAAI/bge-m3")

sentences = [
    "Yarın İstanbul'da yağmur bekleniyor.",
    "İstanbul hava durumu yarın yağışlı.",
    "En iyi pizza hamuru nasıl yapılır?",
]

embeddings = model.encode(sentences)

scores = cosine_similarity([embeddings[0]], embeddings[1:])[0]
for i, score in enumerate(scores):
    print(f"Cümle {i+2} benzerliği: {score:.4f}")

# Çıktı:
# Cümle 2 benzerliği: 0.9312   <- semantik olarak yakın
# Cümle 3 benzerliği: 0.1847   <- tamamen farklı konu

“Kral - Erkek + Kadın = Kraliçe” örneği, vektör uzayında anlam aritmetiğinin çalıştığını gösterir. Kelimeler rastgele konumlandırılmamış; anlamsal ilişkiler geometriye yansımış.

Embedding’in gerçek dünya kullanım alanları

RAG pipeline’ında embedding

RAG (Retrieval-Augmented Generation), bir LLM’in harici bilgi tabanından bilgi çekip yanıt ürettiği bir mimaridir. Embedding bu mimarinin merkezinde durur.

Pipeline şöyle çalışır: belgeleri parçalara (chunk) böl, her parçayı embedding modeline gönder ve vektör al, vektörleri bir vektör veritabanında sakla, kullanıcı sorusunu embed et, en yakın vektörleri veritabanından çek (retrieve), bu parçaları LLM’e bağlam olarak ver ve yanıt üret.

RAG’in nasıl çalıştığına dair daha ayrıntılı bir anlatım için bu yazıya bakabilirsiniz.

Semantik arama

E-ticaret sitelerinde “kışlık bot” yazdığınızda “soğuk hava ayakkabısı” veya “kar botu” sonuçlarının da çıkması bunun bir ürünüdür. Destek botları, sözleşme arama sistemleri, akademik makale tarayıcıları aynı teknolojiyi kullanır.

Duplikat tespiti ve kümeleme

İki müşteri yorumu aynı şikayeti farklı kelimelerle mi dile getiriyor? İki haber aynı olayı mı aktarıyor? Embedding benzerlik skoru bir eşik değeri belirlenerek otomatik kümeleme ve duplikat filtreleme yapmak mümkün.

Öneri sistemleri

Bir makaleyi okuyan kullanıcıya içerik tabanlı filtreleme ile öneri sunulur. Her içerik embed edilir; kullanıcının son okuduğuna en yakın vektörler önerilir.

RAG pipeline diyagramı: belgeler vektörlere dönüşür, vektör veritabanında saklanır, kullanıcı sorgusu da vektöre çevrilip en yakın belgeler LLM'e iletilir

Embedding boyutu: büyük mü, küçük mü?

Daha yüksek boyut genellikle daha fazla anlam bilgisi demektir, ama hesaplama ve depolama maliyeti doğrusal artar. 3072 boyutlu OpenAI text-embedding-3-large ile 1536 boyutlu text-embedding-3-small arasındaki doğruluk farkı pratikte çoğunlukla küçük kalır.

Matryoshka Representation Learning (MRL), OpenAI’nin text-embedding-3 serisinde kullandığı bir teknik. Aynı model 256’dan 3072’ye kadar farklı boyutlarda tutarlı vektörler üretiyor. Hız öncelikli sistemlerde boyutu küçük tutup maliyeti düşürmek, hassasiyet gereken yerlerde artırmak mümkün.

Pratik kural: geliştirme aşamasında 256-512 boyutla başlayın, ölçeğe geçerken 768-1024 aralığını değerlendirin. 3072 boyut gerçekten nadir gerekir.

Türkçe için embedding

Türkçe, biçim açısından karmaşık bir dil. Soneklerin üst üste eklenmesiyle oluşan geniş morfoloji, tokenizasyondan embedding kalitesine kadar her katmanda zorluk çıkarır.

BAAI/bge-m3 100’den fazla dilde çalışır ve Türkçe için tatmin edici sonuçlar verir. Cohere Embed v3 Multilingual da bu kategoride güçlü bir seçenek. Her ikisi de Türkçe testlerde makul kosinüs benzerlik skorları üretiyor; İngilizce performanslarının biraz gerisinde kalıyorlar.

Türkçe için özel bir MTEB benchmark’ı henüz yok. Modelleri karşılaştırmanın tek yolu kendi veri setinizle test etmek. Öneri: alan kelimelerinizi içeren 50-100 cümlelik küçük bir test seti oluşturun, insan değerlendirmesiyle en iyi modeli belirleyin.

from sentence_transformers import SentenceTransformer
from sklearn.metrics.pairwise import cosine_similarity

model = SentenceTransformer("BAAI/bge-m3")

tr = "Yapay zeka modelleri büyük miktarda veri ile eğitilir."
en = "Artificial intelligence models are trained with large amounts of data."
unrelated = "Akdeniz mutfağında zeytinyağı vazgeçilmezdir."

vecs = model.encode([tr, en, unrelated])
print(f"TR-EN benzerlik: {cosine_similarity([vecs[0]], [vecs[1]])[0][0]:.4f}")
print(f"TR-Alakasız:    {cosine_similarity([vecs[0]], [vecs[2]])[0][0]:.4f}")

# Çıktı (bge-m3):
# TR-EN benzerlik: 0.8901   <- çapraz dil semantik eşleşme
# TR-Alakasız:    0.2341

Fine-tuned embedding: ne zaman gerekli?

Genel amaçlı modeller çoğu durumda yeterlidir. Tıbbi teşhis raporları, hukuki sözleşmeler veya finans dokümanları gibi alanlarda ise genel modeller yetersiz kalabilir.

“Miyokard enfarktüsü” ile “kalp krizi” genel bir modelde yeterince yakın görünmeyebilir. Tıbbi metinler üzerinde ince ayar yapılmış bir model bu iki ifadeyi çok daha yakın konumlandırır.

Sentence Transformers kütüphanesi, kendi veri setinizle mevcut bir modeli ince ayarlamak için en erişilebilir araçtır. Pozitif çift örnekleri (benzer anlam taşıyan iki metin) yeterince toplandığında birkaç epoch’ta anlamlı iyileşme elde edilebilir.

Embedding vs tam metin arama: ne zaman hangisi?

KriterBM25 (keyword)Embedding (semantic)
HızÇok hızlıOrta (vektör hesaplama)
Anlam eşleştirmeZayıfGüçlü
Tam eşleşme hassasiyetiYüksekOrta
Kuruluş maliyetiDüşükOrta-yüksek
Çok dilli destekDil bağımlıGüçlü (çok dilli modeller)

BM25 ile embedding birbirinin yerini almaz; hybrid search ikisini birleştirir. BM25 tam kelime eşleşmelerini, embedding anlam yakınlığını yakalar. Üretim sistemlerinde hybrid yaklaşım tek başına her iki yöntemden de genellikle daha iyi sonuç verir.

Vektör veritabanları ve hybrid arama hakkında daha fazla bilgi için bu yazıya bakabilirsiniz.

Hızlı başlangıç: Python’da ilk embedding

OpenAI ile

from openai import OpenAI
import numpy as np

client = OpenAI()

def embed(text: str) -> list[float]:
    response = client.embeddings.create(
        model="text-embedding-3-small",
        input=text,
        dimensions=512,  # MRL: isteğe bağlı küçültme
    )
    return response.data[0].embedding

vec1 = embed("Python programlama dili nasıl öğrenilir?")
vec2 = embed("Python'a nasıl başlanır?")
vec3 = embed("Asya mutfağında kullanılan baharatlar neler?")

def cosine_sim(a, b):
    a, b = np.array(a), np.array(b)
    return float(np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b)))

print(f"Benzer cümleler: {cosine_sim(vec1, vec2):.4f}")   # ~0.92+
print(f"Farklı konu:     {cosine_sim(vec1, vec3):.4f}")   # ~0.15

Açık kaynak: Sentence Transformers

from sentence_transformers import SentenceTransformer, util

model = SentenceTransformer("BAAI/bge-m3")  # ilk çalıştırmada model indirilir

query = "makine öğrenmesi nedir"
corpus = [
    "Makine öğrenmesi, sistemlerin veriden otomatik öğrenmesini inceler.",
    "Derin öğrenme, yapay sinir ağlarını kullanan bir ML alt alanıdır.",
    "İstanbul Boğazı iki kıtayı birbirine bağlar.",
]

query_vec = model.encode(query, convert_to_tensor=True)
corpus_vecs = model.encode(corpus, convert_to_tensor=True)

scores = util.cos_sim(query_vec, corpus_vecs)[0]
for i, score in enumerate(scores):
    print(f"[{score:.4f}] {corpus[i]}")

# [0.8734] Makine öğrenmesi, sistemlerin veriden...
# [0.7651] Derin öğrenme, yapay sinir ağlarını...
# [0.1203] İstanbul Boğazı iki kıtayı...

Bir adım sonrası

Embedding, RAG pipeline’ının ilk halkasıdır; bu halkayı anlamadan vektör veritabanı veya LLM entegrasyonu soyut kalır.

Embedding modeli seçimi, hangi vektör veritabanını kullandığınızdan bağımsız bir karardır. Bu ikisini doğru eşleştirmek, arama sisteminizin hem maliyet hem doğruluk dengesi üzerinde belirleyici etkiye sahiptir.