Desenvolvido pela AWS Brasil e disponibilizado gratuitamente, o SBF (Serverless Bot Framework) é uma solução para criação de chatbots versáteis e dinâmicos e que possui um modelo de preços baseado no consumo dos serviços serverless AWS, tornando-o, possivelmente, um dos chatbots mais escaláveis e baratos do mercado, enquanto entrega uma enorme gama de funcionalidades.
Arquitetura
Semelhantemente ao Lex, o SBF é 100% serverless, mas as semelhanças param por aí. O SBF é instalado através de um template do CloudFormation diretamente na conta do usuário, sem dependências externas. Isto ocorre porque enquanto o Lex é um serviço, o SBF é um framework para desenvolvimento de chatbots, permitindo ao desenvolvedor adaptar a solução de acordo com as suas necessidades ao fornecer acesso direto ao código fonte da solução na forma de funções Lambda.
Arquitetura do SBF
Principais elementos
Client Devices - O SBF expõe uma API Rest que pode ser consumida por diversos tipos de clients, embora por conveniência disponibilize uma aplicação responsiva básica compatível com Chrome, Mozilla, Safari e Edge. Para interação via voz, o SBF requer o Chrome, mas nada impede que seja criado um cliente usando serviços como o Nuances Dragon Naturally-Speaking para realizar o speech-to-text em diversos idiomas.
API Gateway - Serviço serverless que expõe a API Rest do SBF. Possui um custo extremamente baixo e uma enorme escalabilidade.
Core - Scripts escritos em NodeJS com os algoritmos usados para processar as questões e retornar as respostas. Baseado no AWS Lambda, serviço serverless de execucão de código e que é consumido sob demanda, possui custos baixíssimos (US$ 0.00001667 por chamada), sendo o primeiro milhão de chamadas sem custos.
Brain - Bucket privado que contém os arquivos de configuração do SBF.
Web app - Aplicação responsiva que permite interação com o SBF como um client (browser) tanto no desktop quanto em dispositivos móveis. Pode ser customizada pelo desenvolvedor.
Train - Scripts escritos em NodeJS com os algoritmos usados para processar o arquivo knowledge.json contido no bucket Brain sempre que houver uma mudança no mesmo. Também baseado no AWS Lambda, serviço serverless de execucão de código e que é consumido sob demanda, possui custos baixíssimos (US$ 0.00001667 por chamada), sendo o primeiro milhão de chamadas sem custos.
Cognito - Serviço serveless que gerencia o pool de usuários e é usado para autorizar as chamadas ao SBF pelo client.
Polly - Serviço serveless que usa I.A para transformar texto em voz, permitindo a interação via voz.
DynamoDB - Banco de dados NoSQL serveless, com capacidade escalável com baixos custos.(*)
(*)Cabe notar que o SBF implementa estratégias de cache para diminuir o acesso ao banco de dados (DynamoDB) e por consequência os custos associados ao mesmo,
Por trás dos panos
De acordo com o seu AWS Implementation Guide, o SBF combina dois conhecidos modelos no que chama de AMC (Aunt Maricota Classifier):
SVM - Support Vector Machine - All your Bayes are belong to us!
Proposto pelo russo Vladimir Vapnik em 1979, o SVM determina o hiperplano ótimo, no qual os elementos de mesma classe possuem a mesma distância entre si.
![]() | ![]() |
O SVM busca determinar a margem entre os elementos e a fronteira:
![]() | ![]() |
As distâncias são verificadas | Os vetores de suporte são encontrados durante o treinamento |
Bag of words ou bag of bigrams:
Um bag-of-words é a representação do texto que descreve a ocorrência das palavras dentro de um documento e envolve duas coisas:
Um vocabulário formado por palavras conhecidas
Uma forma de quantificar a presença das palavras conhecidas.
No SBF a construção do vocabulário é obtida através do agrupamento das palavras ou bag of bigrams - uma palavra, um "gram", duas palavras "bi-grams" e três palavras, "trigrams". No exemplo abaixo vemos como este processo é feito:
Porque toda a carne é como a erva,
1. Aplicam-se stopwords
Porque toda carne como erva,
2. Criam-se grams, bigrams e trigrams
grams | bigrams | trigrams |
porque | porque toda | porque toda carne |
toda | toda carne | toda carne como |
carne | carne como | carne como erva |
como | como erva | |
erva |
Combinando diversos algoritmos, o SBF rapidamente analisa a questão do usuário e compara com os intents cadastrados no knowledge, aumentando o índice de sucesso na interpretação do texto sem recorrer a técnicas complexas como NLU, permitindo ainda análise de sentimento, múltiplos intents por questões e múltiplas respostas possíveis.
Componentes - O Brain
Cada instalação do SBF representa um único chatbot. Dois buckets são criados pelo CloudFormation, um para a aplicação responsiva e um para o Brain, o qual contém arquivos de configuração que definem a capacidade do chatbot de compreender questões e prover respostas.
Conteúdo do Brain
Dentre os arquivos de configuração do chatbot, temos o knowledge, o qual contém os intents e as possíveis respostas a serem enviadas para o usuário. Sempre que um novo knowledge é atualizado, os arquivos brain-amcClassificationsimpl.json, brain-amcClassificationImpl.pgk, confusion-matrix.json e word-distribution.csv serão atualizados automaticamente. O SBF não providencia uma interface administrativa para gestão do knowledge (ainda), mas é possível criar uma solução com JSONSchema para este fim, como o CMS da iBlue Consulting.
knowledge.json
Neste arquivo do Brain ficam as principais informações sobre o chatbot, incluindo sua saudação, os intents que ele reconhece, as respostas estáticas e as referências a rotinas externas e seus parâmetros que serão coletados pelo SBF durante a conversação com o usuário.
{ "lastUpdated": "05-08-2018 17:58", "stopWords": [ "a", "o", "para", "que", "é" ], "analysers": { "quantitativeWords": [], "sentiment": { "ROMANCE": [] }, "negativeWords": [ "não", "nunca" ], "qualitativeWords": [ "bom", "excelente" ] }, "brainName": "my-first-brain", "version": "1.0.0", "i18n": { "errorMessage": { "speech": "Ops, não entendi o que você disse", "text": "Ops, não entendi o que você disse" }, "nifMessage": {}, "welcomeMessage": { "speech": "Olá, como posso te ajudar?", "text": "Olá, como posso te ajudar?" } }, "knowledge": [ { "_source": { "parameters": [ { "noMatchAsk": [ { "speech": "Qual o departamento?", "text": "Qual o departamento?" } ], "validationSuccessMessage": [ { "speech": "Ok, só um minuto", "text": "Ok, só um minuto" } ], "name": "departamento", "payloadPosition": 0, "defaultValue": "SAC" } ], "arn": " arn:aws:lambda:us-east-1:123456789012:function:busca-telefone", "body": "telefone de contato", "payload": "{departamento:\"$0\"}", "response": [] }, "_intents": [ "qual o telefone de contato", "preciso falar com alguem" ], "_id": "100" } ] }
Exemplo de arquivo knowledge.json
Note que o intent de id 100 (telefone de contato) processará dinamicamente a pergunta do usuário, mas para isto ele necessita que antes seja informado o nome do departamento com o qual deseja-se falar. Neste caso o chatbot perguntará ao usuário "Qual o departamento?". Após entrar com a informação necessária, o SBF executará o código Lambda definido pelo ARN arn:aws:lambda:us-east-1:123456789012:function:busca-telefone, o qual aciona código que usa o parâmetro enviado para buscar num catálogo online o número desejado.
O knowledge também é capaz de responder questões de maneira estática, como por exemplo:
{ "_source": { "response": [ { "speech": "Veja o que sei responder.", "text": "Qual seu nome< br />Previsão do tempo< br />Desbloquear senha." } ], "body": "ajuda" }, "_id": "2", "_intents": [ "ajuda", "me ajuda", "help", "o que voce sabe", "me responda algo" ] }
Trecho de um knowledge com respostas estáticas que pode incluir código HTML para formatar as questões
Se mais de uma resposta estática for registrada, o SBF selecionará uma delas de forma aleatória de forma semelhante ao Siri® da Apple Inc, a qual varia respostas para uma mesma pergunta (tente dizer para Siri "open the pod bay doors" repetidamente e observe os resultados).
Aplicação responsiva
O SBF fornece um client responsivo com suporte a multimídia, incluindo capacidade de exibir vídeos, interação via voz e até tirar fotos. Este último recurso possibilita ao chatbot fazer identificação do usuário via reconhecimento facial, com uma pequena ajuda do fantástico Rekognition. A interface pode ser customizada pois seu código é aberto e facilmente modificável por um desenvolvedor.
Suporte multimídia em ação
Também é possível devolver respostas como botões, facilitando a interação em dispositivos móveis. Neste caso a resposta (HTML) deve conter tanto a informação sobre o formato, quanto o comportamento. No exemplo abaixo temos dois botões fornecendo a opção de seleção de tipo de vôo emissão de passagem aérea:
Para fornecer esta funcionalidade, a resposta deverá conter um trecho HTML semelhante ao código abaixo:
Trecho HTML a ser incluso no campo NoMatchAsk do knowledge.json que será usado pelo chatbot para solicitar o parâmetro tipoDeVoo
Ao selecionar o botão, o código simula a digitação e submissão da informação. O fluxo da aplicação segue como se o usuário houvesse digitado ou falado a opção desejada. O texto então é tratado na função apontada pelo knowledge.json para este intent e a interação pode continuar com outros detalhes. Este approach é extremamente poderoso, pois o que inicialmente é definido de forma estática pode continuar dinamicamente, mantendo-se o contexto da conversação. Através do recurso "steps" é possível controlar o ponto exato em que a conversação encontra-se:
Função Lambda que trata os steps a cada roundtrip. Note que o payload é a variável "event" recebida e atualizada.
Considerações finais
Sendo um framework o desenvolvedor possui total liberdade para implementar soluções sofisticadas, muito além do que poderia ser feito com um produto fechado. O custo é a curva de aprendizado que requer conhecimentos dos serviços AWS e sólidos conhecimentos de programação. Com algumas facilidades sendo desenvolvidas por parceiros AWS, algumas atividades devem tornar-se triviais, como editar o knowledge.json, embora uma boa dose de customização ainda precise ser desenvolvida para fornecer funcionalidades espetaculares.
Parte do formulário de edição do knowledge.json da iBlue
Num futuro artigo trataremos como usar a câmera, processar análise de sentimento, realizar reconhecimento facial, ativar serviços, enviar emails e muito mais através do SBF. Até lá, open the pod bay doors, SBF!