Mudanças entre as edições de "Chatbots"

De Aulas
Linha 219: Linha 219:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
 +
<!--
 
== Tag that ==
 
== Tag that ==
  
Linha 261: Linha 262:
 
</aiml>
 
</aiml>
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
-->
  
 
= Links =
 
= Links =
  
 
* [https://github.com/aichaos/rivescript-python Riverscript] Uma plataforma em python para testar um chatbot AIML.
 
* [https://github.com/aichaos/rivescript-python Riverscript] Uma plataforma em python para testar um chatbot AIML.

Edição das 13h52min de 7 de março de 2025


Assuntos relacionados: Inteligência Artificial

Material Didático

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>


<aiml version="1.0.1"> <category> <pattern> * </pattern> <template>...</template> </category>

<category id="234"> <pattern>FACA UMA PERGUNTA</pattern> <template>Você gosta de filmes?</template> </category>

<category> <pattern>SIM</pattern> <that>234</that> <template>Legal, eu também gosto de filmes.</template> </category>

<category> <pattern>NAO</pattern> <that>234</that> <template>Tudo bem, mas eu gosto de filmes.</template> </category>

<category> <pattern>TALVEZ</pattern> <that>234</that> <template>Você é muito indeciso.</template> </category>

<category> <pattern> * </pattern> <that>VOCÊ GOSTA DE FILMES</that> <template>Essa não é uma resposta válida.</template> </category>

</aiml> </syntaxhighlight> -->

Links

  • Riverscript Uma plataforma em python para testar um chatbot AIML.