Oi, pessoal. Tudo bem com vocês? 🙂
Bem-vindos ao terceiro POST da nossa série sobre chatbots ^^ . Aqui, explicaremos sobre como utilizar serviços adicionais que podem dar mais inteligência ao seu robô, melhorando a forma como ele lida com o fluxo de conversa enquanto processa as mensagens do usuário. Focaremos em dois serviços específicos: QnAMaker e LUIS. Traremos alguns conceitos e ensinaremos a criar projetos que possam ser integrados ao seu bot. Mais pra frente, ensinaremos também como vocês podem utilizar os dois serviços juntos, aumentando a capacidade de conversação do seu robô. Bom, chega de enrolação; apertem os cintos e vamos começar! 😀
QnAMaker
1. O que é o QnAMaker?
QnAMaker é um serviço da Microsoft que permite criar bases de conhecimento com diversas “perguntas” e suas respectivas “respostas”. Uso aspas porque, apesar de usarmos o conceito de “perguntas” e “respostas”, o que temos é uma coluna com os “textos esperados” e outra com as “respostas que o QnAMaker usará caso aquele texto seja recebido”. Muito abstrato? Então vamos analisar a imagem abaixo: temos um app do QnAMaker chamado Teste Excel. Nele, há uma coluna Question, onde temos as mensagens esperadas, e outra, com as respostas, chamada Answer. Assim, se o Teste Excel receber, por exemplo, a mensagem “Oi”, ele responderá um “Olá”.
O QnAMaker é útil para a criação de FAQs que respondam inputs frequentes com respostas pré-definidas. Se você é como eu, deve estar se perguntando: “Por que vou usar um serviço a mais se posso usar uma simples lista de perguntas e respostas?”. Bom, o que torna esse serviço diferente é que ele possui certa “inteligência” – caso receba um texto que não está cadastrado na lista, o QnAMaker em sua lista de Questions por algum texto que se aproximo do recebido; se o encontrar, retorna a resposta associada a este texto para o usuário. Se não encontrar nenhum, ele retorna uma mensagem de erro indicando o ocorrido.
Quer ver acontecendo? Na aba Test da nossa base de conhecimento, podemos testar as respostas que o serviço enviará. Note na imagem abaixo, quando eu envio “Bom dia” (o texto cadastrado) ou “dia” (texto não cadastrado), o serviço devolve a resposta cadastrada para o texto “Bom dia”. Mas quando eu envio “td bem?”, o serviço retorna uma mensagem de erro, já que não tem nada remotamente semelhante a isso em sua lista.
2. Como criar uma FAQ no QnAMaker?
Antes de tudo, você precisa possuir um e-mail Microsoft válido para conseguir se logar no portal do QnAMaker. Uma vez propriamente logado, você estará em “My Services”, onde verá os serviços QnA que você já possui. Caso queira criar um novo, siga os passos abaixo:
1. Vá em “New Service”;
2. No formulário que surgirá, especifique os dados do serviço (nome, etc.);
3. É possível tanto importar uma FAQ de uma página Web (no caso de você já possuir um site ou um blog com dados que queira reutilizar); para isso, basta inserir a URL no campo definido e deixar o QnAMaker fazer o resto.
4. Caso queira, também é possível fazer UPLOAD de arquivos com os dados de uma FAQ. Basta ir à sessão especificada e fazer upload do arquivo – sugiro trabalhar com arquivos .xls ou .csv por questões de praticidade, mas há outros suportados, como .pdt e .doc (veja na imagem abaixo).
5. Com tudo definido, basta finalizar a criação do seu serviço.
3. Como testar ou editar minha FAQ?
Na sua lista de serviços, na página inicial, clique no botão de edição (atualmente, um lápis) do serviço desejado, e você será enviado para a base de conhecimento. Na aba lateral, selecione Tests; você será redirecionado para um chat onde pode enviar as seus inputs (perguntas) e verificar se o QnAMaker responde da maneira desejada.
Caso queira acrescentar linhas à sua FAQ, basta clicar em +Add new QnA pair e inserir os dados desejados; então, você terá de clicar em Save & Retrain para treinar a “inteligência” do QnA com os novos dados. Caso um serviço externo esteja consumindo seu serviço QnA (como, por exemplo, um chatbot), lembre-se de clicar em Publish para disponibilizar as alterações.
4. Como consumir meu serviço?
Tudo o que é necessário é utilizar a Subscription-Key e o Knowledge-base-Id, que podem ser acessados clicando no botão View Code, na tela de listagem de serviços. As duas servirão para que seu bot possa se comunicar com o QnAMaker. Para realizar a comunicação de dentro do código da sua aplicação, você deverá utilizar serviço próprio vem dentro no pacote nuget de serviços cognitivos chamado Microsoft.Bot.Builder.CognitiveServices.QnaMaker.
Em futuros posts, faremos um tutorial para criar um projeto de chatbot utilizando o QnAMaker. Se já quiser ir se adiantando, dê uma olhada neste sample disponibilizado pela Microsoft.
5. Conclusões QNAMaker
O QnAMaker é muito simples de ser utilizado, e disponibiliza a possibilidade de trabalhar com um grande conjunto de dados. Eu gosto de utilizá-lo, por exemplo, para ter respostas prontas para os textos mais simples que um usuário pode enviar, como “Oi”, “tudo bem?”, “Pode me ajudar?”, dentre outros, mas as possibilidades podem variar muito.
LUIS (Language Understanding)
1. O que é o LUIS?
LUIS é um interpretador de linguagem natural que se utiliza de inteligência artificial. Ele foi criado para permitir a criação de um modelo de linguagem natural que possa ser utilizado para identificar intenções dentro de um texto. Beleza, mas o que isso quer dizer? Bom… para exemplificar, acho que o melhor caminho é focar na ideia do nosso bot: imagine que temos um bot que recebe a mensagem de texto “Quero fazer um pedido de pizza“. Qual a intenção dessa mensagem? Para mim e para vocês, é óbvio que a intenção é a de realizar um pedido de pizza. Mas, como fazemos com que o bot entenda isso e comece a processar o pedido?
É aí que entra o LUIS! Dentro dele, criamos um modelo de Intenções, ou seja, um modelo onde definimos o intento por trás de determinados conjuntos de texto. Na imagem abaixo, vemos um exemplo onde criamos um modelo dividido nas intenções Saudação, Fazer Pedido, etc. Uma vez que temos nosso conjunto de intenções, inserimos frases dentro de cada conjunto para que a IA do LUIS consiga entender o tipo de texto que se relaciona àquela intenção específica. Daí, basta treinar seu LUIS e qualquer frase que o serviço vir a receber será categorizada dentro de alguma das intenções definidas no modelo com dada precisão (por exemplo: “oie amiguinho” está, com 75% de certeza, dentro da intenção “Cumprimento“).
Beleza, mas pra que isso serve? A partir do momento em que você sabe a intenção de um texto, você consegue direcionar o processamento do bot para um caminho que trate aquela intenção. O BotFramework trás suporte ao LUIS, permitindo usar um decorator nos métodos. Quando o bot receber uma mensagem, ele a direciona via API para o serviço do LUIS, que retorna a intenção e, automaticamente, direciona o fluxo de execução do código para o método que tenha um decorator com aquela intenção. No exemplo abaixo, se a intenção for Saudacao, o método SaudacaoAsync será executado (Obs: o nome do método não precisa, necessariamente, ser igual ao nome da intenção cadastrada no LUIS, mas o nome da intenção definida dentro do decorator [LuisIntent] PRECISA ser idêntico).
2. Como criar um endpoint LUIS?
Assim como no caso do QnAMaker, é necessário possuir um e-mail Microsoft válido para se logar no portal do LUIS. A partir daí, é tudo bem intuitivo:
1. Clique em “Create New App”;
2. Dê o nome do app, defina a cultura da língua que será interpretada (no nosso caso, “Brazilian Portuguese”);
3. Dê ou não uma descrição;
4. Clique em “Done” e crie seu App;
Uma vez criado o app, pode-se criar as intenções e definir frases específicas para cada uma delas. Então, é necessário clicar em Train para que a IA da Microsoft treine com a massa de dados que você informou.
3. Como testar minhas intenções no LUIS?
Uma vez criadas as intenções, você precisa treinar a IA do LUIS para que ele possa reconhecer as intenções (ver imagem no tópico anterior sobre com o botão Train). Uma vez treinado, você pode testar seu serviço LUIS clicando no botão Test. Será aberta uma nova janela onde você deverá digitar o texto que, teoricamente sue serviço irá receber do usuário. Uma vez digitado o texto, a IA do LUIS irá processá-lo e retornar a intenção na qual acha que aquele texto está classificado – essa intenção é retornada com uma porcentagem (variando de 0 a 1), que indica a certeza que o LUIS tem de que o texto está dentro daquela classificação.
Na imagem o LUIS identificou, com 100% de certeza, que o texto “Oi, tudo bem?” é uma intenção, por parte do usuário, de checar o estado emocional do robô. Geralmente, resultados totais (100%) ocorrem porque temos o texto exatamente igual ao recebido dentro do nosso conjunto de exemplos. Se tentássemos outro texto como, por exemplo, “e aí cara, sussa?”, teríamos uma porcentagem menor – isso ocorre porque o LUIS não possui essa frase dentro de seus modelos, mas acredita, baseado em todas as intenções que tem cadastradas, que ela possui àquela.
Se clicarmos na mensagem, será aberta a janela lateral com as informações de todas as intenções onde a mensagem recebida pode ser classificada e quanto de certeza o LUIS tem de que a mensagem pertença à cada intenção.Ao clicar no botão Edit, podemos mudar a intenção atual para outra… a partir daí, precisamos treinar o LUIS mais uma vez para que ele consiga entender que a intenção certa é a nova que definimos e não a que ele acreditava.
Com esse processo de testar a intenção, editar caso o resultado não seja satisfatório e treinar novamente o serviço, conseguimos fazer com que o LUIS seja inteligente o bastante para reconhecer nossos textos de uma maneira precisa. Outra coisa interessante de se fazer é colocar uma quantidade grande de dados de exemplo para cada intenção cadastrada; o ideal, na minha opinião, seria uns trinta exemplos distintos para que o LUIS se encontre. Outra coisa é criar intenções bem definidas; eu, por exemplo, criei a intenção Saudacao – onde coloquei textos simples “Oi”, “Olá”, “Oie”, “E aí” – e outra, denominada Checar.Emocional.Bot, onde coloquei exemplos textuais mais específicos como “Oi, tudo bem?” e “E aí, cê tá bem?”. Desse modo, posso dividir melhor meu fluxo de conversação dentro das possibilidades de uma conversa real.
4. Como consumir o LUIS na minha aplicação?
Diferente do QnAMaker, o serviço do LUIS já vêm dentro dos pacotes Microsoft.Bot.Builder, que são instalados pelo BotFramework. Para integrar o LUIS ao seu projeto, é necessário se utilizar de uma Subscription-Key e uma App key, ambas que são fornecidas pelo serviço ao acessar a aba “My Apps”, selecionar o app desejado e então clicar na aba Publish (veja abaixo).
Falaremos mais sobre como chamar o serviço do LUIS de dentro do seu código nos próximos POSTs, porque, para isso, vocês precisarão ter alguns conceitos a mais na cabeça. Por enquanto, tenham em mente que só precisamos herdar da classe LuisDialog em cada Dialog (falaremos mais sobre dialogs nos próximos posts) de conversação do seu bot e instanciar dentro delas a classe LuisService com as chaves ditas anteriormente.
Se quiser ir adiantando, dê uma lida neste exemplo da Microsoft.
5. O que são as entidades?
Entidades podem ser definidas como “classificações especiais” de determinadas palavras dentro de um texto. Imagine a frase “Quanto está o real?”. A palavra “real” está se referindo à moeda Brasileira, que é um tipo de entidade. Ótimo, mas pra que isso serve? Bom, imagine que você quer extrair o tipo de moeda que o usuário está falando. Dentro do LUIS, criamos uma entidade moeda e, nos exemplos que colocamos em cada intenção, nós atribuímos uma palavra do exemplo à uma entidade. Na imagem abaixo, por exemplo, a primeira frase usa a palavra real, a segunda usa a palavra euro e a terceira, a palavra real, todas entidades do tipo moeda.
Uma vez que definimos as palavras às quais dada entidade está associada, se o LUIS enxergar alguma daquelas palavras dentro de um texto, ele as extraí e retorna para o programador em uma lista de “Entities“. Dessa forma, o programador consegue que o LUIS extraía o conteúdo do texto original e retorne para ele de maneira fácil e eficaz. Para atribuir uma entidade à um texto, é bem simples: basta criar a entidade desejada e então, dentro do seu conjunto de exemplos de intenções, clicar com o botão direito na palavra desejada e selecionar a entidade à qual ela está associada (veja abaixo, onde atribuímos a entidade moeda à palavra euro).
Tendo as entidades atribuídas, quando testamos uma frase no LUIS ele retorna, além da intenção à qual ela está relacionada, os tipos da entidade e as palavras que a representam dentro do texto. Abaixo, por exemplo, vemos que foi retornada a entidade “Moeda”, representada dentro do nosso texto pela palavra “real”:
Existe uma lista de entidades pré-definidas que podemos utilizar dentro do LUIS. Além disso, há tipos específicos que uma determinada entidade pode possuir. Vale à pena ler a documentação para entender melhor entidade é boa para você. Para entender como criar sua entidade, dê uma lida nesta documentação e, se quiser aprender boas práticas para a criação de suas entidades (lembre-se: sempre tem um jeito melhor de fazer tudo \o/ ) dê uma lida aqui.
6. Conclusões sobre LUIS
LUIS é uma excelente ferramenta de reconhecimento linguístico e trás um conjunto de possibilidades incríveis para sua aplicação. Ele pode ser integrado facilmente em qualquer app (não necessariamente um chatbot) e isso faz com que suas contribuições dependam exclusivamente da imaginação do programador. A possibilidade de se criar entidades para partes do texto é mais interessante ainda, porque trás consigo uma customização bacana do serviço e facilita a interpretação e extração de dados importantes do texto puro. Pessoalmente, considerei a ferramenta extremamente útil e considero utilizá-la sempre que preciso extrair informações de textos.
Para ver um pouco sobre as melhores práticas na utilização do LUIS, cheque este link.
Finalizando…
Bom, é isso aí. Nesse post, tentei apresentar a vocês esses dois serviços e, além da parte teórica, tentar ensiná-los como criar seus próprios aplicativos dentro deles. Eu e o Gustavo Bigardi achamos esse tópico importante porque nós utilizaremos o LUIS em praticamente todos os Bots que desenvolveremos com vocês nesta série, então é legal já irem se acostumando com ele. Mais pra frente, vamos ensiná-los a criar as suas aplicações integrando tanto LUIS quanto QnAMaker em um único bot, visando, desse modo, trazer todo o conjunto de benefícios de ambas para seu projeto.
Gostaria de agradecer à todos que nos acompanharam até aqui e, pessoalmente, pedir desculpas pelo atraso deste post. Ele deveria ter sido lançado há três semanas, mas tive vários problemas pessoais que me impediram de completá-lo. Por favor, me desculpem por qualquer inconveniente e espero tê-los aqui novamente semana que vem, quando o Gustavo vai falar um pouco sobre Cognitive Services do Azure e Custom Cognitive Services.
É isso aí, pessoal. Muito obrigado e até lá 🙂
William Pinto