Ana içeriğe geç

MongoDB'de Gömlemeleri Saklama ve Sorgulama

Atlas Vector Search kullanarak MongoDB'de gömlemeleri nasıl saklayacağınızı, indeksleyeceğinizi ve sorgulayacağınızı öğrenin.
· 8 dk. oku

Yapay Zeka ile Keşfedin

LLM'lerin ve anlamsal aramanın yükselişi, arama, öneri ve getirme sistemlerini nasıl kurduğumuzu kökten değiştirdi. Geleneksel anahtar kelime araması—ister SQL LIKE ile, ister Lucene inverted ya da tam metin indeksleriyle olsun—kullanıcılar doğal dil anlama beklediğinde giderek yetersiz kalıyor.

İşte bu noktada gömlemeler (embeddings) ve vektör veritabanları devreye giriyor.

MongoDB bu alanda Atlas Vector Search ile hızla evrildi ve geliştiricilere belgeler + meta veriler + vektörler için tek bir veritabanı—tek bir API altında—sundu. Bu rehberde şunları ele alacağız:

  • MongoDB nedir.
  • Sorgu gömlemeleri nedir ve neden önemlidir.
  • Gömlemeleri ne zaman kullanmalısınız.
  • Gömlemeler MongoDB'de nasıl saklanır.
  • Bunları Python ile nasıl oluşturup sorgularsınız.

Bu eğitim uygulamalıdır ve geri getirme ile zenginleştirilmiş üretim (RAG), benzerlik araması veya öneri hattınıza entegre etmeye hazırdır.

MongoDB nedir?

MongoDB, verileri esnek BSON belgelerde saklayan belge odaklı bir NoSQL veritabanıdır—BSON, yaygın olarak web tabanlı uygulamalarda veri iletimi ve depolaması için kullanılan metinsel bir nesne gösterimi olan JavaScript Object Notation'ın (JSON) ikili kodlanmış halidir. Katı ilişkisel veritabanlarının aksine, MongoDB şema evrimini basitleştirir ve şunları sunar:

  • Yatay ölçeklenebilirlik (parçalama).
  • Zengin toplu işleme (aggregation) çerçevesi.
  • Tam metin arama.
  • Vektör araması.
  • Zaman serisi koleksiyonları.
  • Şema esnekliği.

Tamamen yönetilen bulut hizmeti olan MongoDB Atlas, bunları şu özelliklerle genişletir:

  • Atlas Search (Lucene üzerine inşa edilmiştir).
  • Atlas Vector Search (HNSW indekslemesiyle anlamsal arama).
  • Otomatik ölçekleme, yedekleme, güvenlik ve izleme.

Vektörler sıklıkla meta verilerle yan yana bulunduğu ve MongoDB Atlas bunların hepsini tek bir sistemde topladığı için, MongoDB yapay zeka iş yükleri için güçlü bir seçenek haline geldi.

Gömlemeler Nedir ve Neden Sorgu Gömlemelerini Kullanırız?

Yapay zeka uygulamalarında arama veya getirme ile çalışırken, karşılaştığınız ilk kavramlardan biri gömlemelerdir (embeddings). 

Bir gömme, özünde bir metnin (veya görsel, ses vb.) anlamını yakalayan, kayan noktalı değerlerden oluşan uzun bir listedir. Tam sözcüklere bakmak yerine, gömlemeler metni, benzer fikirlerin birbirine yakın düştüğü bir vektör uzayına eşler. Örneğin, üç farklı kullanıcı ifadesini düşünün:

  • Faturalandırma sorunu
  • Ödeme hatası
  • Maaş yatmadı

Kelimeler farklı olsa da üçü de finansal bir sorunu tarif ediyor. İyi bir gömme modeli, bu metinleri vektör uzayında birbirine yakın konumlandırır; böylece anahtar kelimelere değil, anlama dayalı olarak bunları getirebilirsiniz.

