Dokumen ini menunjukkan cara menggunakan embedding tersimpan untuk membuat indeks dan membuat kueri embedding. Untuk mengetahui informasi selengkapnya tentang 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
versi0.5.0
atau yang lebih baru yang didasarkan padapgvector
, yang diperluas oleh Google untuk AlloyDB, telah 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 Anda.
Buat indeks ScaNN
AlloyDB alloydb_scann
,
Ekstensi PostgreSQL yang dikembangkan oleh Google yang menerapkan
indeks tetangga terdekat yang efisien dan didukung oleh [ScaNN
algorithm](https://github.com/google-research/google-research/blob/master/scann/docs/algorithms.md).
Indeks ScaNN
adalah indeks kuantisasi berbasis pohon untuk
penelusuran tetangga terdekat. Fungsi ini memberikan waktu pembuatan indeks yang lebih singkat dan ukuran
jejak memori dibandingkan dengan HNSW
. Selain itu, API ini memberikan QPS yang lebih cepat di
dibandingkan dengan HNSW
berdasarkan beban kerja.
tabel di database AlloyDB Anda. Jika Anda mencoba membuat indeks ScaNN
pada tabel kosong atau berpartisi, Anda mungkin mengalami beberapa masalah. Untuk informasi selengkapnya
informasi tentang error yang dihasilkan, lihat Memecahkan masalah error indeks ScaNN.
Indeks hierarki dua tingkat 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 Andabuat—misalnya,
my-scann-index
. Nama indeks dibagikandi seluruh database Anda. Pastikan setiap nama indeks unik untuk setiap
tabel di database Anda.
TABLE
: tabel yang akan ditambahkan indeksnya.EMBEDDING_COLUMN
: kolom yang menyimpanvector
saat menangani data turunan.
DISTANCE_FUNCTION
: fungsi jarak yang akan digunakandengan indeks ini. Pilih salah satu opsi berikut:
Jarak L2:
l2
Perkalian titik:
dot_product
Jarak kosinus:
cosine
NUM_LEAVES_VALUE
: jumlah partisi yang akan diterapkanindeks ini. Tetapkan ke nilai apa pun antara 1 hingga 1048576. Untuk informasi selengkapnya
tentang cara menentukan nilai ini, lihat Menyesuaikan indeks
ScaNN
.
Indeks hierarki tiga tingkat ScaNN
Untuk membuat indeks pohon 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 tingkatPohon pengelompokan k-means. Setel ke
1
(default) untuk berbasis pohon dua tingkatkuantisasi dan ke
2
untuk kuantisasi berbasis pohon tiga tingkat.
Setelah membuat indeks, Anda dapat menjalankan kueri penelusuran neighbor terdekat yang
memanfaatkan indeks dengan mengikuti petunjuk di [Membuat kueri neighbor terdekat
kueri dengan teks tertentu](#query).
Parameter indeks harus ditetapkan untuk mencapai keseimbangan yang tepat antara QPS dan
mengingat. Untuk mengetahui informasi selengkapnya tentang cara menyesuaikan indeks ScaNN
, lihat [Menyesuaikan indeks ScaNN
index](/alloydb/omni/containers/15.7.0/docs/ai/tune-indexes).
Untuk membuat indeks ini pada kolom penyematan yang menggunakan jenis data real[]
daripada 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 [Vektor
functions](https://github.com/pgvector/pgvector?tab=readme-ov-file#vector-functions).
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 agar mendapatkan keseimbangan QPS dan perolehan target, lihat Menyesuaikan indeks ScaNN
.
Menganalisis tabel yang diindeks
Setelah membuat indeks ScaNN
, jalankan perintah ANALYZE
untuk memperbarui statistik tentang data Anda.
ANALYZE TABLE;
Menjalankan kueri
Setelah menyimpan dan mengindeks embedding di database, Anda dapat memulai
membuat kueri menggunakan [pgvector
query
functionality](https://github.com/pgvector/pgvector#querying). 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 membandingkanteks ke.
INDEX_NAME
: nama indeks yang ingin Anda gunakan—misalnya,contoh,
my-scann-index
.EMBEDDING_COLUMN
: kolom yang berisiembedding.
DISTANCE_FUNCTION_QUERY
: fungsi jarak yang akan digunakan dengan inikueri. 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 kecocokan terdekatnyatetangga semantik dari.
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
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 secara eksplisit
Panggilan embedding()
ke vector
untuk menggunakan nilai ini dengan pgvector
operator.
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.