21 Setembro 2018

Construir um Bot com inteligência com a Microsoft Bot Framework

De uma forma genérica, um bot é um conjunto de algoritmos que, tal como uma aplicação tradicional, permite que o utilizador navegue por menus pré-definidos e execute um conjunto limitado de tarefas.

O que diferencia um bot de uma aplicação tradicional é a interação com o utilizador. Ao contrário do que acontece numa aplicação tradicional, aqui o utilizador interage com um bot de conversação através de linguagem natural (texto ou som). Este utiliza ferramentas avançadas como inteligência artificial e machine learning para melhor interpretar e realizar as ações que os utilizadores pretendem.

1. ARQUITETURA DA FRAMEWORK

A framework de um Bot Azure pode ser representada da seguinte forma:

Figura 1 – Arquitetura de um Bot

• Bot Service (Canal de registo do Bot)
A framework dos Bots da Microsoft é suportada por um vasto conjunto de canais (Skype, Facebook Messenger, Microsoft Teams, etc.). Este serviço permite definir que canais podem usar o bot, permitindo a comunicação nesses mesmos canais.

Todas as mensagens são recebidas por esse serviço que as direciona para a API web, devolvendo a mensagem de resposta ao utilizador.

• Web API Service
É responsável por dar resposta aos utilizadores funcionando como um endpoint, sendo que é aqui que deve ser desenvolvida toda a lógica do bot. No entanto, o serviço já disponibiliza o conceito de diálogos e alguns tipos de interfaces para iniciar o desenvolvimento, sendo que este serviço pode ser integrado com outros sistemas externos.

• Bot State Service
Para tornar a conversação entre bot/utilizador mais rápida e eficiente, é guardado um "estado" no Bot State Service cada vez que uma nova atividade é gravada.

Sendo este serviço de natureza assíncrona, os estados do bot podem ser guardados na cache ou na memória. Pelo facto de mantermos os estados na BD, podemos restaurar, a partir de qualquer ponto, esses mesmos estados, permitindo continuar conversas inicializadas anteriormente.

1.1. INTELIGÊNCIA ARTIFICIAL E MICROSOFT COGNITIVE SERVICES

Atualmente, a Microsoft já disponibiliza soluções (API’s e SDK’s) que permitem estender as capacidades do bot, através do uso de IA, designados serviços cognitivos.

Essas soluções dividem-se nas seguintes categorias:

• Visão:
> Computer Vision: Permite, entre outras funcionalidades, processar e analisar imagens carregadas pelo utilizador e produzir uma resposta;
> Content Moderator: Monitorização de conteúdo potencialmente ofensivo ou de risco (Suportando imagens, vídeos e texto).
> Face API: Atualmente, é usada para reconhecimento facial mas também a antiga Emotion API está embebida nesta solução.

• Discurso:
> Speech API: Esta funcionalidade permite transformar falas humanas para texto e(ou) texto em áudio, dando assim, oportunidade de criar comandos de voz.
> Translator Speech: Obter funcionalidades de tradução de áudio para outras línguas.

• Linguagem:
> Bing Speel Check: Dá a possibilidade de serem feitas correções, tanto a nível de gramática como de erros ortográficos
> LUIS: Permite à aplicação compreender as palavras do utilizador para dar uma resposta mais eficaz aos pedidos.

• Conhecimento:
> Custom Service Decision Service: Permite que a aplicação ganhe inteligência através da experiência. Este sistema incorpora a opinião do utilizador para decisões em tempo real.

• Pesquisa:
> Bing Image Search: Retorna imagens que o Bing determina como relevantes para o utilizador.

2. LINGUAGEM NATURAL

A Linguagem Natural é uma parte da Inteligência Artificial que ajuda os bots/aplicações a compreender linguagem humana, tanto escrita como áudio. Até há bem pouco tempo, eram os humanos que tentavam compreender as linguagens computacionais para poderem “comunicar” com as máquinas, através de Java, C#, entre outras, mas com a evolução da tecnologia, este paradigma alterou e atualmente observamos um novo fenómeno: o de aprendizagem das máquinas, para compreender a linguagem humana.

Na era que vivemos, é simples para um computador fazer cálculos complexos, mas provavelmente, se lhe pedirmos para encontrar as diferenças entre duas imagens bastante semelhantes ou para identificar as emoções de uma pessoa numa imagem, irá ser difícil obter uma resposta imediata, no entanto, para uma pessoa, será o processo contrário, facilmente irá reconhecer as emoções, mas dificilmente irá saber a resposta imediata para um cálculo complexo.

A inteligência artificial ajuda a máquina a compreender e a interpretar emoções e palavras tal como o cérebro humano consegue fazer. Todas as pessoas falam e escrevem de formas próprias, uma frase pode ser escrita de diversas formas mesmo tendo um significado idêntico, isto porque, todos temos uma forma diferente de expressar, mesmo tendo igual intenção. Por exemplo: ao pesquisar por um hotel para férias, duas pessoas irão usar vocabulário e pontuação diferentes e essa é a grande dificuldade nos dias de hoje, que pode ser minimizada através do uso da LN.

