DEV Community

Pode me chamar de Juscélio Reis
Pode me chamar de Juscélio Reis

Posted on • Originally published at Medium on

Framework para desenvolvimento de Bots: Computação cognitiva

A computação cognitiva integra uma nova classe de problemas. Basicamente lida com situações complexas, ambíguas e incertas; em em outras palavras problemas humanos!

Esse artigo integra a série Framework para desenvolvimento de Bots. Mas agora vamos conversar sobre o que seria computação cognitiva, a parte inteligente que vai estar no seu software.

Framework para desenvolvimento de Bots:

Teoria

Antes de começar com exemplos e aplicações, precisamos definir um conceito comum sobre o que é computação cognitiva, o que mais observo são combinação de letras e siglas que está associada a inteligência artificial, mas nem todas estão ligadas a computação cognitiva. O conceito que vou apresentar não foi de minha autoria, foi de um consorcio de pessoas muito mais inteligentes e capaz para definir algo tão complexo e ao mesmo tempo maravilhoso! Então, senta que lá vem história:

Em meados de 2014 um grupo de especialistas, com formações bem eclética, de diversas instituições de ensino, além de grandes empresas de tecnologia resolveram sentar e tentar definir o que seria computação cognitiva e qual seria a sua diferença para outros tipos de inteligência artificial, porem era importante que esse termo não fosse proprietária, podendo ser utilizada como referência pela indústria de tecnologia da informação (TI), pesquisadores, mídias e seus usuários. Para mais informações podem acessar o site Cognitive Computing Consortium. Ou se preferir segue um resumo sobre inteligencia artificial feito para ajudar a entender o seu conceito, mais informação podem ler o artigo Demystifying Artificial Intelligence. What is Artificial Intelligence & explaining it from different dimensions.

Desmitificando a inteligencia artificial

Mas qual é a definição de cognitivo? Até agora só está me enrolando.

Cognitivo

Cog·ni·ti·vo 1. Que se refere à cognição ou ao conhecimento.

2. psicol Diz-se de estados ou processos que se relacionam à identificação de um conhecimento dedutível e à solução de tarefas e problemas específicos.

3. ling Que se refere ao processo mental de percepção, juízo, memória e raciocínio.

Definido computação cognitiva

Basicamente a computação cognitiva é caracterizada pela confusão; ops! Pelas situações complexas que são incertas e ambíguas. Meu exemplo favorito é a forma que mineiro fala, olha só:

Mineiro A pergunta ao mineiro B: Pó pô pó?

Mineiro B responde ao mineiro A: Pó pô.

https://medium.com/media/9e40d50d476983ee70391aa9337ca921/href

Como eu posso explicar a uma máquina que o primeiro significa Pode e o segundo significa mesmo. Se até mesmo para alguns brasileiros, principalmente de outras regiões, não consegue entender esse exemplo, justamente por não conhecer o contexto por trás dessa expressão. Ou melhor, tenho outro exemplo formidável, a forma que minha esposa se expressa quando quer pedir para eu pegar alguma coisa.

Esposa: Pegue o trem do lado da coisa lá?

Eu: Pegar o que?

Esposa: Aquela coisa lá, com o trocinho coisado.

É um exemplo real. E sim faz sentido! Se não acredita veja esse vídeo aqui:

Agora como explicar a uma máquina, que no português temos várias formas de dizer a mesma coisa. Viu como esse tipo de situação é complexa, ambígua e incerta. Depende do contexto dos interlocutores envolvidos na conversa, e pode ainda sofrer mudanças, já que somos seres inteligentes e estamos sempre aprendendo novas habilidades.

Para responder à natureza fluida da compreensão dos problemas dos usuários, o sistema de computação cognitiva oferece uma síntese não apenas de fontes de informação, mas também de influências, contextos e ideias. Sendo assim esse sistema inteligente (cognitivo) deve responder com o que considera ser o melhor naquele momento, não o que seria o correto. Podemos afirmar aqui que não existe certo e errado, existe apenas eu acho! E sim, muitas pessoas estão aí se gabando que estão utilizando as tecnologias mais revolucionarias, mas que na raiz da solução estão pagando, ou construindo, sistemas para dizer o que acha com um grau de certeza!

