בדף הזה מוסבר איך למצוא שכנים קרובים משוערים (ANN) ולשאילת הטבעות וקטוריות באמצעות פונקציות המרחק של ANN.
כשמערך הנתונים קטן, אפשר להשתמש בשיטת K-nearest neighbors (KNN) כדי למצוא את הווקטורים המדויקים הכי קרובים. עם זאת, ככל שמערך הנתונים גדל, כך גדלים גם זמן האחזור והעלות של חיפוש KNN. אפשר להשתמש ב-ANN כדי למצוא את השכנים הקרובים ביותר (k-nearest neighbors) בקירוב, עם זמן אחזור ועלות נמוכים משמעותית.
בחיפוש ANN, הווקטורים שמוחזרים לא מייצגים את k השכנים הקרובים ביותר האמיתיים, כי חיפוש ANN מחשב מרחקים משוערים, ויכול להיות שהוא לא בודק את כל הווקטורים במערך הנתונים. לפעמים, המערכת מחזירה כמה וקטורים שלא נכללים בין k השכנים הקרובים ביותר. התופעה הזו נקראת אובדן היזכרות. כמה אובדן של היזכרות מקובל עליכם תלוי בתרחיש השימוש, אבל ברוב המקרים, אובדן קל של היזכרות בתמורה לשיפור הביצועים של מסד הנתונים הוא פשרה מקובלת.
פרטים נוספים על פונקציות המרחק המשוער שנתמכות ב-Spanner זמינים בדפי העיון הבאים ב-GoogleSQL:
שאילתות של הטמעות וקטוריות
Spanner מאיץ חיפושים של וקטורים של שכן קרוב משוער (ANN) באמצעות אינדקס וקטורי. אפשר להשתמש באינדקס וקטורי כדי לשלוח שאילתות להטמעות וקטוריות. כדי לשלוח שאילתות לגבי הטמעות וקטוריות, צריך קודם ליצור אינדקס וקטורי. אחר כך אפשר להשתמש באחת משלוש פונקציות המרחק המשוער כדי למצוא את ה-ANN.
ההגבלות על השימוש בפונקציות של מרחק משוער כוללות את ההגבלות הבאות:
- פונקציית המרחק המשוער צריכה לחשב את המרחק בין עמודת הטמעה לבין ביטוי קבוע (לדוגמה, פרמטר או ערך מילולי).
- הפלט של פונקציית המרחק המשוער חייב לשמש כערך היחיד של מפתח המיון במשפט
ORDER BY, וצריך לצייןLIMITאחריORDER BY. - השאילתה צריכה לסנן במפורש שורות שלא נכללות באינדקס. ברוב המקרים, המשמעות היא שהשאילתה צריכה לכלול פסקה
WHERE <column_name> IS NOT NULLשמתאימה להגדרת אינדקס הווקטור, אלא אם העמודה כבר מסומנת כ-NOT NULLבהגדרת הטבלה.
רשימה מפורטת של המגבלות מופיעה בדף העזר בנושא פונקציית המרחק המשוער.
דוגמאות
נניח שיש לכם טבלה Documents עם עמודה DocEmbedding של הטמעות טקסט שחושבו מראש מתוך עמודת הבייטים DocContents, ועמודה NullableDocEmbedding שמלאה בנתונים ממקורות אחרים, שיכולים להיות null.
CREATE TABLE Documents (
UserId INT64 NOT NULL,
DocId INT64 NOT NULL,
Author STRING(1024),
DocContents BYTES(MAX),
DocEmbedding ARRAY<FLOAT32> NOT NULL,
NullableDocEmbedding ARRAY<FLOAT32>,
WordCount INT64
) PRIMARY KEY (UserId, DocId);
כדי לחפש את 100 הווקטורים הקרובים ביותר ל-[1.0, 2.0, 3.0]:
SELECT DocId
FROM Documents
WHERE WordCount > 1000
ORDER BY APPROX_EUCLIDEAN_DISTANCE(
ARRAY<FLOAT32>[1.0, 2.0, 3.0], DocEmbedding,
options => JSON '{"num_leaves_to_search": 10}')
LIMIT 100
אם העמודה של ההטמעה מאפשרת ערך null:
SELECT DocId
FROM Documents
WHERE NullableDocEmbedding IS NOT NULL AND WordCount > 1000
ORDER BY APPROX_EUCLIDEAN_DISTANCE(
ARRAY<FLOAT32>[1.0, 2.0, 3.0], NullableDocEmbedding,
options => JSON '{"num_leaves_to_search": 10}')
LIMIT 100
המאמרים הבאים
מידע נוסף על הפונקציות של GoogleSQL
APPROXIMATE_COSINE_DISTANCE(),APPROXIMATE_EUCLIDEAN_DISTANCE(),APPROXIMATE_DOT_PRODUCT()כדאי לנסות את המדריך למתחילים בנושא חיפוש וקטורים ב-Spanner כדי לראות דוגמה מפורטת לשימוש ב-ANN.