שימוש בחיפוש וקטורי עם Spanner Graph

בדף הזה נסביר איך להשתמש בחיפוש וקטורים ב-Spanner Graph כדי למצוא את השכנים הקרובים ביותר (KNN) ואת השכנים הקרובים המשוערים (ANN). אפשר להשתמש בפונקציות של מרחק וקטורי כדי לבצע חיפוש וקטורי של KNN ו-ANN לתרחישי שימוש כמו חיפוש דמיון או יצירה משופרת של אחזור (RAG) ליישומי AI גנרטיבי.

‫Spanner Graph תומך בפונקציות המרחק הבאות כדי לבצע חיפוש של דמיון וקטורי KNN:

  • COSINE_DISTANCE(): מחשב את המרחק הקצר ביותר בין שני וקטורים.
  • EUCLIDEAN_DISTANCE(): חישוב הקוסינוס של הזווית בין שני וקטורים.
  • DOT_PRODUCT(): מחשבת את הקוסינוס של הזווית כפול המכפלה של גדלי הווקטורים התואמים. אם אתם יודעים שכל הטמעות הווקטורים במערך הנתונים שלכם מנורמלות, אתם יכולים להשתמש ב-DOT_PRODUCT() כפונקציית מרחק.

מידע נוסף זמין במאמר בנושא ביצוע חיפוש דמיון וקטורי ב-Spanner על ידי מציאת השכנים הקרובים ביותר (K-nearest neighbors).

‫Spanner Graph תומך גם בפונקציות הבאות של מרחק משוער כדי לבצע חיפוש של דמיון וקטורי ב-ANN:

  • APPROX_COSINE_DISTANCE: מחשבת את המרחק הקצר ביותר המשוער בין שני וקטורים.
  • APPROX_EUCLIDEAN_DISTANCE: מחשבת את הקוסינוס המשוער של הזווית בין שני וקטורים.
  • APPROX_DOT_PRODUCT: מחשבת את הקוסינוס המשוער של הזווית כפול מכפלת הגדלים של הווקטורים התואמים. אם אתם יודעים שכל הטמעות הווקטורים במערך הנתונים שלכם מנורמלות, אתם יכולים להשתמש ב-DOT_PRODUCT() כפונקציית מרחק.

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

לפני שמתחילים

כדי להפעיל את הדוגמאות במסמך הזה, צריך קודם לבצע את השלבים במאמר הגדרה ושליחת שאילתות ל-Spanner Graph כדי לבצע את הפעולות הבאות:

  1. יצירת מופע
  2. יצירת מסד נתונים עם סכימת Spanner Graph.
  3. הוספת נתונים חיוניים לתרשים.

אחרי שמוסיפים את נתוני התרשים החיוניים, מבצעים את העדכונים הבאים במסד הנתונים.