Bu, kullanıcı bir arama yaptığında özellikle önemlidir. Yazdıkları metin—“Maaşım neden gecikti?”—de bir gömmeye dönüştürülür. Bu yeni vektöre sorgu gömlemesi denir. Ardından bu sorgu vektörünü, hangi belgelerin anlamsal olarak benzer olduğunu bulmak için tüm saklanan gömlemelerle karşılaştırırsınız. Vektörler ne kadar yakınsa, sonuç o kadar alakalıdır.

MongoDB Atlas, bu iş akışının tamamını Atlas Vector Search ile son derece basitleştirir. Belgelerinizi ve gömlemelerini bir MongoDB koleksiyonunda sakladıktan sonra Atlas, ölçekli bir şekilde benzer belgeleri hızla getirebilen bir vektör indeksi (arka planda HNSW kullanır) oluşturur. Örneğin, destek makalelerini gömlemeleriyle saklarsanız, şöyle bir sorgu…

query = "Why isn't my salary showing up this month?"
query_vec = get_embedding(query) # Explained in below examples

…doğrudan MongoDB'de kullanılabilir:

results = collection.aggregate([
    {
        "$vectorSearch": {
            "path": "embedding",
            "queryVector": query_vec,
            "index": "vector_index",
            "limit": 3
        }
    }
])

MongoDB, anahtar kelime eşleme ya da manuel puanlama yapmanıza gerek kalmadan, gömlemeleri sorguya en yakın olan ilk 3 destek makalesini otomatik olarak döndürür.

MongoDB Atlas'taki gömlemelerin gücü budur: yalnızca metni değil, anlamı saklarsınız ve yalnızca sözcüklere değil, amaca göre sorgularsınız. Bu dönüşüm, gömlemelerin anlamsal arama, RAG sistemleri, yapay zeka asistanları ve akıllı bilgi tabanları için temel bir yapı taşı haline gelmesinin nedenidir.

Sorgu Gömlemelerini Ne Zaman Kullanmalı

Şunu istediğinizde gömlemeleri kullanın: anlamsal benzerlik; örneğin:

Geri getirme ile zenginleştirilmiş üretim (RAG)

  • LLM'inize bilgi tabanınızdan doğru bağlam besleyin
  • Kırılgan anahtar kelime aramasını değiştirin

Derin anlayış gerektiren sohbet botları

  • Portal yardım masası
  • Müşteri desteği

Ürün önerisi

  • “Bu ürüne benzer ürünler”

Belge veya çoğaltma tespiti

  • Kümeleme
  • Konu gruplama

Anahtar kelime araması başarısız olduğunda

  • “maaş yatırma gecikmesi” ile “ödeme işleme sorunu” gibi sorgular

