בדף הזה נסביר איך להשתמש בחיפוש וקטורים ב-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 כדי לבצע את הפעולות הבאות:
אחרי שמוסיפים את נתוני התרשים החיוניים, מבצעים את העדכונים הבאים במסד הנתונים.
הוספת נתוני וקטור נוספים למסד נתונים של גרפים
כדי לבצע את העדכונים הנדרשים במסד הנתונים הגרפי:
מוסיפים עמודה חדשה,
nick_name_embeddings, לטבלת הקלטAccount.ALTER TABLE Account ADD COLUMN nick_name_embeddings ARRAY<FLOAT32>(vector_length=>4);מוסיפים נתונים לעמודה
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;יוצרים הטבעות לטקסט בעמודה
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;מוסיפים שתי עמודות חדשות ל
AccountTransferAccountטבלת הקלט:notesו-notes_embeddings.ALTER TABLE AccountTransferAccount ADD COLUMN notes STRING(MAX); ALTER TABLE AccountTransferAccount ADD COLUMN notes_embeddings ARRAY<FLOAT32>(vector_length=>4);יוצרים הטבעות לטקסט בעמודה
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;אחרי שמוסיפים עמודות חדשות לטבלאות הקלט
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 | חיסכון לנסיעות |
המאמרים הבאים
- ביצוע חיפוש דמיון וקטורי ב-Spanner על ידי מציאת השכנים הקרובים ביותר.
- חיפוש של שכנים קרובים משוערים, יצירת אינדקס וקטורי ושאילתת הטמעות וקטוריות.
- קבלת הטמעות טקסט ב-Vertex AI
- מידע נוסף על שאילתות של Spanner Graph
- שיטות מומלצות לשיפור השאילתות