Voorgestelde vragen over actief leren accepteren in de Knowledge Base

Notitie

De QnA Maker-service wordt op 31 maart 2025 buiten gebruik gesteld. Er is nu een nieuwere versie van de vraag- en antwoordmogelijkheid beschikbaar als onderdeel van Azure AI Language. Zie Vragen beantwoorden voor mogelijkheden voor het beantwoorden van vragen binnen de Taalservice. Vanaf 1 oktober 2022 kunt u geen nieuwe QnA Maker-resources meer maken. Raadpleeg de migratiehandleiding voor informatie over het migreren van bestaande QnA Maker-knowledge bases om vragen te beantwoorden.

Met Actief leren wordt de Knowledge Base of zoekservice gewijzigd nadat u de suggestie hebt goedgekeurd en vervolgens opslaat en traint. Als u de suggestie goedkeurt, wordt deze toegevoegd als een alternatieve vraag.

Actief leren inschakelen

Als u voorgestelde vragen wilt zien, moet u actief leren inschakelen voor uw QnA Maker-resource.

Voorgestelde vragen weergeven

  1. Als u de voorgestelde vragen wilt zien, selecteert u op de pagina Knowledge Base bewerkende optie Weergaveopties en selecteert u vervolgens Actieve leersuggesties weergeven. Deze optie wordt uitgeschakeld als er geen suggesties zijn voor een van de vraag- en antwoordparen.

    Selecteer in de sectie Bewerken van de portal de optie Suggesties weergeven om de nieuwe vraagalternatieven van het actieve leerproces te zien.

  2. Filter de Knowledge Base met vraag- en antwoordparen om alleen suggesties weer te geven door Filteren op suggesties te selecteren.

    Gebruik de wisselknop Filteren op suggesties om alleen de voorgestelde alternatieven voor vragen van de actieve leerstof weer te geven.

  3. Elk QnA-paar stelt de nieuwe vraagalternatieven voor met een vinkje, , om de vraag te accepteren of een x om de suggesties te weigeren. Selecteer het vinkje om de vraag toe te voegen.

    Selecteer de voorgestelde vraagalternatieven van actief leren door het groene vinkje of het rode verwijderteken te selecteren.

    U kunt alle suggesties toevoegen of verwijderen door Alles toevoegen of Alles negeren te selecteren in de contextuele werkbalk.

  4. Selecteer Opslaan en trainen om de wijzigingen op te slaan in de Knowledge Base.

  5. Selecteer Publiceren om toe te staan dat de wijzigingen beschikbaar zijn via de GenerateAnswer-API.

    Wanneer er elke 30 minuten 5 of meer vergelijkbare query's worden geclusterd, stelt QnA Maker de alternatieve vragen voor die u kunt accepteren of afwijzen.

Actieve leersuggesties worden opgeslagen in de geëxporteerde Knowledge Base

Wanneer actief leren is ingeschakeld voor uw app en u de app exporteert, behoudt de SuggestedQuestions kolom in het tsv-bestand de actieve leergegevens.

De SuggestedQuestions kolom is een JSON-object met informatie van impliciete, autosuggesteden expliciete feedback usersuggested . Een voorbeeld van dit JSON-object voor één door de gebruiker ingediende vraag van help is:

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

Wanneer u deze app opnieuw invoert, blijft het actieve leren informatie verzamelen en suggesties voor uw Knowledge Base aanbevelen.

Architectuurstroom voor het gebruik van GenerateAnswer- en Train-API's van een bot

Een bot of andere clienttoepassing moet de volgende architectuurstroom gebruiken om actief leren te gebruiken:

  1. Bot haalt het antwoord op van de Knowledge Base met de GenerateAnswer-API, waarbij de top eigenschap wordt gebruikt om een aantal antwoorden te krijgen.

  2. Bot bepaalt expliciete feedback:

    • Gebruik uw eigen aangepaste bedrijfslogica om lage scores uit te filteren.
    • Geef in de bot of clienttoepassing een lijst weer met mogelijke antwoorden voor de gebruiker en haal het geselecteerde antwoord van de gebruiker op.
  3. Bot stuurt het geselecteerde antwoord terug naar QnA Maker met de Train-API.

