Membuat dan mengelola embedding vektor otomatis untuk tabel besar

Anda dapat membuat dan mengelola sematan vektor untuk seluruh kolom tabel, yang memberi Anda solusi skalabel untuk pembuatan sematan vektor skala besar. Solusi ini sangat berguna untuk memfasilitasi penelusuran semantik dan Retrieval Augmented Generation (RAG) pada konten teks, termasuk berikut ini:

  • Membuat embedding vektor awal untuk tabel baru
  • Membuat embedding setelah mengimpor data dalam jumlah besar
  • Memperbarui embedding setelah perubahan data yang signifikan
  • Mempertahankan embedding secara inkremental

Memahami embedding vektor otomatis

Embedding vektor otomatis di AlloyDB menyediakan cara yang skalabel untuk mengotomatiskan pembuatan dan pemeliharaan embedding vektor untuk data Anda. Daripada membuat embedding secara manual untuk setiap teks baru atau yang diupdate, Anda dapat mengonfigurasi embedding vektor otomatis untuk menangani proses ini. Hal ini sangat berguna untuk aplikasi yang mengandalkan embedding terbaru untuk penelusuran semantik, Retrieval Augmented Generation (RAG), dan fitur lainnya yang didukung AI.

Dengan embedding vektor otomatis, Anda dapat melakukan hal berikut:

  • Menginisialisasi embedding untuk seluruh tabel: membuat embedding untuk semua data yang ada di kolom tabel dengan satu perintah.
  • Menjaga sinkronisasi sematan: memperbarui sematan secara otomatis saat data sumber berubah, sehingga memastikan aplikasi AI Anda selalu berfungsi dengan informasi terbaru.
  • Membuat embedding dalam skala besar: buat embedding secara efisien untuk tabel besar dengan jutaan baris.
  • Konfigurasi dan kelola sematan untuk beberapa kolom dalam tabel yang sama dengan memanggil fungsi pengelolaan untuk setiap kolom sematan.

Fitur ini menyederhanakan pengembangan dan pemeliharaan aplikasi AI dengan menghilangkan kompleksitas pembuatan dan pemeliharaan penyematan vektor.

Sebelum memulai

Sebelum Anda dapat membuat dan mengelola embedding vektor untuk tabel besar, lakukan hal berikut:

  • Hubungkan ke database Anda menggunakan psql atau AlloyDB for PostgreSQL Studio sebagai pengguna postgres.
  • Pastikan ekstensi google_ml_integration telah diinstal.
  • Pastikan tanda google_ml_integration.enable_model_support disetel ke on.
  • Verifikasi bahwa ekstensi google_ml_integration adalah versi 1.5.2 atau yang lebih tinggi dan tanda google_ml_integration.enable_faster_embedding_generation ditetapkan ke on.

    Untuk memeriksa versi ekstensi Anda dengan perintah berikut:

    SELECT extversion FROM pg_extension WHERE extname = 'google_ml_integration';
    

    Jika Anda perlu memperbarui ekstensi, gunakan perintah ALTER EXTENSION google_ml_integration UPDATE;.

  • Sebelum dapat membuat embedding dari database AlloyDB, Anda harus mengonfigurasi AlloyDB agar dapat digunakan dengan Vertex AI. Untuk mengetahui informasi selengkapnya, lihat Mengintegrasikan database Anda dengan Vertex AI.

  • Untuk mengelola dan memantau pembuatan penyematan otomatis, pengguna memiliki akses Select ke tabel google_ml.embed_gen_progress dan google_ml.embed_gen_settings secara default.

    Untuk mengizinkan pengguna mengelola pembuatan penyematan otomatis, berikan izin INSERT, UPDATE, dan DELETE pada tabel google_ml.embed_gen_progress dan google_ml.embed_gen_settings:

    GRANT INSERT, UPDATE, DELETE ON google_ml.embed_gen_progress TO 'USER_NAME';
    

    Ganti kode berikut:

    • USER_NAME: nama pengguna yang diberi izin.
  • Pastikan AUTOCOMMIT disetel ke ON di klien PostgreSQL yang Anda gunakan.

  • Pastikan model embedding yang Anda gunakan memiliki kuota yang cukup untuk embedding vektor otomatis. Kuota yang tidak mencukupi dapat menyebabkan operasi penyematan otomatis berjalan lambat atau gagal. Misalnya, berikut batas untuk model embedding Vertex AI:

    • Batas embedding teks: setiap permintaan dapat memiliki hingga 250 teks input yang menghasilkan satu embedding per teks input dan 20.000 token per permintaan. Hanya 2.048 token pertama dalam setiap teks input yang digunakan untuk menghitung embedding.
    • Permintaan per menit:

      • base_model : text-embedding : 1500
      • base_model : gemini-embedding : 100000
    • Batas token model Embedding Gemini: tidak seperti model embedding lainnya yang terutama dibatasi oleh kuota RPM, seri model Embedding Gemini dibatasi hingga 5.000.000 token per menit per project.