Şu durumlarda gömlemeleri kullanmayın:

  • Tam eşleşme gerekiyorsa (ID'ler, fatura numaraları).
  • Veri kümeniz çok küçükse (basit arama yeterlidir).
  • Sayısal filtreleme/karşılaştırma gerekiyorsa (bunu meta verilerle yapmalısınız).

Gömlemeler MongoDB'de Nasıl Saklanır

MongoDB'nin güzelliği, gömlemelerin doğal olarak belgelere sığmasıdır. Bunları yalnızca float dizileri olarak saklarsınız.

Örnek belge şeması

Tipik bir belge yapısı şöyledir:

{
  "_id": "uuid-123",
  "text": "This is a sample document about MongoDB vector search.",
  "embedding": [0.123, -0.241, 0.998, ...],
  "tags": ["mongodb", "vector", "ai"],
  "createdAt": "2025-01-01T10:20:00Z"
}

Aklınızda tutmanız gereken önemli noktalar:

  • Bir koleksiyondaki her gömmenin aynı boyutsallığa sahip olması gerekir.
  • Gömlemeler ideal olarak float32 olarak saklanmalıdır (MongoDB dahili olarak float64'e dönüştürür).
  • Belgeleriniz uzunsa, gömmeye geçmeden önce onları parçalara ayırın (chunk).
  • Meta verileri ayrı saklayın—etiketler, kategori, URL, zaman damgaları vb. Bu, hibrit aramayı güçlü kılar.

MongoDB'de Vektör İndeksi Oluşturma (Kritik Adım)

Gömlemeleri saklamadan veya sorgulamadan önce MongoDB Atlas'ta bir vektör arama indeksi oluşturmalısınız.

MongoDB Atlas'ta şu yolu izleyin: Atlas → Database → Collections → Search → Create Search Index

Şuna benzer bir tanım kullanın:

{
  "fields": [
    {
      "type": "vector",
      "path": "embedding",
      "numDimensions": 1536,
      "similarity": "cosine"
    }
  ]
}

Bu, MongoDB'ye şunları söyler:

  • embedding alanı vektörler içeriyor.
  • Her vektör 1536 boyuta sahip.
  • Sıralama için kosinüs benzerliğini kullan.

Bu indeks, tüm vektör arama sorgularını güçlendirir.

MongoDB, yerel vektör arama yetenekleri sunar ve şunları destekler:

  • Kosinüs benzerliği.
  • Öklidyen mesafe.
  • dotProduct puanlaması.

Seçimi gömme modelinize göre yapın—peki neyi seçeceğimizi nasıl bileceğiz? Derinlemesine bakalım.

Kosinüs benzerliği

Ne ölçer

İki vektörün ne kadar hizalı olduğunu—yani aralarındaki açıyı—ölçer. Büyüklüğü yok sayar ve yalnızca yönü dikkate alır.

Sezgi

  • İki vektör aynı yöne işaret ediyorsa → benzerlik 1'e yakın
  • Zıt yönler → –1
  • Dik (ilişkisiz) → 0

Ne zaman kullanılır

Büyüklük önemli olmadığında, yalnızca ifade edilen örüntü ya da kavram önemli olduğunda kosinüsü kullanın.

Yaygın kullanım alanları

  • Metin gömlemeleri/NLP
  • Anlamsal arama
  • Ölçeğe değil, anlama dayalı öneri sistemleri

Kosinüs, çoğu gömme modeli için en güvenli varsayılandır.

Öklidyen mesafe

Ne ölçer

Uzaydaki iki vektör arasındaki doğrusal mesafeyi ölçer.

Sezgi

  • Küçük mesafe → vektörler benzerdir
  • Büyük mesafe → vektörler uzaktır

Ne zaman kullanılır

Mutlak değerler ve büyüklükler önemli olduğunda, yalnızca yönden ibaret olmadığında Öklidyen'i kullanın.

Yaygın kullanım alanları

  • Görsel gömlemeleri
  • Fiziksel ölçümler/sensör verileri
  • K-means gibi (içsel olarak Öklidyen kullanan) kümeleme algoritmaları

Veriniz doğal olarak geometrik bir uzayda yaşıyorsa (ör. piksel yoğunlukları), Öklidyen sıklıkla daha mantıklıdır.

Noktasal çarpım (dot product)

Ne ölçer

Benzerlik ile büyüklüğün birleşimini ölçer. 

Matematiksel olarak: dot(u, v) = |u| × |v| × cos(θ)

Sezgi

  • Daha büyük büyüklük VE hizalanma → daha büyük skor
  • Vektör uzunluğuna duyarlıdır
  • Kendiliğinden normalleştirilmez

Ne zaman kullanılır

Daha uzun vektörlerin daha fazla etkisi olmasını istediğinizde veya gömme modeliniz noktasal çarpımı esas alarak eğitildiyse noktasal çarpımı kullanın.

Yaygın kullanım alanları

  • iç çarpım puanlamasını varsayan büyük dil modeli gömlemeleri
  • Sinir ağı benzerlik katmanları
  • Özellik “gücü”nün anlamlı olduğu öneri modelleri

Hızlı kural

Ölçüt

Şunlar için iyi

Şu durumda kaçının

Kosinüs

Metin, anlamsal arama, genel gömlemeler

Büyüklük önemliyse

Öklidyen

Görseller, geometrik özellikler, kümeleme

Veri keyfi ölçeklemeye sahipse

Noktasal çarpım

İç çarpımla eğitilmiş modeller, öneri sistemleri

Büyüklükler benzerliği çarpıtıyorsa

Gömleme Oluşturma, Saklama ve Sorgulama (Python Eğitimi)

Bunu gerçek bir sistem kuruyormuşuz gibi adım adım ele alalım.

Bağımlılıkları kurun

pip install pymongo openai

Gömlemeleri oluşturun

OpenAI kullanarak (tercih ettiğiniz herhangi bir gömme sağlayıcısıyla değiştirebilirsiniz):

import os
from openai import OpenAI

os.environ["OPENAI_API_KEY"] = "your_api_key_here"
client = OpenAI()

def get_embedding(text: str):
    response = client.embeddings.create(
        model="text-embedding-3-small",
        input=text
    )
    return response.data[0].embedding

MongoDB'ye bağlanın ve belgeleri ekleyin

OpenAI kullanarak (tercih ettiğiniz herhangi bir gömme sağlayıcısıyla değiştirebilirsiniz):

from pymongo import MongoClient
import uuid

mongo = MongoClient("<MONGODB_ATLAS_URI>")
db = mongo["vector_db"]
collection = db["documents"]

text = "This is a sample document about MongoDB vector search."
embedding = get_embedding(text)

document = {
    "_id": str(uuid.uuid4()),
    "text": text,
    "embedding": embedding,
    "tags": ["mongodb", "search"],
}

collection.insert_one(document)
print("Document inserted successfully!")

Bu noktada verileriniz anlamsal arama için hazırdır.

MongoDB'de gömlemeleri sorgulama

Şimdi sıra eğlenceli kısımda: vektör sorgusu kullanarak benzer belgeleri getirmek. MongoDB, bir toplama (aggregation) hattında $vectorSearch kullanır.

Sorgu vektörünü oluşturun

from pymongo import MongoClient
query = "How does MongoDB handle semantic search?"
query_vec = get_embedding(query)

Vektör araması yapın (sorgu gömlemeleri)

results = collection.aggregate([
    {
        "$vectorSearch": {
            "index": "vector_index",
            "path": "embedding",
            "queryVector": query_vec,
            "numCandidates": 100,
            "limit": 5,
            "similarity": "cosine"
        }
    },
    {
        "$project": {
            "text": 1,
            "score": {"$meta": "vectorSearchScore"}
        }
    }
])

for r in results:
    print(r)

Bu, anlamsal olarak en benzer beş belgeyi döndürür.

Anlamsal arama istediğiniz RAG hatları için bu çok güçlüdür.

Yukarıdaki sorgunun adım adım açıklaması

$vectorSearch → Belge alanı olan embedding'in, belirtilen benzerlik ölçütünü kullanarak queryVector'a en yakın olduğu belgeleri bulur

numCandidates → Motorun nihai üst sonuçları seçmeden önce kaç potansiyel eşleşmeyi değerlendireceği

limit → Döndürülecek nihai benzer sonuç sayısı

$project → Orijinal metni ve score adlı özel alanı döndürür

Score alanı nedir?

MongoDB Atlas Vector Search, "score": {"$meta": "vectorSearchScore"} adlı özel bir meta veri alanı döndürür; bu alan, saklanan bir vektörün sorgu vektörünüze ne kadar benzer olduğunu gösterir.

Skorun anlamı, aşağıda açıklandığı gibi, seçtiğiniz benzerlik ölçütüne bağlıdır:

Benzerlik ölçütü

Skor neyi ifade eder

Yüksek skor = daha benzer mi?

Skor aralığı

cosine

Vektörler arasındaki açı benzerliği

Evet

–1 ila +1

euclidean

Negatif L2 mesafesi

Hayır—0'a yakınsa daha benzer

–∞ ila 0

dotProduct

Vektör büyüklüğü hizalanması

Evet

–∞ ila +∞

En İyi Uygulamalar

  • Uzun belgeleri parçalayın (her biri 300–500 token): Daha iyi alaka + uzun blokları gömmekten kaçınır
  • Meta verileri ayrı saklayın: Filtreleme ve sıralamaya yardımcı olur
  • Gömleme üretimini toplu yapın: Verimi artırır ve model maliyetini düşürür
  • Modelinizde float32 gömlemeler kullanın: MongoDB dahili olarak float64 kullanır ama float32 dizilerini kabul eder
  • Yalnızca vektör alanını indeksleyin: İndeksteki fazladan alanlar bellek ve gecikmeyi artırır

Kaçınılması Gereken Yaygın Tuzaklar

Sorun

Neden olur

Boyut uyuşmazlığı

Sorgu vektörü boyutu ≠ indeks boyutu

İlgisiz sonuçlar

Saklama ve sorguda farklı modellerin kullanılması

Yavaş arama

Çok fazla numCandidates ya da büyük küme gereksinimleri

Belge çok büyük

16MB belge sınırı

Yanlış benzerlik ölçütü

Model kosinüs için eğitildi ama noktasal çarpım kullanılıyor

Son Düşünceler

Gömlemeler ve anlamsal arama artık modern yapay zeka ürünlerinin temelini oluşturuyor. Bir sohbet botu, RAG hattı, öneri motoru veya akıllı arama katmanı kuruyor olun, vektörleri güvenilir şekilde saklayıp verimli biçimde sorgulamanız gerekir.

MongoDB size şu unsurların bir arada bulunduğu bir birleşik platform sunar:

  • Metniniz burada yaşar.
  • Meta verileriniz burada yaşar.
  • Gömlemeleriniz burada yaşar.
  • Vektör aramanız burada çalışır.
  • Her şey birlikte ölçeklenir.

Bu, ayrı veritabanlarıyla uğraşma karmaşıklığını ortadan kaldırır ve altyapı yerine ürün yeteneklerini inşa etmeye odaklanmanızı sağlar.

FAQs

MongoDB'yi gömlemeler için kullanıyorsam ayrı bir vektör veritabanına ihtiyacım var mı?

Hayır. MongoDB Atlas Vector Search yerleşiktir; böylece Pinecone veya Milvus gibi ayrı bir vektör veritabanı kullanmadan belgeleri, meta verileri ve vektörleri aynı yerde saklayabilirsiniz.

MongoDB'de hangi gömme boyutsallığını kullanmalıyım?

Gömleme modelinizin sağladığı boyutsallığı kullanın (ör. 768 veya 1536). Bir koleksiyondaki tüm belgeler, vektör indeksinin boyutuyla aynı boyutu kullanmalıdır.

MongoDB hibrit arama (meta veri + vektör araması) yapabilir mi?

Aynı toplama hattında önce $match ile filtreleyip ardından $vectorSearch uygulayabilirsiniz—RAG ve öneri sistemleri için idealdir.

MongoDB, büyük ölçekli vektör arama iş yükleri için uygun mu?

Evet. MongoDB, Atlas Search'te HNSW tabanlı indekslemeyi kullanır ve milyonlarca belge için iyi ölçeklenir. İşlem hacmi, indeks boyutuna, küme katmanına ve iş yükü örüntülerine bağlıdır.

MongoDB ile herhangi bir gömme modelini kullanabilir miyim?

Kesinlikle. MongoDB modelden bağımsızdır. Boyutlar indeksle eşleştiği sürece OpenAI, HuggingFace, Cohere, yerel modeller veya özel gömlemeleri kullanabilirsiniz.

Nilesh Soni

Yazar

Nilesh Soni

Uber'da Kıdemli Yazılım Mühendisi

Konular

İlgili