Chatbots
Afluentes: Inteligência Artificial
Material Didático
- Vídeoaula sobre Chatbots e Assistentes Virtuais
- Aula de Chatbots - Slides
- Arquivos de exemplos básicos em AIML
- PyAIML3
- Ácaro: um exemplo simples de chatbot em java (não usa AIML).
Código do Chatbot
O programa em linguagem de programação python abaixo cria um prompt de interação do interpretador AIML do PyAIML3 com o usuário.
import sys
import aiml
import unicodedata
import re
# Efetua uma filtragem no texto de entrada
def filter(text):
# Normaliza o texto entrado como parâmetro e remove os acentos
text = unicodedata.normalize('NFKD', text).encode('ASCII', 'ignore').decode('utf-8')
# Remove pontuação e caracteres especiais
text = re.sub(r'[^\w\s]', '', text)
return text
kb = sys.argv[1] # Pega a base AIML entrada por parâmetro
k = aiml.Kernel() # Inicializa o motor de interpretação AIML
k.learn(kb) # Insere a base AIML no motor para aprendizado
while True: # Executa o laço indefinidamente
message = input("> ") # Inicializa o prompt do chatbot
message = filter(message) # Limpa a mensagem entrada pelo usuário
response = k.respond(message) # Envia ao motor e retorna a resposta
print(response) # Imprime a resposta
É importante observar que deve ser feita uma filtragem na mensagem de entrada do usuário. Não deve ter caracteres especiais, acentos, etc. Para isso, criamos a função filter.
AIML
O AIML (GNU GPL) é uma linguagem baseada em XML para chatbots desenvolvida em 1995 para o A.L.I.C.E. (Artificial Linguistic Internet Computer Entity) por Richard Wallace.
As regras das pequenas entidades são compostas de duas partes: condição e ação. Caso as condições forem satisfeitas, a ação é executada. No caso de mais de uma regra terem suas condições satisfeitas, temos um conflito. Neste caso, o interpretador precisa ter uma estratégia para resolver esses conflitos.
As tags mais importantes de um documento AIML são:
- <aiml>: inicia e termina um documento AIML;
- <category>: marca uma unidade de conhecimento;
- <pattern>: contem um padrão simples que pode fechar com o que o usuário fala ou digita;
- <template>: contem a resposta para uma entrada do usuário.
Documento Simples - Hello World
<aiml>
<category>
<pattern>OLA</pattern>
<template>Olá, como vai você?</template>
</category>
</aiml>
Tag star ou Curinga
Uma condição pode conter um curinga, ou carácter * em seu padrão
<category>
<pattern>MEU NOME E *</pattern>
<template>É um prazer conhecer você, <star/>.</template>
</category>
O curinga também pode ser utilizado para pegar todas as entradas de usuário que não fecharam com nenhuma regra:
<category>
<pattern> * </pattern>
<template>Eu não entendo.</template>
</category>
A categoria acima é usada como fuga. Quando o bot não encontra uma padrão, pode responder com uma frase meio genérica ou um conjunto de frases genéricas aleatórias.
Existe também o curinga "_", mas não vamos falar sobre ele por aqui.
Tag srai
Muitas vezes, a mesma pergunta do usuário pode ser feita de formas diferentes, mas devem ser tratadas da mesma maneira. Nesses casos, a tag srai pode ser utilizada para se referir a outra regra.
<category>
<pattern>COMO EU CHEGO AO SUPERMERCADO</pattern>
<template>Siga pela avenida principal e vire a primeira rua a direita.</template>
</category>
<category>
<pattern>COMO EU CHEGO A UNIVERSIDADE</pattern>
<template>Siga pela rua principal por aproximadamente 2km.</template>
</category>
<category>
<pattern>QUAL O CAMINHO ATE *</pattern>
<template><srai>COMO EU CHEGO <star/></srai></template>
</category>
Ações Randômicas
Uma regra também pode ter respostas randômicas:
<category>
<pattern>COMO VAI VOCE?</pattern>
<template>
<random>
<li>Vou bem, obrigado.</li>
<li>Tudo bem..</li>
<li>Tudo em ordem. Agradeço muito por perguntar.</li>
<li>Muito bem, e você?</li>
</random>
</template>
</category>
Agora que já conhecemos o SRAI e as ações randômicas, podemos utilizar ele de outras formas. Por exemplo, na entrada OI, poderíamos falar OLA também. Além disso, pode ser OI BOT ou OLA BOT. Então são várias formas. Para não ter que escrever sempre a mesma resposta, fazemos uma referência com SRAI. Para complementar, ainda podemos ter várias respostas aleatórias. Então usamos o random e li:
<category>
<pattern>OI</pattern>
<template>
<random>
<li>Olá, como vai você?</li>
<li>Oi.</li>
<li>Beleza.</li>
<li>Olá, tudo certo?</li>
</random>
</template>
</category>
<category>
<pattern>OLA</pattern>
<template><srai>OI</srai></template>
</category>
<category>
<pattern>OI *</pattern>
<template><srai>OI</srai></template>
</category>
<category>
<pattern>OLA *</pattern>
<template><srai>OI</srai></template>
</category>
Variáveis Globais
A linguagem AIML permite a utilização de variáveis globais que podem ser utilizadas nas regras.
<category>
<pattern>MEU NOME E *</pattern>
<template>É um prazer te conhecer,
<set name="userName"><star/></set>.
</template>
</category>
A utilização da tag <think> funciona como no exemplo anterior, mas previne que as informações sejam exibidas juntamente com a resposta.
<category>
<pattern>MEU NOME E *</pattern>
<template>É um prazer te conhecer.
<think><set name="userName"><star/></set></think>
</template>
</category>
Usando variáveis globais em condições
O valor de uma variável global pode ser utilizado depois que ela foi armazenada.
<category>
<pattern>QUAL E O MEU NOME</pattern>
<template>
<condition name="userName">
<li value="">Você ainda não me disse seu nome.</li>
<li>Seu nome é <get name="userName"/>.</li>
</condition>
</template>
</category>
Utilizando Contextos
A linguagem AIML permite a utilização de contextos, ou tema, por meio da tag <topic>. As regras podem ser agrupadas conforme um contexto específico.
<category>
<pattern>POSSO COMPRAR UMA PASSAGEM DE AVIAO</pattern>
<template>Sim.</template>
</category>
<category>
<pattern>POSSO COMPRAR UMA PASSAGEM PARA * </pattern>
<template>Sim, você pode.
<think>
<set name="userDestination"><star/></set>
<set name="topic">PAGAMENTO</set>
</think>
<srai>COMO POSSO PAGAR?</srai>
</template>
</category>
<topic name="PAGAMENTO">
<category>
<pattern>COMO POSSO PAGAR</pattern>
<template>Você pode pagar em dinheiro ou cartão de crédito.</template>
</category>
</topic>
Links
- Riverscript Uma plataforma em python para testar um chatbot AIML.