Home » » Principais comandos e estruturas I

Principais comandos e estruturas I

Para programar a personalidade do chatterbot é preciso conhecer como inserir o roteiro de forma que o interpretador possa reconhecer as instruções.


A tradução para o significado da sigla AIML é “Linguagem de Marcação de Inteligência Artificial”.  Cada evento é marcado com uma indicação de inicio e fim através dos símbolos <> e </> que são denominados de Tags ou marcadores.

Inicio da Tag ou marcação:   <comando>
Fim da Tag ou marcação:     </comando>

Por isso que é chamado de linguagem por marcação.

A instrução de diálogo inicia dentro de uma categoria.  O marcador categoria <category> é o comando que sinaliza um diálogo através de uma entrada e uma saída de texto. A entrada do texto ocorre através do interlocutor humano e a saída consiste na resposta do robô.

Basicamente um diálogo é formado por uma série de categorias compostas de entrada e saída, conforme exemplo abaixo:


<category>
      <pattern>Texto digitado</pattern>
      <template>Resposta do robô</template>
</category>

                                   
 Código de instruções em AIML    

<category>
      <pattern>oi</pattern>
      <template>olá, tudo bem?</template>
</category>

Seqüência do diálogo

Usuário: oi

Robô: olá, tudo bem?

<category>
      <pattern>tudo, e por ai</pattern>
      <template>tranqüilo, posso ajudar?</template>
</category>


Usuário: tudo, e por ai

Robô: tranqüilo, posso ajudar?

<category>
      <pattern>será que chove hoje</pattern>
      <template>Não recebi a previsão do tempo.</template>
</category>


Usuário: será que chove hoje

Robô: Não recebi a previsão do tempo.



É possível criar complexos diálogos usando apenas os comandos descritos acima, no entanto, seria muito trabalhoso simular um comportamento mais humano apenas com estes comandos. 

Uma das características humanas consiste em conversarmos usando diversas formas de expressões para uma mesma afirmação ou pergunta. Hoje respondemos de uma forma e amanhã de outra, sem mudar o significado das respostas. Um chatterbot que responde sempre da mesma forma é monótono e pouco atrativo.

Esta variação de expressões para uma mesma pergunta ou afirmação pode ser trabalhada no simulador de forma mais eficiente quando usamos um sistema contextualizado de escolha aleatória. Assim o robô se aproxima do comportamento humano.

Código de instruções em AIML 

<category>
      <pattern>qual o seu nome</pattern>
      <template>
        <random>
        <li>me chamo Tecnobot.</li>
        <li>Fui batizado com o nome                                 Tecnobot</li>
        <li> Geralmente me chamam de Tecnobot</li>
        </random>
      </template>
</category>

Seqüência do diálogo




Usuário: qual o seu nome

Robô: Fui batizado com o nome             Tecnobot

<category>
      <pattern>qual o seu nome</pattern>
      <template>

        <random>
        <li>me chamo Tecnobot.</li>
        <li>Fui batizado com o nome                                 Tecnobot</li>
        <li>Geralmente me chamam de Tecnobot</li>
        </random>

      </template>
</category>






Usuário: qual o seu nome

Robô: me chamo Tecnobot

Cada expressão dentro de uma marcação <li> </li> é entendida como disponível para sorteio. O interpretador escolhe aleatóriamente uma resposta entre as opções disponíveis dentro do bloco<random> seguido da marcação <li>.




Além de conseguir responder com diversas expressões o simulador precisa manter a conexão com o assunto e guardar temporariamente alguns detalhes da conversa.  Essas duas características trazem maior eficiência ao simulador aproximando ele do comportamento humano.

Uma destas características relacionadas com a memória temporária é o comando  <set name=”X”>  Onde “X” é uma palavra qualquer que represente uma dada informação.

Código de instruções em AIML 

<category>
<pattern>olá</pattern>
<template>qual o seu nome</template>
</category>
Seqüência do diálogo

Usuário: olá

Robô: qual o seu nome

<category>
<pattern>meu nome é *</pattern>
<template>Muito prazer,  <set name=”nome”><star/></set></template>
</category>

Usuário: meu nome é jeferson

Robô: Muito prazer, jeferson


O simbolo * denominado de estrela é um comando que captura qualquer coisa digitada em uma expressão conforme sua posição. Também é chamado de coringa.

No exemplo acima, qualquer coisa digitada depois da expressão “meu nome é” vai ser capturada pela estrela e guardada através do comando set.

Observe que dentro do comando <set></set> está o nome star que significa estrela em inglês e se refere á estrela * que está logo após a expressão “meu nome é”.

O comando <set name=”nome”><star/></set> pode ser traduzido como a seguinte instrução:pegar o que está na estrela e guardar na variável nome”.




