AI Engineering Academy · पाठ

Pinecone और pgvector में हाइब्रिड खोज

Pinecone में विरल-सघन अनुक्रमणिका मोड का उपयोग करके और pgvector में RRF विलय वाली समानांतर क्वेरी के ज़रिए हाइब्रिड खोज कॉन्फ़िगर करें तथा अपने डेटासेट पर पुनर्प्राप्ति गुणवत्ता का बेंचमार्क करें।

पाठ 4, कुल 4 में से13 चरण

Pinecone और pgvector में हाइब्रिड खोज, CoddyKit पर AI Engineering Academy का एक निःशुल्क पाठ है। यह 4 में से 4वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह AI Engineering Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। AI Engineering Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

वेक्टर डेटाबेस में मूल hybrid search

हालाँकि आप दो अलग-अलग indexes और RRF संयोजन का उपयोग करके hybrid search स्वयं लागू कर सकते हैं, लेकिन production के लिए उपयोग किए जाने वाले वेक्टर डेटाबेस अब अधिकाधिक अंतर्निहित hybrid search उपलब्ध करा रहे हैं, जो एक ही query में विरल और सघन पुनर्प्राप्ति संभालती है। Pinecone और pgvector दोनों hybrid मोड का समर्थन करते हैं, लेकिन उनकी संरचना और समझौतों में अंतर है। दोनों विकल्पों को समझने से आप अपने infrastructure के लिए सही tool चुन सकते हैं।

Pinecone विरल-सघन Index मोड

Pinecone एक विरल-सघन index का समर्थन करता है, जिसमें प्रत्येक वेक्टर record सघन embedding (float array के रूप में) और विरल वेक्टर (token ID से weight का dictionary) दोनों संग्रहीत करता है। Queries में सघन query वेक्टर और विरल query वेक्टर दोनों निर्दिष्ट किए जा सकते हैं, और Pinecone भारित रैखिक संयोजन का उपयोग करके परिणामों को मिलाता है। यह RRF से अलग है — Pinecone configurable weights वाले कच्चे स्कोर संयोजन का उपयोग करता है, जिन्हें alpha कहा जाता है।

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 के साथ विरल वेक्टर बनाना

Pinecone के विरल-सघन मोड का उपयोग करने के लिए आपको प्रत्येक दस्तावेज़ के लिए विरल वेक्टर बनाने होंगे। सबसे प्रभावी तरीका SPLADE (Sparse Lexical and Expansion) है। यह एक neural model है, जो expansion के साथ सीखे हुए विरल निरूपण बनाता है — अर्थात् यह पाठ में शाब्दिक रूप से मौजूद शब्दों के अलावा अर्थ की दृष्टि से संबंधित शब्दों को भी विरल वेक्टर में जोड़ता है। इसके विकल्प के रूप में, आप विरल वेक्टरों के लिए सरल BM25 term weights का उपयोग कर सकते हैं।

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}

Hybrid वेक्टरों को Pinecone में Upsert करना

Hybrid index में प्रत्येक Pinecone record में एक id, एक सघन values array, indices और values वाला sparse_values dictionary, तथा वैकल्पिक metadata संग्रहीत होता है। अनुरोध के आकार की Pinecone सीमाओं के भीतर रहते हुए अधिकतम throughput पाने के लिए records को 100 के batches में Upsert करें।

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 Hybrid Index पर Query करना

एक hybrid query, Pinecone query API को सघन vector और विरल sparse_vector दोनों भेजती है। alpha parameter (0 से 1) संतुलन नियंत्रित करता है: alpha=1.0 पूर्णतः सघन, alpha=0.0 पूर्णतः विरल, और alpha=0.5 दोनों को समान भार देता है। किसी validation set पर alpha को समायोजित करें — सामान्यतः optimal मान 0.3 और 0.7 के बीच होते हैं।

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 में वेक्टर Search

pgvector extension, PostgreSQL में vector column type और दूरी operators जोड़ता है। Hybrid search के लिए आप दो queries समानांतर रूप से चलाते हैं — vector column पर approximate nearest neighbor query और PostgreSQL के अंतर्निहित tsvector तथा tsquery का उपयोग करने वाली full-text search query — फिर अपने application code में परिणामों को RRF के साथ मिलाते हैं।

-- 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 में सघन और विरल Queries चलाना

pgvector के साथ, query embedding के निकटतम neighbors खोजने के लिए <=> cosine distance operator का उपयोग करके सघन query चलाएँ, और keyword matches का स्कोर निकालने के लिए tsvector column पर ts_rank_cd का उपयोग करके विरल query चलाएँ। दोनों result sets को स्वतंत्र रूप से प्राप्त करें, फिर Python में RRF का उपयोग करके उनका संयोजन करें।

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 परिणामों पर RRF लागू करना

