Menjalankan penelusuran kemiripan vektor campuran

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.

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 data vector.

  • 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 indeks ScaNN.

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 menggunakan to_tsvector dan to_tsquery, menghitung relevansi dengan ts_rank, serta mengambil 10 kecocokan teks paling relevan.
  • Final SELECT Statement CTE: Menggabungkan hasil penelusuran vektor dan teks menggunakan FULL 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.

Langkah berikutnya