O LAPPIS propôs uma arquitetura open source de chatbot para a Tais composta de diversas ferramentas integradas. A arquitetura geral do framework desenvolvido pelo Laboratório é mostrado na figura abaixo. Foi desenvolvido com a Licença AGPL3. Criamos também um boilerplate para auxiliar novos projetos de chatbots usando essa mesma arquitetura. O projeto do boilerplate pode ser acessado aqui.

Ferramentas que compõem o framework

Rasa NLU

O Rasa NLU é uma ferramenta de processamento de linguagem natural utilizado para a classificação de intenções e extração de entidades aplicadas ao Bot, ou seja, o NLU é responsável por entender o que os usuários escreveram. Isso é feito por uma comparação da mensagem do usuário com os modelos de Machine Learning, procurando inferir a intenção mais próxima da base de conhecimento. A partir daí, a saída do Rasa NLU será a intenção do usuário que enviou a mensagem, que pode ser, por exemplo, cumprimentar, despedir ou uma dúvida específica.

Rasa Core

O Rasa Core é o centro do chatbot, o que é um diferencial do Framework LAPPIS. Ele é responsável por escolher a melhor ação a ser tomada a partir do histórico da conversa e da atual intenção do usuário. Seja essa ela uma resposta dentro do contexto atual da conversa ou uma ação realizada em um novo contexto. Isso garante que o usuário esteja sempre no controle da conversa, ao invés de ser conduzido por uma árvore de decisões. Assim como o Rasa NLU, o Rasa Core utiliza Machine Learning para responder as mensagens. Para que isso seja possível, é necessário a criação das stories, que são os exemplos de intenção e resposta, ou seja, o chatbot vai escolher a melhor resposta para interagir com os usuários a partir desses exemplos de conversas implementados.

Jupyter Notebooks

Uma das maiores dificuldades ao projetar o conteúdo e diálogos de um chatbot é a construção adequada do conjunto de dados de treinamento para as intents e as stories. Jupyter Notebooks é uma aplicação web que ajuda a entender e visualizar dados e resultados de análises, facilitando a experimentação, colaboração e publicação online. O Jupyter foi a ferramenta escolhida para automatizar a análise do conteúdo do chatbot e gerar recomendações de ajustes nas intents e stories. O que nos permite antecipar os problemas de interação com o chatbot antes de colocar o conteúdo em produção.

Elasticsearch/Kibana

É impossível fazer gestão de atendimento sem entender como os cidadãos usam e se apropriam dos canais oferecidos. Conhecer as estatísticas de uso, perfis dos usuários e tendências das demandas é crucial para o sucesso permanente da estratégia. O Elasticsearch é a fundação do módulo de análise de uso do chatbot, pois nele são gerenciadas as informações coletadas das conversas. Para interpretação de todo o conteúdo coletado pelo Elasticsearch, o Kibana é a camada visual responsável por disponibilizar todos os dados por meio de dashboards, gráficos e imagens. Apresenta esses dados de forma a facilitar a interpretação.

RocketChat

O RocketChat é um software criado por uma startup brasileira que tem o objetivo de fornecer uma infraestrutura de salas de conversa que podem ser utilizadas para diversos fins. Tem recursos de conversação, repositório de documentos e API para bots. Sua interface se assemelha com a do WhatsApp ou Telegram. Seu código é livre e licenciado em MIT. No framework do assistente virtual, o RocketChat carrega a janela de conversação onde os cidadãos interagem de fato com o assistente.

Perfis que compõem o framework

Líder de produto

O líder de produto é um perfil fundamental, responsável por orientar o time em relação à aplicação prática do assistente no caso concreto. É o líder de produto que vai estar mais próximo ao órgão para compreender como o assistente virtual se encaixa na estratégia de atendimento da organização. A partir disso, define o escopo da base de conhecimento do bot e prioriza as principais demandas de evolução de conteúdo e novas funcionalidades.

Engenheiro de software

O time de Engenharia de Software tem como principal objetivo manter e evoluir o framework. Garantir a integração entre as partes e a estabilidade da solução tecnológica. Sempre que uma das partes evolui nas suas comunidades de origem (ex: Rasa, RocketChat, etc) é papel desse time avaliar os impactos da atualização dos componentes no framework Lappis. Também é o time que garante a entrega contínua, ou seja, o processo automatizado de atualizações dos ambientes de homologação e produção.

Cientista de dados

