ביצוע חיפוש וקטורי ב-AlloyDB Omni

בחירת גרסת תיעוד:

במדריך הזה מוסבר איך להגדיר ולבצע חיפוש וקטורי ב-AlloyDB Omni באמצעות מסוף Google Cloud . הדוגמאות נועדו להמחיש את יכולות החיפוש הווקטורי, והן מיועדות למטרות הדגמה בלבד.

במאמר חיפוש וקטורי מסונן ב-AlloyDB Omni מוסבר איך להשתמש בחיפוש וקטורי מסונן כדי לצמצם את חיפושי הדמיון.

במאמר תחילת העבודה עם הטמעות וקטורים באמצעות AlloyDB Omni AI מוסבר איך לבצע חיפוש וקטורי באמצעות הטמעות של Vertex AI.

מטרות

  • יוצרים אשכול AlloyDB Omni ומכונה ראשית.
  • מתחברים למסד הנתונים ומתקינים את התוספים הנדרשים.
  • יוצרים טבלה עם product ו-product inventory.
  • הוספת נתונים לטבלאות product ו-product inventory וביצוע חיפוש וקטורי בסיסי.
  • יוצרים אינדקס ScaNN בטבלת המוצרים.
  • לבצע חיפוש וקטורי בסיסי.
  • מבצעים חיפוש וקטורי מורכב עם מסנן וצירוף.

עלויות

במסמך הזה משתמשים ברכיבים הבאים של Google Cloud, והשימוש בהם כרוך בתשלום:

כדי ליצור הערכת עלויות בהתאם לשימוש החזוי, אתם יכולים להשתמש במחשבון התמחור.

משתמשים חדשים של Google Cloud ? יכול להיות שאתם זכאים לתקופת ניסיון בחינם.

כשמסיימים את המשימות שמתוארות במסמך הזה אפשר למחוק את המשאבים שיצרתם כדי להימנע מחיובים נוספים. מידע נוסף זמין בקטע "הסרת המשאבים".

דרישות מוקדמות

לפני שמבצעים חיפוש וקטורי, צריך להשלים את הדרישות המוקדמות הבאות:

הוספת נתונים של מוצרים ושל מלאי מוצרים וביצוע חיפוש וקטורי בסיסי

  1. מריצים את ההצהרה הבאה כדי ליצור טבלה 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
      );
    

    במקרה הצורך, תוכלו לראות את היומנים ולפתור בעיות שגיאה.

  2. מריצים את השאילתה הבאה כדי ליצור טבלת 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)
    );
    
  3. מריצים את השאילתה הבאה כדי להוסיף את נתוני המוצרים לטבלה 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. אופציונלי: מריצים את השאילתה הבאה כדי לוודא שהנתונים נוספו לטבלה product:

    SELECT * FROM product;
    
  5. מריצים את השאילתה הבאה כדי להוסיף את נתוני המלאי לטבלה 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. מריצים את שאילתת החיפוש הווקטורי הבאה, שמנסה למצוא מוצרים שדומים למילה 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 בכוונון ידני בטבלת המוצרים

מריצים את השאילתה הבאה כדי ליצור אינדקס ScaNN של product_index בטבלה 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 עוזרים לאזן בין הביצועים לבין ה-recall.

אתם יכולים להריץ ביעילות שאילתות חיפוש וקטורי מסוננות גם כשאתם משתמשים באינדקס 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, ועוזרת לבצע אופטימיזציה של שאילתות אנליטיות מורכבות שכוללות סינון רגיל וחיפוש וקטורי.

במאגר העמודות יש שתי אפשרויות לניהול התוכן:

כדי להשוות בין זמן הביצוע של חיפוש וקטורי של KNN שמסונן לפי פרדיקט LIKE לפני ואחרי שמפעילים את המנוע מבוסס-העמודות:

  1. מפעילים את התוסף vector כדי לתמוך בסוגי נתונים ופעולות של וקטורים. מריצים את ההצהרות הבאות כדי ליצור טבלת דוגמה (items) עם מזהה, תיאור טקסט ועמודה של הטמעת וקטורים עם 512 מאפיינים.

    CREATE EXTENSION IF NOT EXISTS vector;
    
    CREATE TABLE items (
        id SERIAL PRIMARY KEY,
        description TEXT,
        embedding VECTOR(512)
    );
  2. כדי לאכלס את הנתונים, מריצים את ההצהרות הבאות כדי להוסיף מיליון שורות לטבלה 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;
  3. מודדים את הביצועים הבסיסיים של חיפוש הדמיון הווקטורי בלי המנוע מבוסס-העמודות.

    SELECT id, description, embedding <-> '[...]' AS distance
    FROM items
    WHERE description LIKE '%product_%_common%'
    ORDER BY embedding <-> '[...]'
    LIMIT 100;
  4. הפעלת מנוע מבוסס-עמודות ותמיכה בווקטורים.

    1. מפעילים את הדגלים 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';
    2. הפעלה מחדש של AlloyDB Omni

      systemctl restart alloydbomni18
  5. מוסיפים את הטבלה items למנוע מבוסס-העמודות:

    SELECT google_columnar_engine_add('items');
  6. מודדים את הביצועים של חיפוש הדמיון הווקטורי באמצעות המנוע מבוסס-העמודות. מריצים מחדש את השאילתה שהרצתם קודם כדי למדוד את הביצועים הבסיסיים.

    SELECT id, description, embedding <-> '[...]' AS distance
    FROM items
    WHERE description LIKE '%product_%_common%'
    ORDER BY embedding <-> '[...]'
    LIMIT 100;
  7. כדי לבדוק אם השאילתה הופעלה באמצעות המנוע מבוסס-העמודות, מריצים את הפקודה הבאה:

    explain (analyze) SELECT id, description, embedding <-> '[...]' AS distance
    FROM items
    WHERE description LIKE '%product_%_common%'
    ORDER BY embedding <-> '[...]'
    LIMIT 100;

הסרת המשאבים

הוראות להסרת AlloyDB Omni מופיעות במאמר בנושא ניהול ומעקב אחרי AlloyDB Omni.

המאמרים הבאים