Menginisialisasi embedding untuk tabel

Fungsi untuk mengelola sematan vektor otomatis tersedia dalam skema ai. Skema ini menyediakan antarmuka untuk fitur AI terbaru di AlloyDB.

Gunakan fungsi SQL ai.initialize_embeddings() untuk membuat embedding untuk kolom konten tabel. Ini adalah panggilan pemblokiran:

  • Jika fungsi menampilkan keberhasilan, pembuatan sematan vektor telah selesai.
  • Fungsi ini akan otomatis mencoba memulihkan diri dari masalah sementara seperti error kuota model. Kegagalan hanya akan ditampilkan kepada Anda jika upaya pemulihan ini gagal. Untuk masalah persisten, seperti batch_size yang salah dikonfigurasi yang menyebabkan permintaan melebihi batas ukuran, atau jika operasi dibatalkan secara manual, Anda harus mengeluarkan ulang panggilan secara manual.

Fungsi ini mendukung model yang disediakan Google—misalnya, text-embedding-005 Vertex AI—serta model kustom yang Anda daftarkan.

Sebelum membuat embedding, buat kolom content_embeddings di tabel Anda. Kolom ini biasanya memiliki jenis vector(DIMENSION) dan nilai DEFAULT NULL.

ALTER TABLE user_reviews ADD COLUMN IF NOT EXISTS content_embeddings vector(768) DEFAULT NULL;

Melakukan pembuatan batch

Secara default, AlloyDB menggunakan batching untuk membuat embedding bagi beberapa input teks dalam satu permintaan, yang meningkatkan efisiensi. Jika Anda tidak memberikan ukuran batch tertentu, AlloyDB akan menerapkan nilai default yang ditentukan secara otomatis.

Ukuran batch petunjuk

Parameter batch_size di ai.initialize_embeddings memungkinkan Anda memandu pengoptimal kueri AlloyDB dengan menyarankan ukuran batch pilihan untuk model yang didukung langsung. AlloyDB dapat mengurangi ukuran ini secara dinamis berdasarkan batas atau kuota model, tetapi petunjuk Anda membantu memengaruhi rencana eksekusi kueri.

CALL ai.initialize_embeddings(
    model_id => 'text-embedding-005',
    table_name => 'user_reviews',
    content_column => 'content',
    embedding_column => 'content_embeddings',
    batch_size => 50
);

Menggunakan model penyematan kustom dengan dukungan batch

