מידע על שימוש בחיפוש וקטורי מסונן כדי לצמצם את חיפושי הדמיון זמין במאמר חיפוש וקטורי מסונן ב-AlloyDB Omni.
במאמר קדימה, מתחילים: הטמעת וקטורים באמצעות AlloyDB Omni AI מוסבר איך לבצע חיפוש וקטורי באמצעות הטמעות של Vertex AI.
מטרות
- יוצרים אשכול ומכונה ראשית של AlloyDB Omni.
- מתחברים למסד הנתונים ומתקינים את התוספים הנדרשים.
- תיצור טבלה של
productו-product inventory. - מכניסים נתונים לטבלאות
productו-product inventoryומבצעים חיפוש וקטורי בסיסי. - יוצרים אינדקס ScaNN בטבלת המוצרים.
- ביצוע חיפוש וקטורי בסיסי.
- ביצוע חיפוש וקטורי מורכב עם מסנן וצירוף.
עלויות
במסמך הזה משתמשים ברכיבים הבאים של Google Cloud, והשימוש בהם כרוך בתשלום:
כדי ליצור הערכת עלויות על סמך השימוש החזוי, אתם יכולים להשתמש במחשבון התמחור.
משתמשים חדשים ב- Google Cloud ? יכול להיות שאתם זכאים לתקופת ניסיון בחינם.
כשמסיימים את המשימות שמתוארות במסמך הזה אפשר למחוק את המשאבים שיצרתם כדי להימנע מחיובים נוספים. מידע נוסף זמין במאמר בנושא הסרת המשאבים.
דרישות מוקדמות
לפני שמבצעים חיפוש וקטורי, צריך להשלים את הדרישות המוקדמות הבאות:
- התקנת AlloyDB AI ב-AlloyDB Omni
-
מריצים את AlloyDB Omni ומתחברים אליו
בתור המשתמש
postgres. -
מתקינים את התוספים
vector,alloydb_scannו-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;
הוספת נתוני מוצרים ומלאי מוצרים וביצוע חיפוש וקטורי בסיסי
מריצים את ההצהרה הבאה כדי ליצור טבלה
productשמבצעת את הפעולות הבאות:- שומרת פרטי מוצר בסיסיים.
- כולל עמודת וקטור
embeddingשמחשבת ומאחסנת וקטור הטמעה לתיאור מוצר של כל מוצר.
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 );במידת הצורך, אפשר לצפות ביומנים ולפתור שגיאות.
מריצים את השאילתה הבאה כדי ליצור טבלת
product_inventoryשמאחסנת מידע על מלאי זמין ומחירים תואמים. הטבלאותproduct_inventoryו-productמשמשות במדריך הזה להרצת שאילתות מורכבות של חיפוש וקטורי.CREATE TABLE product_inventory ( id INT PRIMARY KEY, product_id INT REFERENCES product(id), inventory INT, price DECIMAL(10,2) );מריצים את השאילתה הבאה כדי להוסיף נתוני מוצרים לטבלה
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');אופציונלי: מריצים את השאילתה הבאה כדי לוודא שהנתונים מוכנסים לטבלה
product:SELECT * FROM product;מריצים את השאילתה הבאה כדי להוסיף נתוני מלאי לטבלה
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);מריצים את שאילתת החיפוש הווקטורית הבאה שמנסה למצוא מוצרים שדומים למילה
music. המשמעות היא שגם אם המילהmusicלא מוזכרת במפורש בתיאור המוצר, בתוצאה מוצגים מוצרים שרלוונטיים לשאילתה:SELECT * FROM product ORDER BY embedding <=> embedding('text-embedding-005', 'music')::vector LIMIT 3;תוצאת השאילתה היא:

כשמבצעים חיפוש וקטורי בסיסי בלי ליצור אינדקס, נעשה שימוש בחיפוש מדויק של השכן הקרוב ביותר (KNN), שמספק אחזור יעיל. שימוש ב-KNN בהיקף גדול עלול להשפיע על הביצועים. כדי לשפר את הביצועים של השאילתות, מומלץ להשתמש באינדקס ScaNN לחיפוש של השכן הקרוב המשוער (ANN), שמספק אחזור גבוה עם חביון נמוך.
אם לא יוצרים אינדקס, מערכת AlloyDB Omni משתמשת כברירת מחדל בחיפוש מדויק של השכן הקרוב ביותר (KNN).
למידע נוסף על שימוש ב-ScaNN בקנה מידה גדול, אפשר לקרוא את המאמר קדימה, מתחילים: הטמעת וקטורים באמצעות AlloyDB AI.
יצירת אינדקס ScaNN עם כוונון ידני בטבלת מוצרים
מריצים את השאילתה הבאה כדי ליצור אינדקס product_index ScaNN בטבלה product:
CREATE INDEX product_index ON product
USING scann (embedding cosine)
WITH (mode='MANUAL', num_leaves=4);
מידע נוסף על יצירת אינדקס ScaNN
ביצוע חיפוש וקטורי
מריצים את שאילתת החיפוש הווקטורי הבאה שמנסה למצוא מוצרים שדומים לשאילתת השפה הטבעית music. למרות שהמילה music לא נכללת בתיאור המוצר, בתוצאה מוצגים מוצרים שרלוונטיים לשאילתה:
SET LOCAL scann.num_leaves_to_search = 2;
SELECT * FROM product
ORDER BY embedding <=> embedding('text-embedding-005', 'music')::vector
LIMIT 3;
אלה תוצאות השאילתה:

