Aceitar perguntas sugeridas de aprendizagem ativa no base de dados de conhecimento

Nota

O serviço Criador de FAQ será descontinuado a 31 de março de 2025. Uma versão mais recente da capacidade de perguntas e respostas está agora disponível como parte da Linguagem de IA do Azure. Para obter as capacidades de resposta a perguntas no Serviço de Idioma, veja respostas a perguntas. A partir de 1 de outubro de 2022, não poderá criar novos recursos do Criador de FAQ. Para obter informações sobre como migrar bases de dados de conhecimento existentes do Criador de FAQ para responder a perguntas, consulte o guia de migração.

O Active Learning altera a Base de Dados de Conhecimento ou o Serviço de Pesquisa depois de aprovar a sugestão e, em seguida, guarda e prepara. Se aprovar a sugestão, esta será adicionada como uma pergunta alternativa.

Ativar a aprendizagem ativa

Para ver as perguntas sugeridas, tem de ativar a aprendizagem ativa para o recurso criador de FAQ.

Ver perguntas sugeridas

  1. Para ver as perguntas sugeridas, na página Editar base de dados de conhecimento, selecione Ver Opções e, em seguida, selecione Mostrar sugestões de aprendizagem ativas. Esta opção será desativada se não existirem sugestões para nenhum dos pares de perguntas e respostas.

    Na secção Editar do portal, selecione Mostrar Sugestões para ver as novas alternativas de perguntas da aprendizagem ativa.

  2. Filtre o base de dados de conhecimento com pares de perguntas e respostas para mostrar apenas sugestões ao selecionar Filtrar por Sugestões.

    Utilize o botão de alternar Filtrar por sugestões para ver apenas as alternativas sugeridas da aprendizagem ativa.

  3. Cada par de FAQ sugere as novas alternativas de pergunta com uma marca de verificação, , para aceitar a pergunta ou uma x para rejeitar as sugestões. Selecione a marca de verificação para adicionar a pergunta.

    Selecione ou rejeite as alternativas sugeridas da aprendizagem ativa ao selecionar a marca de verificação verde ou a marca de eliminação vermelha.

    Pode adicionar ou eliminar todas as sugestões ao selecionar Adicionar tudo ou Rejeitar tudo na barra de ferramentas contextual.

  4. Selecione Guardar e Preparar para guardar as alterações ao base de dados de conhecimento.

  5. Selecione Publicar para permitir que as alterações estejam disponíveis na API GenerateAnswer.

    Quando 5 ou mais consultas semelhantes são agrupadas, a cada 30 minutos, o Criador de FAQ sugere as perguntas alternativas para aceitar ou rejeitar.

As sugestões de aprendizagem ativa são guardadas no base de dados de conhecimento exportado

Quando a sua aplicação tem a aprendizagem ativa ativa e exporta a aplicação, a SuggestedQuestions coluna no ficheiro tsv retém os dados de aprendizagem ativos.

A SuggestedQuestions coluna é um objeto JSON de informações de comentários implícitos, autosuggestede explícitos usersuggested . Um exemplo deste objeto JSON para uma única pergunta help submetida pelo utilizador é:

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

Quando reimporta esta aplicação, a aprendizagem ativa continua a recolher informações e recomenda sugestões para o seu base de dados de conhecimento.

Fluxo de arquitetura para utilizar As APIs GenerateAnswer e Train a partir de um bot

Um bot ou outra aplicação cliente deve utilizar o seguinte fluxo de arquitetura para utilizar a aprendizagem ativa:

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

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

    • Com a sua própria lógica de negócio personalizada, filtre as pontuações baixas.
    • No bot ou cliente-aplicação, apresente a lista de respostas possíveis ao utilizador e obtenha a resposta selecionada pelo utilizador.
  3. O Bot envia a resposta selecionada para o Criador de FAQ com a API de Preparação.

Utilize a propriedade superior no pedido GenerateAnswer para obter várias respostas correspondentes

Ao submeter uma pergunta ao Criador de FAQ para obter uma resposta, a top propriedade do corpo JSON define o número de respostas a devolver.

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

Utilize a propriedade score juntamente com a lógica de negócio para obter uma lista de respostas para mostrar ao utilizador

Quando a aplicação cliente (como um chat bot) recebe a resposta, são devolvidas as três principais perguntas. Utilize a score propriedade para analisar a proximidade entre pontuações. Este intervalo de proximidade é determinado pela sua própria lógica de negócio.

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

Seguimento da aplicação cliente quando as perguntas têm pontuações semelhantes

A aplicação cliente apresenta as perguntas com uma opção para o utilizador selecionar a pergunta única que mais representa a sua intenção.

Assim que o utilizador selecionar uma das perguntas existentes, a aplicação cliente envia a escolha do utilizador como feedback através da API de Preparação do Criador de FAQ. Este feedback conclui o ciclo de feedback de aprendizagem ativa.

API de Preparação

Os comentários de aprendizagem ativa são enviados para o Criador de FAQ com o pedido TRAIN API POST. 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 do pedido HTTP Nome Tipo Objetivo
Parâmetro de rota de URL ID da base de dados de conhecimento string O GUID da sua base de dados de conhecimento.
Subdomínio personalizado Nome do recurso do QnAMaker string O nome do recurso é utilizado como subdomínio personalizado para o Criador de FAQ. Esta opção está disponível na página Definições depois de publicar o base de dados de conhecimento. Está listado como .host
Cabeçalho Content-Type string O tipo de suporte de dados do corpo enviado para a API. O valor predefinido é: application/json
Cabeçalho Autorização string A sua chave de ponto final (EndpointKey xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx).
Post Body Objeto JSON JSON O feedback de formação

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

Propriedade do corpo JSON Tipo Objetivo
feedbackRecords matriz Lista de comentários.
userId string O ID de utilizador da pessoa que aceita as perguntas sugeridas. O formato de ID de utilizador é da sua mente. Por exemplo, um endereço de e-mail pode ser um ID de utilizador válido na sua arquitetura. Opcional.
userQuestion string Texto exato da consulta do utilizador. Obrigatório.
qnaID número ID da pergunta, encontrado na resposta GenerateAnswer.

Um corpo JSON de exemplo tem o seguinte aspeto:

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

Uma resposta bem-sucedida devolve um estado de 204 e nenhum corpo de resposta JSON.

Batch many feedback records into a single call (Criar muitos registos de comentários numa única chamada)

Na aplicação do lado do cliente, como um bot, pode armazenar os dados e, em seguida, enviar muitos registos num único corpo JSON na feedbackRecords matriz.

Um corpo JSON de exemplo tem o seguinte aspeto:

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

Código de exemplo do Bot Framework

O código do bot framework tem de chamar a API de Preparação se a consulta do utilizador tiver de ser utilizada para aprendizagem ativa. Existem duas partes de código para escrever:

  • Determinar se a consulta deve ser utilizada para aprendizagem ativa
  • Enviar consulta de volta para a API de Preparação do Criador de FAQ para aprendizagem ativa

No exemplo do Bot do Azure, ambas as atividades foram programadas.

Código C# de exemplo para Preparar a API com o Bot Framework 4.x

O código seguinte ilustra como enviar informações de volta para o Criador de FAQ com a API de Preparação.

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 Node.js código para Preparar a API com o Bot Framework 4.x

O código seguinte ilustra como enviar informações de volta para o Criador de FAQ com a API de Preparação.

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

Melhores práticas

Para obter as melhores práticas ao utilizar a aprendizagem ativa, veja Melhores práticas.

Passos seguintes