Jika Anda ingin menggunakan model kustom atau yang didukung secara eksternal yang mendukung batching, tentukan fungsi transformasi batch dan tentukan sebagai model_batch_in_transform_fn dan model_batch_out_transform_fn saat Anda membuat model. Anda juga dapat menentukan batch_size dalam panggilan initialize_embeddings. Untuk model yang mendukung pengelompokan, sebaiknya gunakan batch_size yang lebih besar dari 1 untuk performa yang lebih baik.

  1. Tentukan fungsi input, output, dan transformasi batch model kustom Anda.

    -- Scalar input transform functions
    CREATE OR REPLACE FUNCTION acme_text_input_transform(model_id TEXT, input TEXT) RETURNS JSON;
    CREATE OR REPLACE FUNCTION acme_text_output_transform(model_id TEXT, model_output JSON) RETURNS real[];
    CREATE OR REPLACE FUNCTION acme_generate_headers(model_id TEXT, input TEXT) RETURNS JSON;
    -- Batch input transform functions
    CREATE OR REPLACE FUNCTION acme_text_batch_input_transform(model_id TEXT, input TEXT[]) RETURNS JSON;
    CREATE OR REPLACE FUNCTION acme_text_batch_output_transform(model_id TEXT, model_output JSON) RETURNS real[][];
    
  2. Untuk membuat model, tentukan fungsi transformasi batch.

    CALL
      ai.create_model(
        model_id => 'custom-embedding-model',
        model_request_url => 'https://acme.com/models/text/embeddings/v1',
        model_type => 'text_embedding',
        model_in_transform_fn => 'acme_text_input_transform',
        model_out_transform_fn => 'acme_text_output_transform',
        generate_headers_fn => 'acme_generate_headers',
        model_batch_in_transform_fn => 'acme_text_batch_input_transform',
        model_batch_out_transform_fn => 'acme_text_batch_output_transform'
      );
    
  3. Buat embedding vektor dengan model kustom Anda.

    CALL
      ai.initialize_embeddings(
        model_id => 'custom-embedding-model',
        table_name => 'user_reviews',
        content_column => 'content',
        embedding_column => 'content_embeddings',
        batch_size => 10
    );
    

Anda juga dapat menggunakan fitur penyematan otomatis dengan model kustom yang secara native tidak mendukung pengelompokan. Untuk melakukannya, Anda tetap harus menentukan fungsi transformasi batch model_batch_in_transform_fn dan model_batch_out_transform_fn. Untuk model non-batching, tentukan fungsi ini untuk memproses satu input dalam satu waktu dari array input. Saat Anda memanggil ai.initialize_embeddings untuk model ini, tetapkan batch_size ke 1.

Memperbarui embedding secara inkremental

Saat Anda memuat ulang sematan, sematan tersebut akan dibuat ulang berdasarkan nilai terbaru di kolom konten input.

Untuk memberi Anda kontrol atas konsistensi dan performa, AlloyDB mendukung berbagai mode untuk pembaruan penyematan inkremental. Anda dapat memilih mode menggunakan argumen enum incremental_refresh_mode di ai.initialize_embeddings(). Berikut adalah daftar kemungkinan mode:

  • transactional: embedding diperbarui sebagai bagian dari transaksi yang memperbarui kolom konten. Proses ini, yang sering kali menggunakan mekanisme yang mirip dengan pemicu database untuk membuat sematan secara otomatis saat kolom konten diperbarui, dapat menimbulkan overhead dan memperlambat operasi pembaruan. Overhead yang diperkenalkan adalah pertukaran untuk mempertahankan semantik transaksional dan memastikan bahwa sematan disinkronkan dengan konten. Mode ini mengandalkan fungsi transformasi skalar model Anda, jadi Anda harus menentukan model_in_transform_fn dan model_out_transform_fn saat membuat model. Untuk menggunakan mode transactional, Anda harus memiliki peran pemilik di tabel.

    CALL
      ai.initialize_embeddings(
        model_id => 'text-embedding-005',
        table_name => 'user_reviews',
        content_column => 'content',
        embedding_column => 'content_embeddings',
        batch_size => 10,
        incremental_refresh_mode => 'transactional'
    );
    
  • none: Ini adalah mode default. Dalam mode ini, AlloyDB tidak memperbarui penyematan secara otomatis. Tidak ada pelacakan untuk perubahan inkremental, sehingga memanggil fungsi ai.refresh_embeddings() akan membuat ulang sematan untuk seluruh tabel. Mode ini memberikan kontrol penuh.

Memuat ulang semua penyematan untuk tabel

Setelah berhasil menjalankan ai.initialize_embeddings() untuk tabel, Anda dapat menggunakan fungsi ai.refresh_embeddings() untuk membuat ulang embedding. Anda dapat menggunakan operasi refresh untuk memperbarui penyematan untuk baris yang diubah secara bersamaan selama panggilan initialize_embeddings awal atau untuk melakukan refresh penuh secara berkala.

