Aceitar perguntas sugeridas pelo aprendizado ativo na base de dados de conhecimento

Observação

O serviço de QnA Maker está sendo desativado no dia 31 de março de 2025. Uma versão mais recente da funcionalidade de perguntas e respostas agora está disponível como parte da Linguagem de IA do Azure. Para saber mais sobre o recurso de respostas às perguntas no Serviço de Linguagem, confira respostas às perguntas. A partir de 1º de outubro de 2022, você não poderá criar novos recursos de QnA Maker. Para obter informações sobre como migrar bases de dados de conhecimento do QnA Maker existentes para responder perguntas, consulte o guia de migração.

O aprendizado ativo altera a base de dados de conhecimento ou o serviço de pesquisa depois que você aprova a sugestão. Depois você salva e treina. Se você aprovar a sugestão, ela será adicionada como uma pergunta alternativa.

Ativar o aprendizado ativo

Para ver sugestões de perguntas, você deve ativar o aprendizado ativo no recurso do QnA Maker.

Ver sugestões de perguntas

  1. Para ver as sugestões de perguntas, na página Editar base de dados de conhecimento, selecione Opções de exibição e depois Mostrar sugestões de aprendizado ativo. A opção estará desabilitada se não houver sugestões para nenhum dos pares de perguntas e respostas.

    Na seção Editar do portal, selecione Mostrar Sugestões para ver as novas alternativas de pergunta do aprendizado ativo.

  2. Selecione Filtrar por Sugestões para filtrar a base de dados de conhecimento com os pares de pergunta e resposta para mostrar apenas sugestões.

    Use a alternância Filtrar por sugestões para ver apenas as alternativas de perguntas sugeridas do aprendizado ativo.

  3. Cada par de pergunta e resposta mostra as novas alternativas de perguntas com uma marca de seleção, , para aceitar a pergunta, ou x, para rejeitar as sugestões. Selecione a marca de seleção para adicionar a pergunta.

    Selecione a marca de visto verde ou a marca de exclusão vermelha para selecionar ou rejeitar as sugestões de perguntas alternativas do aprendizado ativo.

    Para adicionar ou excluir todas as sugestões, selecione Adicionar todas ou Rejeitar todas na barra de ferramentas contextual.

  4. Selecione Salvar e Treinar para salvar as alterações à base de dados de conhecimento.

  5. Selecione Publicar para disponibilizar as alterações na API GenerateAnswer.

    Quando cinco ou mais consultas semelhantes estão agrupadas, a cada 30 minutos, o QnA Maker sugere as perguntas alternativas para que você aceite ou rejeite.

As sugestões do aprendizado ativo são salvas na base de dados de conhecimento exportada

Quando você exporta um aplicativo com o aprendizado ativo habilitado, a coluna SuggestedQuestions no arquivo tsv retém os dados do aprendizado ativo.

A coluna SuggestedQuestions é um objeto JSON de informações implícitas, autosuggested, e de usersuggested explícitos. Um exemplo do objeto JSON para uma pergunta enviada pelo usuário de help é:

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

Quando você reimporta esse aplicativo, o aprendizado ativo continua a coletar informações e recomendar sugestões para a base de dados de conhecimento.

Fluxo de arquitetura para usar GenerateAnswer e treinar APIs com um bot

Um bot ou outro aplicativo cliente deve usar o seguinte fluxo de arquitetura para usar o aprendizado ativo:

  1. O bot obtém a resposta da base de dados de conhecimento com a API GenerateAnswer, usando a propriedade top para obter várias respostas.

  2. O bot determina os comentários explícitos:

    • Usando a sua lógica de negócios personalizada, filtre as pontuações baixas.
    • No bot ou no aplicativo cliente, exiba a lista de possíveis respostas ao usuário e obtenha a resposta que ele selecionou.
  3. O bot envia a resposta selecionada de volta ao QnA Maker com a API de Treinamento.

Use a propriedade top na solicitação de GenerateAnswer para obter várias respostas correspondentes

Ao enviar uma pergunta ao QnA Maker para resposta, a propriedade top do corpo JSON define o número de respostas a serem retornadas.

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

Use a propriedade de pontuação junto com a lógica de negócios para obter a lista de respostas para mostrar ao usuário

Quando o aplicativo cliente (por exemplo, um chat bot) recebe a resposta, as três primeiras perguntas são retornadas. Use a propriedade score para analisar a proximidade entre as pontuações. Esse intervalo de proximidade é determinado pela sua lógica de negócios.

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

Acompanhamento do aplicativo cliente quando perguntas têm pontuações semelhantes

O aplicativo cliente exibe as perguntas com uma opção para o usuário selecionar a única pergunta que melhor representa suas intenções.

Depois que o usuário seleciona uma das perguntas, o aplicativo cliente envia a opção do usuário como comentários usando a API de Treinamento do QnA Maker. O comentário conclui o loop de comentários do aprendizado ativo.

API de treinamento

Os comentários do aprendizado ativo são enviados ao QnA Maker com a solicitação POST da API de Treinamento. A assinatura da 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}]}
Propriedade de solicitação HTTP Nome Tipo Finalidade
Parâmetro de rota de URL ID da base de dados de conhecimento string o GUID da base de dados de conhecimento.
Subdomínio personalizado Nome do recurso do QnA Maker string O nome do recurso é usado como o subdomínio personalizado do QnA Maker. Ele está disponível na página Configurações depois que você publica a base de dados de conhecimento. Ele aparece como o host.
parâmetro Tipo de conteúdo string o tipo de mídia do corpo enviado para a API. O valor padrão é: application/json
parâmetro Autorização string sua chave de ponto de extremidade (EndpointKey xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx).
Corpo da publicação Objeto JSON JSON Os comentários de treinamento

O corpo JSON tem várias configurações:

Propriedade do corpo JSON Tipo Finalidade
feedbackRecords array Lista de comentários.
userId string A ID de usuário da pessoa que está aceitando as perguntas sugeridas. O formato da ID de usuário fica a seu critério. Por exemplo, um endereço de email pode ser uma ID de usuário válida em sua arquitetura. Opcional.
userQuestion string Texto exato da consulta do usuário. Obrigatórios.
qnaID número ID da pergunta, disponível na resposta de GenerateAnswer.

Um exemplo de corpo JSON:

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

Uma resposta bem-sucedida retorna o status 204 e nenhum corpo de resposta JSON.

Agrupe vários registros de comentários em uma chamada

No aplicativo do lado do cliente, como um bot, você pode armazenar os dados e enviar vários registros em um corpo JSON na matriz feedbackRecords.

Um exemplo de corpo 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
        }
    ]
}

Exemplo de código do Bot Framework

O código do Bot Framework precisa chamar a API de Treinamento caso a consulta do usuário seja usada para o aprendizado ativo. Há dois trechos de código para programar:

  • Determinar se a consulta deve ser usada para o aprendizado ativo
  • Enviar consulta de volta à API de Treinamento do QnA Maker para aprendizado ativo

Na amostra de bot do Azure, ambas as atividades foram programadas.

Exemplo de código C# para a API de Treinamento com o Bot Framework 4.x

O código a seguir ilustra como enviar informações de volta ao QnA Maker com a API de Treinamento.

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

Exemplo de código Node.js para a API de Treinamento com o Bot Framework 4.x

O código a seguir ilustra como enviar informações de volta ao QnA Maker com a API de Treinamento.

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

Práticas recomendadas

Para as práticas recomendadas ao usar o aprendizado ativo, veja Práticas recomendadas.

Próximas etapas