Add natural language understanding to your bot (Adicionar o Language Understanding natural ao bot)

APLICA-SE A: SDK v4

Nota

O Language Understanding (LUIS) será aposentado em 1 de outubro de 2025. A partir de 1 de abril de 2023, não será possível criar novos recursos LUIS. Uma versão mais recente do entendimento de idiomas agora está disponível como parte do Azure AI Language.

O entendimento de linguagem conversacional (CLU), um recurso do Azure AI Language, é a versão atualizada do LUIS. Para obter mais informações sobre o suporte à compreensão de linguagem no SDK do Bot Framework, consulte Compreensão de linguagem natural.

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

Este tópico orienta você pela adição do LUIS a um aplicativo de reserva de voos para reconhecer diferentes intenções e entidades contidas na entrada do usuário.

Nota

Os SDKs JavaScript, C# e Python do Bot Framework continuarão a ser suportados, no entanto, o Java SDK está sendo desativado com suporte final de longo prazo terminando em novembro de 2023. Apenas segurança crítica e correções de bugs dentro deste repositório serão realizadas.

Os bots existentes construídos com o Java SDK continuarão a funcionar.

Para a criação de novos bots, considere usar o Power Virtual Agents e leia sobre como escolher a solução de chatbot certa.

Para obter mais informações, consulte O futuro da criação de bots.

Pré-requisitos

Sobre este exemplo

Este exemplo de bot principal mostra um exemplo de um aplicativo de reserva de voo de aeroporto. Ele usa um serviço LUIS para reconhecer a entrada do usuário e retornar a intenção LUIS reconhecida superior.

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

Após cada processamento de entrada do usuário, DialogBot salva o estado atual de ambos e ConversationStateUserState . Uma vez reunidas todas as informações necessárias, a amostra de codificação cria uma reserva de voo de demonstração. Neste artigo, abordaremos os aspetos LUIS deste exemplo. No entanto, o fluxo geral da amostra é:

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

Class diagram outlining the structure of the C# sample.

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

  • Origin a cidade de origem
  • TravelDate a data para reservar o voo
  • Destination a cidade de destino

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

Criar uma aplicação LUIS no portal LUIS

  1. Inicie sessão no portal LUIS e, se necessário , crie uma conta e um recurso de criação.
  2. Na página Aplicativos de conversa no LUIS, selecione Importar e, em seguida, Importar como JSON.
  3. Na caixa de diálogo Importar novo aplicativo:
    1. Escolha o arquivo FlightBooking.json na pasta CognitiveModels do exemplo.
    2. Digite FlightBooking como o nome opcional do aplicativo e selecione Concluído.
  4. O site pode exibir Como criar um aplicativo LUIS eficaz e Atualizar suas caixas de diálogo de entidades compostas. Você pode descartar essas caixas de diálogo e continuar.
  5. Treine seu aplicativo e, em seguida, publique-o no ambiente de produção . Para obter mais informações, consulte a documentação do LUIS sobre como treinar e publicar um aplicativo.

Porquê utilizar entidades

As entidades LUIS permitem que seu bot compreenda eventos além das intenções padrão. Isso permite que você colete informações adicionais dos usuários, para que seu bot possa fazer perguntas e responder de forma mais inteligente. Junto com as definições para as três intenções do LUIS 'Reservar voo', 'Cancelar' e 'Nenhuma', o arquivo FlightBooking.json também contém um conjunto de entidades, como 'From.Airport' e 'To.Airport'. Estas entidades permitem ao LUIS detetar e devolver informação adicional contida na entrada original do utilizador quando este solicita uma nova reserva de viagem.

Obter valores para ligar à sua aplicação LUIS

Assim que seu aplicativo LUIS for publicado, você poderá acessá-lo a partir do seu bot. Você precisará registrar vários valores para acessar seu aplicativo LUIS de dentro do seu bot. Você pode recuperar essas informações usando o portal LUIS.

Recuperar informações do aplicativo do portal LUIS.ai

O arquivo de configurações (appsettings.json, .env ou config.py) atua como o local para reunir todas as referências de serviço em um só lugar. As informações recuperadas serão adicionadas a este arquivo na próxima seção.

  1. Selecione seu aplicativo LUIS publicado em luis.ai.

  2. Com a aplicação LUIS publicada aberta, selecione o separador GERIR .

  3. Selecione a guia Configurações no lado esquerdo e registre o valor mostrado para ID do aplicativo como <YOUR_APP_ID>.

    Screenshot of the Manage page displaying your application ID.

  4. Selecione Recursos do Azure e, em seguida , Recurso de Previsão. Registre o valor mostrado para Localização como YOUR_REGION> e Chave Primária como <<YOUR_AUTHORING_KEY>.

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

    Como alternativa, você pode usar a região e a chave primária para seu recurso de criação.

Atualizar o arquivo de configurações

Adicione as informações necessárias para acessar seu aplicativo LUIS, incluindo ID do aplicativo, chave de criação e região no appsettings.json arquivo. Na etapa anterior, você recuperou esses valores do seu aplicativo LUIS publicado. O nome do host da API deve estar no formato <your region>.api.cognitive.microsoft.com.

appsetting.json

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

Configure seu bot para usar seu aplicativo LUIS

Certifique-se de que o pacote NuGet Microsoft.Bot.Builder.AI.Luis esteja instalado para seu projeto.

Para se conectar ao serviço LUIS, o bot extrai as informações que você adicionou ao arquivo appsetting.json. A FlightBookingRecognizer classe contém código com suas configurações do arquivo appsetting.json e consulta o serviço LUIS chamando RecognizeAsync o método.

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, estende a classe FlightBooking.cs parcial usada para armazenar resultados 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];
}

O LUIS agora está configurado e conectado para seu bot.

Testar o bot

Baixe e instale o mais recente Bot Framework Emulator

  1. Execute a amostra localmente na sua máquina. Se você precisar de instruções, consulte o arquivo para o Exemplo de C#, Exemplo de JS ou Exemplo de Python.README

  2. No emulador, digite uma mensagem como "viajar para Paris" ou "Ir de Paris para Berlim". Use qualquer enunciado encontrado no arquivo FlightBooking.json para treinar a intenção "Reservar voo".

Se a intenção principal retornada do LUIS resolver para "Reservar voo", seu bot fará mais perguntas até ter informações suficientes armazenadas para criar uma reserva de viagem. Nesse momento, ele retornará essas informações de reserva de volta ao seu usuário.

Neste ponto, a lógica do bot de código será redefinida e você poderá continuar a criar mais reservas.

Informações adicionais

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

Gorjeta

Diferentes partes do SDK definem classes de entidade ou elementos separados. Para entidades de mensagem, consulte Entidades e tipos de atividade.