Bagian ini menjelaskan cara memanggil prediksi serta membuat kueri dan mengindeks penyematan menggunakan ekstensi pgvector. Fungsi AI yang didukung machine learning ini tersedia melalui AlloyDB AI, yang merupakan serangkaian fitur AlloyDB untuk PostgreSQL yang memungkinkan Anda menerapkan kekuatan semantik dan prediktif model machine learning (ML) ke data Anda.
Pelajari lebih lanjut AI AlloyDB di https://cloud.google.com//alloydb/docs/ai.
Memanggil prediksi
Untuk mengintegrasikan Vertex AI dengan AlloyDB Omni dan menjalankan prediksi pada model yang disimpan di Vertex AI, ikuti langkah-langkah berikut.
Sebelum memulai
- Aktifkan prediksi online Vertex AI di GDC.
Buat secret Kubernetes berdasarkan kunci akun layanan yang didownload pada langkah sebelumnya dengan menjalankan perintah berikut. Pastikan Anda membuat secret Kubernetes di namespace yang sama dengan resource
DBCluster
Anda.kubectl create secret generic SECRET_NAME \ --from-file=PATH_TO_SERVICE_ACCOUNT_KEY/private-key.json \ -n NAMESPACE
Ganti kode berikut:
SECRET_NAME
: nama secret yang digunakan saat Anda membuat manifesDBCluster
untuk memungkinkan AlloyDB Omni mengakses fitur AI Distributed Cloud. Misalnya,vertex-ai-key-alloydb
.PATH_TO_SERVICE_ACCOUNT_KEY
: jalur ke lokasi tempat Anda mendownload kunci akun layananprivate-key.json
.NAMESPACE
: namespace cluster database.
Instal operator AlloyDB Omni menggunakan langkah-langkah yang tercantum dalam Memilih jenis mesin database dan membuat cluster database.
Buat cluster database dengan AI AlloyDB dan tetapkan
vertexAIKeyRef
ke secret Kubernetes yang dibuat pada langkah sebelumnya di kolomgoogleMLExtension
dalam manifesDBCluster
.apiVersion: v1 kind: Secret metadata: name: db-pw-DBCLUSTER_NAME namespace: USER_PROJECT type: Opaque data: DBCLUSTER_NAME: "BASE64_PASSWORD" --- apiVersion: DBENGINE_NAME.dbadmin.gdc.goog/v1 kind: DBCluster metadata: name: DBCLUSTER_NAME namespace: USER_PROJECT spec: primarySpec: adminUser: passwordRef: name: db-pw-DBCLUSTER_NAME features: googleMLExtension: config: vertexAIKeyRef: SECRET_NAME version: "DB_VERSION" resources: memory: DB_MEMORY cpu: DB_CPU disks: - name: DataDisk size: DB_DATA_DISK
Ganti variabel berikut:
DBCLUSTER_NAME
: nama cluster database.USER_PROJECT
: nama project pengguna tempat cluster database akan dibuat.BASE64_PASSWORD
: encoding base64 dari sandi administrator database.DBENGINE_NAME
: nama mesin database. Tetapkan kealloydbomni
.DB_VERSION
: versi mesin database.DB_MEMORY
: jumlah memori yang dialokasikan ke cluster database, misalnya5Gi
.DB_CPU
: jumlah CPU yang dialokasikan ke cluster database, misalnya2
.DB_DATA_DISK
: jumlah ruang yang dialokasikan ke cluster database, misalnya10 Gi
.
Terapkan manifes.
kubectl apply -f DB_CLUSTER_YAML
Ganti kode berikut:
DB_CLUSTER_YAML
: nama file manifes cluster database ini—misalnya,alloydb-omni-db-cluster.yaml
.
Instal ekstensi
google_ml_integration
.CREATE EXTENSION google_ml_integration CASCADE;
Memanggil prediksi
Panggil prediksi online menggunakan endpoint model Vertex AI dengan menjalankan
fungsi SQL ml_predict_row()
berikut:
SELECT ml_predict_row('PREDICTION_ENDPOINT/PROJECT_NAMESPACE/ORGANIZATION/ZONE/DNS/DNS_SUFFIX', '{ "instances": [ INSTANCES ], "parameters":
PARAMETERS');
Ganti kode berikut:
PREDICTION_ENDPOINT
: nama lengkap endpoint Vertex AIPROJECT_NAMESPACE
: namespace tempat endpoint Vertex AI di-deployORGANIZATION
: nama organisasi tempat endpoint Vertex AI di-deployZONE
: zona tempat endpoint Vertex AI Anda di-deployDNS
: DNS untuk organisasi AndaDNS_SUFFIX
: suffix objek DNSINSTANCES
: input ke panggilan prediksi, dalam format JSONPARAMETERS
: parameter untuk panggilan prediksi, dalam format JSON
Mengkueri dan mengindeks embedding menggunakan pgvector
Ekstensi PostgreSQL pgvector
memungkinkan Anda menggunakan operator dan
fungsi khusus vektor saat menyimpan, mengindeks, dan membuat kueri embedding teks di database Anda.
AlloyDB menyediakan pengoptimalan untuk bekerja dengan pgvector
,
yang memungkinkan Anda membuat indeks yang dapat mempercepat kueri tertentu yang
melibatkan penyematan.
Pelajari lebih lanjut cara menggunakan AlloyDB sebagai LLM, serta cara membuat dan menyimpan embedding vektor berdasarkan LLM di https://cloud.google.com/alloydb/docs/ai/work-with-embeddings#index.
Membuat indeks dan membuat kueri vektor menggunakan ScaNN
Bagian ini menunjukkan cara menggunakan embedding tersimpan untuk membuat indeks dan mengkueri
embedding. Anda dapat membuat indeks ScaNN
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 ekstensipostgres_ann
selain ekstensivector
.CREATE EXTENSION IF NOT EXISTS postgres_ann;
Buat indeks ScaNN
Anda dapat membuat indeks ScaNN
untuk tabel di database Anda.
AlloyDB postgres_ann
, ekstensi PostgreSQL yang dikembangkan oleh Google yang menerapkan indeks tetangga terdekat yang sangat efisien yang didukung oleh algoritma ScaNN.
Indeks ScaNN
adalah indeks kuantisasi berbasis pohon untuk perkiraan penelusuran tetangga terdekat. Hal ini memberikan waktu pembuatan indeks yang rendah dan jejak memori yang kecil. Selain itu, layanan ini menyediakan QPS cepat berdasarkan workload.
Indeks ScaNN
hierarki dua tingkat
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 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 yang akan ditambahkan indeksnya.EMBEDDING_COLUMN
: kolom yang menyimpan datavector
.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.
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 tingkat pohon pengelompokan K-means. Tetapkan ke1
(default) untuk kuantisasi berbasis pohon dua tingkat dan ke2
untuk kuantisasi berbasis pohon 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 tertentu.
Parameter indeks harus disetel untuk mencapai keseimbangan yang tepat antara QPS dan perolehan.
Untuk membuat indeks ini pada kolom sematan 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 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 hilang setelah indeks dibuat.
Menjalankan kueri
Setelah menyimpan dan mengindeks sematan di database, Anda dapat mulai membuat kueri menggunakan fungsi kueri pgvector
. Anda tidak dapat menjalankan kueri penelusuran massal menggunakan ekstensi postgres_ann
.
Untuk menemukan tetangga semantik terdekat untuk vektor embedding, Anda dapat menjalankan contoh kueri berikut, dengan 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 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 tersimpan.ROW_COUNT
: jumlah baris yang akan ditampilkan.Tentukan
1
jika Anda hanya menginginkan satu kecocokan terbaik.
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, guna menemukan baris database dengan
embedding yang paling mirip secara semantik. Perhatikan bahwa Anda harus mendaftarkan model Gecko penyematan teks terlebih dahulu untuk menggunakan fungsi ini.
Karena embedding()
menampilkan array real
, Anda harus melakukan transmisi eksplisit panggilan
embedding()
ke vector
untuk menggunakan nilai ini dengan operator pgvector
.
CREATE EXTENSION 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
textembedding-gecko@003
sebagai ID model. Berikut adalah model berbasis cloud yang dapat digunakan Distributed Cloud untuk embedding teks.Opsional:
VERSION_TAG
: tag versi model yang akan dikueri. Awali tag dengan@
.Jika Anda menggunakan salah satu model berbahasa Inggris
textembedding-gecko
dengan Vertex AI, tentukan salah satu tag versi—misalnya,textembedding-gecko@003
.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.
Metrik indeks vektor
Bagian ini mencantumkan metrik yang terkait dengan indeks vektor yang Anda buat di AlloyDB. Anda dapat melihat metrik ini menggunakan tampilan pg_stat_ann_indexes
yang tersedia saat Anda menginstal ekstensi postgres_ann
.
Metrik kegunaan
Metrik kegunaan mencakup metrik yang membantu Anda memahami status pemanfaatan indeks dengan metrik seperti konfigurasi indeks dan jumlah pemindaian indeks.
Nama metrik | Jenis data | Deskripsi |
---|---|---|
relid |
OID |
ID unik tabel yang berisi indeks vektor. |
indexrelid |
OID |
ID unik indeks vektor. |
schemaname |
NAME |
Nama skema tempat indeks berada. |
relname |
NAME |
Nama tabel yang berisi indeks. |
indexrelname |
NAME |
Nama indeks. |
indextype |
NAME |
Jenis indeks. Nilai ini selalu ditetapkan ke postgres_ann . |
indexconfig |
TEXT[] |
Konfigurasi, seperti jumlah daun dan penguantisasi, yang ditentukan untuk indeks saat dibuat. |
indexsize |
TEXT |
Ukuran indeks. |
indexscan |
BIGINT |
Jumlah pemindaian indeks yang dimulai pada indeks. |
Metrik penyesuaian
Metrik penyesuaian memberikan insight tentang pengoptimalan indeks saat ini, sehingga Anda dapat menerapkan rekomendasi untuk performa kueri yang lebih cepat.
Nama metrik | Jenis data | Deskripsi |
---|---|---|
insertcount |
BIGINT |
Jumlah operasi penyisipan pada indeks. Metrik ini juga mencakup sejumlah baris yang ada sebelum indeks dibuat. |
updatecount |
BIGINT |
Jumlah operasi update pada indeks. Metrik ini tidak memperhitungkan update HOT apa pun. |
deletecount |
BIGINT |
Jumlah operasi penghapusan pada indeks. |
distribution |
JSONB |
Distribusi vektor di semua partisi untuk indeks. Kolom berikut menunjukkan distribusi:
Catatan: Karena karakteristik inheren algoritma pengelompokan K-means, akan selalu ada beberapa tingkat varians dalam distribusi vektor di seluruh partisi, bahkan saat indeks dibuat pertama kali. |
Rekomendasi penyesuaian berdasarkan metrik
- Mutasi
- Metrik
insertcount
,updatecount
, dandeletecount
secara bersamaan menunjukkan perubahan atau mutasi dalam vektor untuk indeks. - Indeks dibuat dengan jumlah vektor dan partisi tertentu. Saat operasi seperti penyisipan, pembaruan, atau penghapusan dilakukan pada indeks vektor, operasi tersebut hanya memengaruhi kumpulan partisi awal tempat vektor berada. Akibatnya, jumlah vektor di setiap partisi berfluktuasi dari waktu ke waktu, yang berpotensi memengaruhi perolehan, QPS, atau keduanya.
- Jika Anda mengalami masalah kelambatan atau akurasi seperti QPS rendah atau recall buruk, dalam kueri penelusuran ANN Anda dari waktu ke waktu, pertimbangkan untuk meninjau metrik ini. Jumlah mutasi yang tinggi dibandingkan dengan jumlah total vektor dapat menunjukkan perlunya pengindeksan ulang.
- Distribusi
- Metrik
distribution
menampilkan distribusi vektor di semua partisi. - Saat Anda membuat indeks, indeks tersebut dibuat dengan jumlah vektor tertentu dan partisi tetap. Proses partisi dan distribusi berikutnya terjadi berdasarkan pertimbangan ini. Jika vektor tambahan ditambahkan, vektor tersebut akan dipartisi di antara partisi yang ada, sehingga menghasilkan distribusi yang berbeda dibandingkan dengan distribusi saat indeks dibuat. Karena distribusi akhir tidak mempertimbangkan semua vektor secara bersamaan, recall, QPS, atau keduanya mungkin terpengaruh.
- Jika Anda mengamati penurunan bertahap dalam performa kueri penelusuran ANN, seperti waktu respons yang lebih lambat atau akurasi hasil yang berkurang (diukur dengan QPS atau perolehan), pertimbangkan untuk memeriksa metrik ini dan mengindeks ulang.