O cientista de dados tem o papel de analisar os dados relativos ao conteúdo de interação do assistente virtual e as estatísticas de monitoramento. Seu papel é importante para identificar gargalos de pontos de melhoria nos outros módulos. Esse tipo de análise é capaz de identificar quando uma determinada intenção do usuário não está sendo adequadamente interpretada pelo aprendizado de máquina e levantar esse alerta para o time de conteúdo, que pode produzir textos mais claros e para o time de engenharia que pode trabalhar em uma melhor calibragem do aprendizado de máquina. Complementarmente, a análise dos dados de acesso e interação pode produzir novas demandas de cruzamento e visualização de dados para serem implementadas nas ferramentas de visualização dos dados, como o Kibana. Esse tipo de análise é de especial importância para que a ferramenta produza dados que serão agregados nos indicadores de melhoria de atendimento do órgão.

Roteirista de chatbot

O roteirista de bot tem a responsabilidade de adaptar os conteúdos das políticas fornecidos pelo orgão para que se adequem ao formato conversacional do bot. Para isso ele é responsável por definir a persona do bot a partir de características básicas de personalidade (como empatia, objetividade, nível do vocabulário etc). Uma vez definidas e pactuadas com o órgão, essas características servem de base para a formulação dos textos das respostas disponíveis no banco de conhecimento da assistente virtual. Também é papel do roteirista interpretar os dados de interação e fazer melhorias nos conteúdos que eventualmente não estiverem sendo compreendidos pelos usuários.

Especialista em UX

A pessoa responsável pela experiência de usuário (UX) trabalha lado-a-lado com a equipe de roteiristas. Especialistas de UX atuam para otimizar a experiência de conversa e reforçar a ideia de uma interação que flui naturalmente. Garantem que sequências de pergunta-resposta se desenvolvam de forma harmônica tanto dentro do mesmo tópico, quanto de forma global na base de conhecimento.

Descrição da Arquitetura

A arquitetura da TAIS é dividida pode ser dividida em 4 submódulos principais:

  • (A) Trainer
  • (B) Bot
  • (C) Business Analytics
  • (D) Distribution

Trainer

Por padrão, em bots desenvolvidos com Rasa, os arquivos de treinamento e modelos estão juntos aos arquivos de configuração referentes à forma como o bot será executado, como scripts de configuração e utilização do bot.

Dentro da TAIS, foi feito um esforço para desacoplar a parte de gerenciamento de conteúdo e treinamentos, da parte de utilização do bot.

Analisando a lógica de funcionamento de chatbots Rasa, percebeu-se que os esforços aplicados no desenvolvimento de um bot estão aplicado em duas categorias:

  • Esforços aplicados na definição da base de conhecimentos do bot e na configuração da estratégia de treinamento. As atividades desenvolvidas estão focadas na configuração correta dos parâmetros da rede, em um bom desenvolvimento dos diálogos, fluxos de interação e personalidade do bot, etc. Resumidademente, ao fim deste conjunto de esforços, o objetivo é garantir a geração de um bom modelo, que reflita bem as características do contexto, possua uma boa acurácia e seja confiável.

  • Atividades focadas na lógica de execução e utilização do bot. Aqui há uma maior preocupação com a lógica de negócio e o desenvolvimento é focado em definir os canais de comunicação que serão utilizados, estratégias de escalabilidade e configuração do bot.

Uma vez que a responsabilidade por estes dois conjuntos está desacoplada, é mais fácil criar estratégias para versionamento do conteúdo, escalabilidade e distribuição dos serviços utilizados.

Dentro da arquitetura da TAIS utiliza-se serviços baseado em Docker, sendo assim existem dois serviços, cada um sendo responsável por uma das categorias acima.

A imagem docker utilizada no serviço de Trainer é construída a partir do Dockerfile abaixo. É nesta imagem onde estarão os diretórios de intents e stories do Rasa que formam a base de conhecimentos do bot. Também é nesta imagem onde estarão os modelos treinados.

FROM lappis/botrequirements:latest

COPY ./coach /coach
COPY ./scripts /scripts

RUN mkdir /src_models

WORKDIR /coach

RUN make train

RUN find /. | grep -E "(__pycache__|\.pyc|\.pyo$)" | xargs rm -rf

A imagem lappis/botrequirements:latest possui todas as dependências Rasa pré instaladas e é utilizada como base para este serviço e o serviço de bot, explicado na próxima seção deste documento.

Uma vez que os parâmetros da rede estão bem definidos e o dataset do bot está finalizado, o processo de treinamento será realizado apenas uma vez, e o mesmo modelo será utilizado sempre que se desejar executar aquele estado de treinamento. Com essa abordagem o versionamento dos modelos do bot é feito a partir das tags do docker, sendo que cada tag da imagem de trainer reflete uma versão da base de conhecimentos e das configurações de rede utilizadas em um determinado momento.

