Melakukan penelusuran vektor di AlloyDB Omni

Pilih versi dokumentasi:

Tutorial ini menjelaskan cara menyiapkan dan melakukan penelusuran vektor di AlloyDB Omni. Anda menjalankan kueri menggunakan penelusuran tetangga terdekat yang tepat (KNN) dan indeks ScaNN berbasis perkiraan tetangga terdekat (ANN). Anda juga akan mempelajari cara menjalankan kueri penelusuran vektor yang difilter secara efisien menggunakan indeks ScaNN.

Tujuan

  • Instal AlloyDB AI di AlloyDB Omni.
  • Hubungkan ke database Anda dan instal ekstensi yang diperlukan.
  • Buat tabel product dan product inventory.
  • Masukkan data ke tabel product dan product inventory, lalu lakukan penelusuran vektor dasar.
  • Buat indeks ScaNN di tabel produk.
  • Lakukan penelusuran vektor.
  • Lakukan penelusuran vektor kompleks dengan filter dan gabungan.

Biaya

Dalam dokumen ini, Anda akan menggunakan komponen Google Cloudyang dapat ditagih berikut:

Untuk membuat perkiraan biaya berdasarkan proyeksi penggunaan Anda, gunakan kalkulator harga.

Setelah menyelesaikan tugas yang dijelaskan dalam dokumen ini, Anda dapat menghindari penagihan berkelanjutan dengan menghapus resource yang Anda buat. Untuk informasi selengkapnya, lihat Pembersihan.

Prasyarat

Selesaikan prasyarat berikut sebelum melakukan penelusuran vektor.

Instal AlloyDB AI di AlloyDB Omni berdasarkan lingkungan komputasi Anda

Berdasarkan lingkungan komputasi yang Anda gunakan, selesaikan petunjuk di Menginstal AlloyDB AI di AlloyDB Omni untuk menginstal AlloyDB Omni.

Menghubungkan ke database menggunakan psql

Hubungkan ke database Anda menggunakan psql:

    export DBPOD=`kubectl get pod --selector=alloydbomni.internal.dbadmin.goog/dbcluster=my-db-cluster,alloydbomni.internal.dbadmin.goog/task-type=database -o jsonpath='{.items[0].metadata.name}'`
    kubectl exec -ti $DBPOD -c database -- psql -h localhost -U postgres

Menginstal ekstensi yang diperlukan

Jalankan kueri berikut untuk menginstal ekstensi vector, alloydb_scann, dan google_ml_integration:

  CREATE EXTENSION IF NOT EXISTS vector;
  CREATE EXTENSION IF NOT EXISTS alloydb_scann;
  CREATE EXTENSION IF NOT EXISTS google_ml_integration CASCADE;

Setelah menyelesaikan tugas yang dijelaskan dalam dokumen ini, Anda dapat menghindari penagihan berkelanjutan dengan menghapus resource yang Anda buat. Untuk informasi selengkapnya, lihat Pembersihan.

Masukkan data produk dan inventaris produk, lalu lakukan penelusuran vektor dasar

