قبول الأسئلة المقترحة للتعلم النشط في قاعدة معارف

ملاحظة

سيتم إنهاء خدمة QnA Maker في 31 مارس 2025. يتوفر الآن إصدار أحدث من إمكانية السؤال والإجابة كجزء من Azure الذكاء الاصطناعي Language. للحصول على قدرات الإجابة على الأسئلة داخل خدمة اللغات، انظر سؤال الإجابة. بدءًا من 1 أكتوبر 2022 لن تتمكن من إنشاء موارد جديدة لـ QnA Maker. للحصول على معلومات حول ترحيل قواعد المعرفة الحالية لـ QnA Maker إلى الإجابة عن الأسئلة، راجع دليل الترحيل.

يغير Active Learning قاعدة المعارف أو خدمة البحث بعد الموافقة على الاقتراح، ثم الحفظ والتدريب. إذا وافقت على الاقتراح، فستتم إضافته كسؤال بديل.

تشغيل التعلم النشط

لمشاهدة الأسئلة المقترحة، يجب تشغيل التعلم النشط لمورد QnA Maker.

عرض الأسئلة المقترحة

  1. للاطلاع على الأسئلة المقترحة، في صفحة تحرير قاعدة معارف، حدد خيارات العرض، ثم حدد إظهار اقتراحات التعلم النشط. سيتم تعطيل هذا الخيار إذا لم تكن هناك اقتراحات موجودة لأي من أزواج الأسئلة والأجوبة.

    في قسم تحرير في المدخل، حدد إظهار الاقتراحات للاطلاع على بدائل الأسئلة الجديدة للتعلم النشط.

  2. قم بتصفية قاعدة معارف مع أزواج الأسئلة والأجوبة لإظهار الاقتراحات فقط عن طريق تحديد تصفية حسب الاقتراحات.

    استخدم مفتاح التبديل تصفية حسب الاقتراحات لعرض بدائل الأسئلة المقترحة للتعلم النشط فقط.

  3. يقترح كل إقران السؤال والجواب بدائل السؤال الجديدة مع علامة اختيار، ، لقبول السؤال أو x لرفض الاقتراحات. حدد علامة الاختيار لإضافة السؤال.

    تحديد بدائل الأسئلة المقترحة للتعلم النشط أو رفضها عن طريق تحديد علامة الاختيار الخضراء أو علامة الحذف الحمراء.

    يمكنك إضافة كافة الاقتراحات أو حذفها عن طريق تحديد إضافة الكل أو رفض الكل في شريط الأدوات السياقي.

  4. حدد حفظ وتدريب لحفظ التغييرات على قاعدة معارف.

  5. حدد Publish للسماح بتوفر التغييرات من واجهة برمجة تطبيقات GenerateAnswer.

    عندما يتم تجميع 5 استعلامات متشابهة أو أكثر، كل 30 دقيقة، يقترح QnA Maker الأسئلة البديلة لقبولها أو رفضها.

يتم حفظ اقتراحات التعلم النشط في قاعدة معارف المصدرة

عندما يتم تمكين التعلم النشط لتطبيقك، وتصدير التطبيق، يحتفظ العمود SuggestedQuestions الموجود في ملف tsv ببيانات التعلم النشط.

العمود SuggestedQuestions هو عنصر JSON لمعلومات الملاحظات الضمنية autosuggestedوالصريحةusersuggested. مثال على عنصر JSON هذا لسؤال help واحد تم إرساله من قبل المستخدم هو:

[
    {
        "clusterHead": "help",
        "totalAutoSuggestedCount": 1,
        "totalUserSuggestedCount": 0,
        "alternateQuestionList": [
            {
                "question": "help",
                "autoSuggestedCount": 1,
                "userSuggestedCount": 0
            }
        ]
    }
]

عند إعادة استيراد هذا التطبيق، يستمر التعلم النشط في جمع المعلومات والتوصية باقتراحات قاعدة معارف.

تدفق التصميم لاستخدام GenerateAnswer وتدريب واجهات برمجة التطبيقات من روبوت

يجب أن يستخدم الروبوت أو تطبيق العميل الآخر التدفق المعماري التالي لاستخدام التعلم النشط:

  1. يحصل الروبوت على الإجابة من قاعدة معارف مع واجهة برمجة تطبيقات GenerateAnswer، باستخدام الخاصية top للحصول على عدد من الإجابات.

  2. يحدد الروبوت الملاحظات الصريحة:

    • باستخدام منطق العمل المخصص الخاص بك، قم بتصفية النقاط المنخفضة.
    • في الروبوت أو تطبيق العميل، اعرض قائمة الإجابات المحتملة للمستخدم والحصول على إجابة المستخدم المحددة.
  3. يرسل الروبوت الإجابة المحددة مرة أخرى إلى QnA Maker باستخدام Train API.