दोनों PostgreSQL queries से रैंक की गई rows एकत्र करने के बाद, प्रत्येक result set से rank क्रम में document IDs निकालकर और संयोजन algorithm चलाकर RRF लागू करें। अंतिम संयुक्त सूची आपको ऐसे top-K documents देती है, जो अर्थ और keyword overlap दोनों के आधार पर सबसे अधिक प्रासंगिक हैं।

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]]

पुनर्प्राप्ति गुणवत्ता का मानक परीक्षण

Hybrid search लागू करने के बाद, अपने baseline dense-only retrieval की तुलना में इसका कठोर मानक परीक्षण करें। कम-से-कम 100 queries वाले golden test set का उपयोग करें, जिनके प्रासंगिक documents ज्ञात हों। NDCG@5, MRR और hit rate@3 मापें। Hybrid search से NDCG@5 में सामान्यतः 5 से 20 प्रतिशत सुधार होता है; सबसे बड़े लाभ उन queries में मिलते हैं जिनमें सटीक technical terms होते हैं, जिन्हें dense models नहीं खोज पाते।

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 Hybrid मोड में Alpha को समायोजित करना

Pinecone की hybrid query में alpha parameter को व्यवस्थित रूप से समायोजित करना आवश्यक है। Query-type stratification एक उपयोगी तरीका है: अपनी test queries को मुख्यतः semantic (paraphrases, वैचारिक queries) या मुख्यतः lexical (सटीक terms, codes) के रूप में वर्गीकृत करें और प्रत्येक समूह के लिए optimal alpha अलग-अलग मापें। कुछ production systems dynamic alpha selection लागू करते हैं, जो runtime पर query का वर्गीकरण करके अपने-आप उचित alpha चुनता है।

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 और pgvector Hybrid के बीच चयन

जब आपको managed infrastructure और automatic scaling चाहिए और sparse vector generation की जटिलता को एक ही API को सौंपना हो, तब Pinecone hybrid का उपयोग करें। जब आपके पास पहले से PostgreSQL infrastructure हो, documents और उनके metadata के बीच transactional consistency चाहिए, filtering के लिए पूर्ण SQL flexibility चाहिए, या vendor lock-in से बचना हो, तब pgvector hybrid का उपयोग करें। सही ढंग से समायोजित किए जाने पर दोनों तरीके उत्कृष्ट hybrid retrieval quality देते हैं।

त्वरित जाँच

इस पाठ से hybrid search implementation की अपनी समझ जाँचें।

पाठ का पुनरावलोकन

इस पाठ में आपने सीखा: Pinecone sparse-dense mode प्रत्येक record के लिए सघन और विरल दोनों वेक्टर संग्रहीत करता है और configurable alpha parameter के साथ उनका संयोजन करता है, pgvector hybrid search SQL full-text search को application code में RRF से संयोजित की गई वेक्टर queries के साथ मिलाता है, और आपकी query distribution के लिए optimal संतुलन खोजने हेतु validation set पर alpha tuning आवश्यक है। आगे हम re-ranking के साथ two-stage retrieval का अध्ययन करेंगे।

शुरुआत निःशुल्क

एआई शिक्षक के साथ Python सीखें — निःशुल्क

अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।

पाठ्यक्रम
30
पाठ
120

अक्सर पूछे जाने वाले प्रश्न

क्या “Pinecone और pgvector में हाइब्रिड खोज” पाठ निःशुल्क है?

हाँ—“Pinecone और pgvector में हाइब्रिड खोज” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और AI Engineering Academy पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। AI Engineering Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

“Pinecone और pgvector में हाइब्रिड खोज” में मैं क्या सीखूँगा?

Pinecone में विरल-सघन अनुक्रमणिका मोड का उपयोग करके और pgvector में RRF विलय वाली समानांतर क्वेरी के ज़रिए हाइब्रिड खोज कॉन्फ़िगर करें तथा अपने डेटासेट पर पुनर्प्राप्ति गुणवत्ता का बेंचमार्क करें। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ AI Engineering Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।

क्या AI Engineering Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?

पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर AI Engineering Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 4वाँ पाठ है।

“Pinecone और pgvector में हाइब्रिड खोज” पाठ पूरा करने में कितना समय लगता है?

CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।

क्या मैं इस AI Engineering Academy पाठ में कोड लिख और चला सकता हूँ?

हाँ। हर AI Engineering Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।

इस पाठ्यक्रम के सभी पाठ

  1. सघन बनाम विरल पुनर्प्राप्ति: समझौते
  2. BM25 कीवर्ड खोज लागू करना
  3. स्कोर मिलाने के लिए पारस्परिक रैंक संलयन
  4. Pinecone और pgvector में हाइब्रिड खोज
← AI Engineering Academy पर वापस जाएँ