0Pricing
AI Engineering Academy · Ders

Pinecone ve pgvector'da Karma Arama

Pinecone'da seyrek-yoğun dizin kipini, pgvector'da ise RRF birleştirmeli paralel sorguları kullanarak karma aramayı yapılandırın ve veri kümenizdeki getirme kalitesini karşılaştırmalı olarak ölçün.

Pinecone ve pgvector'da Karma Arama, CoddyKit'te ücretsiz bir AI Engineering Academy dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, AI Engineering Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. AI Engineering Academy kursu toplamda 4 dersten oluşur.

Vektör Veritabanlarında Yerel Hibrit Arama

İki ayrı dizin ve RRF birleştirmesi kullanarak hibrit aramayı kendiniz uygulayabilseniz de üretim ortamlarında kullanılan vektör veritabanları, seyrek ve yoğun geri getirmeyi tek bir sorguda ele alan yerleşik hibrit aramayı giderek daha fazla sunmaktadır. Pinecone ve pgvector hibrit kipleri destekler; ancak mimari seçimleri ve ödünleri farklıdır. Her iki seçeneği de anlamak, altyapınız için doğru aracı seçmenizi sağlar.

Pinecone Seyrek-Yoğun Dizin Kipi

Pinecone, her vektör kaydının hem yoğun bir gömmeyi (kayan noktalı sayı dizisi olarak) hem de seyrek bir vektörü (belirteç kimliğinden ağırlığa eşleme olarak) depoladığı bir seyrek-yoğun dizini destekler. Sorgular hem yoğun bir sorgu vektörü hem de seyrek bir sorgu vektörü belirtebilir ve Pinecone sonuçları ağırlıklı doğrusal birleşim kullanarak birleştirir. Bu, RRF'den farklıdır: Pinecone, alpha adı verilen yapılandırılabilir ağırlıklarla ham puan birleştirmesi kullanır.

from pinecone import Pinecone, ServerlessSpec

pc = Pinecone(api_key='YOUR_API_KEY')

# Create a sparse-dense index
pc.create_index(
    name='hybrid-index',
    dimension=1536,          # dense vector dimension
    metric='dotproduct',     # must use dotproduct for hybrid
    spec=ServerlessSpec(cloud='aws', region='us-east-1'),
)

index = pc.Index('hybrid-index')

SPLADE ile Seyrek Vektörler Oluşturma

Pinecone'un seyrek-yoğun kipini kullanmak için her belge için seyrek vektörler oluşturmanız gerekir. En etkili yaklaşım, öğrenilmiş seyrek gösterimleri genişletmeyle üreten sinir ağı modeli SPLADE'dir (Sparse Lexical and Expansion); model, metinde kelimesi kelimesine yer alanların ötesine geçerek anlamsal olarak ilişkili terimleri seyrek vektöre ekler. Alternatif olarak, seyrek vektörler olarak basit BM25 terim ağırlıklarını kullanabilirsiniz.

from transformers import AutoTokenizer, AutoModelForMaskedLM
import torch

# Load SPLADE model
tokenizer = AutoTokenizer.from_pretrained('naver/splade-cocondenser-ensembledistil')
model = AutoModelForMaskedLM.from_pretrained('naver/splade-cocondenser-ensembledistil')

def generate_sparse_vector(text: str) -> dict:
    tokens = tokenizer(text, return_tensors='pt', truncation=True, max_length=512)
    with torch.no_grad():
        output = model(**tokens)
    logits = output.logits
    # Max-pool over sequence length and apply log1p activation
    sparse = torch.max(torch.log1p(torch.relu(logits)), dim=1).values.squeeze()
    # Return non-zero indices and values as a sparse dict
    nz_indices = sparse.nonzero().squeeze().tolist()
    nz_values = sparse[nz_indices].tolist()
    return {'indices': nz_indices, 'values': nz_values}

Hibrit Vektörleri Pinecone'a Upsert Etme