הוספת נתוני וקטור נוספים למסד נתונים של גרפים

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

  1. מוסיפים עמודה חדשה, nick_name_embeddings, לטבלת הקלט Account.

    ALTER TABLE Account
    ADD COLUMN nick_name_embeddings ARRAY<FLOAT32>(vector_length=>4);
    
  2. מוסיפים נתונים לעמודה nick_name.

    UPDATE Account SET nick_name = "Fund for a refreshing tropical vacation" WHERE id = 7;
    UPDATE Account SET nick_name = "Fund for a rainy day!" WHERE id = 16;
    UPDATE Account SET nick_name = "Saving up for travel" WHERE id = 20;
    
  3. יוצרים הטבעות לטקסט בעמודה nick_name ומאכלסים אותן בעמודה החדשה nick_name_embeddings.

    כדי ליצור הטמעות של Gemini Enterprise Agent Platform לנתונים התפעוליים ב-Spanner Graph, אפשר לעיין במאמר קבלת הטמעות טקסט של Agent Platform.

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

    UPDATE Account SET nick_name_embeddings = ARRAY<FLOAT32>[0.3, 0.5, 0.8, 0.7] WHERE id = 7;
    UPDATE Account SET nick_name_embeddings = ARRAY<FLOAT32>[0.4, 0.9, 0.7, 0.1] WHERE id = 16;
    UPDATE Account SET nick_name_embeddings = ARRAY<FLOAT32>[0.2, 0.5, 0.6, 0.6] WHERE id = 20;
    
  4. מוסיפים שתי עמודות חדשות לAccountTransferAccount טבלת הקלט: notes ו-notes_embeddings.

    ALTER TABLE AccountTransferAccount
    ADD COLUMN notes STRING(MAX);
    ALTER TABLE AccountTransferAccount
    ADD COLUMN notes_embeddings ARRAY<FLOAT32>(vector_length=>4);
    
  5. יוצרים הטבעות לטקסט בעמודה notes ומאכלסים אותן בעמודה notes_embeddings.

    כדי ליצור הטמעות של Agent Platform לנתונים התפעוליים ב-Spanner Graph, אפשר לעיין במאמר קבלת הטמעות טקסט של Agent Platform.

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

    UPDATE AccountTransferAccount
    SET notes = "for shared cost of dinner",
      notes_embeddings = ARRAY<FLOAT32>[0.3, 0.5, 0.8, 0.7]
    WHERE id = 16 AND to_id = 20;
    UPDATE AccountTransferAccount
    SET notes = "fees for tuition",
      notes_embeddings = ARRAY<FLOAT32>[0.1, 0.9, 0.1, 0.7]
    WHERE id = 20 AND to_id = 7;
    UPDATE AccountTransferAccount
    SET notes = 'loved the lunch',
      notes_embeddings = ARRAY<FLOAT32>[0.4, 0.5, 0.7, 0.9]
    WHERE id = 20 AND to_id = 16;
    
  6. אחרי שמוסיפים עמודות חדשות לטבלאות הקלט Account ו-AccountTransferAccount, מעדכנים את ההגדרה של גרף הנכסים באמצעות ההצהרות הבאות. מידע נוסף זמין במאמר בנושא עדכון של הגדרות קיימות של צמתים או קשתות.

    CREATE OR REPLACE PROPERTY GRAPH FinGraph
    NODE TABLES (Account, Person)
    EDGE TABLES (
      PersonOwnAccount
        SOURCE KEY (id) REFERENCES Person (id)
        DESTINATION KEY (account_id) REFERENCES Account (id)
        LABEL Owns,
      AccountTransferAccount
        SOURCE KEY (id) REFERENCES Account (id)
        DESTINATION KEY (to_id) REFERENCES Account (id)
        LABEL Transfers
    );
    

חיפוש השכנים הקרובים ביותר

בדוגמה הבאה, משתמשים בפונקציה EUCLIDEAN_DISTANCE() כדי לבצע חיפוש וקטורי של KNN בצמתים ובקשתות של מסד נתוני הגרף.

ביצוע חיפוש וקטורי של KNN בצמתים של תרשים

אפשר לבצע חיפוש וקטורי KNN במאפיין nick_name_embeddings של הצומת Account. החיפוש הזה של וקטורים לפי KNN מחזיר את name של בעל החשבון ואת nick_name של החשבון. בדוגמה הבאה, התוצאה מציגה את שני השכנים הקרובים ביותר ל-K עבור accounts for leisure travel and vacation, שמיוצג על ידי הטמעת וקטורים [0.2, 0.4, 0.9, 0.6].

GRAPH FinGraph
MATCH (p:Person)-[:Owns]->(a:Account)
RETURN p.name, a.nick_name
ORDER BY EUCLIDEAN_DISTANCE(a.nick_name_embeddings,
  -- An illustrative embedding for 'accounts for leisure travel and vacation'
  ARRAY<FLOAT32>[0.2, 0.4, 0.9, 0.6])
