Accettare le domande suggerite per l'apprendimento attivo nel knowledge base

Nota

Il servizio QnA Maker viene ritirato il 31 marzo 2025. Una versione più recente della domanda e della funzionalità di risposta è ora disponibile come parte del linguaggio di intelligenza artificiale di Azure. Per le funzionalità di risposta alle domande all'interno del servizio linguistico, vedere La risposta alle domande. A partire dal 1° ottobre 2022 non sarà possibile creare nuove risorse QnA Maker. Per informazioni sulla migrazione delle knowledge base QnA Maker esistenti alla risposta alle domande, consultare la guida alla migrazione.

Active Learning modifica la Knowledge Base o il servizio di ricerca dopo aver approvato il suggerimento, quindi salvare e eseguire il training. Se si approva il suggerimento, verrà aggiunto come domanda alternativa.

Attivare l'apprendimento attivo

Per visualizzare le domande suggerite, è necessario attivare l'apprendimento attivo per la risorsa QnA Maker.

Visualizzare le domande suggerite

  1. Per visualizzare le domande suggerite, nella pagina Modifica knowledge base selezionare Visualizza opzioni e quindi selezionare Mostra suggerimenti di apprendimento attivo. Questa opzione verrà disabilitata se non sono presenti suggerimenti per una delle coppie di domande e risposte.

    Nella sezione Modifica del portale selezionare Mostra suggerimenti per visualizzare le nuove alternative dell'apprendimento attivo.

  2. Filtrare la knowledge base con coppie di domande e risposte per visualizzare solo suggerimenti selezionando Filtra per suggerimenti.

    Usare l'opzione Filtra per suggerimenti per visualizzare solo le alternative consigliate dell'apprendimento attivo.

  3. Ogni coppia QnA suggerisce le nuove alternative alla domanda con un segno di spunta, , per accettare la domanda o un x oggetto per rifiutare i suggerimenti. Selezionare il segno di spunta per aggiungere la domanda.

    Selezionare o rifiutare le alternative consigliate dell'apprendimento attivo selezionando il segno di spunta verde o il segno di eliminazione rosso.

    È possibile aggiungere o eliminare tutti i suggerimenti selezionando Aggiungi tutto o Rifiuta tutto nella barra degli strumenti contestuale .

  4. Selezionare Save and Train (Salva ed esegui il training) per salvare le modifiche alla knowledge base.

  5. Selezionare Pubblica per consentire la disponibilità delle modifiche dall'API GenerateAnswer.

    Quando vengono cluster 5 o più query simili, ogni 30 minuti, QnA Maker suggerisce le domande alternative da accettare o rifiutare.

I suggerimenti per l'apprendimento attivo vengono salvati nell'knowledge base esportato

Quando l'app è abilitata per l'apprendimento attivo e si esporta l'app, la SuggestedQuestions colonna nel file tsv conserva i dati di apprendimento attivi.

La SuggestedQuestions colonna è un oggetto JSON delle informazioni di feedback impliciti, , autosuggestede espliciti usersuggested . Un esempio di questo oggetto JSON per una singola domanda inviata dall'utente è help :

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

Quando si reimporta questa app, l'apprendimento attivo continua a raccogliere informazioni e consigliare suggerimenti per il knowledge base.

Flusso dell'architettura per l'uso di GenerateAnswer e Training API da un bot

Un bot o un'altra applicazione client deve usare il flusso dell'architettura seguente per usare l'apprendimento attivo:

  1. Il bot ottiene la risposta dalla knowledge base con l'API GenerateAnswer, usando la top proprietà per ottenere una serie di risposte.

  2. Il bot determina il feedback esplicito:

    • Usando la propria logica di business personalizzata, filtrare i punteggi bassi.
    • Nel bot o nell'applicazione client visualizzare l'elenco delle risposte possibili all'utente e ottenere la risposta selezionata dell'utente.
  3. Il bot invia una risposta selezionata a QnA Maker con l'API Train.

Usare la proprietà principale nella richiesta GenerateAnswer per ottenere diverse risposte corrispondenti

Quando si invia una domanda a QnA Maker per una risposta, la top proprietà del corpo JSON imposta il numero di risposte da restituire.

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

Usare la proprietà score insieme alla logica di business per ottenere un elenco di risposte per visualizzare l'utente

Quando l'applicazione client (ad esempio un bot di chat) riceve la risposta, vengono restituite le prime 3 domande. Utilizzare la proprietà per analizzare la score prossimità tra i punteggi. Questo intervallo di prossimità è determinato dalla propria logica di business.

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

Follow-up dell'applicazione client in caso di domande con punteggi simili

L'applicazione client visualizza le domande con un'opzione per l'utente per selezionare la singola domanda che rappresenta la loro intenzione.

Dopo aver selezionato una delle domande esistenti, l'applicazione client invia la scelta dell'utente come feedback usando l'API QnA Maker Train. Questo feedback completa il ciclo di feedback di apprendimento attivo.

API Train

Il feedback sull'apprendimento attivo viene inviato a QnA Maker con la richiesta Train API POST. La firma DELL'API è:

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}]}
Proprietà della richiesta HTTP Nome Tipo Scopo
Parametro di route URL ID della knowledge Base string L'identificatore univoco globale della Knowledge Base.
Sottodominio personalizzato Nome risorsa QnAMaker string Il nome della risorsa viene usato come sottodominio personalizzato per QnA Maker. Questa opzione è disponibile nella pagina Impostazioni dopo la pubblicazione del knowledge base. È elencato come .host
Intestazione Content-Type string tipo di supporto del corpo inviato all'API. Il valore predefinito è: application/json
Intestazione Autorizzazione string la chiave endpoint (EndpointKey xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx).
Post Body Oggetto JSON JSON Feedback di training

Il corpo JSON ha diverse impostazioni:

Proprietà corpo JSON Tipo Scopo
feedbackRecords array Elenco di commenti e suggerimenti.
userId string ID utente della persona che accetta le domande suggerite. Il formato ID utente è fino all'utente. Ad esempio, un indirizzo di posta elettronica può essere un ID utente valido nell'architettura. Facoltativa.
userQuestion string Testo esatto della query dell'utente. Obbligatorio.
qnaID d'acquisto ID della domanda, trovato nella risposta GenerateAnswer.

Un corpo JSON di esempio è simile al seguente:

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

Una risposta con esito positivo restituisce uno stato pari a 204 e nessun corpo della risposta JSON.

Eseguire il batch di molti record di feedback in una singola chiamata

Nell'applicazione lato client, ad esempio un bot, è possibile archiviare i dati, quindi inviare molti record in un singolo corpo JSON nella feedbackRecords matrice.

Un corpo JSON di esempio è simile al seguente:

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

Codice di esempio di Bot Framework

Il codice bot Framework deve chiamare l'API Train, se la query dell'utente deve essere usata per l'apprendimento attivo. Esistono due parti di codice da scrivere:

  • Determinare se la query deve essere usata per l'apprendimento attivo
  • Inviare di nuovo la query all'API QnA Maker Train per l'apprendimento attivo

Nell'esempio di Azure Bot entrambe queste attività sono state programmate.

Codice C# di esempio per eseguire il training dell'API con Bot Framework 4.x

Il codice seguente illustra come inviare informazioni a QnA Maker con l'API Train.

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

Esempio di codice Node.js per il training dell'API con Bot Framework 4.x

Il codice seguente illustra come inviare informazioni a QnA Maker con l'API Train.

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

Procedure consigliate

Per le procedure consigliate quando si usa l'apprendimento attivo, vedere Procedure consigliate.

Passaggi successivi