Hibrit dizindeki her Pinecone kaydı bir id, yoğun bir values dizisi, indices ve values içeren bir sparse_values sözlüğü ve isteğe bağlı metadata depolar. Pinecone'un istek boyutu sınırları içinde kalırken aktarım hızını en üst düzeye çıkarmak için kayıtları 100'lük gruplar halinde upsert edin.

def upsert_hybrid_docs(index, documents: list[dict], batch_size: int = 100):
    records = []
    for doc in documents:
        dense_vec = embed(doc['text'])        # OpenAI embedding
        sparse_vec = generate_sparse_vector(doc['text'])  # SPLADE
        records.append({
            'id': doc['id'],
            'values': dense_vec,
            'sparse_values': sparse_vec,
            'metadata': {'text': doc['text'], 'source': doc['source']},
        })

    for i in range(0, len(records), batch_size):
        batch = records[i:i + batch_size]
        index.upsert(vectors=batch)
        print(f'Upserted batch {i//batch_size + 1}')

Pinecone Hibrit Dizinini Sorgulama

Hibrit sorgu, Pinecone sorgu API'sine hem yoğun bir vector hem de seyrek bir sparse_vector gönderir. alpha parametresi (0 ile 1 arasında) dengeyi belirler: alpha=1.0 yalnızca yoğun, alpha=0.0 yalnızca seyrek, alpha=0.5 ise her ikisine eşit ağırlık verilmesi anlamına gelir. alpha değerini bir doğrulama kümesi üzerinde ayarlayın; tipik en iyi değerler 0.3 ile 0.7 arasındadır.

def hybrid_query_pinecone(index, query: str, alpha: float = 0.5, top_k: int = 5):
    dense_vec = embed(query)
    sparse_vec = generate_sparse_vector(query)

    # Scale vectors by alpha for weighted fusion
    scaled_dense = [v * alpha for v in dense_vec]
    scaled_sparse = {
        'indices': sparse_vec['indices'],
        'values': [v * (1 - alpha) for v in sparse_vec['values']],
    }

    results = index.query(
        vector=scaled_dense,
        sparse_vector=scaled_sparse,
        top_k=top_k,
        include_metadata=True,
    )
    return results.matches

pgvector: PostgreSQL'de Vektör Arama

pgvector eklentisi, PostgreSQL'e bir vector sütun türü ve uzaklık işleçleri ekler. Hibrit arama için iki sorguyu paralel olarak çalıştırırsınız: vektör sütununda yaklaşık en yakın komşu sorgusu ve PostgreSQL'in yerleşik tsvector ile tsquery yapılarını kullanan tam metin arama sorgusu. Ardından sonuçları uygulama kodunuzda RRF ile birleştirirsiniz.

-- Setup: enable extensions
CREATE EXTENSION IF NOT EXISTS vector;
CREATE EXTENSION IF NOT EXISTS pg_trgm;

-- Create hybrid-capable table
CREATE TABLE documents (
    id SERIAL PRIMARY KEY,
    content TEXT NOT NULL,
    embedding vector(1536),
    content_tsv tsvector GENERATED ALWAYS AS (to_tsvector('english', content)) STORED
);

-- Indexes for both search modes
CREATE INDEX ON documents USING hnsw (embedding vector_cosine_ops);
CREATE INDEX ON documents USING GIN (content_tsv);

pgvector'da Yoğun ve Seyrek Sorguları Çalıştırma

pgvector ile <=> kosinüs uzaklığı işleçini kullanarak yoğun sorguyu çalıştırın ve sorgu gömmesinin en yakın komşularını bulun; anahtar kelime eşleşmelerini puanlamak için tsvector sütununa karşı ts_rank_cd kullanarak seyrek sorguyu çalıştırın. Her iki sonuç kümesini bağımsız olarak alın, ardından Python'da RRF kullanarak birleştirin.

import psycopg2
import json

