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

בדף הזה נסביר איך להשתמש בחיפוש וקטורים ב-Spanner Graph כדי למצוא את השכנים הקרובים ביותר (KNN) ואת השכנים הקרובים המשוערים (ANN). אתם יכולים להשתמש בפונקציות של מרחק וקטורי כדי לבצע חיפוש וקטורי של KNN ו-ANN לתרחישי שימוש כמו חיפוש דמיון או Retrieval-Augmented Generation (יצירה משולבת-אחזור, 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.

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

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

    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.

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

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

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

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

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

בדוגמה הבאה, יוצרים אינדקס וקטורי באמצעות סוג המרחק האוקלידי בעמודה 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 של החשבון. בדוגמה הבאה, התוצאה מציגה את שני השכנים הקרובים המשוערים ביותר ל-accounts for leisure travel and vacation, שמיוצג על ידי הטמעת וקטורים [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 חיסכון לנסיעות

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