Halaman ini menjelaskan cara menggunakan penyematan tersimpan untuk membuat indeks dan membuat kueri
penyematan menggunakan indeks ScaNN
, IVF
, IVFFlat
, dan HNSW
dengan AlloyDB untuk PostgreSQL.
Untuk informasi selengkapnya tentang menyimpan penyematan, lihat
Menyimpan penyematan vektor.
Sebelum memulai
Sebelum dapat mulai membuat indeks, Anda harus menyelesaikan prasyarat berikut.
Vektor penyematan ditambahkan ke tabel di database AlloDB Anda.
Ekstensi
vector
versi0.5.0
atau yang lebih baru yang didasarkan padapgvector
, yang diperluas oleh Google untuk AlloDB diinstal.CREATE EXTENSION IF NOT EXISTS vector;
Untuk membuat indeks
ScaNN
, instal ekstensialloydb_scann
selain ekstensivector
.CREATE EXTENSION IF NOT EXISTS alloydb_scann;
Membuat indeks
Anda dapat membuat salah satu jenis indeks berikut untuk tabel di database.
Membuat indeks ScaNN
AlloyDB alloydb_scann
, ekstensi PostgreSQL yang dikembangkan oleh Google yang mengimplementasikan indeks tetangga terdekat
yang sangat efisien dan didukung oleh algoritma
ScaNN.
Indeks ScaNN
adalah indeks kuantisasi berbasis hierarki untuk perkiraan penelusuran tetangga terdekat. Hal ini memberikan waktu pembuatan indeks yang lebih rendah dan
jejak memori yang lebih kecil dibandingkan dengan HNSW
. Selain itu, implementasi ini memberikan QPS yang lebih cepat dibandingkan dengan HNSW
berdasarkan beban kerja.
Indeks ScaNN
hierarki dua tingkat
Untuk menerapkan indeks hierarki dua tingkat menggunakan algoritma ScaNN ke kolom yang berisi penyematan vektor yang disimpan, 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 tempat indeks akan ditambahkan.EMBEDDING_COLUMN
: kolom yang menyimpan datavector
.DISTANCE_FUNCTION
: fungsi jarak yang akan digunakan dengan indeks ini. Pilih salah satu opsi berikut:Jarak L2:
l2
Dot product:
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 informasi selengkapnya tentang cara menentukan nilai ini, lihat Menyesuaikan indeksScaNN
.
Indeks ScaNN
hierarki tiga tingkat
Untuk membuat indeks hierarki tiga tingkat menggunakan algoritma ScaNN ke kolom yang berisi penyematan vektor yang disimpan, 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 hierarki pengelompokan K-means. Tetapkan ke1
(default) untuk kuantisasi berbasis hierarki dua tingkat dan ke2
untuk kuantisasi berbasis hierarki tiga tingkat.
Setelah membuat indeks, Anda dapat menjalankan kueri penelusuran tetangga terdekat yang menggunakan indeks dengan mengikuti petunjuk di Membuat kueri tetangga terdekat dengan teks yang diberikan.
Parameter indeks harus ditetapkan untuk mencapai keseimbangan yang tepat antara QPS dan
recall. Untuk mengetahui informasi selengkapnya tentang cara menyesuaikan indeks ScaNN
, lihat Menyesuaikan indeks
ScaNN
.
Untuk membuat indeks ini pada kolom penyematan 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 penyematan. 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 index: tree training
akan menghilang setelah indeks dibuat.
Untuk menyesuaikan indeks Anda dengan target recall dan keseimbangan QPS, lihat Menyesuaikan indeks ScaNN
.
Menjalankan kueri
Setelah menyimpan dan mengindeks penyematan di 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 penyematan, Anda dapat menjalankan contoh kueri berikut, dengan menetapkan fungsi jarak yang sama dengan yang digunakan selama pembuatan indeks.
SELECT * FROM TABLE
ORDER BY EMBEDDING_COLUMN DISTANCE_FUNCTION_QUERY ['EMBEDDING']
LIMIT ROW_COUNT
Ganti kode berikut:
TABLE
: tabel yang berisi penyematan untuk membandingkan teks.INDEX_NAME
: nama indeks yang ingin Anda gunakan—misalnya,my-scann-index
.EMBEDDING_COLUMN
: kolom yang berisi penyematan yang disimpan.DISTANCE_FUNCTION_QUERY
: fungsi jarak yang akan digunakan dengan kueri ini. Pilih salah satu dari opsi berikut berdasarkan fungsi jarak yang digunakan saat membuat indeks:Jarak L2:
<->
Produk dalam:
<#>
Jarak kosinus:
<=>
EMBEDDING
: vektor penyematan yang ingin Anda temukan tetangga semantik terdekatnya.ROW_COUNT
: jumlah baris yang akan ditampilkan.Tentukan
1
jika Anda hanya menginginkan satu kecocokan terbaik.
Untuk 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 secara eksplisit mentransmisikan
panggilan embedding()
ke vector
untuk menggunakan nilai ini dengan operator
pgvector
.
CREATE EXTENSION IF NOT EXISTS google_ml_integration VERSION '1.2';
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 Model Garden Vertex AI, tentukan
text-embedding-005
sebagai ID model. Ini adalah model berbasis cloud yang dapat digunakan AlloDB untuk embedding teks. Untuk informasi selengkapnya, lihat Embedding teks.Opsional:
VERSION_TAG
: tag versi model yang akan dibuat kueri. Awali tag dengan@
.Jika Anda menggunakan salah satu model bahasa Inggris
text-embedding-005
dengan Vertex AI, tentukan salah satu tag versi—misalnya,text-embedding-005
, yang tercantum di Versi model.Google sangat merekomendasikan 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 menjadi embedding vektor.
Langkah selanjutnya
- Contoh alur kerja penyematan
- Menyesuaikan performa kueri vektor
- Metrik indeks vektor
- Pelajari cara membuat asisten belanja pintar dengan AlloyDB, pgvector, dan pengelolaan endpoint model.