A inteligência por trás dessa tecnologia está na forma que conseguimos organizar o caos, percorrendo coleções maciças de informações diversas para encontrar padrões e, em seguida, aplicam esses padrões para responder às necessidades do momento.

Um mundo globalizado como o nosso e que está cada vez mais conectado e ubíquo como o nosso. Precisamos rever a natureza dos relacionamentos entre pessoas e ambiente virtual, cada dia mais difuso onde tecnologias podem agir como um assistente, um treinador para o usuário ou podem atuar virtualmente autonomamente em muitas situações de solução de problemas, resultando em respostas indicativas, sugestiva, instrutiva ou simplesmente divertidas.

Para definir um sistema como cognitivo precisamos observar quatro características, sendo elas adaptativo, interativo, interativo e com estado e contextual.

Adaptativo

Sistemas cognitivos devem ser capaz de aprender com as mudanças, que os requisitos evoluem. Devem ser projetados para serem alimentados com dados dinâmicos e em tempo “quase” real.

Interativo

Devem ser simples para o usuário, deixando esses usuários confortáveis para dizer qual a sua necessidade. Os sistemas podem interagir com outros processadores, dispositivos e serviços em nuvem, bem como com pessoas.

Iterativo e com estado

Devem ajudar na solução de um problema, fazendo perguntas ou encontrando informações adicionais diretamente na fonte de dados. Eles precisam “lembrar” as interações anteriores e retornar informações adequadas para a aplicação específica naquele momento.

Contextual

Eles devem entender, identificar e extrair elementos contextuais, como significado, entidade, sintaxe, hora, local, domínio apropriado, regulamentos, perfil do usuário, processo, tarefa e objetivo. Eles podem recorrer a várias fontes de informação, incluindo informações digitais estruturadas e não estruturadas, bem como entradas sensoriais (visual, gestual, auditiva ou fornecida pelo sensor).

Os sistemas cognitivos coexistirão com os sistemas legados. Muitos sistemas cognitivos se basearão nos recursos de TI atuais. Mas a ambição e o alcance da computação cognitiva são fundamentalmente diferentes. Abandonando o modelo de computador como dispositivo, ele busca levar a computação a uma parceria fundamental mais próxima nos esforços humanos.

Os sistemas cognitivos diferem dos aplicativos de computação atuais, pois vão além da tabulação e cálculo com base em regras e programas pré-configurados. Embora sejam capazes de realizar tarefas da computação básica, eles também podem inferir e até raciocinar com base em objetivos mais amplos.

Para quem leu o primeiro artigo da serie um dos requisitos, não negociáveis, da nossa consultoria é implementar um bot conversacional utilizando o serviço da IBM o IBM Watson Assistant. Vamos entender o que seria esse tal de assistente vulgo bot. Seria um serviço de inteligencia com a finalidade ajudar sua marca a estar presente em qualquer dispositivo, aplicativo ou canal. Dessa forma o assistente pode se conectar aos recursos de engajamento do cliente que você já usa para entregar uma experiência de resolução de problemas unificada e envolvente para seus clientes, exemplo muito popular no Brasil seria o Whatsapp e Facebook.

Basicamente o assistente atual como um programa que interpreta a entrada do usuário, qualifica essa entrada para saber onde redirecionar o usuário e o que responder.

Teoria aplicada à prática

Agora vamos para a parte divertida, ou seja, vamos construir nosso assistente. Lembrando o nosso objetivo com essa parte pratica

  • Planejar um diálogo
  • Criando um assistente
  • Criando uma habilidade de dialogo (Dialog Skill)
  • Definir intents (intenções) customizados
  • Incluir uma entidade padrão e usá-la no diálogo para localizar padrões na entrada do usuário
  • Incluir entidades para tornar suas respostas mais específicas
  • Incluir nós de diálogo que podem manipular suas intenções
  • Juntando tudo em um diálogo

Planejar um diálogo

Antes de sair fazendo um bot conversacional é necessário ter mapeado o que deseja fazer. Em outras palavras precisamos de um serviço que ajude a criar um fluxo de conversa com início, meio e fim (é desejável que seja feito por um especialista, comumente chamado de UX Writer, já que é a parte mais complexa do desenvolvimento de um bot).

