Zaakceptuj sugerowane pytania dotyczące uczenia aktywnego w baza wiedzy

Uwaga

Usługa QnA Maker jest wycofana 31 marca 2025 r. Nowsza wersja funkcji pytań i odpowiedzi jest teraz dostępna w ramach języka sztucznej inteligencji platformy Azure. Aby uzyskać możliwości odpowiedzi na pytania w usłudze językowej, zobacz odpowiadanie na pytania. Od 1 października 2022 r. nie będzie można tworzyć nowych zasobów usługi QnA Maker. Aby uzyskać informacje na temat migrowania istniejących baz wiedzy usługi QnA Maker do odpowiadania na pytania, zapoznaj się z przewodnikiem migracji.

Usługa Active Learning zmienia bazę wiedzy lub usługę wyszukiwania po zatwierdzeniu sugestii, a następnie zapisuje i trenuje. Jeśli zatwierdzisz sugestię, zostanie ona dodana jako pytanie alternatywne.

Włącz uczenie aktywne

Aby zobaczyć sugerowane pytania, musisz włączyć aktywne uczenie dla zasobu usługi QnA Maker.

Wyświetlanie sugerowanych pytań

  1. Aby wyświetlić sugerowane pytania, na stronie Edytuj baza wiedzy wybierz pozycję Wyświetl opcje, a następnie wybierz pozycję Pokaż aktywne sugestie szkoleniowe. Ta opcja zostanie wyłączona, jeśli nie ma żadnych sugestii dotyczących żadnej pary pytań i odpowiedzi.

    W sekcji Edytuj w portalu wybierz pozycję Pokaż sugestie, aby wyświetlić nowe alternatywy pytań uczenia aktywnego.

  2. Odfiltruj baza wiedzy przy użyciu par pytań i odpowiedzi, aby wyświetlić tylko sugestie, wybierając pozycję Filtruj według sugestii.

    Użyj przełącznika Filtruj według sugestii, aby wyświetlić tylko sugerowane alternatywy pytań dla aktywnej nauki.

  3. Każda para pytań i odpowiedzi sugeruje nowe alternatywy pytań z znacznikiem wyboru , aby zaakceptować pytanie lub odrzucić x sugestie. Wybierz znacznik wyboru, aby dodać pytanie.

    Wybierz lub odrzuć sugerowane alternatywy pytań dla aktywnej nauki, wybierając zielony znacznik wyboru lub czerwony znacznik usuwania.

    Możesz dodać lub usunąć wszystkie sugestie , wybierając pozycję Dodaj wszystko lub Odrzuć wszystko na pasku narzędzi kontekstowych.

  4. Wybierz pozycję Zapisz i wytrenuj, aby zapisać zmiany w baza wiedzy.

  5. Wybierz pozycję Publikuj, aby zezwolić na udostępnienie zmian z interfejsu API GenerateAnswer.

    Gdy 5 lub więcej podobnych zapytań jest klastrowanych, co 30 minut usługa QnA Maker sugeruje alternatywne pytania dotyczące akceptowania lub odrzucania.

Sugestie dotyczące uczenia aktywnego są zapisywane w wyeksportowanym baza wiedzy

Gdy aplikacja ma włączoną aktywną naukę i eksportujesz aplikację, kolumna SuggestedQuestions w pliku tsv zachowuje aktywne dane szkoleniowe.

Kolumna SuggestedQuestions jest obiektem JSON informacji niejawnych, autosuggestedi jawnych opinii usersuggested . Przykładem tego obiektu JSON dla jednego przesłanego help przez użytkownika pytania jest:

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

Gdy ponownie zaimportujesz tę aplikację, aktywna nauka będzie nadal zbierać informacje i zalecać sugestie dotyczące baza wiedzy.

Przepływ architektury do używania interfejsów API GenerateAnswer i Train z bota

Bot lub inna aplikacja kliencka powinna używać następującego przepływu architektury do korzystania z aktywnego uczenia:

  1. Bot otrzymuje odpowiedź z baza wiedzy za pomocą interfejsu API GenerateAnswer przy użyciu top właściwości w celu uzyskania wielu odpowiedzi.

  2. Bot określa jawną opinię:

    • Korzystając z własnej niestandardowej logiki biznesowej, odfiltruj niskie wyniki.
    • W botze lub aplikacji klienckiej wyświetl listę możliwych odpowiedzi dla użytkownika i uzyskaj wybraną odpowiedź użytkownika.
  3. Bot wysyła wybraną odpowiedź z powrotem do usługi QnA Maker przy użyciu interfejsu API trenowania.

