Membuat indeks IVF

Pilih versi dokumentasi:

Halaman ini menjelaskan cara menggunakan embedding tersimpan untuk membuat indeks dan membuat kueri embedding menggunakan indeks IVF dengan AlloyDB Omni. Untuk mengetahui informasi selengkapnya tentang cara menyimpan embedding, lihat Menyimpan embedding vektor.

Sebelum memulai

Sebelum dapat mulai membuat indeks, Anda harus menyelesaikan prasyarat berikut.

  • Vektor embedding ditambahkan ke tabel di database AlloyDB Omni.

  • Versi ekstensi vector 0.5.0 atau yang lebih baru yang didasarkan pada pgvector, yang diperluas oleh Google untuk AlloyDB Omni, telah diinstal.

    CREATE EXTENSION IF NOT EXISTS vector;
    

Membuat indeks IVF

Stok pgvector mendukung penelusuran perkiraan tetangga terdekat melalui pengindeksan. AlloyDB Omni menambahkan dukungan ini dengan fitur kuantisasi skalar yang dapat Anda tentukan saat membuat indeks. Jika diaktifkan, kuantisasi skalar dapat mempercepat kueri yang memiliki vektor dimensi yang lebih besar secara signifikan, dan memungkinkan Anda menyimpan vektor dengan hingga 8.000 dimensi.

Untuk mengaktifkan kuantisasi skalar pada indeks berbasis pgvector, tentukan IVF sebagai metode indeks, dan SQ8 sebagai quantizer:

CREATE INDEX INDEX_NAME ON TABLE
  USING ivf (EMBEDDING_COLUMN DISTANCE_FUNCTION)
  WITH (lists = LIST_COUNT, quantizer = 'QUANTIZER');

Ganti kode berikut:

  • INDEX_NAME: nama indeks yang ingin Anda buat—misalnya, my-ivf-index. Nama indeks dibagikan di seluruh database Anda. Pastikan setiap nama indeks unik untuk setiap tabel di database Anda.

  • TABLE: tabel tempat indeks akan ditambahkan.

  • EMBEDDING_COLUMN: kolom yang menyimpan data vector.

  • DISTANCE_FUNCTION: fungsi jarak yang akan digunakan dengan indeks ini. Pilih salah satu opsi berikut:

    • Jarak L2: vector_l2_ops

    • Produk dalam: vector_ip_ops

    • Jarak kosinus: vector_cosine_ops

  • LIST_COUNT: jumlah daftar yang akan digunakan dengan indeks ini. Untuk mengetahui informasi selengkapnya tentang cara menentukan nilai ini, lihat Menyesuaikan indeks IVF.

  • QUANTIZER: jenis quantizer yang ingin Anda gunakan.

    Tetapkan ke salah satu opsi berikut:

    • SQ8: Direkomendasikan. Respons kueri lebih cepat, tetapi menyebabkan beberapa kehilangan recall, yang tidak memengaruhi skenario produksi.
    • FLAT: respons kueri lebih lambat dan penggunaan memori lebih tinggi, tetapi dapat mencapai kehilangan recall yang dapat diabaikan.

    Untuk membuat indeks ini di kolom embedding yang menggunakan jenis data real[], bukan vector, transmisikan kolom ke jenis data vector:

CREATE INDEX INDEX_NAME ON TABLE
  USING ivf (CAST(EMBEDDING_COLUMN AS vector(DIMENSIONS)))'}} DISTANCE_FUNCTION)
  WITH (lists = LIST_COUNT, quantizer = 'SQ8');

Ganti DIMENSIONS dengan lebar dimensi kolom embedding. Untuk mengetahui informasi selengkapnya tentang cara menemukan dimensi, lihat fungsi vector_dims di Fungsi vektor.

Untuk melihat progres pengindeksan, gunakan tampilan pg_stat_progress_create_index:

SELECT * FROM pg_stat_progress_create_index;

Kolom phase menampilkan status pembuatan indeks Anda saat ini, dan fase building postings menunjukkan bahwa pembuatan indeks hampir selesai.

Untuk menyesuaikan indeks Anda untuk target recall dan keseimbangan QPS, lihat Menyesuaikan indeks IVF.

Menjalankan kueri

Setelah menyimpan dan mengindeks embedding di database, Anda dapat mulai membuat kueri menggunakan fungsi kueri pgvector.

Untuk menemukan tetangga semantik terdekat untuk vektor embedding, Anda dapat menjalankan contoh kueri berikut, tempat Anda menetapkan fungsi jarak yang sama yang Anda gunakan selama pembuatan indeks.

  SELECT * FROM TABLE
    ORDER BY EMBEDDING_COLUMN DISTANCE_FUNCTION_QUERY ['EMBEDDING']
    LIMIT ROW_COUNT

Ganti kode berikut:

  • TABLE: tabel yang berisi embedding untuk membandingkan teks.

  • EMBEDDING_COLUMN: kolom yang berisi embedding tersimpan.

  • DISTANCE_FUNCTION_QUERY: fungsi jarak yang akan digunakan dengan kueri ini. Pilih salah satu opsi berikut berdasarkan fungsi jarak yang digunakan saat membuat indeks:

    • Jarak L2: <->

    • Produk dalam: <#>

    • Jarak kosinus: <=>

  • EMBEDDING: vektor embedding yang ingin Anda temukan tetangga semantik tersimpan terdekatnya.

  • ROW_COUNT: jumlah baris yang akan ditampilkan.

    Tentukan 1 jika Anda hanya menginginkan satu kecocokan terbaik.

Untuk mengetahui informasi selengkapnya tentang contoh kueri lainnya, lihat Membuat kueri.

Anda juga dapat menggunakan embedding() fungsi untuk menerjemahkan teks ke dalam vektor. Anda menerapkan vektor ke salah satu operator tetangga terdekat pgvector, <-> untuk jarak L2, untuk menemukan baris database dengan embedding yang paling mirip secara semantik.

Karena embedding() menampilkan array real, Anda harus secara eksplisit mentransmisikan panggilan embedding() ke vector agar dapat menggunakan nilai ini dengan operator pgvector.

Langkah berikutnya