פרמטר השאילתה scann.num_leaves_to_search שולט במספר צמתי העלה שמתבצע בהם חיפוש במהלך חיפוש דמיון. ערכי הפרמטרים num_leaves ו-scann.num_leaves_to_search עוזרים להשיג איזון בין ביצועים לבין היזכרות.
ביצוע חיפוש וקטורי שמשתמש במסנן ובצירוף
אתם יכולים להריץ שאילתות חיפוש וקטורי מסוננות ביעילות גם כשאתם משתמשים באינדקס ScaNN. מריצים את שאילתת החיפוש הווקטורי המורכבת הבאה, שמחזירה תוצאות רלוונטיות שעומדות בתנאי השאילתה, גם עם מסננים:
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;
איך להאיץ את החיפוש הווקטורי עם מסננים
אתם יכולים להשתמש במאגר התוכן של מנוע מבוסס-עמודות כדי לשפר את הביצועים של חיפושים של דמיון וקטורי, במיוחד חיפושים של K-Nearest Neighbor (KNN), בשילוב עם סינון פרדיקטים סלקטיבי מאוד – לדוגמה, באמצעות LIKE – במסדי נתונים. בקטע הזה, אתם משתמשים בתוסף vector ובתוסף google_columnar_engine של AlloyDB Omni. מידע נוסף על אופן הפעולה של מנוע מבוסס-עמודות זמין במאמר סקירה כללית על מנוע מבוסס-עמודות.
השיפורים בביצועים נובעים מהיעילות המובנית של מנוע העמודות בסריקת מערכי נתונים גדולים ובהחלת מסננים – כמו LIKEתנאים – בשילוב עם היכולת שלו, באמצעות תמיכה בווקטורים, לסנן מראש שורות. הפונקציונליות הזו מצמצמת את מספר קבוצות המשנה של הנתונים שנדרשות לחישובים הבאים של מרחק וקטורי KNN, ועוזרת לבצע אופטימיזציה של שאילתות אנליטיות מורכבות שכוללות סינון רגיל וחיפוש וקטורי.
החנות העמודתית מציעה שתי אפשרויות לניהול התוכן שלה:
- ניהול אוטומטי של התוכן במאגר העמודות: מופעים חדשים של AlloyDB Omni משתמשים בשיטה אוטומטית של ארגון הנתונים בעמודות כברירת מחדל. לחלופין, אפשר להריץ ידנית את הפונקציונליות של ארגון הנתונים בעמודות.
- ניהול ידני של תוכן במאגר העמודות: אם אתם צריכים לנהל באופן ידני את העמודות במאגר העמודות עבור עומס העבודה, אתם יכולים להשבית את ההפיכה האוטומטית לעמודות.
כדי להשוות את זמן הביצוע של חיפוש וקטורים ב-KNN שסונן לפי LIKE
predicate לפני ואחרי שמפעילים את מנוע מבוסס-העמודות, פועלים לפי השלבים הבאים:
-
מפעילים את התוסף
vectorכדי לתמוך בסוגי נתונים וקטוריים ובפעולות וקטוריות. מריצים את ההצהרות הבאות כדי ליצור טבלה לדוגמה (items) עם מזהה, תיאור טקסט ועמודת הטמעה של וקטור עם 512 ממדים.CREATE EXTENSION IF NOT EXISTS vector; CREATE TABLE items ( id SERIAL PRIMARY KEY, description TEXT, embedding VECTOR(512) );
-
כדי לאכלס את הנתונים, מריצים את ההצהרות הבאות כדי להוסיף מיליון שורות לטבלת הדוגמה
items.-- 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;
-
מדידת הביצועים הבסיסיים של חיפוש הדמיון הווקטורי ללא מנוע מבוסס-עמודות.
SELECT id, description, embedding <-> '[...]' AS distance FROM items WHERE description LIKE '%product_%_common%' ORDER BY embedding <-> '[...]' LIMIT 100;
-
הפעלת מנוע מבוסס-עמודות ותמיכה בווקטורים.
-
מפעילים את התכונות הניסיוניות
google_columnar_engine.enabledו-google_columnar_engine.enable_vector_supportשל מסד הנתונים.ALTER SYSTEM SET google_columnar_engine.enabled = 'on'; ALTER SYSTEM SET google_columnar_engine.enable_vector_support = 'on';
-
הפעלה מחדש של AlloyDB Omni
systemctl restart alloydbomni18
-
-
מוסיפים את הטבלה
itemsלמנוע מבוסס-עמודות:SELECT google_columnar_engine_add('items');
-
מדידת הביצועים של חיפוש הדמיון הווקטורי באמצעות מנוע עמודות. מריצים מחדש את השאילתה שהרצתם קודם כדי למדוד את ביצועי הבסיס.
SELECT id, description, embedding <-> '[...]' AS distance FROM items WHERE description LIKE '%product_%_common%' ORDER BY embedding <-> '[...]' LIMIT 100;
-
כדי לבדוק אם השאילתה רצה עם מנוע מבוסס-עמודות, מריצים את הפקודה הבאה:
explain (analyze) SELECT id, description, embedding <-> '[...]' AS distance FROM items WHERE description LIKE '%product_%_common%' ORDER BY embedding <-> '[...]' LIMIT 100;
הסרת המשאבים
הוראות להסרת AlloyDB Omni מופיעות במאמר בנושא ניהול ומעקב אחרי AlloyDB Omni.