Incorporación de comprensión lingüística natural al bot

SE APLICA A: SDK v4

Nota:

Reconocimiento del lenguaje (LUIS) se retirará el 1 de octubre de 2025. A partir del 1 de abril de 2023, no podrá crear nuevos recursos de LUIS. Hay disponible una versión más reciente de reconocimiento del lenguaje como parte del Lenguaje Azure AI.

Reconocimiento del lenguaje conversacional (CLU), una característica del lenguaje de Azure AI, es la versión actualizada de LUIS. Para obtener más información sobre la compatibilidad con reconocimiento del lenguaje en el SDK de Bot Framework, consulte Reconocimiento del lenguaje natural.

La tarea de entender qué quiere decir el usuario conversacionalmente y contextualmente puede ser difícil, pero hace que la conversación del bot parezca más natural. Language Understanding LUIS es un servicio de API en la nube que permite hacer precisamente esto, de modo que el bot pueda reconocer la intención de los mensajes de usuario, permitir al usuario emplear un lenguaje más natural y dirigir mejor el flujo de conversación.

En este tema se explica cómo agregar LUIS a una aplicación de reserva de vuelos para reconocer las diferentes intenciones y entidades que contiene la entrada del usuario.

Nota:

Los SDK de JavaScript, C# y Python de Bot Framework seguirán siendo compatibles, pero el SDK de Java se va a retirar con la finalización del soporte técnico a largo plazo en noviembre de 2023. Solo se realizarán correcciones de errores y seguridad críticos en este repositorio.

Los bots existentes creados con el SDK de Java seguirán funcionando.

Para la nueva compilación de bots, considere la posibilidad de usar Power Virtual Agents y lea sobre cómo elegir la solución de bot de chat adecuada.

Para obtener más información, consulte El futuro de la construcción de bots.

Requisitos previos

Acerca de este ejemplo

En este ejemplo de bot básico se muestra un ejemplo de una aplicación de reservas de vuelos del aeropuerto. Utiliza un servicio de LUIS para reconocer lo que introduce el usuario y devolver la primera intención de LUIS que reconoce.

El modelo de lenguaje contiene tres intenciones: Book Flight, Cancel y None. LUIS usará estas intenciones para entender qué quiso decir el usuario cuando envió un mensaje al bot. El modelo de lenguaje también define las entidades que LUIS puede extraer de la entrada del usuario, como el aeropuerto de origen o de destino.

Después de cada procesamiento de la entrada del usuario, DialogBot guarda el estado actual tanto de UserState como de ConversationState. Una vez recopilada toda la información necesaria, el ejemplo de código crea una aplicación de reservas de vuelos de demostración. En este artículo se van a tratarán los aspectos de LUIS de este ejemplo. Sin embargo, el flujo general del ejemplo es:

  • Se llama a OnMembersAddedAsync cuando se conecta un usuario nuevo y muestra una tarjeta de bienvenida.
  • Se llama a OnMessageActivityAsync para cada entrada del usuario recibida.

Class diagram outlining the structure of the C# sample.

El módulo OnMessageActivityAsync ejecuta el diálogo adecuado a través del método de extensión del diálogo Run. Después, el diálogo principal llama a la aplicación auxiliar de LUIS para buscar la intención del usuario con mayor puntuación. Si la intención con mayor puntuación de la entrada del usuario devuelve "BookFlight", la aplicación auxiliar rellena la información del usuario que LUIS devolvió. Después, el diálogo principal inicia BookingDialog, que adquiere la información adicional del usuario que sea necesaria, como:

  • Origin: la ciudad de origen.
  • TravelDate: la fecha para la que se reserva el vuelo.
  • Destination: la ciudad de destino.

En este artículo se explica cómo agregar LUIS a un bot. Para más información acerca de cómo usar los diálogos o el estado, consulte Implementación de un flujo de conversación secuencial o Guardado de los datos del usuario y la conversación.