استخدم الخاصية العلوية في طلب GenerateAnswer للحصول على إجابات مطابقة متعددة

عند إرسال سؤال إلى QnA Maker للحصول على إجابة، تحدد خاصية top لنص JSON عدد الإجابات التي يجب إرجاعها.

{
    "question": "wi-fi",
    "isTest": false,
    "top": 3
}

استخدم خاصية النتيجة مع منطق العمل للحصول على قائمة الإجابات لإظهار المستخدم

عندما يتلقى تطبيق العميل (مثل روبوت الدردشة) الاستجابة، يتم إرجاع أهم 3 أسئلة. استخدم الخاصية score لتحليل التقارب بين الدرجات. يتم تحديد نطاق التقارب هذا من خلال منطق عملك الخاص.

{
    "answers": [
        {
            "questions": [
                "Wi-Fi Direct Status Indicator"
            ],
            "answer": "**Wi-Fi Direct Status Indicator**\n\nStatus bar icons indicate your current Wi-Fi Direct connection status:  \n\nWhen your device is connected to another device using Wi-Fi Direct, '$  \n\n+ *+ ' Wi-Fi Direct is displayed in the Status bar.",
            "score": 74.21,
            "id": 607,
            "source": "Bugbash KB.pdf",
            "metadata": []
        },
        {
            "questions": [
                "Wi-Fi - Connections"
            ],
            "answer": "**Wi-Fi**\n\nWi-Fi is a term used for certain types of Wireless Local Area Networks (WLAN). Wi-Fi communication requires access to a wireless Access Point (AP).",
            "score": 74.15,
            "id": 599,
            "source": "Bugbash KB.pdf",
            "metadata": []
        },
        {
            "questions": [
                "Turn Wi-Fi On or Off"
            ],
            "answer": "**Turn Wi-Fi On or Off**\n\nTurning Wi-Fi on makes your device able to discover and connect to compatible in-range wireless APs.  \n\n1.  From a Home screen, tap ::: Apps > e Settings .\n2.  Tap Connections > Wi-Fi , and then tap On/Off to turn Wi-Fi on or off.",
            "score": 69.99,
            "id": 600,
            "source": "Bugbash KB.pdf",
            "metadata": []
        }
    ]
}

متابعة تطبيق العميل عندما يكون للأسئلة درجات مماثلة

يعرض تطبيق العميل الأسئلة مع خيار للمستخدم لتحديد السؤال الفردي الذي يمثل معظم نيته.

بمجرد أن يحدد المستخدم أحد الأسئلة الموجودة، يرسل تطبيق العميل اختيار المستخدم كملاحظات باستخدام QnA Maker Train API. تكمل هذه الملاحظات حلقة ملاحظات التعلم النشط.

تدريب واجهة برمجة التطبيقات

يتم إرسال ملاحظات التعلم النشط إلى QnA Maker مع طلب Train API POST. توقيع واجهة برمجة التطبيقات هو:

POST https://<QnA-Maker-resource-name>.azurewebsites.net/qnamaker/knowledgebases/<knowledge-base-ID>/train
Authorization: EndpointKey <endpoint-key>
Content-Type: application/json
{"feedbackRecords": [{"userId": "1","userQuestion": "<question-text>","qnaId": 1}]}
خاصية طلب HTTP الاسم النوع الغرض
معلمة مسار URL معرف قاعدة المعرفة سلسلة المعرف الفريد العمومي (GUID) لقاعدة معارف.
مجال فرعي مخصص اسم مورد QnAMaker سلسلة يتم استخدام اسم المورد كمجال فرعي مخصص لـ QnA Maker. يتوفر هذا في صفحة الإعدادات بعد نشر قاعدة معارف. يتم إدراجه على أنه host.
الرأس نوع المحتوى سلسلة نوع الوسائط من النص الأساسي المرسلة إلى واجهة برمجة التطبيقات. القيمة الافتراضية هي: application/json
الرأس التخويل سلسلة مفتاح نقطة النهاية (EndpointKey xxxxxxxx-xxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx).
نص النشر عنصر JSON JSON ملاحظات التدريب

يحتوي نص JSON على العديد من الإعدادات:

خاصية نص JSON النوع الغرض
feedbackRecords صفيف قائمة الملاحظات.
userId سلسلة معرف المستخدم للشخص الذي يقبل الأسئلة المقترحة. تنسيق معرف المستخدم متروك لك. على سبيل المثال، يمكن أن يكون عنوان البريد الإلكتروني معرف مستخدم صالحًا في البنية الخاصة بك. ‏‏اختياري.
userQuestion سلسلة النص الدقيق لاستعلام المستخدم. مطلوب
qnaID العدد معرف السؤال، الموجود في استجابة GenerateAnswer.

مثال على نص JSON يشبه:

