Untuk mengetahui informasi tentang cara menggunakan penelusuran vektor yang difilter untuk menyaring penelusuran kemiripan, lihat Penelusuran vektor yang difilter di AlloyDB Omni.
Untuk mempelajari cara melakukan penelusuran vektor dengan embedding Vertex AI, lihat Mulai menggunakan Embedding Vektor dengan AlloyDB Omni AI.
Tujuan
- Buat cluster dan instance utama AlloyDB Omni.
- Hubungkan ke database Anda dan instal ekstensi yang diperlukan.
- Buat tabel
productdanproduct inventory. - Masukkan data ke tabel
productdanproduct inventory, lalu lakukan penelusuran vektor dasar. - Buat indeks ScaNN di tabel produk.
- Lakukan penelusuran vektor dasar.
- 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.
Pengguna Google Cloud baru mungkin memenuhi syarat untuk mendapatkan uji coba gratis.
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:
- Menginstal AlloyDB AI di AlloyDB Omni
-
Jalankan dan hubungkan ke AlloyDB Omni
sebagai pengguna
postgres. -
Instal ekstensi
vector,alloydb_scann, dangoogle_ml_integration.CREATE EXTENSION IF NOT EXISTS vector; CREATE EXTENSION IF NOT EXISTS alloydb_scann; CREATE EXTENSION IF NOT EXISTS google_ml_integration CASCADE;
Menyisipkan data produk dan inventaris produk serta melakukan penelusuran vektor dasar
Jalankan pernyataan berikut untuk membuat tabel
productyang melakukan hal berikut:- Menyimpan informasi produk dasar.
- Mencakup kolom vektor
embeddingyang 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-005', description)) STORED );Jika perlu, Anda dapat melihat log dan memecahkan masalah error.
Jalankan kueri berikut untuk membuat tabel
product_inventoryyang menyimpan informasi tentang inventaris yang tersedia dan harga yang sesuai. Tabelproduct_inventorydanproductdigunakan dalam tutorial ini untuk menjalankan kueri penelusuran vektor yang kompleks.CREATE TABLE product_inventory ( id INT PRIMARY KEY, product_id INT REFERENCES product(id), inventory INT, price DECIMAL(10,2) );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');Opsional: Jalankan kueri berikut untuk memverifikasi bahwa data dimasukkan dalam tabel
product:SELECT * FROM product;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);Jalankan kueri penelusuran vektor berikut yang mencoba menemukan produk yang mirip dengan kata
music. Artinya, meskipun katamusictidak 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;Hasil kuerinya adalah sebagai berikut:

Melakukan penelusuran vektor dasar tanpa membuat indeks menggunakan penelusuran tetangga terdekat yang tepat (KNN), yang memberikan perolehan yang efisien. Dalam skala besar, penggunaan KNN dapat memengaruhi performa. Untuk performa kueri yang lebih baik, sebaiknya gunakan indeks ScaNN untuk penelusuran tetangga terdekat perkiraan (ANN), yang memberikan perolehan tinggi dengan latensi rendah.
Tanpa membuat indeks, AlloyDB Omni secara default menggunakan penelusuran tetangga terdekat (KNN) yang tepat.
Untuk mempelajari lebih lanjut cara menggunakan ScaNN dalam skala besar, lihat Mulai menggunakan Embedding Vektor dengan AlloyDB AI.
Membuat indeks ScaNN yang disesuaikan secara manual pada 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 (mode='MANUAL', num_leaves=4);
Untuk mengetahui informasi selengkapnya tentang cara membuat indeks ScaNN, lihat Membuat indeks ScaNN.
Melakukan penelusuran 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;
Hasil kuerinya adalah sebagai berikut:

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 mencapai keseimbangan antara performa dan perolehan.
Melakukan penelusuran vektor yang menggunakan filter dan gabungan
Anda dapat menjalankan kueri penelusuran vektor yang difilter secara efisien meskipun Anda menggunakan indeks ScaNN. Jalankan kueri penelusuran vektor kompleks berikut, yang menampilkan hasil 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;
Mempercepat penelusuran vektor yang difilter
Anda dapat menggunakan penyimpanan konten columnar engine untuk meningkatkan performa penelusuran kesamaan vektor, khususnya penelusuran Tetangga K Terdekat (KNN), jika digabungkan dengan pemfilteran predikat yang sangat selektif, misalnya, menggunakan LIKE— dalam database. Di bagian ini, Anda akan menggunakan ekstensi vector dan
ekstensi AlloyDB Omni
google_columnar_engine.
Untuk mengetahui informasi selengkapnya tentang cara kerja columnar engine, lihat
Ringkasan columnar engine.
Peningkatan performa berasal dari efisiensi bawaan mesin berbasis kolom dalam memindai set data besar dan menerapkan filter, seperti predikat LIKE, yang dipadukan dengan kemampuannya, menggunakan dukungan vektor, untuk memfilter baris terlebih dahulu. Fungsi ini mengurangi jumlah subset data yang diperlukan untuk
perhitungan jarak vektor KNN berikutnya, dan membantu mengoptimalkan kueri analitik
kompleks yang melibatkan pemfilteran standar dan penelusuran vektor.
Penyimpanan kolom menawarkan dua opsi untuk mengelola kontennya:
- Mengelola konten column store secara otomatis: instance AlloyDB Omni baru menggunakan columnarisasi otomatis secara default. Atau, Anda dapat menjalankan fungsi kolom otomatis secara manual.
- Mengelola konten column store secara manual: jika perlu mengelola kolom di column store untuk workload secara manual, Anda dapat menonaktifkan columnarization otomatis.
Untuk membandingkan waktu eksekusi penelusuran vektor KNN yang difilter menurut predikat LIKE
sebelum dan setelah Anda mengaktifkan columnar engine, ikuti langkah-langkah berikut:
-
Aktifkan ekstensi
vectoruntuk mendukung jenis data dan operasi vektor. Jalankan pernyataan berikut untuk membuat tabel contoh (item) dengan ID, deskripsi teks, dan kolom embedding vektor 512 dimensi.CREATE EXTENSION IF NOT EXISTS vector; CREATE TABLE items ( id SERIAL PRIMARY KEY, description TEXT, embedding VECTOR(512) );
-
Isi data dengan menjalankan pernyataan berikut untuk menyisipkan 1 juta baris ke dalam tabel
itemscontoh.-- Simplified example of inserting matching (~0.1%) and non-matching data INSERT INTO items (description, embedding) SELECT CASE WHEN g % 1000 = 0 THEN 'product_' || md5(random()::text) || '_common' -- ~0.1% match ELSE 'generic_item_' || g || '_' || md5(random()::text) -- ~99.9% don't match END, (SELECT array_agg(random()) FROM generate_series(1, 512))::vector FROM generate_series(1, 999999) g;
-
Ukur performa dasar penelusuran kemiripan vektor tanpa columnar engine.
SELECT id, description, embedding <-> '[...]' AS distance FROM items WHERE description LIKE '%product_%_common%' ORDER BY embedding <-> '[...]' LIMIT 100;
-
Aktifkan dukungan vektor dan mesin columnar.
-
Aktifkan flag database
google_columnar_engine.enableddangoogle_columnar_engine.enable_vector_support.ALTER SYSTEM SET google_columnar_engine.enabled = 'on'; ALTER SYSTEM SET google_columnar_engine.enable_vector_support = 'on';
-
Mulai ulang AlloyDB Omni
systemctl restart alloydbomni18
-
-
Tambahkan tabel
itemske mesin columnar:SELECT google_columnar_engine_add('items');
-
Ukur performa penelusuran kemiripan vektor menggunakan columnar engine. Anda menjalankan kembali kueri yang sebelumnya dijalankan untuk mengukur performa dasar.
SELECT id, description, embedding <-> '[...]' AS distance FROM items WHERE description LIKE '%product_%_common%' ORDER BY embedding <-> '[...]' LIMIT 100;
-
Untuk memeriksa apakah kueri berjalan dengan columnar engine, jalankan perintah berikut:
explain (analyze) SELECT id, description, embedding <-> '[...]' AS distance FROM items WHERE description LIKE '%product_%_common%' ORDER BY embedding <-> '[...]' LIMIT 100;
Pembersihan
Untuk meng-uninstal AlloyDB Omni, lihat Mengelola dan memantau AlloyDB Omni.