Membuat indeks dan vektor kueri

Pilih versi dokumentasi:

Dokumen ini menunjukkan cara menggunakan embedding tersimpan untuk membuat indeks dan membuat kueri embedding. Untuk mengetahui informasi selengkapnya tentang cara menyimpan embedding, lihat Menyimpan embedding vektor.

Anda dapat membuat indeks ScaNN, IVF, IVFFlat, dan HNSW dengan AlloyDB.

Sebelum memulai

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

  • Vektor embedding ditambahkan ke tabel di database AlloyDB Anda.

  • 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;
    
  • Untuk membuat indeks ScaNN, instal ekstensi alloydb_scann selain ekstensi vector.

    CREATE EXTENSION IF NOT EXISTS alloydb_scann;
    

Membuat indeks

Anda dapat membuat salah satu jenis indeks berikut untuk tabel di database Anda.

Membuat indeks ScaNN

AlloyDB alloydb_scann, ekstensi PostgreSQL yang dikembangkan oleh Google yang mengimplementasikan indeks tetangga terdekat yang sangat efisien yang didukung oleh algoritma ScaNN.

Indeks ScaNN adalah indeks kuantisasi berbasis hierarki untuk penelusuran perkiraan tetangga terdekat. Algoritma ini memberikan waktu pembuatan indeks yang lebih rendah dan jejak memori yang lebih kecil dibandingkan dengan HNSW. Selain itu, fitur ini memberikan QPS yang lebih cepat dibandingkan dengan HNSW berdasarkan workload.

Indeks ScaNN hierarki dua tingkat

Untuk menerapkan indeks hierarki 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 bersifat unik untuk setiap tabel dalam database Anda.

  • TABLE: tabel yang akan ditambahi 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.

Indeks hierarki tiga tingkat ScaNN

Untuk membuat indeks hierarki tiga 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, max_num_levels = MAX_NUM_LEVELS);

Ganti kode berikut:

  • MAX_NUM_LEVELS: jumlah maksimum level pohon pengelompokan K-means. Tetapkan ke 1(default) untuk kuantisasi berbasis pohon dua tingkat dan ke 2 untuk kuantisasi berbasis pohon tiga tingkat.

Setelah membuat indeks, Anda dapat menjalankan kueri penelusuran tetangga terdekat yang menggunakan indeks tersebut dengan mengikuti petunjuk di Membuat kueri tetangga terdekat dengan teks yang diberikan.

Parameter indeks harus ditetapkan untuk mencapai keseimbangan yang tepat antara QPS dan perolehan. Untuk mengetahui informasi selengkapnya tentang penyesuaian indeks ScaNN, lihat Menyesuaikan indeks ScaNN.

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

CREATE INDEX INDEX_NAME ON TABLE
  USING scann (CAST(EMBEDDING_COLUMN AS vector(DIMENSIONS)) DISTANCE_FUNCTION)
  WITH (num_leaves=NUM_LEAVES_VALUE, max_num_levels = MAX_NUM_LEVELS);

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

Untuk mendapatkan pengalaman penelusuran yang konsisten, aktifkan pemeliharaan otomatis saat Anda membuat indeks ScaNN. Untuk mengetahui informasi selengkapnya, lihat Memelihara indeks vektor. Fitur ini tersedia dalam Pratinjau.

Untuk melihat progres pengindeksan, gunakan tampilan pg_stat_progress_create_index:

SELECT * FROM pg_stat_progress_create_index;

Kolom phase menunjukkan status pembuatan indeks Anda saat ini, dan fase building index: tree training akan hilang setelah indeks dibuat.

Untuk menyesuaikan indeks Anda agar mencapai keseimbangan antara target perolehan dan QPS, lihat Menyesuaikan indeks ScaNN.

Menganalisis tabel yang diindeks

Setelah membuat indeks ScaNN, jalankan perintah ANALYZE untuk memperbarui statistik tentang data Anda.

ANALYZE TABLE;

Membangun indeks secara paralel

AlloyDB dapat otomatis membuat beberapa pekerja paralel, bergantung pada set data Anda dan jenis indeks yang Anda pilih untuk membuat indeks lebih cepat.

Pembangunan indeks paralel sering kali dipicu saat Anda membuat indeks ScaNN 3 tingkat atau jika set data Anda melebihi 100 juta baris.

Meskipun AlloyDB otomatis mengoptimalkan jumlah worker paralel, Anda dapat menyesuaikan worker paralel menggunakan parameter perencanaan kueri PostgreSQL max_parallel_maintenance_workers, max_parallel_workers, dan min_parallel_table_scan_size.

Menjalankan kueri

Setelah menyimpan dan mengindeks embedding dalam database, Anda dapat mulai membuat kueri menggunakan fungsi kueri pgvector. Anda tidak dapat menjalankan kueri penelusuran massal menggunakan ekstensi alloydb_scann.

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-scann-index.

  • 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 fungsi embedding() untuk menerjemahkan teks menjadi vektor. Anda menerapkan vektor ke salah satu operator tetangga terdekat pgvector, <-> untuk jarak L2, guna menemukan baris database dengan embedding yang paling mirip secara semantik.

Karena embedding() menampilkan array real, Anda harus melakukan transmisi eksplisit panggilan embedding() ke vector untuk menggunakan nilai ini dengan operator pgvector.

  CREATE EXTENSION IF NOT EXISTS google_ml_integration;
  CREATE EXTENSION IF NOT EXISTS vector;

  SELECT * FROM TABLE
    ORDER BY EMBEDDING_COLUMN::vector
    <-> embedding('MODEL_IDVERSION_TAG', 'TEXT')
    LIMIT ROW_COUNT

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.

  • Opsional: VERSION_TAG: tag versi model yang akan dikueri. Awali tag dengan @.

    Jika Anda menggunakan salah satu model berbahasa Inggris text-embedding dengan Vertex AI, tentukan salah satu tag versi—misalnya, text-embedding-005, yang tercantum di Versi model.

    Google sangat menyarankan agar Anda selalu menentukan tag versi. Jika Anda tidak menentukan tag versi, AlloyDB akan selalu menggunakan versi model terbaru, yang dapat menyebabkan hasil yang tidak terduga.

  • TEXT: teks yang akan diterjemahkan ke dalam penyematan vektor.

Langkah berikutnya