Será que seu chatbot é bom mesmo?

Renato dos Santos Rosa Leal
As Máquinas que Pensam
8 min readNov 17, 2017

Criar um chatbot utilizando machine learning se tornou uma tarefa muito simples hoje em dia: qualquer pessoa com uma conta na IBM Cloud e um serviço do Watson Conversation pode fazê-lo em questão de minutos.

No entanto para construir um chatbot bom mesmo muito mais do que saber utilizar uma ferramenta específica é necessário: você precisa pensar na UX, no treinamento e evolução do chatbot, na metodologia, e muitos outros fatores.

Um fator que é muito importante e muitas vezes é feito de forma "pobre" ao desenvolver chatbots são os testes.

Depois de algumas horas ou dias de trabalho a pergunta que fica é: será que o trabalho que estou realizando está bom o suficiente? Como posso avaliar o esforço realizado? E como posso melhorá-lo?

Esse artigo responde o COMO responder as perguntas mencionadas acima e é acompanhado de um Jupyter Notebook em python com os scripts necessários para automatizar essas análises.

Diferentes tipos de testes

Testar um chatbot não é disponibilizar uma página para que um grupo de usuários possa enviar perguntas sem qualquer tipo de padronização e coletar as perguntas realizadas. Pelo menos não é só isso.

Existem várias técnicas as quais podemos utilizar para testar o nosso chatbot, sendo algumas delas:

  1. Utilizar "testes unitários" para verificar se o fluxo de respostas não foi quebrado. Aqui basta criar um script com uma sequência de inputs e verificar se as respostas continuam as mesmas.
  2. Fazer sessões de "navegação assistida" junto a usuários para coletar a experiência do mesmo no end-to-end.
  3. Se o exemplo acima não for possível podemos então pelo menos pedir feedbacks ao término de cada sessão e depois analisá-los para encontrar falhas na experiência.
  4. Podemos ainda avaliar o nível do entendimento do nosso modelo de Machine Learning para garantir que pelo menos ele entende corretamente o que os usuários estão perguntando mesmo que os fluxos ainda não estejam corretos.

Vamos considerar então que o primeiro teste é uma tarefa de TI, o segundo e terceiro ficam a cargo do pessoal de UX e o quarto seria responsabilidade do engenheiro de machine learning ou data scientist (como você queira chamar).

Esse artigo foca apenas em avaliar (e melhorar) o seu modelo de machine learning e por mais que ele utilize várias técnicas para fazer as análises ainda existem muitas outras que podem ser aplicadas.

Conceitos importantes antes de começar

Para não deixar o texto muito grande vou supor que você já conhece os seguintes termos: acurácia, precisão, recall, matriz de confusão, falsos positivos e negativos.

PS: Se você não os conhece sugiro começar a leitura dessa série de artigos aqui e somente depois voltar para esta análise.

A análise

A análise que faremos está divida em três tópicos da seguinte forma:

  1. Análise exploratória sobre os exemplos utilizados para treino.
  2. Análise exploratória sobre os logs coletados.
  3. Análise a partir de métricas de machine learning.

Passaremos brevemente por cada uma explicando os conceitos macro utilizados. Uma explicação mais detalhada e o código para rodar tais análises se encontram no notebook disponibilizado no fim deste artigo.

Parte 1.1 — Distribuição dos Exemplos de Treinamento

A análise do modelo de machine learning começa com o entendimento de que um chatbot é muitas vezes uma tarefa de NLP e um problema de classificação. E deste modo podemos utilizar as mesmas técnicas e conceitos apresentados na avaliação de classificadores para testar o nosso chatbot.

Incialmente devemos obter um melhor entendimento sobre os dados que temos em mãos e o comportamento dos mesmos, para isso verificamos a distribuição da quantidade de exemplos por classe (intenção):

O principal insight que podemos tirar desse tipo de gráfico é que existe uma discrepância grande no número de exemplos que utilizamos para treinar cada intenção. Isso impacta na eficácia do nosso modelo, então devemos avaliar:

será que podemos quebrar essas "intenções gigantes" em intenções menores ou então podemos aumentar o número de exemplos das restantes?

Aqui vale um ponto importante: na "arte" de construir um chatbot não existe certo e errado! Cabe a cada um ter em mente o que cada decisão tomada acarreta.

Outro ponto que podemos verificar com esse mesmo gráfico é a existência de intenções com menos do que o mínimo sugerido de exemplos (10).

Parte 1.2 — Repetições de Exemplos em Diferentes Classes

A segunda análise a ser feita com base nos exemplos utilizados para o treinar o bot é verificar a existência de uma mesma frase em mais que uma intenção. Isso pode ser um grande indicativo que suas intenções estão confusas ou que falta alinhamento entre as pessoas que estão treinando o seu bot.

Uma análise mais avançada deste ponto seria verificar o nível de similaridade entre duas frases mas como essas técnicas utilizam conceitos de NLP que ainda não foram explicados então deixarei de fora por enquanto.

