Membangun aplikasi AI generatif menggunakan AlloyDB AI

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

  1. Aktifkan prediksi online Vertex AI di GDC.
  2. 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 manifes DBCluster 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 layanan private-key.json.

    • NAMESPACE: namespace cluster database.

  3. Instal operator AlloyDB Omni menggunakan langkah-langkah yang tercantum dalam Memilih jenis mesin database dan membuat cluster database.

  4. Buat cluster database dengan AI AlloyDB dan tetapkan vertexAIKeyRef ke secret Kubernetes yang dibuat pada langkah sebelumnya di kolom googleMLExtension dalam manifes DBCluster.

    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 ke alloydbomni.
    • DB_VERSION: versi mesin database.
    • DB_MEMORY: jumlah memori yang dialokasikan ke cluster database, misalnya 5Gi.
    • DB_CPU: jumlah CPU yang dialokasikan ke cluster database, misalnya 2.
    • DB_DATA_DISK: jumlah ruang yang dialokasikan ke cluster database, misalnya 10 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.
  5. 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 AI

  • PROJECT_NAMESPACE: namespace tempat endpoint Vertex AI di-deploy

  • ORGANIZATION: nama organisasi tempat endpoint Vertex AI di-deploy

  • ZONE: zona tempat endpoint Vertex AI Anda di-deploy

  • DNS: DNS untuk organisasi Anda

  • DNS_SUFFIX: suffix objek DNS

  • INSTANCES: input ke panggilan prediksi, dalam format JSON

  • PARAMETERS: 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 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 postgres_ann selain ekstensi vector.

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

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 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 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:
  • maximum (INT8): Jumlah maksimum vektor di semua partisi.
  • minimum (INT8): Jumlah minimum vektor di semua partisi.
  • average (FLOAT) : Jumlah rata-rata vektor di semua partisi.
  • outliers (INT8[]): Pencilan teratas di semua partisi. Nilai ini menampilkan 20 pencilan teratas.

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, dan deletecount 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.