03 Aug
03Aug


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. 


Qual a melhor fronteira? A ou B?
E se novos elementos forem introduzidos?


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!

Comentários
* O e-mail não será publicado no site.
ESTE SITE FOI CRIADO USANDO