Parte 2.1 — Distribuição dos Logs

A terceira parte da nossa análise olha para os inputs recebidos pelo nosso bot durante os testes e salvos nos logs (é válido lembrar que testes executados dentro da interface do conversation não serão incluídos aqui, apenas aqueles realizados em interfaces externas).

Poderíamos olhar apenas para a confiança geral do chatbot no entanto essa métrica pode ser enganosa (como explicado no notebook) e depender dela pode trazer riscos para o projeto.

Uma análise melhor é utilizar o gráfico abaixo para priorizar aquelas intenções com muitas requisições e que não atingem um nível mínimo de confiança pré-estabelecido.

No gráfico acima as interações classificadas como "irrelevantes" são a escolha óbvia para início da análise mas depois poderíamos priorizar esforços com as intenções #pedido_nao_recebido e #segunda_via uma vez que estão no top 10 de intenções e possuem uma confiança "baixa" (abaixo de 60%).

Parte 2.2 — Outras Análises Baseadas no Log

Podemos ainda utilizar o log de interações para priorizar nossos esforços selecionando aquelas interações que foram submetidas múltiplas vezes e que tiveram um nível ruim ou médio de confiança.

Também podemos utilizar todas as interações que tiveram uma confiança muito baixa (abaixo de 30% por exemplo) e iniciar o "re-treino" com essas interações.

É esperado que essas "interações ruins" impactem mais o modelo uma vez que são exemplos mais distantes daqueles utilizados no treino.

Exemplos classificados corretamente com 95% de confiança normalmente são muito próximos a aqueles já existentes e não trazem ganho tão expressivo quanto utilizados no re-treino.

Parte 3 — Análise a partir de Métricas de Machine Learning

A última análise que podemos fazer é aquela que utiliza os conceitos de precisão e abrangência para dar uma visão geral de como o seu chatbot se comporta e onde ele se confunde.

[Se você não lembra o que é precisão ou abrangência então leia este post]

Para realizar essa tarefa temos que seguir alguns passos:

  1. Dividir o chatbot em dois: um conjunto de treinamento e outro de testes seguindo uma proporção de 80/20.
  2. Treinar um novo chabot com os 80% dos exemplos extraídos do original.
  3. Utilizar os 20% dos exemplos restantes para fazer submissões ao novo bot.
  4. Comparar o resultado retornado com a intenção original e anotar.
  5. Deletar o chatbot criado para testes.
  6. Executar os passos de 1 a 5 outras duas vezes.

Com essas tarefas realizadas, algo que não deve passar dos 20 minutos de processamento teremos então os dados necessários para montar o que chamamos de matriz de confusão:

Com base na matriz de confusão podemos então extrair as métricas de precisão, abrangência (recall) e F1 para que possamos realizar analises comparativas com o passar do tempo.

Podemos então dizer que nosso bot tinha um F1 de 70% na primeira versão e de 80% na segunda, o que é muito mais representativo do que apenas confiar na confiança retornada pelos logs!

E porque rodar três vezes?

Você provavelmente ficou se perguntando: porque rodar três vezes a mesma análise como indicado no passo 6?

O que acontece é que ao rodar apenas uma vez os passos acima a análise fica muito dependente da divisão 80/20 e se ela selecionou exemplos bons ou ruins. Ao realizar essa divisão mais vezes e tirar a média dos resultados nós minimizamos esse bias da seleção.

Por que não rodar 100 vezes então?

Vale lembrar que cada submissão realizada para executar esses testes conta dos seus créditos e ao ultrapassar a camada inicial (10.000 chamadas/mês) você pode começar a ter custos.

Próximos Passos e Como Melhorar a Análise

Como próximos passos pretendo incluir técnicas de NLP para verificar o nível de similaridade dos exemplos utilizados para treino.

Também colocarei outra opção para realizar a divisão dos exemplos de teste e treino utilizando uma técnica conhecida como K-Fold que diminui o impacto da seleção randomizada.

Se você fizer alguma alteração no código pra melhor ou inserir novas análises me avise por aqui, pelo linkedin ou pelo github mesmo! Qualquer sugestão de melhoria ou adição de funcionalidades ao código são super bem vindas!

Vamos compartilhar pra melhorar os bots por aí.

Show Me The CODE!

Para utilizar o código das análises apresentadas você deve instalar o python e jupyter notebooks na sua máquina ou então utilizar a plataforma de ciência de dados criada pela IBM que permite processar todas essas tarefas na nuvem com um poder computacional muito maior. Para isso basta instanciar a sua versão do Data Science Experience.

Faça os seguintes passos:

  1. Acesse o DSX.
  2. Crie um novo projeto seguindo os passos dessa página.
  3. Na aba Assets clique em criar um notebook e selecione a opção From URL.
  4. No campo Notebook URL insira essa url do meu github.
  5. Dentro do notebook altere as credenciais para o seu Conversation.

Pronto! Você já pode realizar a análises do seu chatbot e descobrir como melhorar o entendimento dele.

--

--