Pencarian Hibrida di Pinecone dan pgvector
Konfigurasikan pencarian hibrida di Pinecone menggunakan mode indeks jarang-padat dan di pgvector menggunakan kueri paralel dengan penggabungan RRF, lalu ukur kualitas pengambilan pada kumpulan data Anda.
Pencarian Hibrida di Pinecone dan pgvector adalah pelajaran AI Engineering Academy gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar AI Engineering Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus AI Engineering Academy mencakup 4 pelajaran total.
Pencarian Hibrida Native di Basis Data Vektor
Meskipun Anda dapat menerapkan pencarian hibrida sendiri menggunakan dua indeks terpisah dan penggabungan RRF, basis data vektor untuk lingkungan produksi semakin sering menyediakan pencarian hibrida bawaan yang menangani pengambilan sparse dan dense dalam satu kueri. Pinecone dan pgvector sama-sama mendukung mode hibrida, tetapi dengan pilihan arsitektur dan kompromi yang berbeda. Dengan memahami kedua opsi ini, Anda dapat memilih alat yang tepat untuk infrastruktur Anda.
Mode Indeks Sparse-Dense Pinecone
Pinecone mendukung indeks sparse-dense, tempat setiap rekaman vektor menyimpan embedding dense (sebagai larik float) dan vektor sparse (sebagai kamus ID token ke bobot). Kueri dapat menentukan vektor kueri dense dan vektor kueri sparse, lalu Pinecone menggabungkan hasil menggunakan kombinasi linear berbobot. Hal ini berbeda dari RRF—Pinecone menggunakan penggabungan skor mentah dengan bobot yang dapat dikonfigurasi, yang disebut 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')Membuat Vektor Sparse dengan SPLADE
Untuk menggunakan mode sparse-dense Pinecone, Anda perlu membuat vektor sparse untuk setiap dokumen. Pendekatan yang paling efektif adalah SPLADE (Sparse Lexical and Expansion), yaitu model neural yang menghasilkan representasi sparse terpelajar dengan ekspansi—model ini menambahkan istilah yang terkait secara semantik ke vektor sparse, di luar istilah yang benar-benar muncul dalam teks. Sebagai alternatif, Anda dapat menggunakan bobot istilah BM25 sederhana sebagai vektor sparse.
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}Mengunggah Vektor Hibrida ke Pinecone
Setiap rekaman Pinecone dalam indeks hibrida menyimpan id, larik values dense, kamus sparse_values yang berisi indices dan values, serta metadata opsional. Unggah rekaman dalam kelompok berisi 100 item untuk memaksimalkan throughput sekaligus tetap berada dalam batas ukuran permintaan Pinecone.
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}')Menjalankan Kueri pada Indeks Hibrida Pinecone
Kueri hibrida mengirimkan vector dense dan sparse_vector ke API kueri Pinecone. Parameter alpha (0 hingga 1) mengatur keseimbangannya: alpha=1.0 berarti dense murni, alpha=0.0 berarti sparse murni, dan alpha=0.5 memberikan bobot yang sama pada keduanya. Sesuaikan alpha pada set validasi—nilai optimal yang umum berada di antara 0.3 dan 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.matchespgvector: Pencarian Vektor di PostgreSQL
Ekstensi pgvector menambahkan tipe kolom vector dan operator jarak ke PostgreSQL. Untuk pencarian hibrida, Anda menjalankan dua kueri secara paralel—kueri tetangga terdekat aproksimasi pada kolom vektor dan kueri pencarian teks lengkap menggunakan tsvector serta tsquery bawaan PostgreSQL—kemudian menggabungkan hasilnya dengan RRF dalam kode aplikasi.
-- 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);Menjalankan Kueri Dense dan Sparse di pgvector
Dengan pgvector, jalankan kueri dense menggunakan operator jarak kosinus <=> untuk menemukan tetangga terdekat dari embedding kueri, dan kueri sparse menggunakan ts_rank_cd terhadap kolom tsvector untuk memberi skor pada kecocokan kata kunci. Ambil kedua himpunan hasil secara terpisah, lalu gabungkan menggunakan RRF dalam Python.
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)Menerapkan RRF pada Hasil pgvector
Setelah mengumpulkan baris berperingkat dari kedua kueri PostgreSQL, terapkan RRF dengan mengambil ID dokumen berdasarkan urutan peringkat dari setiap himpunan hasil dan menjalankan algoritme penggabungan. Daftar akhir yang digabungkan memberikan dokumen top-K yang paling relevan berdasarkan makna semantik maupun kesamaan kata kunci.
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]]Mengukur Kualitas Pengambilan
Setelah menerapkan pencarian hibrida, ukur kinerjanya secara ketat terhadap pengambilan dense saja sebagai dasar pembanding. Gunakan set pengujian acuan yang berisi sedikitnya 100 kueri dengan dokumen relevan yang telah diketahui. Ukur NDCG@5, MRR, dan hit rate@3. Peningkatan umum dari pencarian hibrida berkisar antara 5 hingga 20 persen pada NDCG@5, dengan peningkatan terbesar pada kueri yang mengandung istilah teknis persis yang tidak ditemukan oleh model dense.
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),
}Menyesuaikan Alpha dalam Mode Hibrida Pinecone
Parameter alpha dalam kueri hibrida Pinecone memerlukan penyesuaian yang sistematis. Stratifikasi berdasarkan jenis kueri merupakan pendekatan yang berguna: klasifikasikan kueri pengujian sebagai kueri yang terutama semantik (parafrasa, konseptual) atau terutama leksikal (istilah persis, kode), lalu ukur alpha optimal secara terpisah untuk setiap kelompok. Beberapa sistem produksi menerapkan pemilihan alpha dinamis yang mengklasifikasikan kueri saat dijalankan dan memilih alpha yang sesuai secara otomatis.
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_alphaMemilih antara Pinecone dan pgvector Hibrida
Gunakan hibrida Pinecone ketika Anda memerlukan infrastruktur terkelola, penskalaan otomatis, dan ingin menyerahkan kerumitan pembuatan vektor sparse kepada satu API. Gunakan hibrida pgvector ketika Anda sudah memiliki infrastruktur PostgreSQL, memerlukan konsistensi transaksional antara dokumen dan metadatanya, menginginkan fleksibilitas SQL penuh untuk pemfilteran, atau perlu menghindari keterikatan pada vendor. Kedua pendekatan menghasilkan kualitas pengambilan hibrida yang sangat baik jika disesuaikan dengan tepat.
Pemeriksaan Singkat
Uji pemahaman Anda tentang penerapan pencarian hibrida dari pelajaran ini.
Rangkuman Pelajaran
Dalam pelajaran ini, Anda mempelajari bahwa mode sparse-dense Pinecone menyimpan vektor dense dan sparse untuk setiap rekaman lalu menggabungkannya dengan parameter alpha yang dapat dikonfigurasi, pencarian hibrida pgvector menggabungkan pencarian teks lengkap SQL dengan kueri vektor yang digabungkan menggunakan RRF dalam kode aplikasi, dan penyesuaian alpha pada set validasi sangat penting untuk menemukan keseimbangan optimal bagi distribusi kueri Anda. Selanjutnya, kita akan membahas pengambilan dua tahap dengan pemeringkatan ulang.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Pencarian Hibrida di Pinecone dan pgvector” gratis?
Ya — teks lengkap “Pencarian Hibrida di Pinecone dan pgvector” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus AI Engineering Academy, upgrade ke CoddyKit PRO. Kursus AI Engineering Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Pencarian Hibrida di Pinecone dan pgvector”?
Konfigurasikan pencarian hibrida di Pinecone menggunakan mode indeks jarang-padat dan di pgvector menggunakan kueri paralel dengan penggabungan RRF, lalu ukur kualitas pengambilan pada kumpulan data… Kamu berlatih AI Engineering Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai AI Engineering Academy?
Tidak diperlukan pengalaman sebelumnya. AI Engineering Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.
Berapa lama pelajaran “Pencarian Hibrida di Pinecone dan pgvector” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran AI Engineering Academy ini?
Ya. Setiap pelajaran AI Engineering Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Pengambilan Padat vs Jarang: Keseimbangan
- Menerapkan Pencarian Kata Kunci BM25
- Penggabungan Peringkat Timbal Balik untuk Menggabungkan Skor
- Pencarian Hibrida di Pinecone dan pgvector