Aceptación de preguntas sugeridas de aprendizaje activo en la base de conocimiento

Nota

El servicio QnA Maker se retirará del mercado el 31 de marzo de 2025. Ya hay disponible una versión más reciente de la funcionalidad de preguntas y respuestas como parte de Lenguaje de Azure AI. Para más información sobre las funcionalidades de respuesta a preguntas en el servicio de lenguaje, consulte Respuesta a preguntas. A partir del 1 de octubre de 2022 no podrá crear nuevos recursos de QnA Maker. Para obtener información sobre la migración de knowledge bases existentes de QnA Maker a respuesta a preguntas, consulte la guía de migración.

El aprendizaje activo modifica la base de conocimiento o el servicio de búsqueda después de aprobar la sugerencia y, a continuación, de guardarla y entrenarla. Si aprueba la sugerencia, se agregará como una pregunta alternativa.

Activación del aprendizaje activo

Para ver las preguntas sugeridas, debe activar el aprendizaje activo para el recurso de QnA Maker.

Visualización de las preguntas sugeridas

  1. Para ver las preguntas sugeridas, en la página Editar de la base de conocimiento, seleccione Ver opciones y, después, Show active learning suggestions (Mostrar sugerencias de aprendizaje activo). Esta opción se deshabilitará si no existe ninguna sugerencia para ninguno de los pares de pregunta y respuesta.

    En la sección Editar del portal, seleccione Mostrar sugerencias para ver nuevas preguntas alternativas del aprendizaje activo.

  2. Filtre la base de conocimiento con pares de preguntas y respuestas para mostrar únicamente las sugerencias seleccionando Filter by Suggestions (Filtrar por sugerencias).

    Active o desactive el filtrado por sugerencias para ver solo las sugerencias de preguntas alternativas del aprendizaje activo.

  3. Cada par de QnA sugiere la nueva pregunta alternativa con una marca de verificación, , para aceptar la pregunta o una x para rechazar las sugerencias. Seleccione la marca de verificación para agregar la pregunta.

    Seleccione o rechace las sugerencias de preguntas alternativas del aprendizaje activo seleccionando la marca de verificación verde o la marca de eliminación de roja.

    Puede agregar o eliminar todas las sugerencias seleccionando Agregar todo o Rechazar todo en la barra de herramientas contextual.

  4. Seleccione Save and Train (Guardar y entrenar) para guardar los cambios en la base de conocimiento.

  5. Seleccione Publicar para permitir que los cambios estén disponibles desde GenerateAnswer API.

    Cuando 5 o más consultas similares se agrupan en clústeres, cada 30 minutos, QnA Maker sugiere preguntas alternativas para que las acepte o rechace.

Las sugerencias de aprendizaje activo se guardan en la base de conocimiento exportada

Cuando la aplicación tiene el aprendizaje activo habilitado y exporta la aplicación, la columna SuggestedQuestions del archivo tsv conserva los datos de aprendizaje activo.

La columna SuggestedQuestions es un objeto JSON de la información de los comentarios implícitos, autosuggested, y explícitos, usersuggested. Un ejemplo de este objeto JSON para una sola pregunta enviada por un usuario de help es:

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

Cuando se vuelva a importar esta aplicación, el aprendizaje activo continúa para recopilar información y sugerencias recomendadas para la base de conocimiento.

Flujo arquitectónico para usar GenerateAnswer y Train API desde un bot

Un bot u otra aplicación cliente debe usar el siguiente flujo de arquitectura para usar el aprendizaje activo:

  1. El bot obtiene la respuesta de la base de conocimiento con GenerateAnswer API, utilizando la propiedad top para obtener un número de respuestas.

  2. El bot determina comentarios explícitos:

    • Usando su propia lógica de negocios personalizada, filtre las puntuaciones bajas.
    • En el bot o aplicación cliente, muestre la lista de posibles respuestas al usuario y obtenga la respuesta seleccionada del usuario.
  3. El bot envía la respuesta seleccionada a QnA Maker con Train API.

