• Português
  • English
  • Por dentro da inteligência de chatbots

    Por: em 5 de abril de 2018

    Num post anterior, comecei com a seguinte citação da famosa série de TV Friends:

    “So, ya know, that’s why within a few years that voice recognition is gonna be pretty much standard on any computer you buy. So you can be, like… like, ‘Wash my car,’ ‘Clean my room.’ You know it’s not gonna be able to do any of those things… but it’ll understand what you’re saying.” [“Então, em alguns anos, reconhecimento de voz será bem comum em qualquer computador que você comprar. Você vai poder, tipo, ‘lave meu carro’, ‘limpe meu quarto’. Bom, ele não vai poder fazer nenhuma dessas coisas… mas vai entender o que você disse.”] – Pete Becker (interpretado por Jon Favreau) em um dos episódios, lançado em 1997, da série de TV “Friends”.

    Naquela ocasião, aproveitei a citação para falar um pouco sobre como máquinas podem reconhecer fala humana a ponto de transcrevê-la. Mas um passo além seria a pergunta: como máquinas podem entender a linguagem humana a ponto de ser capaz de me responder?

    Essa questão encontra aplicação natural no desenvolvimento de chatbots. Como já discutido anteriormente neste blog, chatbots são programas de computador capazes de conversar com humanos — e ainda tomar outras decisões a partir dessas conversas. Imagine, por exemplo, que eu tive uma emergência e não poderei trabalhar. Então eu ligo ao DataLab e um chatbot atende:

    Bot: Olá, eu sou o chatbot do DataLab. Com quem eu falo?

    Eu: Aqui é o Felipe.

    Bot: Olá, Felipe! Como posso ajudar?

    Eu: Tive uma emergência. Vou chegar mais tarde.

    Bot: Que pena! Quer que eu avise a equipe do Lab?

    Eu: Sim, por favor.

    Bot: Pronto, já avisei. Mas também vi na sua agenda uma reunião com Fulano às 10h. Quer que eu já tente remarcar?

    Eu: Sim, tente às 14h.

    Bot: Feito, Felipe. Há algo mais que eu possa fazer?

    Eu: Não, obrigado. Tudo certo.

    Bot: Foi um prazer. Até mais!

    Essa conversa ilustra várias das características que um chatbot pode ter na prática: ele mantém a conversa quase como um ser humano faria, entende o motivo do contato (“vou me atrasar”) e realiza ações baseado nos meus dados contextuais (vendo minha agenda e ajudando a remarcar uma reunião). Mas como ele faz tudo isso?

    Em geral, a inteligência por trás de chatbots segue a estrutura do diagrama da Figura 1. O bot recebe uma mensagem textual (ou a transcrição automática de uma mensagem de voz) e a interpreta através do módulo NLU (do inglês natural language understanding, entendimento de linguagem natural em tradução livre). Essa interpretação consiste em usar através de métodos de processamento de linguagem natural para extrair a intenção da mensagem recebida além de eventuais entidades (nomes próprios, datas, lugares) que ajudem a especificar partes do conteúdo da mensagem.

    Figura 1 –  Diagrama típico de funcionamento de chatbots

    Na conversa acima, por exemplo, quando eu digo “Aqui é o Felipe”, o bot deveria detectar que a intenção é “identificação” e que “Felipe” é uma entidade do tipo “nome de colaborador”. Note que as intenções e entidades costumam ser bem específicas ao contexto da aplicação (nem todo nome do mundo é um nome de colaborador do DataLab!) e por isso é comum desenvolvedores de chatbots escolherem treinar seus próprios modelos de NLU apesar da existência de modelos de uso geral como o Watson (IBM), DialogFlow (Google), entre outros.

    Voltando à inteligência do chatbot, o próximo passo é usar as intenções e entidades detectadas para decidir qual ação deve ser tomada. No exemplo acima, logo após eu dizer que sou o Felipe, o bot me reconhece (e sabemos disso pois ele vê minha agenda no decorrer da conversa) e toma uma decisão: pergunta como pode me ajudar. Para isso, ele usa a entidade “Felipe”, verifica em sua base de dados contextuais se sou um colaborador do DataLab e envia essa informação ao motor de tomada de decisão. A decisão, no caso, é perguntar do que eu preciso.

    Dentro do motor de tomada de decisão, também é interessante manter memória de interações passadas. Um bom exemplo no diálogo acima é o trecho:

    Bot: Pronto, já avisei. Mas também vi na sua agenda uma reunião com Fulano às 10h. Quer que eu já tente remarcar?

    Eu: Sim, tente às 14h.

    Note que eu não preciso dizer a frase completa “tente remarcar a reunião com Fulano às 14h”; o bot entende “tente às 14h” dentro do contexto adequado justamente por manter memória do que aconteceu anteriormente na conversa.

    O funcionamento desse motor de tomada de decisão costuma ser baseado em árvores de decisão ou em algoritmos probabilísticos de classificação. Em ambos os casos, vale lembrar, o que o motor faz é usar as intenções e entidades encontradas pelo NLU (junto aos dados contextuais e à memória do bot) para decidir qual será a próxima ação a ser tomada. Essas ações (por exemplo, perguntar quem fala ou verificar a agenda do usuário) são previamente definidas pelo desenvolvedor do bot de acordo com as funcionalidades que se deseja implementar.

    Essa arquitetura que separa o bot em 2 módulos principais (o NLU e o Motor), é bem poderosa e facilmente adaptável a diversos contextos — basta retreinar o NLU e o Motor num conjunto de diálogos apropriado. O desafio, portanto, é obter dados de diálogo com marcação de intenções e entidades para treinar tanto o NLU quanto o Motor, além de definir adequadamente as ações que se espera do bot. E neste ponto, ainda não há regra de ouro; vale a experiência do desenvolvedor e o contato constante com possíveis usuários do chatbot.

    Juntando tudo, fica claro o potencial de aplicação de chatbots em diversos contextos — por exemplo, como atendentes de Call Center, SAC e canais de atendimento em geral; assistentes pessoais capazes de ajudar a gerenciar sua agenda, suas finanças ou mesmo sua dieta (!); automações de casas e escritórios (como Jarvis de “O Homem de Ferro”).

    No DataLab, desenvolvemos chatbots visando essas três aplicações: atendentes automáticos, assistentes pessoais e automação de escritório/residência. Dependendo da complexidade das interações com o usuário, podemos escolher se o NLU do bot será baseada em machine learning ou em identificação de palavras chave. Com relação ao motor de tomada de decisão, já temos módulos baseados em árvores de decisão e estamos desenvolvendo motores mais complexos que utilizem machine learning e sejam capazes de tomar decisões com ponderações mais complexas.

    Para saber mais sobre o assunto, além das referências já linkadas ao longo do texto, uma excelente opção para se aprofundar é ler a documentação de bibliotecas open source de chatbots, como o botpress, o rasa (que tem tanto um motor de diálogos quanto um NLU) e o ChatterBot.

    5 de abril de 2018