Gebruik de eigenschap top in de GenerateAnswer-aanvraag om verschillende overeenkomende antwoorden te krijgen

Wanneer u een vraag naar QnA Maker indient voor een antwoord, stelt de top eigenschap van de JSON-hoofdtekst het aantal antwoorden in dat moet worden geretourneerd.

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

Gebruik de eigenschap score samen met bedrijfslogica om een lijst met antwoorden te krijgen om de gebruiker weer te geven

Wanneer de clienttoepassing (zoals een chatbot) het antwoord ontvangt, worden de drie belangrijkste vragen geretourneerd. Gebruik de score eigenschap om de nabijheid tussen scores te analyseren. Dit nabijheidsbereik wordt bepaald door uw eigen bedrijfslogica.

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

Opvolgen van clienttoepassingen wanneer vragen vergelijkbare scores hebben

Uw clienttoepassing geeft de vragen weer met een optie voor de gebruiker om de ene vraag te selecteren die het meest overeenkomt met de bedoeling.

Zodra de gebruiker een van de bestaande vragen selecteert, verzendt de clienttoepassing de keuze van de gebruiker als feedback met behulp van de QnA Maker Train-API. Deze feedback voltooit de actieve feedbacklus voor leren.

API trainen

Actieve feedback over leren wordt verzonden naar QnA Maker met de POST-aanvraag train-API. De API-handtekening is:

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}]}
Eigenschap HTTP-aanvraag Naam Type Doel
URL-routeparameter Id van de Knowledge Base tekenreeks De GUID voor uw Knowledge Base.
Aangepast subdomein QnAMaker-resourcenaam tekenreeks De resourcenaam wordt gebruikt als het aangepaste subdomein voor uw QnA Maker. Dit is beschikbaar op de pagina Instellingen nadat u de Knowledge Base hebt gepubliceerd. Deze wordt vermeld als de host.
Header Content-Type tekenreeks Het mediatype van de hoofdtekst die naar de API is verzonden. De standaardwaarde is: application/json
Header Autorisatie tekenreeks Uw eindpuntsleutel (EndpointKey xxxxxxxx-xxxx-xxxx-xxxxxxxxxxxx).
Berichttekst JSON-object JSON De trainingsfeedback

De JSON-hoofdtekst heeft verschillende instellingen:

JSON-hoofdteksteigenschap Type Doel
feedbackRecords matrix Lijst met feedback.
userId tekenreeks De gebruikers-id van de persoon die de voorgestelde vragen accepteert. U kunt zelf de indeling van de gebruikers-id opgeven. Een e-mailadres kan bijvoorbeeld een geldige gebruikers-id in uw architectuur zijn. Optioneel.
userQuestion tekenreeks Exacte tekst van de query van de gebruiker. Vereist.
qnaID getal Id van vraag, gevonden in het antwoord GenerateAnswer.

Een voorbeeld van een JSON-hoofdtekst ziet er als volgt uit:

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

Een geslaagd antwoord retourneert de status 204 en geen JSON-antwoordtekst.

Batch veel feedbackrecords in één aanroep

In de toepassing aan de clientzijde, zoals een bot, kunt u de gegevens opslaan en vervolgens veel records verzenden in één JSON-hoofdtekst in de feedbackRecords matrix.

Een voorbeeld van een JSON-hoofdtekst ziet er als volgt uit:

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

Voorbeeldcode van botframework

Uw bot-frameworkcode moet de Train-API aanroepen, als de query van de gebruiker moet worden gebruikt voor actief leren. Er zijn twee codefragmenten om te schrijven:

  • Bepalen of de query moet worden gebruikt voor actief leren
  • Query terugsturen naar de QnA Maker Train-API voor actief leren

In het Azure Bot-voorbeeld zijn beide activiteiten geprogrammeerd.

Voorbeeld van C#-code voor API trainen met Bot Framework 4.x

De volgende code illustreert hoe u informatie terugstuurt naar QnA Maker met de 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();
        }
    }
}

Voorbeeld Node.js code voor API trainen met Bot Framework 4.x

De volgende code illustreert hoe u informatie terugstuurt naar QnA Maker met de 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);
}

Aanbevolen procedures

Zie Best practices voor aanbevolen procedures bij het gebruik van actief leren.

Volgende stappen