Accepter des questions suggérées d’apprentissage actif dans la base de connaissances

Notes

Le service QnA Maker sera mis hors service le 31 mars 2025. Une version plus récente de la fonctionnalité de questions et réponses est désormais disponible dans le cadre d’Azure AI Language. Pour obtenir des réponses aux questions au sein du service de langage, consultez Réponses aux questions. À partir du 1er octobre 2022 vous ne pourrez plus créer de nouvelles ressources QnA Maker. Pour plus d’informations sur la migration de bases de connaissances QnA Maker existantes vers Réponses aux questions, consultez le Guide de migration.

L’apprentissage actif modifie la base de connaissances ou Search Service après approbation de la suggestion, puis elle est enregistrée et formée. Si vous approuvez la suggestion, elle est ajoutée en tant que question de substitution.

Activation de l’apprentissage actif

Pour consulter les questions suggérées, vous devez activer l'apprentissage actif pour votre ressource QnA Maker.

Afficher les questions suggérées

  1. Pour afficher les suggestions de questions, sur la page Modifier de la base de connaissances, sélectionnez Afficher les options, puis Show active learning suggestions (Afficher les suggestions d’apprentissage actif). Cette option est désactivée si aucune suggestion n’est présente pour les paires de questions/réponses.

    Dans la section Modifier du portail, sélectionnez l’option d’affichage des suggestions afin de voir les nouvelles alternatives de question d’apprentissage actif.

  2. Filtrez la base de connaissances contenant des paires de questions-réponses pour afficher uniquement les suggestions en sélectionnant Filter by Suggestions (Filtrer par suggestions).

    Utilisez le filtre par suggestions pour afficher uniquement les alternatives de question suggérées d’apprentissage actif.

  3. Chaque paire de questions-réponses suggère de nouvelles alternatives de question avec une coche, , pour les accepter ou avec un symbole x pour rejeter les suggestions. Sélectionnez la coche pour ajouter la question.

    Sélectionnez ou rejeter les alternatives de question suggérées d’apprentissage actif en sélectionnant la coche verte ou le symbole de suppression rouge.

    Vous pouvez ajouter ou supprimer toutes les suggestions en sélectionnant Ajouter tout ou Rejeter tout dans la barre d’outils contextuelle.

  4. Sélectionnez Save and Train (Enregistrer et effectuer l’apprentissage) pour enregistrer les modifications apportées à la base de connaissances.

  5. Sélectionnez Publier pour que les modifications soient disponibles dans l’API GenerateAnswer.

    Lorsque 5 requêtes similaires ou plus sont ordonnées en cluster, toutes les 30 minutes, QnA Maker suggère les questions alternatives pour que vous les acceptiez ou les refusiez.

Les suggestions d’apprentissage actif sont enregistrées dans la base de connaissances exportée

Lorsque l’apprentissage actif est activé pour votre application et que vous exportez l’application, la colonne SuggestedQuestions dans le fichier tsv conserve les données d’apprentissage actif.

La colonne SuggestedQuestions est un objet JSON d’informations des commentaires implicites, autosuggested, et explicites, usersuggested. Un exemple de cet objet JSON pour une seule question soumise par l’utilisateur de help est :

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

Lorsque vous réimportez cette application, l’apprentissage actif continue à collecter des informations et à recommander des suggestions pour votre base de connaissances.

Flux architectural pour utiliser les API Train et GenerateAnswer à partir d’un bot

Un bot ou une autre application cliente doivent utiliser le flux architectural suivant pour utiliser l’apprentissage actif :

  1. Le bot obtient la réponse de la base de connaissances avec l’API GenerateAnswer, à l’aide de la propriété top pour obtenir un certain nombre de réponses.

  2. Le bot détermine des commentaires explicites :

    • À l’aide de votre logique métier personnalisée, filtrez les scores faibles.
    • Dans le bot ou l’application cliente, affichez la liste de réponses possibles pour l’utilisateur et obtenez la réponse sélectionnée par l’utilisateur.
  3. Le bot envoie la réponse sélectionnée à QnA Maker avec l’API Train.