Neste capítulo, vamos incidir sobre um serviço disponibilizado pela Microsoft Cognitive Services, o LUIS (Language Understanding Intelligent Services), que ajuda na difícil tarefa de compreender a linguagem humana. Este serviço é gratuito até 10.000 transações mensais para mensagens de texto.

2.1. LUIS

O LUIS é uma aplicação que integra a framework do bot, tendo como objetivo compreender as frases do utilizador, encontrando a intenção por trás da mesma e identificando o assunto e referências, permitindo conferir maior inteligência ao bot.

Esta aplicação já providencia um vasto conjunto de ferramentas que permitem definir modelos simples de compreensão de frases, no entanto, é necessário que o LUIS receba inputs à medida do problema de negócio para que a aplicação possa responder com credibilidade.

Depois de publicada, a aplicação LUIS está preparada para receber e processar pedidos (expressões), através de HTTP requests e devolver a melhor ação que o utilizador pretende (intenção). A troca de mensagens é feita através de objetos JSON.

As componentes que integram a aplicação são:

• Intents
A principal função desta aplicação é compreender a intenção do utilizador, via texto. Os utilizadores podem escrever qualquer texto com vocabulário e pontuação, como tal, o developer deve providenciar todas as intenções (como intenções, entendem-se todos os motivos, ideias ou objetivos dos utilizadores que vão interagir com a aplicação) que achar necessárias.

Os motivos dividem-se em duas categorias principais:
> Pesquisar: O utilizador pretende pesquisar, por exemplo, por um determinado ficheiro.
> Perguntar ou pedir para realizar uma ação: Reservar um voo, um restaurante, etc.

• Entities
As entidades são tão importantes como compreender a intenção do utilizador, para que a aplicação possa dar resposta é preciso que seja possível compreender os parâmetros passados. Por exemplo, para pesquisar um determinado ficheiro na base de dados, a aplicação precisa, além de saber qual a intenção do utilizador (obter um ficheiro), qual é o ficheiro em causa, caso contrário, não será possível retornar uma resposta fidedigna.

Exemplo: pesquisar um ficheiro abc_123 com a data de 2 de janeiro
> A intenção é pesquisar um ficheiro;
> As entidades serão abc_123 e 2 de janeiro.

• Utterances
Depois das intenções serem definidas, o LUIS deve conter um conjunto de expressões pré-definidas pelo developer, para poder treinar-se a si próprio a identificar as intenções e entidades de uma determinada frase. É muito importante que a aplicação possa aprender para poder responder, no futuro, com mais precisão, pois é isso que vamos receber do utilizador - expressões (frases).

• Features
As Features são metadata, traços ou atributos para uma determinada intenção ou entidade. Ajudam a melhorar a eficiência e a eficácia do algoritmo de NLP que irá correr por trás.

3. CRIAÇÃO DE UM BOT INTELIGENTE

As demonstrações deste artigo assentam nas tecnologias .NET e no IDE Visual Studio.

Recomenda-se o uso do IDE grátis Visual Studio 2017 Community para desenvolvimento da aplicação na linguagem C#. Atualmente, o Bot framework está em fase preview, por esse motivo será necessário acrescentar manualmente o template “Bot Application”.

O template permite criar um bot básico conhecido por “EchoBot”, sendo um bom ponto de partida para compreender e desenvolver funcionalidades. O “EchoBot” interage de forma básica com o utilizador. O utilizador escreve uma frase e o bot apresenta o número de caracteres da frase introduzida.

3.1. INSTALAR VISUAL STUDIO 2017 COMMUNITY, BOT EMULATOR TEMPLATE E SDK

 

1. Download do visual studio em https://www.visualstudio.com/downloads/ e instalar.

2. Download do template em https://marketplace.visualstudio.com/items?itemName=BotBuilder.BotBuilderV3.

3. Colocar o ficheiro .zip, sem extrair, na pasta de templates c# (…\Documents\Visual Studio 2017\Templates\ProjectTemplates\Visual C#).

4. Abrir o visual studio em modo administrador, criar um novo projeto pesquisando por “Bot Application”.

5. Para adicionar as funcionalidades mais sofisticadas da framework de bots é necessário instalar Bot builder SDK. Para isso basta executar o comando “Install-Package Microsoft.Bot.Builder”.

6. Após atribuir um nome e criar o projeto, garantir que o buid corre com sucesso (Ctrl + Shift + B) e executar o projeto (Ctrl + F5). Será aberta uma janela no browser semelhante à imagem abaixo.

Figura 2 – Teste à conexão do Bot

 