Uso de la propiedad top en la solicitud GenerateAnswer para obtener varias respuestas coincidentes

Al enviar una pregunta a QnA Maker para obtener una respuesta, la propiedad top del cuerpo JSON define el número de respuestas a devolver.

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

Uso de la propiedad de puntuación y la lógica de negocios para obtener la lista de respuestas que se mostrará al usuario

Cuando la aplicación cliente (por ejemplo, un bot de chat) recibe la respuesta, se devuelven las 3 preguntas principales. Use la propiedad score para analizar la proximidad entre las puntuaciones. Este intervalo de proximidad viene determinado por su propia lógica de negocios.

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

Seguimiento de la aplicación cliente cuando las preguntas tienen puntuaciones similares

La aplicación cliente muestra las preguntas con una opción para que el usuario seleccione la única pregunta que mejor representa su intención.

Una vez que el usuario selecciona una de las preguntas existentes, la aplicación cliente envía la elección del usuario como comentario mediante Train API de QnA Maker. Estos comentarios completan el bucle de comentarios de aprendizaje activo.

Train API

Los comentarios de aprendizaje activo se envían a QnA Maker con la solicitud POST de Train API. La firma de API es:

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}]}
Propiedad de la solicitud HTTP Nombre Tipo Propósito
Parámetro de la ruta de dirección URL Id. de base de conocimiento string GUID de Knowledge Base.
Subdominio personalizado Nombre del recurso de QnAMaker string El nombre del recurso se usa como subdominio personalizado para QnA Maker. Esta disponible en la página Configuración después de publicar la base de conocimiento. Se enumera como host.
Encabezado Content-Type string tipo de soporte del cuerpo enviado a la API. El valor predeterminado es: application/json
Encabezado Authorization string su clave de punto de conexión (EndpointKey xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx).
Cuerpo de POST Objeto JSON JSON Comentarios de entrenamiento

El cuerpo JSON tiene varias opciones de configuración:

Propiedad del cuerpo de JSON Tipo Propósito
feedbackRecords array Lista de comentarios.
userId string Id. de usuario de la persona que acepta las preguntas sugeridas. El formato del id. de usuario es decisión suya. Por ejemplo, una dirección de correo electrónico puede ser un id. de usuario válido en la arquitectura. Opcional.
userQuestion string Texto exacto de la consulta del usuario. Necesario.
qnaID number Id. de la pregunta, se encuentra en la respuesta GenerateAnswer.

Un cuerpo JSON de ejemplo tiene el siguiente aspecto:

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

Una respuesta correcta devuelve el estado de 204 y ningún cuerpo de respuesta JSON.

Procesar por lotes varios registros de comentarios en una sola llamada

En la aplicación del lado cliente, como un bot, puede almacenar los datos y luego enviar muchos registros en un único cuerpo JSON con la matriz feedbackRecords.

Un cuerpo JSON de ejemplo tiene el siguiente aspecto:

{
    "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 ejemplo de Bot Framework

El código de Bot Framework debe llamar a Train API, si la consulta del usuario se debe usar para el aprendizaje activo. Hay dos fragmentos de código para escribir:

  • Determinar si se debe usar la consulta para el aprendizaje activo
  • Envío de la consulta a Train API de QnA Maker para el aprendizaje activo

En el ejemplo de Azure Bot, se han programado ambas actividades.

Ejemplo del código C# para Train API con Bot Framework 4.x

En el código siguiente se muestra cómo enviar información a QnA Maker con 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();
        }
    }
}

Ejemplo del código Node.js para Train API con Bot Framework 4.x

En el código siguiente se muestra cómo enviar información a QnA Maker con 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);
}

Procedimientos recomendados

Para los procedimientos recomendados al usar el aprendizaje activo, consulte Procedimientos recomendados.

Pasos siguientes