Fungsi refresh menggunakan kembali setelan dari panggilan awal, sehingga Anda hanya perlu menentukan tabel dan kolom sematan. Anda juga dapat memberikan batch_size opsional untuk mengganti nilai default.

CALL ai.refresh_embeddings(
    table_name => 'user_reviews',
    embedding_column => 'content_embeddings',
    batch_size => 50  -- Optional override
);

Bekerja dengan data tabel selama pembuatan embedding vektor

Meskipun ai.initialize_embeddings() adalah panggilan pemblokiran untuk sesi yang dijalankannya, koneksi lain dapat terus bekerja dengan tabel. Proses penyematan vektor otomatis memperbarui baris dalam batch, yang melibatkan penguncian tingkat baris standar. Artinya, operasi DML serentak seperti UPDATE atau DELETE hanya diblokir sebentar jika mencoba mengubah baris yang sama yang sedang diperbarui oleh proses penyematan. Kueri dari koneksi lain tidak diblokir. Perhatikan bahwa initialize_embeddings melewati baris yang dimodifikasi secara bersamaan. Jika incremental_refresh_mode adalah none, sematan untuk baris yang diubah ini tidak diperbarui hingga refresh berikutnya dipanggil.

-- connection1 (starts embedding generation)
SELECT
  ai.initialize_embeddings(
    model_id => 'text-embedding-005',
    table_name => 'user_reviews',
    content_column => 'content',
    embedding_column => 'content_embeddings'
  );

-- connection2 (performs DMLs/queries without blocking)
INSERT INTO user_reviews(id, review_time, is_edited, content)
VALUES (48290, now(), false, 'I really liked the product functionality, but wish it came in orange color');

UPDATE user_reviews
SET is_edited = TRUE, content = 'Changing to 5 star. My issue is resolved by the support'
WHERE id = 700;

Jika Anda membatalkan initialize_embeddings menggunakan pg_cancel, atau jika initialize_embeddings gagal karena error internal, status kegagalan akan ditampilkan. Embedding vektor yang berhasil dibuat tidak akan di-roll back. Untuk memulihkan dari kegagalan dan menyelesaikan pembuatan penyematan vektor, Anda harus membersihkan konfigurasi terlebih dahulu menggunakan fungsi ai.drop_embedding_config(), lalu mengeluarkan kembali panggilan ai.initialize_embeddings().

Untuk memperbarui penyematan untuk baris yang diubah secara bersamaan, panggil ai.refresh_embeddings setelah panggilan ai.initialize_embeddings selesai. Panggilan pembaruan ini membuat ulang penyematan untuk seluruh tabel.

Menghapus setelan penyematan vektor otomatis

Jika Anda perlu menghapus konfigurasi penyematan vektor otomatis untuk kombinasi kolom penyematan dan tabel tertentu, gunakan fungsi ai.drop_embedding_config(). Fungsi ini dapat berguna untuk pembersihan atau saat Anda mengonfigurasi ulang pengelolaan penyematan untuk kolom.

CALL
  ai.drop_embedding_config(
    table_name => 'user_reviews',
    embedding_column => 'content_embeddings');

Contoh untuk membuat embedding secara otomatis

Bagian ini memberikan contoh untuk membuat embedding secara otomatis menggunakan endpoint model terdaftar.

Model embedding OpenAI

Untuk membuat embedding menggunakan endpoint model text-embedding-3-small terdaftar yang disediakan oleh OpenAI, jalankan pernyataan berikut:

CALL ai.initialize_embeddings(
    model_id => 'text-embedding-3-small',
    table_name => 'user_reviews',
    chunk_column => 'content',
    embedding_column => 'content_embeddings'
);

Model penyematan kustom

Untuk model Anda sendiri atau model yang didukung secara eksternal, Anda harus menentukan fungsi transformasi input dan output serta mendaftarkannya dengan ai.create_model. Jika Anda berencana menggunakan fitur penyematan otomatis, Anda harus menentukan fungsi transformasi skalar—misalnya, acme_text_input_transform, acme_text_output_transform—dan fungsi transformasi batch—misalnya, acme_text_batch_input_transform, acme_text_batch_output_transform.

Langkah berikutnya