جهز سياق الاسترجاع للزيادة

مكتمل

الآن فهمت ما هو RAG ومتى تستخدمه. في الوحدات التالية، تتعلم كيفية تنفيذ كل خطوة من خطوات سير عمل RAG في T-SQL.

تخيل السيناريو التالي: يسأل أحد العملاء "أي دواسات تناسب الدراجة الجبلية التي اشتريتها الشهر الماضي؟" تستعلام قاعدة البيانات، تجد ترتيبها، تحدد نموذج الدراجة، وتحدد المكونات المتوافقة. تمثل هذه الخطوة الحرف "R" في RAG: الاسترجاع. دعونا نستعيد ونجهز تلك البيانات لنموذج اللغة. هناك العديد من الطرق لاسترجاع البيانات من SQL، لكن بالنسبة ل RAG، الهدف هو توفير سياق منظم للنموذج يمكنه استخدامه فعليا.

تحويل البيانات العلائقية إلى JSON

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

بعض الخيارات تتيح لك تشكيل المخرج:

  • 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 الخاص بك بتضمين الأعمدة التي يحتاجها النموذج فقط. الضوضاء الأقل تعني إجابات أفضل وتكاليف رموز أقل.