3.2. BOT EMULATOR

O Bot Framework Emulator é uma ferramenta que permite interagir de forma simples com o bot, simulando um canal de conversação. Uma alternativa a esta ferramenta seria criar uma aplicação à medida, o que requer mais esforço.

Quando o bot está registado no portal Azure, também é possível interagir através da opção “Test in Web Chat”.

Para instalar o emulador, basta seguir os passos:

1. Download do arquivo .exe em https://github.com/Microsoft/BotFramework-Emulator/releases;

2. Após abrir o emulador, selecionar a opção “New bot configuration”.

3. Atribuir um nome ao bot e indicar o URL. É o mesmo URL atribuído à API, com o sufixo api/messages. Exemplo http://localhost:3979/api/messages.

Figura 3 – Interagir com o EchoBot no Bot Emulator

3.3. LUIS

O EchoBot acabado de criar é inútil, não conseguindo interpretar as intenções dos utilizadores. Para resolver essa questão é usado o LUIS, que é uma aplicação REST API que, depois de publicada, permite a interação com outras aplicações como, por exemplo, bots.

Para criar a aplicação LUIS, basta entrar em https://www.luis.ai/. Devem ser usadas as credenciais Microsoft.

Figura 4 – Criação da aplicação LUIS

Após criação da aplicação, segue-se a criação das intenções (Intents). De forma a agilizar o processo de criação de intenções, é possível criá-las através de exemplos pré-definidos, selecionando a opção “Add prebuild domain intent”. A intenção “None” é sempre criada por omissão, sendo selecionada sempre que não seja possível interpretar o input do utilizador.

Para esta demonstração, foram criadas duas intenções, “SearchFlights” e “SearchHotels”.

Figura 5 – Lista das intenções

Foram criadas duas entidades (Entities) “Origin” e “Destination”. No contexto de pesquisa de voos, ambas serão usadas para mapear os locais de origem e destino. No contexto de pesquisa de hotéis, apenas o destino interessa mapear.

Figura 6 – Lista de entidades

Após criar o domínio de intenções e entidades, o próximo passo é indicar expressões de exemplo (Utterances). Quantos mais exemplos forem alimentados no bot, maior será a precisão a identificar intenções dos utilizadores.

Figura 7 – Lista das expressões para intenção “Search Flights”

Figura 8 – Lista das expressões para intenção “Search Hotels”

Depois de definir as intenções, entidades e frases de exemplo, é necessário treinar o LUIS, selecionando a opção “Train” e testar “Test”. Após testar a aplicação, é necessário publicá-la de forma a poder integrá-la com o bot. Selecionar a opção “Publish” e copiar a chave “Key String” gerada.

3.4. INTEGRAR BOT COM LUIS NO VISUAL STUDIO USANDO C#

No projecto C# criado no primeiro passo, existem dois ficheiros chave para o funcionamento do bot. O ficheiro “MessagesController.cs” que se encontra na pasta “Controllers”, e o ficheiro “CustomRootDialog.cs” da pasta “Dialogs”.

No ficheiro “CustomRootDialog.cs”, é criada a lógica de mapeamento de intenções do LUIS com diálogos customizados. Neste caso, foram mapeadas as duas intenções “SearchFlights” e “SearchHotels”, mais a intenção “None” que apenas devolve a mensagem “I do not understand you message!”.

Figura 9 – Código C# do ficheiro “CustomRootDialog.cs”

Por fim, é necessário alterar o ficheiro “MessagesController.cs”, que irá invocar a classe “CustomRootDialog”. Editar e trocar a expressão “await Conversation.SendAsync(activity, () => new Dialogs.RootDialog());” por “await Conversation.SendAsync(activity, MakeRoot);”.

Criar o método MakeRoot() dentro da classe MessagesController.

Figura 10 – Definição do método MakeRoot

3.5. COMPILAR O PROJETO E TESTAR

Após gravar e compilar o projeto, é possível testar as novas funcionalidades no emulador. Quando o utilizador envia texto na aplicação, o bot avalia e devolve a melhor intenção, assim como todas as entidades encontradas no texto.

Figura 11 – Testar novas funcionalidades do bot com o Bot Emulator

4. CONCLUSÃO

Com o avanço da tecnologia, os utilizadores preferem interfaces mais user-friendly e dinâmicas, utilizando linguagem natural para comunicar, em vez dos tradicionais menus e janelas.

A Microsoft Bot Framework fornece um conjunto de ferramentas que permitem a criação de bots e a sua integração em diversos canais. A framework é Open Source e é integrável com outras aplicações através da sua interface rest api.

É possível incrementar a inteligência do bot através da integração com os serviços cognitivos da Microsoft, sendo o LUIS o serviço que permite a compreensão de linguagem natural.

       Ana Guerreiro         Daniel Rodrigues
 Associate Consultant          Consultant