{
    "feedbackRecords": [
        {
            "userId": "1",
            "userQuestion": "<question-text>",
            "qnaId": 1
        }
    ]
}

ترجع الاستجابة الناجحة حالة 204 وليس نص استجابة JSON.

تجميع العديد من سجلات الملاحظات في استدعاء واحد

في التطبيق من جانب العميل، مثل الروبوت، يمكنك تخزين البيانات، ثم إرسال العديد من السجلات في نص JSON واحد في الصفيف feedbackRecords.

مثال على نص JSON يشبه:

{
    "feedbackRecords": [
        {
            "userId": "1",
            "userQuestion": "How do I ...",
            "qnaId": 1
        },
        {
            "userId": "2",
            "userQuestion": "Where is ...",
            "qnaId": 40
        },
        {
            "userId": "3",
            "userQuestion": "When do I ...",
            "qnaId": 33
        }
    ]
}

نموذج التعليمات البرمجية لإطار عمل الروبوت

تحتاج التعليمات البرمجية لإطار عمل الروبوت إلى استدعاء Train API، إذا كان يجب استخدام استعلام المستخدم للتعلم النشط. هناك جزءان من التعليمات البرمجية لكتابتها:

  • تحديد ما إذا كان يجب استخدام الاستعلام للتعلم النشط
  • إرسال الاستعلام مرة أخرى إلى QnA Maker Train API للتعلم النشط

في نموذج Azure Bot، تم برمجة كلا النشاطين.

مثال على التعليمات البرمجية C# لتدريب واجهة برمجة التطبيقات مع Bot Framework 4.x

توضح التعليمات البرمجية التالية كيفية إرسال المعلومات مرة أخرى إلى QnA Maker باستخدام Train API.

public class FeedbackRecords
{
    // <summary>
    /// List of feedback records
    /// </summary>
    [JsonProperty("feedbackRecords")]
    public FeedbackRecord[] Records { get; set; }
}

/// <summary>
/// Active learning feedback record
/// </summary>
public class FeedbackRecord
{
    /// <summary>
    /// User id
    /// </summary>
    public string UserId { get; set; }

    /// <summary>
    /// User question
    /// </summary>
    public string UserQuestion { get; set; }

    /// <summary>
    /// QnA Id
    /// </summary>
    public int QnaId { get; set; }
}

/// <summary>
/// Method to call REST-based QnAMaker Train API for Active Learning
/// </summary>
/// <param name="endpoint">Endpoint URI of the runtime</param>
/// <param name="FeedbackRecords">Feedback records train API</param>
/// <param name="kbId">Knowledgebase Id</param>
/// <param name="key">Endpoint key</param>
/// <param name="cancellationToken"> Cancellation token</param>
public async static void CallTrain(string endpoint, FeedbackRecords feedbackRecords, string kbId, string key, CancellationToken cancellationToken)
{
    var uri = endpoint + "/knowledgebases/" + kbId + "/train/";

    using (var client = new HttpClient())
    {
        using (var request = new HttpRequestMessage())
        {
            request.Method = HttpMethod.Post;
            request.RequestUri = new Uri(uri);
            request.Content = new StringContent(JsonConvert.SerializeObject(feedbackRecords), Encoding.UTF8, "application/json");
            request.Headers.Add("Authorization", "EndpointKey " + key);

            var response = await client.SendAsync(request, cancellationToken);
            await response.Content.ReadAsStringAsync();
        }
    }
}

مثال على التعليمات البرمجية Node.js لتدريب واجهة برمجة التطبيقات باستخدام Bot Framework 4.x

توضح التعليمات البرمجية التالية كيفية إرسال المعلومات مرة أخرى إلى QnA Maker باستخدام Train API.

async callTrain(stepContext){

    var trainResponses = stepContext.values[this.qnaData];
    var currentQuery = stepContext.values[this.currentQuery];

    if(trainResponses.length > 1){
        var reply = stepContext.context.activity.text;
        var qnaResults = trainResponses.filter(r => r.questions[0] == reply);

        if(qnaResults.length > 0){

            stepContext.values[this.qnaData] = qnaResults;

            var feedbackRecords = {
                FeedbackRecords:[
                    {
                        UserId:stepContext.context.activity.id,
                        UserQuestion: currentQuery,
                        QnaId: qnaResults[0].id
                    }
                ]
            };

            // Call Active Learning Train API
            this.activeLearningHelper.callTrain(this.qnaMaker.endpoint.host, feedbackRecords, this.qnaMaker.endpoint.knowledgeBaseId, this.qnaMaker.endpoint.endpointKey);

            return await stepContext.next(qnaResults);
        }
        else{

            return await stepContext.endDialog();
        }
    }

    return await stepContext.next(stepContext.result);
}

أفضل الممارسات

للحصول على أفضل الممارسات عند استخدام التعلم النشط، راجع أفضل الممارسات.

الخطوات التالية