def pgvector_hybrid_search(conn, query: str, top_k: int = 5):
    dense_vec = embed(query)
    tsquery = ' & '.join(query.split())  # simple AND query

    # Dense query
    dense_sql = '''
        SELECT id, content, 1 - (embedding <=> %s::vector) AS score
        FROM documents
        ORDER BY embedding <=> %s::vector
        LIMIT 20
    '''
    # Sparse query
    sparse_sql = '''
        SELECT id, content, ts_rank_cd(content_tsv, to_tsquery('english', %s)) AS score
        FROM documents
        WHERE content_tsv @@ to_tsquery('english', %s)
        ORDER BY score DESC
        LIMIT 20
    '''
    with conn.cursor() as cur:
        cur.execute(dense_sql, [json.dumps(dense_vec), json.dumps(dense_vec)])
        dense_rows = cur.fetchall()
        cur.execute(sparse_sql, [tsquery, tsquery])
        sparse_rows = cur.fetchall()

    return fuse_with_rrf(dense_rows, sparse_rows, top_k)

pgvector Sonuçlarına RRF Uygulama

Her iki PostgreSQL sorgusundan sıralı satırları topladıktan sonra, her sonuç kümesindeki belge kimliklerini sıralama düzeninde çıkararak ve birleştirme algoritmasını çalıştırarak RRF uygulayın. Son birleştirilmiş liste, hem anlamsal anlam hem de anahtar kelime örtüşmesi bakımından en ilgili ilk K belgeyi verir.

def fuse_with_rrf(dense_rows, sparse_rows, top_k: int = 5, k: int = 60):
    from collections import defaultdict

    doc_texts = {}
    scores = defaultdict(float)

    for rank, row in enumerate(dense_rows, start=1):
        doc_id, text, _ = row
        scores[doc_id] += 1.0 / (k + rank)
        doc_texts[doc_id] = text

    for rank, row in enumerate(sparse_rows, start=1):
        doc_id, text, _ = row
        scores[doc_id] += 1.0 / (k + rank)
        doc_texts[doc_id] = text

    ranked = sorted(scores.items(), key=lambda x: x[1], reverse=True)
    return [{'id': doc_id, 'text': doc_texts[doc_id], 'rrf_score': s}
            for doc_id, s in ranked[:top_k]]

Geri Getirme Kalitesini Karşılaştırmalı Ölçme

Hibrit aramayı uyguladıktan sonra, temel yoğun-yalnızca geri getirme yaklaşımınıza karşı titizlikle karşılaştırmalı ölçüm yapın. Bilinen ilgili belgeleri içeren, en az 100 sorgudan oluşan altın standart bir test kümesi kullanın. NDCG@5, MRR ve isabet oranı@3 değerlerini ölçün. Hibrit aramadan elde edilen tipik iyileşmeler NDCG@5 için yüzde 5 ile 20 arasındadır; en büyük kazanımlar, yoğun modellerin gözden kaçırdığı kesin teknik terimleri içeren sorgularda görülür.

def evaluate_retrieval(search_fn, test_queries, golden_relevant, k=5):
    ndcg_scores = []
    hit_count = 0

    for query, relevant_ids in zip(test_queries, golden_relevant):
        results = search_fn(query, top_k=k)
        retrieved_ids = [r['id'] for r in results]

        # Hit rate
        if any(rid in relevant_ids for rid in retrieved_ids):
            hit_count += 1

        # Simplified NDCG (binary relevance)
        dcg = sum(
            1.0 / (i + 1)
            for i, rid in enumerate(retrieved_ids)
            if rid in relevant_ids
        )
        idcg = sum(1.0 / (i + 1) for i in range(min(len(relevant_ids), k)))
        ndcg_scores.append(dcg / idcg if idcg > 0 else 0)

    return {
        'hit_rate': hit_count / len(test_queries),
        'ndcg': sum(ndcg_scores) / len(ndcg_scores),
    }

Pinecone Hibrit Kipinde Alpha Ayarlama