Particularmente gosto da ferramenta botsociety, pois possui uma camada de serviço gratuita. É excelente para demonstrar o bot antes de sair fazendo o fluxo na ferramenta da IBM. Uma das features que mais gosto é poder exportar um vídeo da a conversa:

Exemplo de um vídeo demonstrando como seria a conversa no whatsapp

Além de conseguir mapear fluxos alternativos e construir um fluxograma automaticamente de acordo com o que você for criando seu mockup, e possui ainda uma funcionalidade para realizar pesquisa e teste de usabilidade.

Fluxograma criado automaticamente

Exemplo da pesquisa de usabilidade

Criando um assistente

Uma vez que temos o fluxo mapeado vamos iniciar na o nosso assistente na plataforma da IBM. Se não possui uma conta é preciso criar uma conta:

O Watson Assistant (antigo Watson Conversation) é a API do Watson para a criação e desenvolvimento de interfaces conversacionais, ou chatbots. Este serviço possui uma interface simples e intuitiva para que profissionais não-técnicos possam usufruir de todos os recursos disponíveis, de forma simples e rápida.

Crie sua conta da IBM Cloud. Feito isso vamos precisar criar nosso primeiro assistente, segue um vídeo para ajudar no processo de criação.

Criando um serviço Watson Assistant

Para criar um assistente precisamos procurar os serviços do watson, depois basta procurar pelo serviço Watson Assistant. Existe uma camada gratuita, com 10.000 mensagens recebidas de forma gratuita por mês. Este número somente é descontado através das chamadas de API. Além disso, é possível criar até 5 skills diferentes, com 100 intenções, 200 entidades e 100 nós de diálogo cada. No final da pagina é possível editar o nome do serviço. É possível utilizar o tutorial oficial da IBM (Criando um assistente).

Criando uma habilidade de dialogo (Dialog Skill)

Uma habilidade seria um conjunto de conhecimento em uma lógica treinada (baseada no cenário do seu negócio). É possível ter mais de uma habilidade para um assistente.

Um assistente é um conjunto de habilidades que podem ser agrupados em um único serviço para poder lidar com diversos cenários. No nosso caso é onde vamos criar o atendimento da secretaria da Escola do Futuro. E a habilidade que vamos construir seria a de um secretário.

Criando um assistente e uma habilidade

É possível utilizar o tutorial oficial da IBM (Criando uma habilidade de diálogo) também.

Definir intents (intençoes) customizados

Uma intent ou intenção representa o desejo do usuário, o que o usuário deseja quando está enviando uma mensagem. No caso do Watson Assistent existe um padrão de nomenclatura para intenções iniciando com #.

E para conseguir treinar essa intenção e indicar para o bot como faz para identificar a intenção do usuário, precisamos dar alguns exemplos. Exemplo:

Intenção: #sim

Exemplos:

sim

s

yeap

positivo

Como o exemplo acima é possível notar que existem diversas formas de dizer a mesma coisa (intenção), por isso é preciso treinar com exemplos, e com o tempo precisamos voltar nos exemplos e atualizar os mesmos.

Criando intenções customizadas

É possível utilizar o tutorial oficial da IBM (Definindo intenções) também.

Incluir uma entidade padrão e usá-la no diálogo para localizar padrões na entrada do usuário

Essas são entidades comuns criadas pela IBM que podem ser usadas em qualquer caso de uso. Eles estão prontos para uso assim que você os adicionar. É importante ressaltar que não é possível editar essas entidades.

Habilitando uma entidade pré definida

É possível utilizar o tutorial oficial da IBM (Criando entidades) também.

Incluir entidades para tornar suas respostas mais específicas

Entidades representam objetos da intenção, seria um valor que queremos retirar do meio da oração, ops mensagem que o usuário enviou.

Uma entidade possui um tipo, um valor e pode possuir um sinônimo ou um padrão. No caso abaixo estamos criando uma entidade contato com um valor CpfCnpj cujo padrão é um regex para identificar CPF (sim, sim, o cnpj ainda não está no exemplo abaixo).

Também é possível criar uma entidade cujo valor pode possuir sinônimos, como é o exemplo do menu. Nome da entidade menuUra, valor conhecerEscola, sinônimos: conhecer mais sobre a escola, conhecer escola, informação da escola. Qualquer um desses termos que o usuário escrever irá corresponder a entidade menuUra com o valor conhecerEscola.

