Adicionar reconhecimento de idioma natural ao seu bot

aplica-se a: SDK v4

A capacidade de entender o que seu usuário quer dizer contextualmente e em conversas pode ser uma tarefa difícil, mas pode dar ao seu bot uma sensação de conversa mais natural. O LUIS (Reconhecimento vocal) é um serviço de API baseado em nuvem que permite que você faça exatamente isso, para que o seu bot possa reconhecer a intenção das mensagens do usuário, permitir uma linguagem mais natural do seu usuário e direcionar melhor o fluxo de conversação.

Este tópico explica como adicionar LUIS a um aplicativo de reservas de voo para reconhecer intenções e entidades diferentes contidas na entrada do usuário.

Pré-requisitos

Sobre este exemplo

Essa amostra de bot básico mostra um exemplo de um aplicativo de reservas de voo em aeroportos. Ele usa um serviço do LUIS para reconhecer a entrada do usuário e retornar a melhor intenção reconhecida pelo LUIS.

O modelo de linguagem contém três intenções: Book Flight, Cancel e None. O LUIS usará essas intenções para entender o que o usuário pretendia ao enviar uma mensagem ao bot. O modelo de linguagem também define as entidades que o LUIS pode extrair da entrada do usuário, como o aeroporto de origem ou de destino.

Após cada processamento da entrada do usuário, DialogBot salva o estado atual de UserState e ConversationState. Após a coleta de todas as informações necessárias, o exemplo de codificação cria uma reserva de reserva de voo de demonstração. Neste artigo, abordaremos os aspectos LUIS deste exemplo. No entanto, o fluxo geral do exemplo é mostrado a seguir:

  • OnMembersAddedAsync é chamado quando um novo usuário é conectado e exibe um cartão de boas-vindas.
  • OnMessageActivityAsync é chamado em cada entrada do usuário recebida.

Fluxo lógico do exemplo do LUIS

O módulo OnMessageActivityAsync executa o diálogo apropriado por meio do método de extensão de diálogo Run. Em seguida, a caixa de diálogo principal chama o auxiliar do LUIS para localizar a intenção do usuário com melhor pontuação. Se a intenção principal para a entrada do usuário retornar "BookFlight", o auxiliar preencherá as informações do usuário retornadas pelo LUIS. Depois disso, a caixa de diálogo principal inicia o BookingDialog, que adquire informações adicionais do usuário conforme necessário, tais como:

  • Origin a cidade de origem
  • TravelDate a data da reserva do voo
  • Destination a cidade de destino

Este artigo aborda como adicionar o LUIS a um bot. Para obter informações sobre como usar diálogos ou estado, consulte como coletar entradas do usuário usando um prompt de diálogo ou como salvar dados do usuário e da conversa, respectivamente.

Criar um aplicativo LUIS no portal do LUIS

  1. Entre no portal do LUIS.

    • Se você ainda não tem uma conta, crie uma.
    • Se você ainda não tem um recurso de criação, crie um.
    • Para obter mais informações, consulte a documentação do LUIS sobre como entrar no portal do LUIS.
  2. Na página Meus Aplicativos, clique em Novo aplicativo para conversa e selecione Importar como JSON.

  3. No diálogo Importar novo aplicativo:

    1. Escolha o arquivo FlightBooking.json na pasta CognitiveModels da amostra.
    2. Insira FlightBooking como o nome opcional do aplicativo e clique em Concluído.
  4. Talvez você seja solicitado a atualizar suas entidades compostas. Você pode ignorar isso e clicar em Lembrar-me mais tarde:

    ignore-composite-entities

  5. Treine e publique o seu aplicativo. Para obter mais informações, consulte a documentação do LUIS sobre como treinar e publicar um aplicativo no ambiente de produção.

Por que usar entidades?