Creación de una aplicación de LUIS en el portal de LUIS

  1. Inicie sesión en el portal de LUIS y, si es necesario, cree una cuenta y un recurso de creación.
  2. En la página de aplicaciones de conversación en LUIS, seleccione Importar y, a continuación, Importar como JSON.
  3. En el diálogo Import new app (Importar nueva aplicación):
    1. Elija el archivo FlightBooking.json en la carpeta CognitiveModels del ejemplo.
    2. Escriba FlightBooking como nombre opcional de la aplicación y seleccione Listo.
  4. El sitio puede mostrar Cómo crear una aplicación de LUIS eficaz y Actualizar los cuadros de diálogo de entidades compuestas. Puede descartar estos diálogos y continuar.
  5. Entrene la aplicación y, a continuación, publique la aplicación en el entorno de producción. Para más información, consulte la documentación de LUIS sobre cómo formar y publicar una aplicación.

Por qué usar entidades

Las entidades de LUIS permiten al bot comprender los eventos más allá de las intenciones estándar. Esto le permite recopilar información adicional de los usuarios para que el bot pueda formular preguntas y responder de forma más inteligente. Además de las definiciones de las tres intenciones de LUIS ("Book Flight", "Cancel" y "None") el archivo FlightBooking.json contiene un conjunto de entidades, como "From.Airport" y "To.Airport". Dichas entidades permiten a LUIS detectar y devolver información adicional que se encuentra dentro de la entrada original del usuario original cuando se solicita una nueva reserva de viaje.

Obtención de valores para conectarse a la aplicación de LUIS

Una vez que la aplicación de LUIS se ha publicado, puede acceder a ella desde su bot. Para acceder a su aplicación de LUIS desde el bot, deberá registrar varios valores. Para recuperar esa información, puede usar el portal de LUIS.

Recuperar la información de la aplicación del portal LUIS.ai

El archivo de configuración (appsettings.json, .env o config.py) actúa como el lugar en que se reúnen todas las referencias de servicio. La información que recupere se agregará a este archivo en la siguiente sección.

  1. Seleccione la aplicación de LUIS publicada en luis.ai.

  2. Con la aplicación de LUIS publicada abierta, seleccione la pestaña MANAGE (ADMINISTRAR).

  3. Seleccione la pestaña Configuración en el lado izquierdo y registre el valor mostrado para ID de aplicación como <YOUR_APP_ID>.

    Screenshot of the Manage page displaying your application ID.

  4. Seleccione Recursos de Azure y, a continuación, Recurso de predicción. Registre el valor mostrado para Ubicación como <YOUR_REGION> y la Clave Principal como <YOUR_AUTHORING_KEY>.

    Screenshot of the Manage page displaying your location and primary key.

    Como alternativa, puede usar la región y la clave principal para el recurso de creación.

Actualización del archivo de configuración

Agregue la información necesaria para acceder a la aplicación de LUIS, lo que incluye el identificador de la aplicación, la clave de creación y la región al archivo appsettings.json. En el paso anterior, recuperó estos valores de la aplicación de LUIS publicada. El nombre de host de la API debe tener el formato <your region>.api.cognitive.microsoft.com.

appsetting.json

{
  "MicrosoftAppType": "",
  "MicrosoftAppId": "",
  "MicrosoftAppPassword": "",
  "MicrosoftAppTenantId": "",
  "LuisAppId": "",
  "LuisAPIKey": "",
  "LuisAPIHostName": ""
}

Configuración del bot para usar la aplicación de LUIS

Asegúrese de que el paquete NuGet Microsoft.Bot.Builder.AI.Luis está instalado para el proyecto.

Para conectar con el servicio LUIS, el bot extrae la información que agregó al archivo appsetting.json. La clase FlightBookingRecognizer contiene código con la configuración del archivo appsetting.json y consulta el servicio de LUIS mediante una llamada al método RecognizeAsync.

FlightBookingRecognizer.cs

public class FlightBookingRecognizer : IRecognizer
{
    private readonly LuisRecognizer _recognizer;

