הכינו הקשר שליפה להרחבה
עכשיו אתה מבין מה זה RAG ומתי להשתמש בו. ביחידות הבאות לומדים כיצד ליישם כל שלב בתהליך העבודה של RAG ב-T-SQL.
תחשוב על התרחיש הבא: לקוח שואל "אילו פדלים מתאימים לאופני ההרים שקניתי בחודש שעבר?" אתה בודק את המאגר, מוצא את הסדר שלהם, מזהה את דגם האופנוע, ומוצא רכיבים תואמים. השלב הזה מייצג את ה-"R" ב-RAG: שליפה. בואו נשלוף ונכין את הנתונים האלה למודל השפה. ישנן דרכים רבות לשלוף נתונים מ-SQL, אבל עבור RAG, המטרה היא לספק למודל הקשר מובנה שהוא באמת יכול להשתמש בו.
המרת נתונים יחסיים ל-JSON
מודלים לשוניים מעבדים טקסט, לא מבנים יחסיים. אם אתה מעביר תוצאות שאילתה גולמיות, למודל אין דרך לפרש שמות עמודות, סוגי נתונים או קשרים. JSON פותר בעיה זו על ידי שמירה על מבנה בפורמט טקסט. שמות השדות נשארים מחוברים לערכים. אובייקטים מקוננים מייצגים קשרים. המודל יכול לקרוא "ProductName": "Mountain-500" ולהתייחס למוצר הספציפי הזה בתגובתו.
JSON גם שומר על הדברים צפויים. כשהמודל מחזיר תשובה, אתה יודע שהתשובה הגיעה משדות שסיפקת במפורש. אם היית משאיר טקסט לא מובנה במקום, תהיה לך פחות שליטה על מה שהמודל משתמש כדי לנסח את התגובה שלו.
תוצאות שאילתת פורמט עם FOR JSON
אין צורך לבנות מחרוזות JSON ביד. פשוט תוסיף FOR JSON לסוף ה-SELECT שלך ו-SQL עושה את העבודה:
FOR JSON AUTOפורמטים מתקבלים לפי מבנה השאילתות שלך. שמות העמודות הופכים אוטומטית לשמות שדות.SELECT Name, ListPrice, Color FROM Production.Product WHERE ProductID = @ProductID FOR JSON AUTO;שאילתה זו מחזירה משהו כמו:
[{"Name":"Mountain-500 Black, 48","ListPrice":564.99,"Color":"Black"}]FOR JSON PATHנותן לך שליטה מפורשת על מבנה ה-JSON. אתה מגדיר את שמות השדות והקינון באמצעות כינויי עמודות.SELECT Name AS 'product.name', ListPrice AS 'product.price', Size AS 'product.size' FROM Production.Product WHERE ProductID = @ProductID FOR JSON PATH;שאילתה זו מחזירה משהו כמו:
[{"product":{"name":"Mountain-500 Black, 48","price":564.99,"size":"48"}}]
אפשרויות יציאת JSON של Control
כמה אפשרויות מאפשרות לעצב את הפלט:
WITHOUT_ARRAY_WRAPPERמסיר את הסוגריים המרובעים כשאתה שולף תקליט בודד. אפשרות זו שימושית ל-RAG כי לעיתים קרובות מקבלים לקוח אחד, מוצר אחד או הזמנה אחת בכל פעם.SELECT Name, Description, Size, Weight FROM Production.Product WHERE ProductID = @ProductID FOR JSON PATH, WITHOUT_ARRAY_WRAPPER;INCLUDE_NULL_VALUESשומר שדות אפס בפלט במקום להשמיטם. השתמש בפרמטר זה כאשר היעדר ערך משמעותי.ROOT('name')עוטפת את כל הפלט באלמנט שורש בשם, מה שיכול לעזור למודל להבין איזה סוג נתונים הוא מקבל.
בחר מה לכלול
לא כל טור שייך להקשר שלך. לדוגמה, מזהים פנימיים, חותמות זמן לביקורת וקודי מחסן לא עוזרים למודל לענות על שאלות הלקוחות. הם פשוט צורכים טוקנים ומוסיפים רעש.
לשאלה על מוצר, כלול את שם המוצר, תיאור, מפרט ותמחור. דלג על rowguid, תאריך מותאם ודגל הופסק אלא אם הם רלוונטיים ישירות.
גם מגבלות האסימונים חשובות. כל טוקן שאתה שולח עולה כסף ונחשב לחלון ההקשר של המודל. אם אתה אוסף כמה מוצרים, שמור על כל אחד רזה. המודל מתפקד טוב יותר עם הקשר ממוקד מאשר עם כל מה שאפשר לכלול.
שילוב מקורות מרובים
הקשר של RAG מגיע לעיתים קרובות ממספר טבלאות. שאלה לגבי תאימות פדלים דורשת פרטי מוצר, מפרטים ורכיבים קשורים. אתה יכול להתחיל בלמצוא מוצרים רלוונטיים בחיפוש וקטורי, ואז להצטרף לטבלאות אחרות כדי לבנות את התמונה המלאה.
הנה איך זה נראה בפועל. ראשית, המור את שאלת המשתמש להטמעה. לאחר מכן השתמש VECTOR_DISTANCE כדי למצוא את ההתאמות הקרובות ביותר, להצטרף לטבלאות הרלוונטיות, ולעצב הכל כ-JSON:
DECLARE @userQuestion NVARCHAR(1000) = 'Which pedals are compatible with the Mountain-500?';
DECLARE @questionVector VECTOR(1536);
DECLARE @context NVARCHAR(MAX);
-- Generate embedding for the question
SELECT @questionVector = AI_GENERATE_EMBEDDINGS(@userQuestion USE MODEL my_embedding_model);
-- Find relevant products and format as JSON
SET @context = (
SELECT TOP 3
p.Name AS ProductName,
p.Color,
p.Size,
pc.Name AS Category,
pm.Name AS Model
FROM Production.Product p
INNER JOIN Production.ProductSubcategory ps ON p.ProductSubcategoryID = ps.ProductSubcategoryID
INNER JOIN Production.ProductCategory pc ON ps.ProductCategoryID = pc.ProductCategoryID
INNER JOIN Production.ProductModel pm ON p.ProductModelID = pm.ProductModelID
ORDER BY VECTOR_DISTANCE('cosine', p.DescriptionVector, @questionVector)
FOR JSON PATH
);
המשתנה @context מחזיק כעת מחרוזת JSON מוכנה להנחיה. מחרוזת ה-JSON הזו היא תוצאת השליפה שלך שמותאמת להרחבה.
נקודות מפנה
המטרה היא לתת למודל השפה הקשר מובנה שהוא באמת יכול להשתמש בו. JSON שומר על משמעות הנתונים שלך תוך שמירה על קריאה כטקסט. השתמש FOR JSON AUTO כשאתה רוצה תוצאות מהירות וכשאתה FOR JSON PATH צריך שליטה על שמות שדות וקינון. הוסף WITHOUT_ARRAY_WRAPPER לשאילתות עם רשומה בודדת. שמור על ה-JSON שלך רזה על ידי הכללת רק העמודות שהמודל צריך. פחות רעש אומר תשובות טובות יותר ועלויות טוקן נמוכות יותר.