השדרוג עם הקשר למסד הנתונים

הושלם

השליפה נותנת לך את הנתונים. אבל כתם JSON בפני עצמו לא עונה על השאלה של אף אחד. אם לקוח שואל על תאימות לדוושות אופניים, יש לך את המידע של המוצר מהמאגר שלך, אבל עכשיו אתה צריך להגיד למודל השפה מה לעשות איתו. שלב זה מייצג את ה-"A" ב-RAG: שדרוג.

הבן את מבנה הודעות הצ'אט

למודלים שונים יש ממשקי API שונים, אבל רוב המודלים מבוססי הצ'אט פועלים לפי דפוס דומה. אנחנו משתמשים ב-Azure OpenAI כדוגמה, אבל המושגים חלים באופן רחב.

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

{
  "messages": [
    {
      "role": "system",
      "content": "You are a helpful assistant that answers questions about products. Use only the provided context to answer. If the context doesn't contain enough information, say so."
    },
    {
      "role": "user", 
      "content": "Context: {retrieved_data}\n\nQuestion: {user_question}"
    }
  ]
}

בדוגמה הזו, {retrieved_data} זה יהיה ה-JSON שבנית מהשאילתת המוצר שלך, ויהיה {user_question} משהו כמו "אילו פדלים תואמים ל-Mountain-500?"

הודעת המערכת קובעת כללים בסיסיים. הודעת המשתמש משלבת את ההקשר של מסד הנתונים שלך עם השאלה עצמה.

בניית פרומפטים ב-T-SQL

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

DECLARE @userQuestion NVARCHAR(1000) = 'Which pedals are compatible with the Mountain-500?';

-- @context contains retrieved product data as JSON from the retrieval step

DECLARE @systemMessage NVARCHAR(MAX) = 'You are a customer service assistant for Adventure Works. Answer questions using only the provided product information. Be concise and helpful.';

DECLARE @userMessage NVARCHAR(MAX) = 'Product information: ' + @context + CHAR(10) + CHAR(10) + 'Customer question: ' + @userQuestion;

DECLARE @payload NVARCHAR(MAX) = JSON_OBJECT(
    'messages': JSON_ARRAY(
        JSON_OBJECT('role': 'system', 'content': @systemMessage),
        JSON_OBJECT('role': 'user', 'content': @userMessage)
    ),
    'max_tokens': 500,
    'temperature': 0.7
);

המשתנה @payload מכיל כעת גוף בקשות מלא המוכן ל-API של Azure OpenAI.

עגן את המודל בנתונים שלך

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

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

DECLARE @systemMessage NVARCHAR(MAX) = 
'You are an Adventure Works product expert. Follow these rules:
1. Answer only using the product information provided
2. Do not invent features or specifications
3. If information is missing, tell the customer you''ll need to check
4. Keep responses under 100 words
5. Suggest related products when relevant';

הוראות אלו עוזרות למודל להישאר ממוקד ולספק תשובות מועילות ומדויקות.

התנהגות מודל הבקרה

מטען הבקשה כולל מספר פרמטרים המשפיעים על אופן יצירת התגובות של המודל:

  • max_tokens מגבילה את אורך התגובה. לתשובות מפורטות על מוצר, 500 עד 1,000 עובדים טוב.
  • temperature שולטת ביצירתיות בסולם מ-0 עד 2. ערכים נמוכים יותר (0.3 עד 0.5) מייצרים תגובות עקביות ועובדתיות יותר. ערכים גבוהים מאפשרים למודל להיות יצירתי יותר, מה שבדרך כלל לא רוצים ב-RAG.

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

בניית המטען המלא

כך תוכל לבנות פרומפט RAG לשאלה על מוצר באמצעות טבלאות Adventure Works:

DECLARE @userQuestion NVARCHAR(1000) = 'Which pedals are compatible with the Mountain-500?';
DECLARE @questionVector VECTOR(1536);
DECLARE @context NVARCHAR(MAX);
DECLARE @payload NVARCHAR(MAX);

-- Generate embedding for the question
SELECT @questionVector = AI_GENERATE_EMBEDDINGS(@userQuestion USE MODEL my_embedding_model);

-- Get product context using vector search
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
);

-- Build the prompt
SET @payload = JSON_OBJECT(
    'messages': JSON_ARRAY(
        JSON_OBJECT(
            'role': 'system', 
            'content': 'You are an Adventure Works product assistant. Use only the provided product data to answer questions.'
        ),
        JSON_OBJECT(
            'role': 'user', 
            'content': 'Product data: ' + @context + CHAR(10) + 'Question: ' + @userQuestion
        )
    ),
    'max_tokens': 500,
    'temperature': 0.5
);

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

נקודות מפנה

ההנחיה היא המקום שבו השליפה הופכת לשימושית. ההקשר שלך ב-JSON לא אומר כלום אלא אם תגיד למודל איך להשתמש בו. הגדר כללי הארקה ברורים בהודעת המערכת כדי שהמודל יישאר בנתונים שלך. שמור על טמפרטורה נמוכה לתשובות עובדתיות. השתמש JSON_OBJECT ולבנות JSON_ARRAY מטעני JSON תקפים ישירות ב-T-SQL.