Em programação aiml a estrela * pode ser inserida em qualquer posição de um texto de entrada, capturando uma palavra ou expressão digitada pelo usuário.

Quando capturado em uma estrala * o que é digitado, é possível decidir o que fazer com o conteúdo, podendo ser guardado como no exemplo acima ou ignorado.

É possível falar de algo cujo resultado seja genérico, por exemplo, um diálogo sobre o ódio pode iniciar com uma afirmação do tipo “odeio carros” ou “odeio bicicletas” ou ainda “odeio praias”, etc.

Independente do que é odiado, o robô poderia responder algo do tipo, “o ódio é ruim para a qualidade de vida”. Neste tipo de resposta o que se odeia pode ser ignorado.

Um script possível para um diálogo generalizado é adquirido com o uso de estrela * nas palavras ou expressões que podem ser descartadas, funcionando como um filtro no diálogo.


Código de instruções em AIML 

<category>
<pattern>odeio *</pattern>
<template>o ódio é ruim para a qualidade de vida</template>
</category>
Seqüência do diálogo

Usuário: odeio chuva

Robô: o ódio é ruim para a qualidade de vida

<category>
<pattern>odeio *</pattern>
<template>o ódio é ruim para a qualidade de vida</template>
</category>

Usuário: odeio casa velha

Robô: o ódio é ruim para a qualidade de vida


No exemplo acima, não importa o que é digitado após a expressão odeio. O robô só identifica o termo odeio e ignora o resto, respondendo de forma genérica.




Uma vez capturado em uma estrela * o que é digitado podemos decidir ignorar ou através do comando set, guardar. E para mostrar na tela o que foi guardado, se usa o comando get.

SET = Guarda/Captura            GET = Mostra/Imprime na tela


É possível ocorrer em meio ao diálogo perguntas do tipo, “você lembra meu nome” ou “você sabe o que mais me irrita” ou ainda “sobre o que estamos falando mesmo” e o simulador poderia se previamente programado, mostrar que lembra de algumas das questões apresentadas.

Este tipo de estratégia também auxilia na sensação de interação entre homem e máquina além de deixar o diálogo mais consistente e agradável.

É neste tipo de ocorrência que o comando get se destaca.

Código de instruções em AIML

<category>
  <pattern>Meu nome é *</pattern>
  <template>Muito prazer, <set name=”nome”><star/></set></template>
</category>
Seqüência do diálogo

Usuário: Meu nome é jeferson

Robô: Muito prazer, jeferson

<category>
  <pattern>Você lembra do meu nome</pattern>
  <template>Lembro sim,  <get name=”nome”/></template>
</category>


Usuário: Você lembra do meu nome

Robô: Lembro sim, jeferson


No exemplo acima o comando get mostra na tela o que estava guardado na memória da variável nome, capturada em diálogo anterior.

Observe que o comando get difere de outros comandos, ele não apresenta a tag de inicio e fim. É um comando que abre e fecha dentro da mesma tag através da barra no final. <get name=”nome”/>


O comando <get name=”nome/pode ser traduzido como a seguinte instrução: “imprima a variável nome na tela”.

É possível usar os comandos SET e GET para coletar e mostrar qualquer informação. Veja abaixo outro exemplo:

<category>
  <pattern>eu tenho * anos</pattern>
  <template>Um dia eu também farei<set name=”idade”><star/></set> anos</template>
</category>

Usuário: eu tenho 18 anos

Robô: Um dia eu também farei 18 anos
<category>
  <pattern>Você lembra a minha idade</pattern>
  <template>Lembro sim, você tem <get name=”idade/anos</template>
</category>

Usuário: Você lembra a minha idade

Robô: Lembro sim, você tem 18 anos

Observe que foi atribuído o nome “idade” para a variável que irá guardar o conteúdo digitadoÉ possível adicionar qualquer palavra para representar o conteúdo que se pretende guardar dentro do comando SET.

O comando SET no momento em que guarda uma expressão, também imprime ela na tela. No caso de impressões posteriores basta informar ao comando GET qual a palavra usada pelo para capturar de determinado conteúdo.





Existem diálogos onde é preferível não mostrar a informação capturada pelo comando SET. O comando SET no momento em que guarda uma informação apresenta ela na tela.

Para evitar que uma informação seja mostrada na tela no momento em que é armazenada, se usa o comando THINK.


Código de instruções em AIML 

<category>
  <pattern>Eu nasci em *</pattern>
  <template>Obrigado pela informação.
          <think><set name=”naturalde”><star/></set></think>
   </template>
</category>

Seqüência do diálogo


Usuário: Eu nasci em Porto Alegre

Robô: Obrigado pela informação.

No exemplo acima, a informação é guardada na variável “naturalde” sem apresentar na tela o que foi digitado. Se não fosse aplicado o comando THINK para ocultar a expressão “Porto Alegre” ela apareceria na seqüência da frase ficando assim: “Obrigado pela informação. Porto Alegre”.





