Framework para desenvolvimento de Bots: Computação cognitiva
Tags: ai, developer, ibmwatson, bots
Published: 2020-07-13 21:40:47

---
title: Framework para desenvolvimento de Bots: Computação cognitiva
published: true
date: 2019-12-27 18:30:00 UTC
tags: ai,developer,ibmwatson,bots
canonical_url: https://medium.com/@juscelioreis/framework-para-desenvolvimento-de-bots-computa%C3%A7%C3%A3o-cognitiva-755c71c82493
---

> 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:

- [Contexto](https://dev.to/juscelior/framework-para-desenvolvimento-de-bots-contexto-4a06-temp-slug-5624969).
- Computação cognitiva.

#### 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_](https://cognitivecomputingconsortium.com/). 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_](http://nirvacana.com/thoughts/2017/12/27/demystifying-artificial-intelligence/).

![](https://cdn-images-1.medium.com/max/1024/1*BoXTlSNMiiySwlX_Suk3fw.png)<figcaption><a href="http://nirvacana.com/thoughts/2017/12/27/demystifying-artificial-intelligence/">Desmitificando a inteligencia artificial</a></figcaption>

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

> [**_Cognitivo_**](http://michaelis.uol.com.br/busca?id=oWlY)  
> _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ô.

<iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fgiphy.com%2Fembed%2FKlfHImaIFfCq4%2Ftwitter%2Fiframe&amp;url=https%3A%2F%2Fmedia.giphy.com%2Fmedia%2FKlfHImaIFfCq4%2Fgiphy.gif&amp;image=https%3A%2F%2Fi.giphy.com%2Fmedia%2FKlfHImaIFfCq4%2Fgiphy-downsized-large.gif&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=giphy" width="435" height="239" frameborder="0" scrolling="no"><a href="https://medium.com/media/9e40d50d476983ee70391aa9337ca921/href">https://medium.com/media/9e40d50d476983ee70391aa9337ca921/href</a></iframe>

Como eu posso explicar a uma máquina que o primeiro **Pó** significa **Pode** e o segundo **pó** significa **pó** 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:

{% youtube 6-9nWt04oSI %}

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](https://dev.to/juscelior/framework-para-desenvolvimento-de-bots-contexto-4a06-temp-slug-5624969) um dos requisitos, não negociáveis, da nossa consultoria é implementar um bot conversacional utilizando o serviço da IBM o [IBM Watson Assistant](https://www.ibm.com/cloud/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](https://botsociety.io/), 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:

![](https://cdn-images-1.medium.com/max/400/1*HgX-WeLVnrsMWchmcUGd8A.gif)<figcaption>Exemplo de um vídeo demonstrando como seria a conversa no whatsapp</figcaption>

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.

![](https://cdn-images-1.medium.com/max/600/1*rL5NRUad5cMAyhl7YzWoxA.png)<figcaption>Fluxograma criado automaticamente</figcaption>

![](https://cdn-images-1.medium.com/max/1024/1*Br50eaW1XpZyJYBWIlCMKQ.png)<figcaption>Exemplo da pesquisa de usabilidade</figcaption>

#### 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.

> - [IBM Developer Brasil](https://dev.to/victorshinya/watson-assistant-como-criar-o-seu-chatbot-usando-skills-e-assistants-5bfg-temp-slug-9827853)

Crie sua conta da [IBM Cloud](https://cloud.ibm.com/registration?locale=pt-br). Feito isso vamos precisar criar nosso primeiro assistente, segue um vídeo para ajudar no processo de criação.

![](https://cdn-images-1.medium.com/max/1024/1*6Z7hfu77qYxRhe8iZ57Vhw.gif)<figcaption>Criando um serviço Watson Assistant</figcaption>

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](https://cloud.ibm.com/docs/services/assistant?topic=assistant-assistant-add&locale=pt-br)).

#### 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.

![](https://cdn-images-1.medium.com/max/1024/1*9Jbp9yepdo1iGeWTQVQPrQ.gif)<figcaption>Criando um assistente e uma habilidade</figcaption>

É possível utilizar o tutorial oficial da IBM ([Criando uma habilidade de diálogo](https://cloud.ibm.com/docs/services/assistant?topic=assistant-skill-dialog-add&locale=pt-br)) 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.

![](https://cdn-images-1.medium.com/max/1024/1*YMDssWSS56hOX3XvbmO64w.gif)<figcaption>Criando intenções customizadas</figcaption>

É possível utilizar o tutorial oficial da IBM ([Definindo intenções](https://cloud.ibm.com/docs/services/assistant?topic=assistant-intents&locale=pt-br)) 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.

![](https://cdn-images-1.medium.com/max/1024/1*aZI4zODcbARYUfmE49K5zg.gif)<figcaption>Habilitando uma entidade pré definida</figcaption>

É possível utilizar o tutorial oficial da IBM ([Criando entidades](https://cloud.ibm.com/docs/services/assistant?topic=assistant-entities&locale=pt-br)) 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_.

![](https://cdn-images-1.medium.com/max/1024/1*GZwirba69-FnK-fIIIMEYQ.gif)<figcaption>Criando uma entidade personalizada</figcaption>

É possível utilizar o tutorial oficial da IBM ([Criando entidades](https://cloud.ibm.com/docs/services/assistant?topic=assistant-entities&locale=pt-br)) 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)

![](https://cdn-images-1.medium.com/max/992/1*z9VQLTys3ueXx3-reOUkBA.jpeg)

![](https://cdn-images-1.medium.com/max/772/1*_JL5GaRe0PTPwc6xMIZUDw.jpeg)<figcaption>Criando o primeiro node</figcaption>

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)

![](https://cdn-images-1.medium.com/max/976/1*AMnx9aKzJoDjaCA3FEPvJg.jpeg)

![](https://cdn-images-1.medium.com/max/1021/1*55UUP3lQOiGavRQ3SplF2Q.jpeg)<figcaption>Logica para entrar no node.</figcaption>

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.

![](https://cdn-images-1.medium.com/max/947/1*Amg9_vxEDDWpzwGYZ-3sNw.jpeg)<figcaption>Redirecionando para outro node.</figcaption>

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.

![](https://cdn-images-1.medium.com/max/1024/1*31-Mhj0nQQVmSQbK18KcaQ.jpeg)

![](https://cdn-images-1.medium.com/max/1024/1*fk7Q_-c3Ptvbqu30PaCQgg.jpeg)

![](https://cdn-images-1.medium.com/max/1024/1*x5qEmKG0QmM-gWxX6Zqaqg.jpeg)<figcaption>Extrair valores de mensagem do usuário e salvando em variável de contexto.</figcaption>

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.

![](https://cdn-images-1.medium.com/max/1024/1*GX1lWyJtMcU1f-KjfVIdAA.jpeg)<figcaption>Estrutura para confirmar uma informação</figcaption>

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.

![](https://cdn-images-1.medium.com/max/1024/1*6cf-B0F4GTyWWWiI9z_uXw.jpeg)

![](https://cdn-images-1.medium.com/max/1024/1*q8J0DKiCGipaa2dCH7gfiQ.jpeg)<figcaption>Exemplo de menu com múltiplas opções.</figcaption>

Esse artigo ficou maior do que o imaginado, deixo aqui o [_link_](https://github.com/juscelior/bot-template-community/blob/master/watson/skill-Secret%C3%A1rio.json) 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](https://github.com/juscelior/bot-template-community)

---

{% user juscelior %}