הכינו SQL לחיפוש וקטורי
לפני שתוכל להריץ חיפושי וקטורים, עליך לאחסן וקטורים במסד הנתונים ולהחליט איך החיפושים מתבצעים. היחידה הזו מכסה את החלטות העיצוב שאתה מקבל לפני כתיבת השאילתת הווקטורית הראשונה שלך.
חיפוש וקטורי מוצא שורות המבוססות על דמיון מתמטי ולא התאמות מדויקות. כדי שזה יעבוד, מאחסנים הטבעות כקטורים, בוחרים כיצד למדוד דמיון, ומחליטים אם לחפש את כל הווקטורים בדיוק או להשתמש באינדקס לקבלת תוצאות מקורבות מהירות יותר.
אחסון וקטורים עם סוג הנתונים הווקטורי
SQL Server ו-Azure SQL Database מספקים סוג נתונים וקטורי מקורי שנועד לאחסון הטמעות. כל וקטור הוא מערך של מספרים בנקודה צפה, המאוחסנים בפורמט בינארי אופטימלי אך נחשפים כמערכי JSON לנוחות.
כאשר אתה מגדיר עמודה וקטורית, אתה מציין את מספר הממדים:
CREATE TABLE dbo.Products
(
ProductID INT PRIMARY KEY,
Name NVARCHAR(100),
Description NVARCHAR(MAX),
DescriptionVector VECTOR(1536) NOT NULL
);
המספר בסוגריים תואם את המידות שמודל ההטמעה שלך מייצר. לדוגמה, מודל ה-text-embedding-3-small של OpenAI מייצר 1,536 ממדים, כך שהעמודה שלך תהיה VECTOR(1536). המקסימום הנתמך הוא 1,998 ממדים.
כל רכיב מאוחסן כפלט מדויק יחיד (4 בתים). וקטור בעל 1,536 ממד משתמש בכ-6 KB בכל שורה. כשאתה מעצב את הטבלה שלך, שקול כיצד עמודה זו משפיעה על האחסון והזיכרון ככל שהנתונים שלך גדלים.
הבנת מדדי מרחק
חיפוש וקטורי פועל על ידי חישוב המרחק בין וקטורים. וקטורים קרובים יותר מייצגים מושגים דומים יותר. SQL Server תומך בשלושה מדדי מרחק:
מרחק הקוסינוס מודד את הזווית בין וקטורים, תוך התעלמות מהגודל שלהם. שני וקטורים המצביעים לאותו כיוון יש להם מרחק קוסינוס של 0, ללא קשר לאורכם. מדד זה עובד טוב כשאכפת לך מהכיוון של המשמעות, לא לעוצמה. מרחק הקוסינוס נע בין 0 (זהה) ל-2 (הפוך).
מרחק אוקלידי מודד את המרחק בקו ישר בין שתי נקודות במרחב הווקטורי. היא מתחשבת גם בכיוון וגם בעוצמה. המרחק האוקלידי נע בין 0 (זהה) לאינסוף.
מכפלת הנקודה מחשבת את סכום המכפלות לפי איברים. SQL Server מחזיר את מכפלת הנקודה השלילית כך שערכים קטנים יותר מציינים וקטורים דומים יותר, בהתאם למדדים האחרים.
רוב מודלי ההטמעה מותאמים לדמיון קוסינוס, מה שהופך את מרחק הקוסינוס לבחירה הנפוצה. עם זאת, המדד הטוב ביותר תלוי איך ההטמעות שלך אומנו.
בחר בין חיפוש מדויק לחיפוש מקורב
כשאתה מחפש וקטורים דומים, יש לך שתי אפשרויות: חיפוש שכן מדויק (ENN) וחיפוש שכן קרוב משוער (ANN).
חיפוש שכן קרוב בדיוק משווה את וקטור השאילתה שלך לכל וקטור בטבלה. הוא מבטיח את התוצאות המדויקות ביותר אך דורש חישוב המרחק לכל שורה. השתמש בפונקציה לחיפוש VECTOR_DISTANCE מדויק:
DECLARE @query VECTOR(1536) = '[0.1, 0.2, ...]';
SELECT TOP 10 ProductID, Name,
VECTOR_DISTANCE('cosine', @query, DescriptionVector) AS Distance
FROM dbo.Products
ORDER BY Distance;
שאילתה זו מחשבת את מרחק הקוסינוס בין @query לכל שורה DescriptionVector, ואז מחזירה את 10 ההתאמות הקרובות ביותר. לטבלאות קטנות (פחות מ-50,000 וקטורים כהנחיה כללית), חיפוש מדויק מתפקד היטב.
חיפוש שכן קרוב במיוחד משתמש באינדקס וקטורי כדי למצוא וקטורים דומים מבלי לסרוק כל שורה. הוא מחליף דיוק מושלם במהירות, ומחזיר תוצאות שקרובות מאוד לדיוק, אבל לא מובטחות שיהיו השכנות הכי קרובות.
צור אינדקס וקטורי באמצעות CREATE VECTOR INDEX:
CREATE VECTOR INDEX idx_Products_DescriptionVector
ON dbo.Products(DescriptionVector)
WITH (METRIC = 'cosine', TYPE = 'DiskANN');
SQL Server משתמש באלגוריתם DiskANN, שבונה מבנה גרף שמאפשר ניווט מהיר לווקטורים סמוכים. כאשר האינדקס קיים, השתמש בפונקציה VECTOR_SEARCH לחיפוש מקורב:
DECLARE @query VECTOR(1536) = '[0.1, 0.2, ...]';
SELECT t.ProductID, t.Name, s.distance
FROM VECTOR_SEARCH(
TABLE = dbo.Products AS t,
COLUMN = DescriptionVector,
SIMILAR_TO = @query,
METRIC = 'cosine',
TOP_N = 10
) AS s
ORDER BY s.distance;
החליטו מתי להשתמש בכל גישה
הבחירה בין חיפוש מדויק לחיפוש משוער תלויה בגודל מאגר הנתונים ובדרישות הדיוק שלך.
השתמש בחיפוש מדויק (VECTOR_DISTANCE) כאשר:
- בטבלה שלך יש פחות מ-50,000 וקטורים
- מסנני השאילתות שלך מצמצמים את קבוצת המועמדים לכמה שורות
- אתה צריך תוצאות מדויקות מובטחות ויכול לקבל זמני שאילתה ארוכים יותר
השתמש בחיפוש משוער (VECTOR_SEARCH עם אינדקס) כאשר:
- בטבלה שלך יש מאות אלפי או מיליוני וקטורים
- מהירות השאילתות חשובה יותר מדיוק מושלם
- קריאה קרובה ל-1 (כלומר רוב השכנים הקרובים ביותר נמצאים) היא מקובלת
Recall מודד כמה מהשכנים הקרובים האמיתיים מחזיר החיפוש המשוער לעומת חיפוש מדויק. DiskANN בדרך כלל משיג שליפה גבוהה, כלומר התוצאות קרובות מאוד למה שהחיפוש המדויק היה מחזיר.
שקול מגבלות אינדקס
לאינדקסים וקטוריים ב-SQL Server יש דרישות ספציפיות שיש להכיר בהן:
- הטבלה חייבת להכיל מפתח ראשי עם עמודה אחת עם אינדקס מקובל
- טבלאות עם אינדקסים וקטוריים הופכות לקריאה בלבד כל עוד האינדקס קיים—עליך לוותר על האינדקס כדי לשנות נתונים, ואז ליצור אותו מחדש
- אינדקסים וקטוריים אינם ניתנים לחלוקה
הערה
אינדקסים וקטוריים נמצאים כרגע בתצוגה מקדימה. ב-Azure SQL Database ו-SQL database ב-Microsoft Fabric, אפשר להגדיר את ALLOW_STALE_VECTOR_INDEX תצורת ה-SQL של מסד הנתונים כך ON שתאפשר כתיבה, אבל האינדקס לא משקף נתונים חדשים עד שתבנה אותם מחדש. אפשרות זו אינה זמינה כרגע ב-SQL Server 2025. בדוק את התיעוד הנוכחי לקבלת העדכונים האחרונים על המגבלות הללו.
מגבלות אלו משפיעות על האופן שבו אתה מעצב את הטבלאות שלך ואת תהליכי התחזוקה שלך. לטבלאות שמשתנות לעיתים קרובות, אפשר להשתמש בחיפוש מדויק עד שהנתונים מתייצבים, ואז להוסיף אינדקס וקטורי.
נקודות מפנה
הכנת SQL לחיפוש וקטורי משמעותה קבלת שלוש החלטות: איזה סוג נתונים ואיזה ממדים להשתמש, איזה מדד מרחק מתאים למודל ההטמעה שלך, והאם חיפוש מדויק או משוער מתאים לגודל מאגר הנתונים שלך. חיפוש מדויק עם VECTOR_DISTANCE עובד היטב עבור מאגרי נתונים קטנים או שאילתות מסוננות, בעוד שחיפוש מקורב עם VECTOR_SEARCH אינדקס DiskANN מטפל ביעילות במאגרי נתונים גדולים יותר. ביחידה הבאה תלמד את הפונקציות ודפוסי השאילתות הספציפיים להרצת חיפושי וקטור.