Além da memória temporária um chatterbot eficiente precisa manter uma conexão coerente com o assunto central do diálogo. Sem esta conexão a conversa pode ficar confusa, sem sentido.

Alguns comandos de conexão possuem como objetivo facilitar ao programador a criação do roteiro que o simulador irá simular, em outros casos, o principal objetivo consiste em criar certos mecanismos de tomada de decisão com base em critérios previamente configurados.

É comum nos diálogos entre humanos uma mudança de postura conforme certos critérios sobre o que se está debatendo. Um interlocutor pode ter uma opinião desfavorável sobre um determinado comportamento generalizado e assumir uma postura favorável sobre o mesmo tema em uma situação contextualizada.

Por exemplo, alguém contra a violência pode assumir uma postura favorável em caso de legitima defesa. Dependendo da contextualização e de certos critérios é comum pessoas possuírem opiniões diferentes para um mesmo tema.

Manter ou mudar de postura conforme a diálogo vai sendo contextualizado é uma tarefa desempenhada pelos comandos de conexão.

Código de instruções em AIML

<category>
<pattern>faça uma pergunta</pattern>
<template>você é favorável ao desarmamento</template>
</category>


Seqüência do diálogo

Usuário: faça uma pergunta

Robô: você é favorável ao desarmamento

<category>
<pattern>sim</pattern>
 <that>
você é favorável ao desarmamento
</that>
<template>eu também acho arma coisa perigosa<set name=”nome”><star/></set></template>
</category>




Usuário: sim

Robô: eu também acho arma coisa perigosa
No exemplo acima o comando that só entende o sim caso ele seja digitado logo após a emissão da expressão “você é favorável ao desarmamento”.
Observe que o comando that é anterior ao comando de resposta do robô <template>. Isso é devido ao fato do that servir como um filtro de conexão de texto, enviando para a tela a resposta somente se esta for logo após uma expressão, garantindo a conexão no diálogo.
O comando <that> </that> pode ser traduzido como a seguinte instrução: “Se a resposta for logo após a expressão X, então responda Y”.
Com o uso do that o diálogo fica semelhante ao diálogo humano, onde o interlocutor pode apenas responder com um sim e o robô mantêm a conexão com o tema que está sendo tratado.



O comando that causa a impressão de identificação do tema abordado, promovendo a sensação de compreensão além de tornar o diálogo mais informal.  É algo importante quando se pretende simular um diálogo próximo da postura humana.

Sem o uso do comando that é necessário digitar a resposta completa. Por exemplo, “sim, sou favorável ao desarmamento”. Para que o simulador mantenha conexão com o assunto.  Neste caso deverá ser programado algo do tipo, “sim * desarmamento” para manter a conexão com o termo de concordância (sim) e o tema (desarmamento).


Outro comando bastante utilizado tem por função garantir a conexão entre os sinônimos e facilitar o trabalho do programador.

Imagine programar as categorias de saudação, são diversas formas que um usuário pode chamar pelo chatterbot. Olá, oi, tem alguém ai, pode teclar agora, etc.

Cada possível entrada dos usuários precisa ser inserida no simulador e o ideal é garantir uma seqüência de respostas aleatórias para dar mais interatividade ao robô.

Uma forma de programar o simulador é criar para cada possível entrada uma categoria, exemplo:
<category>
      <pattern>olá</pattern>
      <template>
        <random>
        <li>como vai</li>
        <li>que bom, alguém para conversar</li>
        <li> já estava me sentindo sozinho</li>
        <li> sobre o que vamos teclar</li>
        </random>
      </template>
</category>

<category>
      <pattern>oi</pattern>
      <template>
        <random>
        <li>como vai</li>
        <li>que bom, alguém para conversar</li>
        <li> já estava me sentindo sozinho</li>
        <li> sobre o que vamos teclar</li>
        </random>
      </template>
</category>


<category>
      <pattern>e ai</pattern>
      <template>
        <random>
        <li>como vai</li>
        <li>que bom, alguém para conversar</li>
        <li> já estava me sentindo sozinho</li>
        <li> sobre o que vamos teclar</li>
        </random>
      </template>
</category>


Para cada possibilidade de chamada do chatterbot cria-se uma nova categoria repetindo todas as possíveis respostas que devem ser sorteadas.

Se ocorrer a necessidade de inserir mais respostas ou de mudar alguma coisa, o programador terá de trocar cada uma das categorias existentes. Isso dará um trabalho e tanto.

Leia a sequencia deste conteúdo conforme abaixo:
01 - 02 - 03 - 04 - 05 - 06 - 07 - 08 - 09 - 10 - 11 - 12 - 13 - 14 - 15 - 16
BlogdoJSilva. Tecnologia do Blogger.