Tabel product_inventory dan product digunakan dalam tutorial ini untuk menjalankan kueri penelusuran vektor yang kompleks.

  1. Jalankan pernyataan berikut untuk membuat tabel product yang melakukan hal berikut:

    • Menyimpan informasi produk dasar.
    • Mencakup kolom vektor embedding yang menghitung dan menyimpan vektor sematan untuk deskripsi produk dari setiap produk.
      CREATE TABLE product (
        id INT PRIMARY KEY,
        name VARCHAR(255) NOT NULL,
        description TEXT,
        category VARCHAR(255),
        color VARCHAR(255),
        embedding vector(768) GENERATED ALWAYS AS (embedding('text-embedding-004', description)) STORED
      );
    
  2. Jalankan kueri berikut untuk membuat tabel product_inventory yang menyimpan informasi tentang inventaris yang tersedia dan harga yang sesuai.

    CREATE TABLE product_inventory (
      id INT PRIMARY KEY,
      product_id INT REFERENCES product(id),
      inventory INT,
      price DECIMAL(10,2)
    );
    
  3. Jalankan kueri berikut untuk menyisipkan data produk ke dalam tabel product:

    INSERT INTO product (id, name, description,category, color) VALUES
    (1, 'Stuffed Elephant', 'Soft plush elephant with floppy ears.', 'Plush Toys', 'Gray'),
    (2, 'Remote Control Airplane', 'Easy-to-fly remote control airplane.', 'Vehicles', 'Red'),
    (3, 'Wooden Train Set', 'Classic wooden train set with tracks and trains.', 'Vehicles', 'Multicolor'),
    (4, 'Kids Tool Set', 'Toy tool set with realistic tools.', 'Pretend Play', 'Multicolor'),
    (5, 'Play Food Set', 'Set of realistic play food items.', 'Pretend Play', 'Multicolor'),
    (6, 'Magnetic Tiles', 'Set of colorful magnetic tiles for building.', 'Construction Toys', 'Multicolor'),
    (7, 'Kids Microscope', 'Microscope for kids with different magnification levels.', 'Educational Toys', 'White'),
    (8, 'Telescope for Kids', 'Telescope designed for kids to explore the night sky.', 'Educational Toys', 'Blue'),
    (9, 'Coding Robot', 'Robot that teaches kids basic coding concepts.', 'Educational Toys', 'White'),
    (10, 'Kids Camera', 'Durable camera for kids to take pictures and videos.', 'Electronics', 'Pink'),
    (11, 'Walkie Talkies', 'Set of walkie talkies for kids to communicate.', 'Electronics', 'Blue'),
    (12, 'Karaoke Machine', 'Karaoke machine with built-in microphone and speaker.', 'Electronics', 'Black'),
    (13, 'Kids Drum Set', 'Drum set designed for kids with adjustable height.', 'Musical Instruments', 'Blue'),
    (14, 'Kids Guitar', 'Acoustic guitar for kids with nylon strings.', 'Musical Instruments', 'Brown'),
    (15, 'Kids Keyboard', 'Electronic keyboard with different instrument sounds.', 'Musical Instruments', 'Black'),
    (16, 'Art Easel', 'Double-sided art easel with chalkboard and whiteboard.', 'Arts & Crafts', 'White'),
    (17, 'Finger Paints', 'Set of non-toxic finger paints for kids.', 'Arts & Crafts', 'Multicolor'),
    (18, 'Modeling Clay', 'Set of colorful modeling clay.', 'Arts & Crafts', 'Multicolor'),
    (19, 'Watercolor Paint Set', 'Watercolor paint set with brushes and palette.', 'Arts & Crafts', 'Multicolor'),
    (20, 'Beading Kit', 'Kit for making bracelets and necklaces with beads.', 'Arts & Crafts', 'Multicolor'),
    (21, '3D Puzzle', '3D puzzle of a famous landmark.', 'Puzzles', 'Multicolor'),
    (22, 'Race Car Track Set', 'Race car track set with cars and accessories.', 'Vehicles', 'Multicolor'),
    (23, 'RC Monster Truck', 'Remote control monster truck with oversized tires.', 'Vehicles', 'Green'),
    (24, 'Train Track Expansion Set', 'Expansion set for wooden train tracks.', 'Vehicles', 'Multicolor');
    
  4. Opsional: Untuk memverifikasi bahwa data dimasukkan dalam tabel product, jalankan kueri berikut:

    SELECT * FROM product;
    
  5. Jalankan kueri berikut untuk menyisipkan data inventaris ke dalam tabel product_inventory:

    INSERT INTO product_inventory (id, product_id, inventory, price) VALUES
    (1, 1, 9, 13.09),
    (2, 2, 40, 79.82),
    (3, 3, 34, 52.49),
    (4, 4, 9, 12.03),
    (5, 5, 36, 71.29),
    (6, 6, 10, 51.49),
    (7, 7, 7, 37.35),
    (8, 8, 6, 10.87),
    (9, 9, 7, 42.47),
    (10, 10, 3, 24.35),
    (11, 11, 4, 10.20),
    (12, 12, 47, 74.57),
    (13, 13, 5, 28.54),
    (14, 14, 11, 25.58),
    (15, 15, 21, 69.84),
    (16, 16, 6, 47.73),
    (17, 17, 26, 81.00),
    (18, 18, 11, 91.60),
    (19, 19, 8, 78.53),
    (20, 20, 43, 84.33),
    (21, 21, 46, 90.01),
    (22, 22, 6, 49.82),
    (23, 23, 37, 50.20),
    (24, 24, 27, 99.27);
    
  6. Jalankan kueri penelusuran vektor berikut untuk menelusuri produk yang mirip dengan kata music. Meskipun kata music tidak disebutkan secara eksplisit dalam deskripsi produk, hasilnya menampilkan produk yang relevan dengan kueri:

    SELECT * FROM product
    ORDER BY embedding <=> embedding('text-embedding-005', 'music')::vector
    LIMIT 3;
    

    Jika Anda melakukan penelusuran vektor dasar tanpa membuat indeks, AlloyDB AI akan menggunakan KNN, yang memberikan perolehan yang efisien; namun, dalam skala besar, penggunaan KNN dapat memengaruhi performa. Untuk performa kueri yang lebih baik, sebaiknya gunakan indeks ScaNN untuk penelusuran ANN, yang memberikan recall tinggi dengan latensi rendah.

    Jika Anda tidak membuat indeks, AlloyDB Omni akan menggunakan KNN secara default.