Utilisation de la propriété principale dans la requête GenerateAnswer pour obtenir plusieurs réponses correspondantes

Lorsque vous soumettez une question à QnA Maker pour obtenir une réponse, la propriété top du corps JSON définit le nombre de réponses à renvoyer.

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

Utiliser la propriété de score, ainsi que la logique métier pour obtenir la liste de réponses à afficher pour l’utilisateur

Lorsque l’application cliente (par exemple, un bot conversationnel) reçoit la réponse, les 3 questions principales sont renvoyées. Utilisez la propriété score pour analyser la proximité entre les scores. Cette plage de proximité est déterminée par votre logique métier.

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

Suivi de l’application cliente lorsque les questions présentent des scores similaires

Votre application cliente affiche les questions avec une option permettant à l’utilisateur de sélectionner la seule question qui représente le mieux son intention.

Une fois que l’utilisateur a sélectionné l’une des questions existantes, l’application cliente envoie le choix de l’utilisateur en tant que commentaires à l’aide de l’API Train de QnA Maker. Ces commentaires terminent la boucle de commentaires de l’apprentissage actif.

API Train

Les commentaires de l’apprentissage actif sont envoyés à QnA Maker avec la requête POST de l’API Train. La signature d’API est :

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}]}
Propriété de requête HTTP Nom Type Objectif
Paramètre d’itinéraire d’URL ID de base de connaissances string GUID de votre base de connaissances.
Sous-domaine personnalisé Nom de la ressource QnAMaker string Le nom de la ressource est utilisé en tant que sous-domaine personnalisé pour votre service QnA Maker. Cela se trouve sur la page Paramètres une fois la base de connaissances publiée. Il est indiqué en tant que host.
En-tête Content-Type string type de média du corps envoyé à l’API. La valeur par défaut est: application/json
En-tête Autorisation string clé de votre point de terminaison (EndpointKey xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx).
Corps de publication Objet JSON JSON Commentaires de formation

Le corps JSON a plusieurs paramètres :

Propriété du corps JSON Type Objectif
feedbackRecords tableau Liste des commentaires.
userId string ID utilisateur de la personne acceptant les questions suggérées. Le choix du format d’ID utilisateur dépend de vous. Par exemple, une adresse e-mail peut être un ID utilisateur valide dans votre architecture. facultatif.
userQuestion string Texte exact de la requête de l’utilisateur. Obligatoire.
qnaID nombre ID de la question, trouvée dans la réponse GenerateAnswer.

Un exemple de corps JSON ressemble à ceci :

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

Une réponse réussie renvoie un état 204 et aucun corps de réponse JSON.

Traiter autant d’enregistrements de commentaires que possible dans un seul appel

Dans l’application côté client, par exemple un bot, vous pouvez stocker les données, puis envoyer un grand nombre d’enregistrements dans un seul corps JSON dans le tableau feedbackRecords.

Un exemple de corps JSON ressemble à ceci :

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

Exemple de code d’infrastructure de bot

Votre code d’infrastructure de bot doit appeler l’API Train si la requête de l’utilisateur doit être utilisée pour l’apprentissage actif. Deux éléments de code doivent être écrits :

  • Déterminer si la requête doit être utilisée pour l’apprentissage actif
  • Renvoyer la requête à l’API Train de QnA Maker pour l’apprentissage actif

Dans l’exemple de bot Azure, ces deux activités ont été programmées.

Exemple de code C# pour l’API Train avec Bot Framework 4.x

Le code suivant illustre comment renvoyer des informations à QnA Maker avec 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();
        }
    }
}

Exemple de code Node.js pour l’API Train avec Bot Framework 4.x

Le code suivant illustre comment renvoyer des informations à QnA Maker avec 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);
}

Meilleures pratiques

Pour prendre connaissance des meilleures pratiques lors de l’utilisation de l’apprentissage actif, consultez la rubrique Bonnes pratiques.

Étapes suivantes