Para interação do usuário com o chatbot temos 3 etapas de inferência, o bot deverá entender as intenções do usuário, tomar alguma ação com respeito a essa intenção, isto é, executar uma tarefa, e por fim, dar uma resposta sobre a ação tomada. Ilustramos na figura a baixo essa interação em um alto nível. Primeiro o usuário inicia a conversa pedindo informações sobre um restaurante. O modelo infere então que a intenção do usuário é encontrar um restaurante, e que tenha as especificações de ser barato e no centro da cidade, com essas informações é possível transcrever em uma consulta para um banco de restaurantes fornecendo as especificações dadas pelo cliente. Com a resposta em mãos podemos tomar uma ação, o restaurante foi encontrado ou não foi possivel encontrá-lo? Dependendo da resposta fornecemos essa ação ao modelo, assim ele condicionalmente irá gerar uma resposta adequada para informar a ação que foi tomada.
Apresentamos na figura acima o fluxo de interação com um chatbot onde o modelo infere crenças (informações relevantes ao diálogo) ****e respostas em função da interação com o usuário, no problema sequência-sequência, cada seção inferida pelo modelo é demarcada pelo token especial <sos_X>, onde X denota a seção utterance, belief, action ou response. Com um modelo de linguagem adequado e devidamente ajustado aos dados dos especialistas, executamos inicialmente diálogos orientados a tarefas da seguinte forma: um usuário inicia um diálogo com o modelo, este é apresentado pelo modelo enclausurado pelos tokens <sos_u><eos_u>, e o modelo irá inferir as intenções do usuário no segmento <sos_b><eos_b>. Isto é, qual o domínio da intenção, quais as intenções e especificidades dessa intenção, com essa informação em mãos, transcrevemos de forma automática em uma consulta ao banco para obter as respostas solicitadas. Com a resposta do banco obtemos qual ação deve ser tomada, adicionamos esse segmento a sequência de conversa enclausurado pelos tokens <sos_a><eos_a>. O modelo então é usado para gerar a string de resposta fornecido com estas informações. Ele gera então uma sentença deslexicalizada enclausurado pelos tokens <sos_r><eos_r>, na qual o resultado da consulta ao banco de dados substituirá as entidades desta sentença. Finalmente, esta resposta gerada é devolvida ao usuário, que continua com o fluxo do diálogo.
Foram desenvolvidas duas interfaces de comunicação para que seja possível interagir com o bot. Uma interface é via Telegram, e a outra via uma página Web. Assim, é possível interagir com o bot para testar e validar seu comportamento de acordo com o treinamento realizado. O bot pode ser adicionado via Telegram usando o nome @zécariocabot.
Acima é apresentado o fluxo de informação entre diferentes artefatos implementados pelo projeto. O modelo conversacional (1) e o servidor (2) foram implementados em Python, linguagem já anteriormente escolhida para implementação dos modelos conversacionais. O servidor (2) comunica-se simultaneamente com a API do Telegram (3) (famoso aplicativo de mensagens instantâneas) e com o webchat de interface própria (4) implementado pela equipe do projeto, utilizando Javascript e a AJAX, uma metodologia frequentemente utilizada para tornar páginas web mais interativas com o usuário. Tanto o Telegram (3) como o Webchat (4) são as vias de comunicação com os usuários (5), e também de captação de respostas e envio para o servidor (2) de apoio. Algumas consultas realizadas pelo usuário requerem interações do modelo conversacional implementado com o banco de dados (6), sendo que o modelo é capaz de preencher lacunas nas respostas geradas para o usuário com os resultados adquiridos com as consultas ao banco de dados.
A interface web acessível ao usuário foi desenvolvida visando ser intuitiva, simples e agradável, semelhante aos aplicativos de mensagens entre seres humanos reais mais comuns.
Nela, o nome do atendente (chatbot), muda a cada novo atendimento, assim como ocorre em centrais de atendimentos tradicionais, ocorre uma recepção graciosa ao usuário (demonstrando receptividade), e simula uma digitação do chabot em um ritmo próximo ao de um usuário real, que é entre 100 e 200 TPM (toques por minuto).
A interface do Telegram tem sua operação de forma simplificada, para isso usamos a API de python para armazenar o historico de conversa e a cada interação, resgatamos esse historico e apresentamos ao modelo para decodificar novas intenções e respostas, estas que também por meio da API são enviadas ao usuário. No link abaixo é demonstrado um exemplo de como é feita essa comunicação entre bot e usuário:
https://github.com/ZeCariocaUnicamp/zecarioca/blob/master/telegrambot.py