Criando uma entidade personalizada

É possível utilizar o tutorial oficial da IBM (Criando entidades) também.

Juntando tudo em um diálogo

Agora que já foi criado as entidades e as intenções vamos juntar com o diálogo. Observe que um diálogo em branco sempre vai ter 2 caixas uma chamada Bem-vindo e outra Em outros casos, conforme imagem abaixo_._

Vamos começar criando um folder e dar o nome de Acolhimento, nesse exemplo esse folder serve para organizar tarefas relacionadas a etapa de acolhimento (receber o contato e identificar sua pessoa)

Criando o primeiro node

Dentro da pastar folder vamos criar nosso primeiro node (nó), esses 3 pontos na vertical tem a opção de criar o node. Esse node que estamos trabalhando vamos dar o nome de Boas-vindas, e vamos configurar para quando for identificado uma intenção de saudação vai ser direcionado para esse node. E como o watson vai saber disso? Simples basta configurar a caixa de diálogo logo abaixo da frase If assistant recognizes (se o assistente reconhecer) #saudacao (# lembra sempre intenções).

Agora podemos ter variáveis de contexto, criada para armazenar valores extraído da mensagem enviada pelo nosso usuário ou uma variável de controle interna. A sua sintaxe começa com $ como podemos ver abaixo criado no segundo node chamado Primeiro Contato !$contato (! representa negação $contato uma variável de contexto, e tudo junto indica que queremos entrar nesse node quando a variável $contato for nula ou não existir)

Logica para entrar no node.

Outro ponto não menos importante de um node é a forma que ele vai tratar no final da sua execução, podemos esperar que nosso usuário responda algo, ou podemos redirecionar para outro node. Para nosso exemplo o node Boas vindas, após imprimir a sua mensagem vai redirecionar para o node Primeiro contato, e caso sua condição seja verdadeira irá imprimir a sua mensagem.

Redirecionando para outro node.

Além de variáveis de contexto ou intenções podemos utilizar as nossas entidades para validar uma condição. Vamos olhar o exemplo de perguntar qual o CPF do nosso usuário, criamos um node para perguntar o CPF e esperamos que o usuário responda, em seguida criamos um node filho para validar se na mensagem enviada pelo usuário contém um CPF, se existir vamos armazenar esse valor em uma variável de contexto chamada $cpfContato.

Extrair valores de mensagem do usuário e salvando em variável de contexto.

Uma boa prática é perguntar se o que nosso usuário escreve está certo (não que isso aconteça com muita frequência!!), sendo assim vamos utilizar a variável que criamos $cpfContato e vamos utilizar como um valor para concatenar em uma mensagem que vamos enviar para esse usuário. E para saber se estamos no caminho certo vamos criar 3 nodes filhos da pergunta sendo um para tratar da intenção #sim, outro para a intenção #nao e uma para tratar qualquer mensagem que não foi reconhecida como #sim ou #nao.

Estrutura para confirmar uma informação

O interessante dessa abordagem é que não ficamos presos a valores literais, temos uma intenção logo tanto um valor sim como um yeap significa a mesma intenção. O mesmo vale para uma intenção negativa, serve tanto um não como um nops.

Após a etapa de acolhimento vamos mostrar nossa ura, ou se preferir chamar de menu com as opções que nosso usuário poderá solicitar um atendimento, é uma boa prática mostrar quais assuntos o seu bot consegue responder para seu usuário. Não deixe seu usuário perdido ou traumatizado em um bot sem um guia.

A nossa ura é inteligente o suficiente para entender expressões ou frases como reconhece um número. Lembra que criamos uma entidade chamada menuUra e para cada item dentro dessa entidade tínhamos um sinônimo vinculado a esse item. Então mesmo que o usuário escolha finalizar ou digite o número 4 vai cair no nó de finalização.

Exemplo de menu com múltiplas opções.

Esse artigo ficou maior do que o imaginado, deixo aqui o link para poder baixar a habilidade que criei nesse artigo e com isso ajudar você na sua jornada para a construção de um assistente virtual. Deixo também o link para o projeto que estou construindo durante o desenvolvimento dessa série de artigos.

juscelior/bot-template-community


Top comments (0)