Membuat indeks

Indeks Hierarchical Navigable Small World (HNSW) di AlloyDB untuk PostgreSQL memungkinkan Anda mempercepat penelusuran kemiripan vektor atas embedding yang disimpan dengan recall tinggi dan latensi kueri rendah. Anda dapat membuat indeks HNSW berbasis grafik menggunakan ekstensi vector, menyesuaikan parameter build indeks, dan menjalankan kueri kemiripan terhadap embedding yang diindeks. 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.

  • Ekstensi vector versi 0.5.0 atau yang lebih baru yang didasarkan pada pgvector, yang diperluas oleh Google untuk AlloyDB, telah diinstal.

    CREATE EXTENSION IF NOT EXISTS vector;
    

Membuat indeks HNSW

AlloyDB mendukung pembuatan indeks hnsw berbasis grafik yang tersedia dengan pgvector stok menggunakan ekstensi pgvector AlloyDB. Penggunaan indeks hnsw menghasilkan greedy search yang bergerak melalui grafik dan terus mencari tetangga terdekat dengan vektor kueri hingga menemukan hasil yang optimal. Indeks ini memberikan performa kueri yang lebih cepat, tetapi waktu build yang lebih lambat jika dibandingkan dengan IVF.

Untuk mengetahui informasi selengkapnya tentang algoritma HNSW, lihat Grafik Hierarchical Navigable Small World.

Untuk membuat indeks hnsw, jalankan kueri berikut:

CREATE INDEX INDEX_NAME ON TABLE
  USING hnsw (EMBEDDING_COLUMN DISTANCE_FUNCTION)
  WITH (m = NUMBER_OF_CONNECTIONS, ef_construction = 'CANDIDATE_LIST_SIZE');

Ganti kode berikut:

  • INDEX_NAME: nama indeks yang ingin Anda buat—misalnya, my-hnsw-index.

  • 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

  • NUMBER_OF_CONNECTIONS: jumlah maksimum koneksi per dari node dalam grafik. Anda dapat memulai dengan nilai default sebagai 16 dan bereksperimen dengan nilai yang lebih tinggi berdasarkan ukuran set data Anda.

  • CANDIDATE_LIST_SIZE: ukuran daftar kandidat yang dipertahankan selama pembuatan grafik, yang terus memperbarui kandidat terbaik saat ini untuk tetangga terdekat untuk sebuah node. Tetapkan nilai ini ke nilai apa pun yang lebih tinggi dari dua kali nilai m—misalnya, 64.

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 graph akan hilang setelah indeks dibuat.

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

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 dengan 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.

  • INDEX_NAME: nama indeks yang ingin Anda gunakan—misalnya, my-hnsw-index.

  • EMBEDDING_COLUMN: kolom yang berisi embedding yang disimpan.

  • 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 terdekatnya yang disimpan.

  • 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 fungsi embedding() 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