Lakukan penelusuran campuran di AlloyDB untuk PostgreSQL, yang menggabungkan penelusuran teks, pencocokan kata kunci, penelusuran vektor, dan kemiripan semantik, menggunakan ekstensi vector
, yang merupakan ekstensi PostgreSQL pgvector
standar yang disesuaikan untuk AlloyDB.
Untuk meningkatkan relevansi penelusuran, Anda dapat melakukan penelusuran campuran yang menggabungkan penelusuran kesamaan vektor dengan penelusuran teks. AlloyDB memungkinkan Anda membuat Generalized Inverted Indexes (GIN) untuk penelusuran teks dan indeks Scalable Nearest Neighbors (ScaNN) untuk penelusuran vektor. Kemudian, Anda dapat menggabungkan hasil dari kedua penelusuran dan memeringkat ulang menggunakan penggabungan peringkat timbal balik (RRF), algoritma yang menggabungkan beberapa daftar hasil penelusuran ke dalam satu daftar berperingkat, untuk mengambil hasil yang sangat relevan berdasarkan kecocokan kata kunci persis dan kemiripan semantik.
Menjalankan penelusuran kemiripan dengan input teks dan vektor
Untuk melakukan penelusuran hybrid di AlloyDB untuk PostgreSQL, Anda harus membuat indeks vektor dan indeks penelusuran teks di tabel. Kemudian, Anda akan menggabungkan hasil dari kedua penelusuran dan mengurutkannya kembali untuk menyajikan informasi yang paling relevan.
Membuat indeks GIN
Indeks Generalized Inverted Index (GIN) adalah jenis indeks khusus yang dioptimalkan untuk penelusuran dalam nilai komposit, seperti array, JSONB, dan data penelusuran teks lengkap.
Untuk membuat indeks GIN pada data teks Anda guna melakukan penelusuran teks lengkap, jalankan perintah berikut:
CREATE INDEX INDEX_NAME ON TABLE USING GIN (to_tsvector('english', COLUMN_NAME));
Ganti kode berikut:
INDEX_NAME
: nama indeks yang ingin Anda buat —misalnya,my-gin-index
.TABLE
: tabel untuk menambahkan indeks.COLUMN_NAME
: kolom yang menyimpan data teks yang ingin Anda telusuri.
Membuat indeks ScaNN
Untuk menerapkan indeks pohon dua tingkat menggunakan algoritma ScaNN ke kolom yang berisi embedding vektor tersimpan, jalankan kueri DDL berikut:
CREATE INDEX INDEX_NAME ON TABLE
USING scann (EMBEDDING_COLUMN DISTANCE_FUNCTION)
WITH (num_leaves=NUM_LEAVES_VALUE);
Ganti kode berikut:
INDEX_NAME
: nama indeks yang ingin Anda buat—misalnya,my-scann-index
. Nama indeks dibagikan di seluruh database Anda. Pastikan setiap nama indeks unik untuk setiap tabel dalam database Anda.TABLE
: tabel untuk menambahkan indeks.EMBEDDING_COLUMN
: kolom yang menyimpan datavector
.DISTANCE_FUNCTION
: fungsi jarak yang akan digunakan dengan indeks ini. Pilih salah satu opsi berikut:Jarak L2:
l2
Perkalian titik:
dot_product
Jarak kosinus:
cosine
NUM_LEAVES_VALUE
: jumlah partisi yang akan diterapkan ke indeks ini. Tetapkan ke nilai apa pun antara 1 hingga 1048576. Untuk mengetahui informasi selengkapnya tentang cara menentukan nilai ini, lihat Menyesuaikan indeksScaNN
.
Untuk mempelajari lebih lanjut berbagai konfigurasi indeks ScaNN, lihat Membuat indeks ScaNN
. Anda juga dapat membuat indeks HNSW.
Melakukan penelusuran campuran menggunakan penggabungan peringkat timbal balik
Penelusuran hybrid melibatkan pelaksanaan penelusuran vektor dan teks secara terpisah, lalu menggabungkan dan memeringkat ulang hasil menggunakan Reciprocal Rank Fusion (RRF). RRF adalah algoritma berbasis peringkat yang menggabungkan beberapa daftar hasil penelusuran yang diberi peringkat menjadi satu daftar yang diberi peringkat dengan menetapkan skor ke setiap dokumen. Skor ini didasarkan pada peringkat timbal balik RRF di semua daftar yang berkontribusi, dengan dokumen yang memiliki peringkat lebih tinggi menerima kontribusi yang lebih besar. Gunakan kueri SQL berikut untuk menggabungkan penelusuran teks lengkap dan penelusuran campuran, serta memberi peringkat ulang pada hasilnya:
WITH vector_search AS (
SELECT id,
RANK () OVER (ORDER BY embedding <=> google_ml.embedding('MODEL_ID', 'TEXT')) AS rank
FROM TABLE
ORDER BY embedding <=> google_ml.embedding('MODEL_ID', 'TEXT') LIMIT 10
),
text_search AS (
SELECT id,
RANK () OVER (ORDER BY ts_rank(to_tsvector('english', COLUMN_NAME), to_tsquery(KEYWORD)) desc)
FROM TABLE
WHERE to_tsvector('english', COLUMN_NAME) @@ to_tsquery(KEYWORD)
ORDER BY ts_rank(to_tsvector('english', COLUMN_NAME), to_tsquery(KEYWORD)) desc
LIMIT 10
)
SELECT
COALESCE(vector_search.id, text_search.id) AS id,
COALESCE(1.0 / (60 + vector_search.rank), 0.0) + COALESCE(1.0 / (60 + text_search.rank), 0.0) AS rrf_score
FROM vector_search FULL OUTER JOIN text_search ON vector_search.id = text_search.id
ORDER BY rrf_score DESC
LIMIT 5;
Ganti kode berikut:
MODEL_ID
: ID model yang akan dikueri.Jika Anda menggunakan Vertex AI Model Garden, tentukan
text-embedding-005
sebagai ID model. Berikut adalah model berbasis cloud yang dapat digunakan AlloyDB untuk embedding teks. Untuk mengetahui informasi selengkapnya, lihat Embedding teks.TABLE
: tabel yang berisi data Anda.TEXT
: teks yang akan diterjemahkan ke dalam penyematan vektor.KEYWORD
: kata kunci yang ingin Anda telusuri.COLUMN_NAME
: kolom yang menyimpan data teks yang ingin Anda telusuri.
Penjelasan Kueri Penelusuran Hybrid dan Ekspresi Tabel Umum (CTE) terkait:
vector_search
CTE: Melakukan penelusuran kemiripan vektor standar, mengurutkan hasil berdasarkan jarak kosinus dan menetapkan peringkat. Fitur ini mengambil 10 produk yang paling mirip secara semantik.text_search
CTE: Menjalankan penelusuran teks menggunakanto_tsvector
danto_tsquery
, menghitung relevansi dengants_rank
, serta mengambil 10 kecocokan teks paling relevan.Final SELECT Statement
CTE: Menggabungkan hasil penelusuran vektor dan teks menggunakanFULL OUTER JOIN
, memilih ID produk, menghitung skor RRF, mengurutkan berdasarkan skor, dan mengambil 5 hasil teratas.
Melakukan penelusuran campuran menggunakan LangChain
Penelusuran campuran dengan penyimpanan vektor AlloyDB meningkatkan akurasi penelusuran dengan menggabungkan dua strategi pencarian yang berbeda: penelusuran vektor embedding padat dan penelusuran berbasis kata kunci. AlloyDBVectorStore
adalah class penyimpanan vektor LangChain yang menggunakan LangChain dengan bertindak sebagai penerapan spesifik dari class VectorStore
LangChain. Pelajari
cara menggunakan AlloyDB untuk menyimpan embedding vektor dengan class AlloyDBVectorStore.
Anda dapat mengaktifkan dan mengonfigurasi penelusuran hibrida ini menggunakan class HybridSearchConfig
saat menyiapkan AlloyDBVectorStore
.
Penelusuran hybrid dengan penyimpanan vektor AlloyDB secara simultan melakukan penelusuran semantik untuk memahami makna dan konteks kueri, serta penelusuran kata kunci untuk menemukan kecocokan leksikal yang persis. Hasil dari kedua penelusuran tersebut kemudian digabungkan untuk memberikan kumpulan hasil yang lebih komprehensif.