تعزيز المحفزات مع سياق قاعدة البيانات
الاسترجاع يمنحك البيانات. لكن كتلة JSON بحد ذاتها لا تجيب على سؤال أي شخص. إذا سأل عميل عن توافق دواسات الدراجة، فأنت حصلت على معلومات المنتج من قاعدة بياناتك، لكن الآن عليك أن تخبر نموذج اللغة بما يجب فعله بها. تمثل هذه الخطوة الحرف "A" في RAG: التعزيز.
افهم هيكل رسائل الدردشة
النماذج المختلفة لها واجهات برمجة تطبيقات مختلفة، لكن معظم النماذج المعتمدة على الدردشة تتبع نمطا مشابها. نستخدم 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 الآن على جسم طلب كامل جاهز لواجهة برمجة تطبيقات 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 إلى 1000 خيار جيد بالنسبة لي. -
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.