Isto permite criar facilmente estratégias como a representada no diagrama acima onde se tem dois bots que utilizam a mesma versão de modelo, sendo que um dos bots utiliza o Telegram como canal de interação e o outro utiliza o RocketChat como canal. Para a implementação bastaria que houvessem dois serviços com lógicas de conexão diferentes que utilizam a mesma imagem de trainer como base.

Bot

O Bot se utiliza dos modelos pré-treinados do trainer e do Rasa para execução do bot. Este módulo é utilizado também através de um serviço executado à partir de um container Docker. A imagem utilizada neste serviço é gerada à partir do Dockerfile abaixo:

FROM lappis/coach:latest as coach

FROM lappis/botrequirements:latest

COPY ./bot /bot
COPY --from=coach /src_models/ /models/
COPY ./scripts /scripts

WORKDIR /bot

ENV ROCKETCHAT_URL=rocketchat:3000         \
    MAX_TYPING_TIME=10                     \
    MIN_TYPING_TIME=1                      \
    WORDS_PER_SECOND_TYPING=5              \
    ROCKETCHAT_ADMIN_USERNAME=admin        \
    ROCKETCHAT_ADMIN_PASSWORD=admin        \
    ROCKETCHAT_BOT_USERNAME=tais           \
    ROCKETCHAT_BOT_PASSWORD=tais           \
    ENVIRONMENT_NAME=localhost             \
    BOT_VERSION=last-commit-hash           \
    ENABLE_ANALYTICS=False                 \
    ELASTICSEARCH_URL=elasticsearch:9200   

RUN find . | grep -E "(__pycache__|\.pyc|\.pyo$)" | xargs rm -rf

Quando se utiliza um Dockerfile a linha definida com a palavra FROM indica a imagem a ser utilizada como base. A partir da imagem de base, os comandos seguintes serão aplicados sequencialmente para ao fim gerar a imagem final.

No Dockerfile acima pode-se notar que a palavra FROM foi utilizada duas vezes, o objetivo disto é utilizar um recurso do docker chamado multi-stage build.

O que a linha FROM lappis/coach:latest as coach faz é criar uma referência à imagem lappis/coach com o nome de coach. Depois disso a imagem de base é redefinida na linha FROM lappis/botrequirements:latest como sendo a imagem de requirements onde já estão instaladas as dependências do Rasa necessárias para a execução do bot. Como a referência à primeira imagem de base foi definida como coach, na linha COPY --from=coach /src_models/ /models/ o diretório de modelos pode ser copiado da primeira imagem de base para a segunda imagem de base. O resultado disso é que a imagem final será criada a partir da imagem lappis/botrequirements:latest, mas dentro dela estarão os modelos copiados da imagem lappis/coach:latest.

Business Analytics

O foco das ferramentas e estratégias utilizadas na camada de Analytics é aferir e melhorar a qualidade do bot, levando em conta que a qualidade nesse contexto está relacionada às métricas de acurácia do bot e desempenho durante a interação com o usuário.

O primeiro conjunto de ferramentas utilizado para tal é uma stack ElasticSearch, com o uso da ferramenta Kibana para visualização dos dados. Esses serviços também são executados utilizando containers Docker.

As imagens abaixo exemplificam dashboards de visualização de dados da TAIS.

Para a Stack de Analytics com o ElasticSearch é utilizado um script de tracker que sobreescreve o tracker de dados padrão do Rasa, e faz com que toda vez que uma mensagem seja trocada entre o bot e o usuário seja criado uma instância de um objeto de mensagem e este seja inserido no ElasticSearch.

Outras das ferramentas utilizadas é o Jupyter, ele é utilizado para avaliar a acurácia das intents e stories definidas. Neste outro documento são explicados os parâmetros de avaliação e a utilização dos notebooks na TAIS.

Para utilização dos notebook é utilizado um serviço docker que, ao rodar, terá uma porta compartilhada entre o container e o computador e dará acesso aos códigos que executam as métricas. A execução e análise dessas métricas ainda é feita de forma manual, e deverá ser feita subjetivamente de acordo com o contexto de cada bot.

Distribution

A última camada é a camada de apresentação e distribuição. É a camada onde acontecerá o contato direto do usuário e o meio por onde se dará a experiência de interação com o bot.

O Rasa provê nativamente conectores para algumas ferramentas como: RocketChat, Slack, Telegram, Mattermost e Twillio.

Na TAIS, é utilizado o RocketChat como canal principal de interação. Uma vez que se configura um agente de conversação dentro do RocketChat, é possível gerar um código javascript que permite a renderização de uma janela de conversação com o bot. Essa abordagem permite uma flexibilidade muito grande, uma vez que quando o bot está propriamente configurado, este código pode ser injetado em qualquer pagina que será carregada pelo usuário, que não precisará criar uma conta ou acessar diretamente o servidor do RocketChat para conversar com o bot.