As entidades LUIS permitem que seu bot entenda determinadas coisas ou eventos diferentes das intenções padrão. Assim, você pode coletar mais informações do usuário, o que permite que seu bot responda de forma mais inteligente ou ignore algumas perguntas nas quais ele pede essas informações ao usuário. Além das definições das três intenções do LUIS (“Reservar voo, “Cancelar” e “Nenhum”), o arquivo FlightBooking.json também contém um conjunto de entidades, como “From.Airport” e “To.Airport”. Essas entidades permitem que o LUIS detecte e retorne informações adicionais contidas na entrada original do usuário, quando ele solicitar uma nova reserva de viagem.

Obter valores para conectar ao seu aplicativo LUIS

Após a publicação de seu aplicativo LUIS, acesse-o no bot. Será necessário registrar vários valores para acessar seu aplicativo LUIS no bot. Você pode recuperar essas informações usando o portal do LUIS.

Recupere as informações do aplicativo no portal LUIS.ai

O arquivo de configurações (appsettings.json, .env ou config.py) age como um único local para reunir todas as referências de serviço. As informações que você recupera serão adicionadas a esse arquivo na próxima seção.

  1. Marque seu aplicativo LUIS publicado em luis.ai.
  2. Com o aplicativo LUIS publicado aberto, escolha a guia GERENCIAR.
  3. selecione a guia Configurações no lado esquerdo e registre o valor mostrado para a ID do aplicativo como <YOUR_APP_ID> .

    Gerenciar o Aplicativo LUIS – Informações do Aplicativo

  4. Selecione a guia Recursos do Azure no lado esquerdo e selecione o grupo Recurso de Criação. Registre o valor mostrado para Localização como <YOUR_REGION> e Chave Primária como <YOUR_AUTHORING_KEY>.

    Gerenciar informações de criação de aplicativo LUIS

Atualizar o arquivo de configurações

Adicione as informações necessárias para acessar o aplicativo LUIS, incluindo ID do aplicativo, chave de criação e região, ao arquivo appsettings.json. Estes são os valores que você salvou anteriormente de seu aplicativo LUIS publicado. Lembre-se de que o nome do host da API deve estar no formato <your region>.api.cognitive.microsoft.com.

appsetting.json

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

Configure seu bot para usar seu aplicativo LUIS

Verifique se o pacote do NuGet Microsoft.Bot.Builder.AI.Luis está instalado para o seu projeto.

Para se conectar ao serviço do LUIS, o bot extrai as informações adicionadas acima do arquivo appsetting.json. A classe FlightBookingRecognizer contém código com as configurações do arquivo appsetting.json e consulta o serviço do LUIS chamando o 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);
}

O FlightBookingEx.cs contém a lógica para extrair From, To e TravelDate; ela estende a classe parcial FlightBooking.cs usada para armazenar os resultados do LUIS ao chamar FlightBookingRecognizer.RecognizeAsync<FlightBooking> do 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];
}

Agora, o LUIS está configurado e conectado ao seu bot.

Testar o bot

Baixe e instale o Bot Framework Emulator mais recente

  1. Execute o exemplo localmente em seu computador. Se você precisar de instruções, consulte o README arquivo para o exemplo de exemplo do C#, exemplo de JS ou Python.

  2. na Emulator, digite uma mensagem como "viagem a paris" ou "indo de paris para berlim". Use qualquer enunciado encontrado no arquivo FlightBooking.json para treinar a intenção "Reservar voo".

Entrada de reserva do LUIS

Se a melhor intenção retornada pelo LUIS for "Reservar voo", seu bot fará perguntas adicionais até que tenha informações suficientes armazenadas para criar uma reserva de viagem. Nesse ponto, ele retornará essas informações de reserva para o usuário.

Resultado da reserva do LUIS

Nesse momento, a lógica de bot do código reiniciará e você poderá continuar a criar reservas adicionais.

Informações adicionais

Para obter mais informações sobre o LUIS, consulte a documentação dele:

Próximas etapas