Użyj właściwości top w żądaniu GenerateAnswer, aby uzyskać kilka pasujących odpowiedzi

Podczas przesyłania pytania do usługi QnA Maker dla odpowiedzi top właściwość treści JSON ustawia liczbę odpowiedzi do zwrócenia.

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

Użyj właściwości score wraz z logiką biznesową, aby uzyskać listę odpowiedzi na wyświetlanie użytkownika

Gdy aplikacja kliencka (na przykład czatbot) otrzyma odpowiedź, zwracane są 3 najważniejsze pytania. Użyj właściwości , score aby przeanalizować bliskość między wynikami. Ten zakres sąsiedztwa jest określany przez własną logikę biznesową.

{
    "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": []
        }
    ]
}

Kontynuacja aplikacji klienckiej, gdy pytania mają podobne wyniki

Aplikacja kliencka wyświetla pytania z opcją dla użytkownika, aby wybrać jedno pytanie , które większość reprezentuje ich intencję.

Gdy użytkownik wybierze jedno z istniejących pytań, aplikacja kliencka wyśle wybór użytkownika jako opinię przy użyciu interfejsu API trenowania usługi QnA Maker. Ta opinia kończy pętlę uczenia aktywnego uczenia.

Interfejs API trenowania

Aktywna opinia szkoleniowa jest wysyłana do usługi QnA Maker za pomocą żądania POST trenowania interfejsu API. Podpis interfejsu API to:

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}]}
Właściwość żądania HTTP Nazwa Typ Przeznaczenie
Parametr trasy adresu URL Identyfikator bazy wiedzy ciąg Identyfikator GUID dla baza wiedzy.
Domena podrzędna niestandardowa Nazwa zasobu usługi QnAMaker ciąg Nazwa zasobu jest używana jako domena podrzędna niestandardowa dla usługi QnA Maker. Jest to dostępne na stronie Ustawienia po opublikowaniu baza wiedzy. Jest on wyświetlany jako host.
Nagłówek Content-Type ciąg Typ nośnika treści wysyłanej do interfejsu API. Wartość domyślna to: application/json
Nagłówek Autoryzacja ciąg Klucz punktu końcowego (EndpointKey xxxxxxxx-xxxx-xxxx-xxxx-xxxx-xxxxxxxxxx).
Treść wpisu Obiekt JSON JSON Opinia szkoleniowa

Treść JSON ma kilka ustawień:

Właściwość treści JSON Typ Przeznaczenie
feedbackRecords array Lista opinii.
userId ciąg Identyfikator użytkownika osoby akceptującej sugerowane pytania. Format identyfikatora użytkownika jest do Ciebie. Na przykład adres e-mail może być prawidłowym identyfikatorem użytkownika w architekturze. Opcjonalny.
userQuestion ciąg Dokładny tekst zapytania użytkownika. Wymagane.
qnaID liczba Identyfikator pytania znaleziony w odpowiedzi GenerateAnswer.

Przykładowa treść JSON wygląda następująco:

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

Pomyślna odpowiedź zwraca stan 204 i brak treści odpowiedzi JSON.

Batch wiele rekordów opinii w jednym wywołaniu

W aplikacji po stronie klienta, takiej jak bot, można przechowywać dane, a następnie wysyłać wiele rekordów w jednej treści JSON w tablicy feedbackRecords .

Przykładowa treść JSON wygląda następująco:

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

Przykładowy kod platformy Bot Framework

Kod struktury bota musi wywołać interfejs API trenowania, jeśli zapytanie użytkownika powinno być używane do aktywnego uczenia. Istnieją dwa fragmenty kodu do napisania:

  • Określanie, czy zapytanie powinno być używane na potrzeby uczenia aktywnego
  • Wysyłanie zapytania z powrotem do interfejsu API trenowania usługi QnA Maker na potrzeby aktywnego uczenia

W przykładzie usługi Azure Bot oba te działania zostały zaprogramowane.

Przykładowy kod języka C# do trenowania interfejsu API przy użyciu platformy Bot Framework 4.x

Poniższy kod ilustruje sposób wysyłania informacji z powrotem do usługi QnA Maker przy użyciu interfejsu API trenowania.

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();
        }
    }
}

Przykładowy kod Node.js trenowania interfejsu API przy użyciu platformy Bot Framework 4.x

Poniższy kod ilustruje sposób wysyłania informacji z powrotem do usługi QnA Maker przy użyciu interfejsu API trenowania.

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);
}

Najlepsze rozwiązania

Aby uzyskać najlepsze rozwiązania dotyczące korzystania z uczenia aktywnego, zobacz Najlepsze rozwiązania.

Następne kroki