Buat indeks ScaNN di tabel produk

Jalankan kueri berikut untuk membuat indeks ScaNN product_index pada tabel product:

  CREATE INDEX product_index ON product
  USING scann (embedding cosine)
  WITH (num_leaves=5);

Parameter num_leaves menunjukkan jumlah node daun yang digunakan indeks berbasis pohon untuk membangun indeks. Untuk mengetahui informasi selengkapnya tentang cara menyesuaikan parameter ini, lihat Menyesuaikan performa kueri vektor.

Jalankan kueri penelusuran vektor berikut yang mencoba menemukan produk yang mirip dengan kueri bahasa alami music. Meskipun kata music tidak disertakan dalam deskripsi produk, hasilnya menampilkan produk yang relevan dengan kueri:

SET LOCAL scann.num_leaves_to_search = 2;

SELECT * FROM product
ORDER BY embedding <=> embedding('text-embedding-005', 'music')::vector
  LIMIT 3;

Parameter kueri scann.num_leaves_to_search mengontrol jumlah node daun yang ditelusuri selama penelusuran kemiripan. Nilai parameter num_leaves dan scann.num_leaves_to_search membantu menyeimbangkan performa dan perolehan kueri.

Jalankan kueri penelusuran vektor kompleks berikut, yang menampilkan hasil yang relevan yang memenuhi kondisi kueri, bahkan dengan filter:

SET LOCAL scann.num_leaves_to_search = 2;

SELECT * FROM product p
JOIN product_inventory pi ON p.id = pi.product_id
WHERE pi.price < 80.00
ORDER BY embedding <=> embedding('text-embedding-005', 'music')::vector
LIMIT 3;

Pembersihan

Menghapus cluster database

      kubectl patch dbclusters.alloydbomni.dbadmin.goog my-db-cluster -p '{"spec":{"isDeleted":true}}' --type=merge

Menghapus operator AlloyDB Omni

Untuk meng-uninstal operator Kubernetes AlloyDB Omni dari cluster Kubernetes, selesaikan langkah-langkah berikut:

  1. Hapus semua cluster database Anda:

          for ns in $(kubectl get dbclusters.alloydbomni.dbadmin.goog --all-namespaces -o=jsonpath='{range .items[*]}{.metadata.namespace}{"\n"}{end}'); do
          for cr in $(kubectl get dbclusters.alloydbomni.dbadmin.goog -n $ns -o=jsonpath='{range .items[*]}{.metadata.name}{"\n"}{end}'); do
          kubectl patch dbclusters.alloydbomni.dbadmin.goog $cr -n $ns --type=merge -p '{"spec":{"isDeleted":true}}'
          done
          done
      ```
  2. Pastikan operator Kubernetes AlloyDB Omni telah menghapus semua cluster database Anda dengan menjalankan perintah berikut:

        kubectl get dbclusters.alloydbomni.dbadmin.goog --all-namespaces
  3. Hapus resource lain yang dibuat oleh operator AlloyDB Omni Kubernetes:

        kubectl delete failovers.alloydbomni.dbadmin.goog --all --all-namespaces
        kubectl delete restores.alloydbomni.dbadmin.goog --all --all-namespaces
        kubectl delete switchovers.alloydbomni.dbadmin.goog --all --all-namespaces
  4. Uninstal operator AlloyDB Omni Kubernetes:

        helm uninstall alloydbomni-operator --namespace alloydb-omni-system
  5. Hapus rahasia, deskripsi resource kustom, dan namespace yang terkait dengan operator AlloyDB Omni Kubernetes:

        kubectl delete certificate -n alloydb-omni-system --all
        kubectl get secrets --all-namespaces -o custom-columns=NAMESPACE:.metadata.namespace,NAME:.metadata.name,ANNOTATION:.metadata.annotations.cert-manager\.io/issuer-name | grep -E 'alloydbomni|dbs-al' | awk '{print $1 " " $2}' | xargs -n 2 kubectl delete secret -n
        kubectl delete crd -l alloydb-omni=true
        kubectl delete ns alloydb-omni-system

Langkah berikutnya