יישום דפוסי חיפוש וקטורי

הושלם

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

שאילתות חיפוש וקטוריות עוקבות אחרי דפוס נפוץ: יוצרים או שלפו וקטור שאילתה, מחשבים מרחקים לווקטורים המאוחסנים, ומחזירים את ההתאמות הקרובות ביותר. SQL Server מספק ארבע פונקציות הפועלות יחד כדי לתמוך בדפוס זה: VECTOR_DISTANCE, VECTOR_SEARCH, VECTOR_NORMALIZE, ו- VECTORPROPERTY.

חשב מרחקים עם VECTOR_DISTANCE

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

VECTOR_DISTANCE(metric, vector1, vector2)

המטריקה חייבת להיות 'cosine', 'euclidean', או 'dot'. שני הווקטורים חייבים להיות בעלי אותו מספר ממדים.

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

-- Generate an embedding for the user's search phrase
DECLARE @searchVector VECTOR(1536);
SELECT @searchVector = AI_GENERATE_EMBEDDINGS('lightweight hiking boots' USE MODEL MyEmbeddingModel);

SELECT TOP 10 
    ProductID,
    Name,
    VECTOR_DISTANCE('cosine', @searchVector, DescriptionVector) AS Distance
FROM dbo.Products
ORDER BY Distance;

השאלה הזו פועלת בשני שלבים. ראשית, הוא ממיר את ביטוי החיפוש "מגפי הליכה קלים" להטמעה המשתמש באותו מודל שיצר את הערכים המאוחסנים DescriptionVector . שנית, הוא מחשב את המרחק הקוסינוסי בין @searchVector לכל שורה DescriptionVector. הפסוק ORDER BY Distance ממיין את התוצאות מהמרחק הקטן ביותר (הכי דומה) לגדול ביותר, ומחזיר TOP 10 רק את עשר השורות הראשונות. מכיוון שמרחקים קטנים יותר משמעותם וקטורים דומים יותר, השילוב הזה נותן לך את 10 המוצרים הקשורים ביותר מבחינה סמנטית ל"נעלי הליכה קלות משקל".

ניתן גם להשתמש VECTOR_DISTANCE בפסוק WHERE כדי למצוא את כל הווקטורים בתוך סף מרחק מסוים:

SELECT ProductID, Name
FROM dbo.Products
WHERE VECTOR_DISTANCE('cosine', @searchVector, DescriptionVector) < 0.3
ORDER BY VECTOR_DISTANCE('cosine', @searchVector, DescriptionVector);

גישה זו מוצאת את כל המכפלות בתוך סף דמיון במקום להחזיר ספירה קבועה. הערך 0.3 כאן הוא רק דוגמה. מרחק הקוסינוס נע בין 0 (וקטורים זהים) ל-2 (הפוך לחלוטין), אבל מה שנחשב "דומה מספיק" תלוי לחלוטין בנתונים ובמודל ההטמעה שלך. כדי למצוא את הסף הנכון, הריץ שאילתות בדיקה, בדוק את ערכי המרחק בתוצאות, וזהה היכן התוצאות הרלוונטיות עוצרות והרעש מתחיל. השתמש בדפוס הזה כשאתה רוצה שהכל יעמוד בסטנדרטים של איכות במקום במספר קבוע של תוצאות.

השתמש VECTOR_SEARCH לשחזור מקורב

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

VECTOR_SEARCH(
    TABLE = object AS alias,
    COLUMN = vector_column,
    SIMILAR_TO = query_vector,
    METRIC = 'cosine' | 'euclidean' | 'dot',
    TOP_N = k
)

פונקציה זו מחזירה קבוצת תוצאות הכוללת את כל העמודות מטבלת המקור בתוספת עמודה distance . כך היית משתמש בזה:

DECLARE @searchVector VECTOR(1536);
SELECT @searchVector = AI_GENERATE_EMBEDDINGS('lightweight hiking boots' USE MODEL MyEmbeddingModel);

SELECT t.ProductID, t.Name, s.distance
FROM VECTOR_SEARCH(
    TABLE = dbo.Products AS t,
    COLUMN = DescriptionVector,
    SIMILAR_TO = @searchVector,
    METRIC = 'cosine',
    TOP_N = 10
) AS s
ORDER BY s.distance;

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

טפל בזהירות בסינון לאחר

VECTOR_SEARCH מיישם כל תנאי סעיף WHERE לאחר מציאת השכנים הקרובים ביותר, לא לפני. שקלו את השאלה הזו:

SELECT t.ProductID, t.Name, s.distance
FROM VECTOR_SEARCH(
    TABLE = dbo.Products AS t,
    COLUMN = DescriptionVector,
    SIMILAR_TO = @searchVector,
    METRIC = 'cosine',
    TOP_N = 10
) AS s
WHERE t.CategoryID = 5
ORDER BY s.distance;

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

SELECT TOP 10 t.ProductID, t.Name, s.distance
FROM VECTOR_SEARCH(
    TABLE = dbo.Products AS t,
    COLUMN = DescriptionVector,
    SIMILAR_TO = @searchVector,
    METRIC = 'cosine',
    TOP_N = 50
) AS s
WHERE t.CategoryID = 5
ORDER BY s.distance;

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

נרמול וקטורים להשוואות עקביות

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

VECTOR_NORMALIZE(vector, norm_type)

הם norm_type יכולים להיות:

  • 'norm2': נורמה אוקלידית (הנפוצה ביותר)
  • 'norm1': סכום הערכים המוחלטים
  • 'norminf': ערך מוחלט מקסימלי
DECLARE @v VECTOR(3) = '[3, 4, 0]';
SELECT VECTOR_NORMALIZE(@v, 'norm2') AS NormalizedVector;
-- Returns: [0.6, 0.8, 0.0]

נרמול מבטיח שמרחק הקוסינוס ומכפלת הנקודה יתנהגו בעקביות. רוב מודלי ההטמעה המודרניים (כמו אלה של OpenAI) מייצרים וקטורים מנורמלים, אז לרוב לא צריך את השלב הזה. אבל אם אתה עובד עם הטמעות ממודלים שלא נרמלים, יישום VECTOR_NORMALIZE לפני אחסון או השוואה מבטיח ציוני דמיון עקביים.

ניתן לחשב את גודל הווקטור באמצעות הפונקציה הרלוונטית VECTOR_NORM :

DECLARE @v VECTOR(3) = '[3, 4, 0]';
SELECT VECTOR_NORM(@v, 'norm2') AS Magnitude;
-- Returns: 5.0

בדוק וקטורים עם תכונת VECTOR

הפונקציה VECTORPROPERTY מחזירה מטא-דאטה על וקטור. מטא-דאטה זו שימושית לאימות נתונים או לניפוי אי-התאמות במימדים.

VECTORPROPERTY(vector, property)

שתי תכונות נתמכות:

  • 'Dimensions': מחזיר את מספר הממדים כמספר שלם
  • 'BaseType': מחזיר את שם סוג הנתונים (כרגע תמיד float)
DECLARE @v VECTOR(1536) = '[0.1, 0.2, ...]';
SELECT VECTORPROPERTY(@v, 'Dimensions') AS Dims;
-- Returns: 1536

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

בחר את הפונקציה המתאימה לתרחיש שלך

לכל פונקציה יש מטרה ייחודית בחיפוש וקטורי:

תרחיש פונקציה מתי להשתמש
מערך נתונים קטן או שאילתות מסוננות VECTOR_DISTANCE מתחת ל-50,000 וקטורים, או כאשר סעיף WHERE מפחית משמעותית את המועמדים
מערך נתונים גדול עם אינדקס וקטורי VECTOR_SEARCH מאות אלפי וקטורים או יותר, כשמהירות חשובה
השוואת וקטורים ממודלים שונים VECTOR_NORMALIZE כאשר מקורות הטמעה משתנים או שהמודל לא מייצר וקטורים מנורמליים
אימות נתוני וקטור VECTORPROPERTY בדיקת מידות במהלך פתרון תקלות או אימות נתונים

נקודות מפנה

שאילתות חיפוש וקטוריות ב-SQL עוקבות אחרי דפוס צפוי: מכינים וקטור שאילתה, מוצאים שכנים באמצעות ( VECTOR_DISTANCE מדויק) או VECTOR_SEARCH (משוער), ומסודרים לפי מרחק. VECTOR_NORMALIZE ולתמוך VECTORPROPERTY באיכות ועקביות נתונים. זכור שזה VECTOR_SEARCH מפעיל מסננים אחרי שמוצאים את השכנים הקרובים ביותר, אז בקש יותר מועמדים ממה שאתה צריך כשאתה משלב עם סעיפי WHERE. ביחידה הבאה תלמד כיצד לשלב חיפוש וקטורי עם חיפוש טקסט מלא בשאילתות היברידיות.