LIMIT 2;

תוצאות

name nick_name
Alex קרן לחופשה טרופית מרעננת
Dana חסכון לנסיעות

ביצוע חיפוש וקטורי של KNN בקצוות של גרף

אפשר לבצע חיפוש וקטורי KNN בנכס notes_embeddings של קצה Owns. חיפוש וקטורי של KNN מחזיר את name של בעל החשבון ואת notes של ההעברה. בדוגמה הבאה, התוצאה מציגה את שני השכנים הקרובים ביותר ל-food expenses, שמיוצג על ידי וקטור ההטמעה [0.2, 0.4, 0.9, 0.6].

GRAPH FinGraph
MATCH (p:Person)-[:Owns]->(:Account)-[t:Transfers]->(:Account)
WHERE t.notes_embeddings IS NOT NULL
RETURN p.name, t.notes
ORDER BY EUCLIDEAN_DISTANCE(t.notes_embeddings,
  -- An illustrative vector embedding for 'food expenses'
  ARRAY<FLOAT32>[0.2, 0.4, 0.9, 0.6])
LIMIT 2;

תוצאות

name הערות
Lee for shared cost of dinner
Dana אהבתי את ארוחת הצהריים

יצירת אינדקס וקטורי ומציאת השכנים הקרובים המשוערים

כדי לבצע חיפוש ANN, צריך ליצור אינדקס וקטורי ייעודי ש-Spanner Graph משתמש בו כדי להאיץ את החיפוש הווקטורי. באינדקס vector חובה להשתמש במדד מרחק ספציפי. כדי לבחור את מדד המרחק המתאים ביותר לתרחיש השימוש שלכם, מגדירים את הפרמטר distance_type לאחד מהערכים COSINE, DOT_PRODUCT או EUCLIDEAN. מידע נוסף זמין במאמר בנושא הצהרות של VECTOR INDEX.

בדוגמה הבאה, יוצרים אינדקס וקטורי באמצעות סוג המרחק האוקלידי בעמודה nick_name_embedding של טבלת הקלט Account:

CREATE VECTOR INDEX NickNameEmbeddingIndex
ON Account(nick_name_embeddings)
WHERE nick_name_embeddings IS NOT NULL
OPTIONS (distance_type = 'EUCLIDEAN', tree_depth = 2, num_leaves = 1000);

ביצוע חיפוש וקטורי של ANN בצמתי גרף

אחרי שיוצרים אינדקס וקטורי, אפשר לבצע חיפוש וקטורי של ANN במאפיין nick_name של הצומת Account. החיפוש הווקטורי של ANN מחזיר את name של בעל החשבון ואת nick_name של החשבון. בדוגמה הבאה, התוצאה מציגה את שני השכנים הקרובים המשוערים ביותר לחשבונות לנסיעות לצורכי פנאי ולחופשות, שמיוצגים על ידי וקטור ההטמעה [0.2, 0.4, 0.9, 0.6].

רמז לגרף מאלץ את האופטימיזציה של השאילתה להשתמש באינדקס הווקטורי שצוין בתוכנית ההפעלה של השאילתה.

GRAPH FinGraph
MATCH (@{FORCE_INDEX=NickNameEmbeddingIndex} a:Account)
WHERE a.nick_name_embeddings IS NOT NULL
RETURN a, APPROX_EUCLIDEAN_DISTANCE(a.nick_name_embeddings,
  -- An illustrative embedding for 'accounts for leisure travel and vacation'
  ARRAY<FLOAT32>[0.2, 0.4, 0.9, 0.6],
  options => JSON '{"num_leaves_to_search": 10}') AS distance
ORDER BY distance
LIMIT 2

NEXT

MATCH (p:Person)-[:Owns]->(a)
RETURN p.name, a.nick_name;

תוצאות

name nick_name
Alex קרן לחופשה טרופית מרעננת
Dana חסכון לנסיעות

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