Pinecone'un hibrit sorgusundaki alpha parametresi sistematik bir ayarlama gerektirir. Sorgu türüne göre katmanlandırma yararlı bir yaklaşımdır: test sorgularınızı ağırlıklı olarak anlamsal (yeniden ifade etmeler, kavramsal sorgular) veya ağırlıklı olarak sözlüksel (kesin terimler, kodlar) şeklinde sınıflandırın ve en iyi alpha değerini her grup için ayrı ayrı ölçün. Bazı üretim sistemleri, sorguyu çalışma zamanında sınıflandıran ve uygun alpha değerini otomatik olarak seçen dinamik alpha seçimi uygular.

def find_optimal_alpha(index, test_queries, golden_relevant, alphas=None):
    if alphas is None:
        alphas = [0.0, 0.2, 0.4, 0.5, 0.6, 0.8, 1.0]

    best_alpha, best_score = 0.5, 0
    for alpha in alphas:
        hits = 0
        for query, relevant in zip(test_queries, golden_relevant):
            results = hybrid_query_pinecone(index, query, alpha=alpha, top_k=5)
            if any(r['id'] in relevant for r in results):
                hits += 1
        hit_rate = hits / len(test_queries)
        print(f'alpha={alpha}: hit_rate={hit_rate:.3f}')
        if hit_rate > best_score:
            best_score, best_alpha = hit_rate, alpha
    return best_alpha

Pinecone ve pgvector Hibriti Arasında Seçim Yapma

Yönetilen altyapıya ve otomatik ölçeklendirmeye ihtiyaç duyduğunuzda ve seyrek vektör oluşturma karmaşıklığının tek bir API'ye devredilmesini istediğinizde Pinecone hibritini kullanın. Zaten PostgreSQL altyapınız varsa, belgeler ile meta verileri arasında işlemsel tutarlılığa ihtiyaç duyuyorsanız, filtreleme için tam SQL esnekliği istiyorsanız veya bir sağlayıcıya bağımlı kalmaktan kaçınmanız gerekiyorsa pgvector hibritini kullanın. Doğru şekilde ayarlandığında her iki yaklaşım da mükemmel hibrit geri getirme kalitesi sunar.

Hızlı Kontrol

Bu derste hibrit aramanın uygulanması konusundaki anlayışınızı sınayın.

Ders Özeti

Bu derste şunları öğrendiniz: Pinecone seyrek-yoğun kipi, kayıt başına hem yoğun hem de seyrek vektörleri depolar ve bunları yapılandırılabilir bir alpha parametresiyle birleştirir; pgvector hibrit araması, SQL tam metin aramasını uygulama kodunda RRF ile birleştirilen vektör sorgularıyla bir araya getirir ve alpha ayarlaması, sorgu dağılımınız için en uygun dengeyi bulmak amacıyla bir doğrulama kümesi üzerinde yapılmalıdır. Sırada, yeniden sıralama içeren iki aşamalı geri getirmeyi inceleyeceğiz.

Sıkça Sorulan Sorular

“Pinecone ve pgvector'da Karma Arama” dersi ücretsiz mi?

Evet — “Pinecone ve pgvector'da Karma Arama” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve AI Engineering Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. AI Engineering Academy kursu toplamda 4 dersten oluşur.

“Pinecone ve pgvector'da Karma Arama” dersinde ne öğreneceğim?

Pinecone'da seyrek-yoğun dizin kipini, pgvector'da ise RRF birleştirmeli paralel sorguları kullanarak karma aramayı yapılandırın ve veri kümenizdeki getirme kalitesini karşılaştırmalı olarak ölçün. AI Engineering Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

AI Engineering Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te AI Engineering Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.

“Pinecone ve pgvector'da Karma Arama” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu AI Engineering Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her AI Engineering Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Yoğun ve Seyrek Getirme: Ödünleşimler
  2. BM25 Anahtar Sözcük Aramasını Uygulama
  3. Puan Birleştirme İçin Karşılıklı Sıra Birleştirme
  4. Pinecone ve pgvector'da Karma Arama
← AI Engineering Academy Sayfasına Dön