    public FlightBookingRecognizer(IConfiguration configuration)
    {
        var luisIsConfigured = !string.IsNullOrEmpty(configuration["LuisAppId"]) && !string.IsNullOrEmpty(configuration["LuisAPIKey"]) && !string.IsNullOrEmpty(configuration["LuisAPIHostName"]);
        if (luisIsConfigured)
        {
            var luisApplication = new LuisApplication(
                configuration["LuisAppId"],
                configuration["LuisAPIKey"],
                "https://" + configuration["LuisAPIHostName"]);
            // Set the recognizer options depending on which endpoint version you want to use.
            // More details can be found in https://docs.microsoft.com/en-gb/azure/cognitive-services/luis/luis-migration-api-v3
            var recognizerOptions = new LuisRecognizerOptionsV3(luisApplication)
            {
                PredictionOptions = new Bot.Builder.AI.LuisV3.LuisPredictionOptions
                {
                    IncludeInstanceData = true,
                }
            };

            _recognizer = new LuisRecognizer(recognizerOptions);
        }
    }

    // Returns true if luis is configured in the appsettings.json and initialized.
    public virtual bool IsConfigured => _recognizer != null;

    public virtual async Task<RecognizerResult> RecognizeAsync(ITurnContext turnContext, CancellationToken cancellationToken)
        => await _recognizer.RecognizeAsync(turnContext, cancellationToken);

    public virtual async Task<T> RecognizeAsync<T>(ITurnContext turnContext, CancellationToken cancellationToken)
        where T : IRecognizerConvert, new()
        => await _recognizer.RecognizeAsync<T>(turnContext, cancellationToken);
}

FlightBookingEx.cs contiene la lógica para a extraer From, To and TravelDate; extiende la clase parcial FlightBooking.cs que se usa para almacenar los resultados de LUIS cuando se llama a FlightBookingRecognizer.RecognizeAsync<FlightBooking> desde MainDialog.cs.

CognitiveModels\FlightBookingEx.cs

// Extends the partial FlightBooking class with methods and properties that simplify accessing entities in the luis results
public partial class FlightBooking
{
    public (string From, string Airport) FromEntities
    {
        get
        {
            var fromValue = Entities?._instance?.From?.FirstOrDefault()?.Text;
            var fromAirportValue = Entities?.From?.FirstOrDefault()?.Airport?.FirstOrDefault()?.FirstOrDefault();
            return (fromValue, fromAirportValue);
        }
    }

    public (string To, string Airport) ToEntities
    {
        get
        {
            var toValue = Entities?._instance?.To?.FirstOrDefault()?.Text;
            var toAirportValue = Entities?.To?.FirstOrDefault()?.Airport?.FirstOrDefault()?.FirstOrDefault();
            return (toValue, toAirportValue);
        }
    }

    // This value will be a TIMEX. And we are only interested in a Date so grab the first result and drop the Time part.
    // TIMEX is a format that represents DateTime expressions that include some ambiguity. e.g. missing a Year.
    public string TravelDate
        => Entities.datetime?.FirstOrDefault()?.Expressions.FirstOrDefault()?.Split('T')[0];
}

LUIS ya está configurado y conectado para el bot.

Probar el bot

Descargue e instale la versión más reciente de Bot Framework Emulator.

  1. Ejecute el ejemplo localmente en la máquina. Si necesita instrucciones, consulte el archivo README en el ejemplo de C#, el ejemplo de JS o el ejemplo de Python.

  2. En el emulador, escriba un mensaje como "travel to Paris" (viajar a París) o "going from Paris to Berlin" (ir de París a Berlín). Utilice cualquier expresión que se encuentra en el archivo FlightBooking.json para entrenar la intención "Book flight".

Si la intención superior que se devuelve desde LUIS se resuelve como "Book flight", el bot realizará preguntas adicionales hasta que tenga suficiente información almacenada para crear la reserva de un viaje. En ese momento devolverá la información de dicha reserva a su usuario.

En ese momento se restablecerá la lógica del bot del código y podrá crear más reservas.

Información adicional

Para más información acerca de LUIS, consulte la documentación de LUIS:

Sugerencia

Distintos elementos del SDK definen a clases o elementos de entidad independientes. Para las entidades de mensajes, consulte Tipos de entidades y actividades.