Arisa Nest

De Aulas

Estrutura dos Diálogos

Para as Respostas pode se usar acentos e caracteres especiais. Apenas lembre-se sempre de colocar ponto e vírgula (;) para separar cada resposta.

Para as Perguntas é importante seguir algumas regras.

  • usar apenas caracteres e números, sem acentos ou cedilha ou caracteres especiais.
  • usar letras minúsculas.
  • usar o caracter porcento na forma de curinga (%) para as perguntas. O curinga é de grande importância, pois é o que dará maior maleabilidade para interpretar a mensagem de entrada do usuário. Contudo, deve-se ter o cuidado para não generalizar demais, o que pode deixar as respostas do chatbot aleatórias demais e muitas vezes sem sentido.

Muitas vezes a prática de criação de diálogos vai ajudar a criar chatbots com respostas mais condizentes, assim como para melhorar os diálogos já cadastrados. Utilizando o sistema de logs de conversas também serve como recurso para verificar como os usuários estão conversando com o chatbot para poder criar diálogos que satisfaçam melhor os questionamentos e dúvidas dos usuários.

Contexto 0

É importante haver um contexto para conversas genéricas como cumprimentos, despedidas, ou mesmo com assuntos gerais. Isso serve como socialização do chatbot para com os usuários e também uma forma de tentar buscar do usuário o que ele quer extrair de informações do chatbot. Este contexto genérico é o contexto 0. Caso você tenha um contexto para conversar sobre comidas, por exemplo, pode-se criar um diálogo no Contexto 0 com perguntas que tentem interpretar quando o usuário está falando sobre comida e direcione este para um outro contexto específico.

Também pode haver uma estrutura de árvores de contextos, especificando ainda mais o que o usuário quer conversar. Por exemplo, se o usuário quer conversar sobre uma comida específica, no caso sushi, pode-se criar um diálogo que leve-o para outro contexto onde há apenas diálogos que conversem sobre sushi.

> 0 > [Comidas] > [Sushi]

Se o usuário tentar conversar algo com o chatbot e ele não encontra no contexto de sushi, o chatbot irá pesquisar nos diálogos do contexto anterior para tentar encontrar uma resposta. Caso não encontre alí, irá pro anterior e por assim em diante, até o contexto 0.

Importante: O contexto inicial é o contexto 0. Para que qualquer outro possa ser encontrado pelo chatbot, ele deve possuir um Goto para ele. Por exemplo, para acessar o contexto de Comidas, no contexto 0 há um diálogo com o assunto de comidas que tem um Goto para o contexto Comidas, assim como para acessar o contexto Sushi, no contexto Comidas há um diálogo falando sobre sushi que tem um Goto para o contexto Sushi.

Respostas genéricas / Fugas

No contexto 0 deve existir um diálogo genérico, ou respostas de fuga. Quando o chatbot não conseguir encontrar nada que combina com a mensagem do usuário, ele irá escolher aleatoriamente uma resposta desse diálogo genérico.

Para criar um diálogo genérico, basta criar um diálogo com o campo perguntas vazio no Contexto 0. Pode se criar mais de um diálogo genérico para separar melhor as respostas de fuga.

Crie diálogos genéricos apenas no Contexto 0.

Sem respostas

É possível apenas informar algo ao bot sem a necessidade de receber uma resposta. Para isso, basta criar um diálogo que, ao fechar o padrão de entrada, não responde nada, ou seja, deixar o campo Repostas vazio.

Esse recurso também serve quando se quer fazer a interação entre dois bots. Caso não houvesse um ponto de parada, eles ficariam indefinidamente conversando. Com esse recurso, quando um não mais responder, a conversa se encerra.

Utilização do Curinga %

Curinga no início:: quando o curinga é colocado no início, pode-se ter qualquer coisa antes da palavra.

%tudo bem;

Curinga no fim : quando o curinga é colocado no fim, pode-se ter qualquer coisa depois.

Gostaria de saber%;

Pode-se utilizar este recurso para o caso de diferença de gênero. Por exemplo. Se o avatar do chatbot é feminino, a frase como você é implementada termina com a, mas se for masculino, termina com o. Então utiliza-se o curinga para não ter problema com essa diferença.

como voce e implementad%

Curinga entre palavras: pode-se ter qualquer coisa entre duas palavras, sendo que obrigatóriamente deve haver na frase essas palavras e na ordem correta.

como%esta;

Exemplo 1

Caso o usuário queira perguntar para o chatbot se está tudo bem com o chatbot, o usuário pode enviar vários tipos de mensagems:

E aí? Tudo bem com voce?
Oi, tudo bem?
Como você está?
Hei, como está?
...

Pode-se abstrarir essas perguntas com algumas formas utilizando o curinga, como por exemplo:

%tudo bem?%;
%como%esta?%;

As duas primeiras perguntas foram abstraídas com a primeira linha acima e as duas seguintes com a segunda linha. O curinga entre como e está? significa que pode ter algo no meio como tu, a senhorita, etc. Observe o ponto e vírgula no final das frases acima.

Exemplo 2

Caso alguém quiser perguntar como o chatbot funciona, pode se cadastrar as seguintes perguntas:

%como voce e implementad%;
%como voce funciona%;
%seu funcionamento%;
%como voce trabalha%;
%voce funciona como%;

E como respostas, por exemplo, pode-se ter:

Este é um assunto bem complexo, na verdade. Quem sabe responder melhor pra você é meu mestre. Há também artigos publicados sobre meu funcionamento e estão disponíveis no meu blog: http://www.projetoarisa.com.br.;
Eu não sei ao certo, é melhor conversar com meu mestre sobre isso ou visite meu blog: http://www.projetoarisa.com.br.;

Observe o ponto e vírgula no final das frases acima.

Contextos e Diálogos codicionais

Você pode utilizar a estrutura dos contextos e diálogos para fazer uma pergunta específica para o usuário do chatbot. Por exemplo, imagine que você quer saber se o usuário quer pagar em crédito ou débito. No contexto em que você se encontra, você cria um diálogo para o usuário falar sobre pagamento.

O usuário fala: "Quero fazer o pagamento."

e entra em um diálogo por causa da palavra chave ***%quero%paga%***.

O bot responde: "Ok, como você pretende pagar? cartão crédito, cartão de débito ou boleto bancário?"

Neste mesmo diálogo, há um link para um contexto criado para gerenciar essa pergunta. Neste caso, ele é chamado de "Formas de Pagamento". Lá dentro são criados os diálogos para gerenciar cada uma das respostas. Cada um dos diálogos de resposta pode ter um link para um contexto específico para tratar cada um desses assuntos ou, nesse caso, formas de pagamento.

A estrutura dos contextos ficaria da seguinte forma:

[Contexto Atual] -> [Formas de Pagamento] -> [Cartao de Debito]
                                    |  |
                                    |  +---> [Cartao de Credito]
                                    |
                                    +------> [Boleto Bancario]

Condições

Um novo recurso das questões (nó) são as condições. Você pode utilizar para verificar crenças do bot. Por exemplo. Se você colocar uma questão sobre o nome do amigo, mas o bot não tem essa informação então faça:

CONDIÇÕES: friend_name = empty
PADRÃO: %como e o meu nome%
RESPOSTA: Não sei. Qual seu nome?

O bot só vai entrar nesse nó se o nome do amigo estiver fazio ou não existir essa crença do amigo. Pode-se colocar um outro nó para ser acessado apenas se a informação friend_name existir:

CONDIÇÕES: friend_name != empty
PADRÃO: %como e o meu nome%
RESPOSTA: Seu nome é {friend_name}.

Scripts

Vamos experimentar alguns scripts.

Exemplo: Retorna a data

Para saber o dia de hoje, podemos cadastrar um script chamado dia_hoje com o seguinte conteúdo:

return os.date("%d do %m de %Y")

Para testar, crie uma questão com o seguinte padrão e resposta:

PADRÃO: %que dia e hoje%;
RESPOSTA: Hoje é {@dia_hoje}.;

Veja que {@dia_hoje} é substituído pelo retorno do nosso script. O @ serve para indicar que você está buscando um script chamdo dia_hoje.

Soma

O scritp abaixo soma dois valores entrados como argumentos:

a = tonumber(args[1])
b = tonumber(args[2])
return a + b

Veja que args[n] é a posição do parâmetro começando em 1.

Crie uma questão com o padrão e resposta abaixo:

PADRÃO: %quanto e {$1} + {$2}%;
RESPOSTA: O resultado de {$1} mais {$2} é {@soma $1 $2}.;

Veja que no padrão são usados dois parâmetros, o $1 e o $2. O $ serve para indicar que é uma variável que não será armazenada como crença local. Esses mesmos parâmetros são usados aqui na resposta e passados para função soma. Os nomes são de escolha do programador. Aqui, como não serão armazenados, coloquei apenas números mesmo.

Crenças Globais e Locais

Existem algumas crenças que podem ser armazenadas como locais, no perfil do usuário nas conversas. Para isso, basta criar uma crença sem o $ no seu nome. Por exemplo, o usuário fala seu nome e este é armazenado, conforme a questão com o seguinte padrão e resposta:

PADRÃO: %me chamo {friend_name}
RESPOSTA: Olá {friend_name}, muito prazer, meu nome é {bot_name}.

Se a crença friend_name não existir, será criada com a informação após "me chamo ". Também temos bot_name que pode ser cadastrado como uma crença global.

Uma crença local sempre irá sobrescrever uma global. Por exemplo, se o bot tiver uma crença global como

melhor_jogo = "World of Warcraft".

O bot pode responder "O melhor jogo é World of Warcraft" ao seguinte nó:

PADRÃO: %qual%melhor jogo%
RESPOSTA: O melhor jogo é {melhor_jogo}.

Mas se o usuário puder dar outra informação por meio de um nó, então o usuário vai ter uma crença local que irá sobrescrever a global:

PADRÃO: %melhor jogo e {melhor_jogo}
RESPOSTA: Ok, agora sei que o melhor jogo é {melhor_jogo}.

Se o usuário digitar "O melhor jogo é Skyrim", o bot vai responder com essa nova crença assim: "Ok, agora sei que o melhor jogo é Skyrim", pois é a nova crença local do usuário.

Comportamentos

Nos scripts ou comportamentos, você pode utilizar a função getDialog(nome_comportamento, nome_dialogo) para retornar uma resposta aleatória daquele diálogo.

Por exemplo, imagine que você queira mandar uma mensagem de feliz ano novo para todos os contatos da lista do bot que utilizam telegram.

Crie um diálogo no contexto main chamado feliz_ano_novo com os seguintes padrões e respostas (separe as respostas com ponto e vírgula):

padrões:

  • %feliz ano novo%;

respostas

  • feliz ano novo;
  • felicidades pra você nesse novo ano;
  • que todos seus desejos se realizem nesse novo ano que entra;

Depois crie um comportamento anual agendado para dia 1/1/2019 (ano atual) e para hora 0:1

Coloque o seguinte código

friends = json.decode(friendList()) -- retorna todos ids dos contatos em uma lista
for i = 1, #friends do -- varre a lista de contatos
	friend_id = friends[i] -- pega o id do contato
	im = getLocal(friend_id, 'im') -- pega o tipo de im (instant messaging) que o contato usa
	if im == 'telegram' then -- se o im for telegram
		message = getDialog('main', 'feliz_ano_novo') -- pega uma resposta aleatória de um diálogo chamado feliz_ano_novo do contexto main
		sendMessage(friend_id, message) -- envia a mensagem ao contato
	end
end

Serviço Web

Para usar um serviço web, basta cadastrá-lo pelo seu serviço, sem o ?WSDL. Por exemplo, aqui cria-se um serviço chamado mail:

http://localhost/~saulo/ws/mail/

No serviço acima, será encontrado uma operação send, da seguinte forma:

string send(string host, string port ,string user, string pass, string name, string to, string subject, string body)

E depois cria-se um script para utilizá-lo. Coloque os nomes das variáveis exatamente iguais aos parâmetros da operação send do serviço.

out = wscall('mail', 'send', {
	host = getGlobal('mail_host'),
	port = getGlobal('mail_port'),
	user = getGlobal('mail_user'),
	pass = getGlobal('mail_pass'),
	name = getLocal('friend_name'),
	to = args[1],
	subject = args[2],
	body = args[3]})
if out == '1' then
	out = 'ok'
end
return out

No script acima, usamos a função wscall com no nome do serviço como primeiro parâmetro, a operação como segundo parâmetro e o terceiro parâmetro é um vetor com os parâmetros da operação.

a função getGlobal('mail_host') retorna o valor de uma crença global já cadastrada. Pode-se utilizar as funções getGlobal, setGlobal, getLocal, setLocal, em que as crenças locais são as informações do usuário.

Para usar a função e serviço web criados, utilize a seguinte questão com o padrão e resposta:

PADRÃO: %email para {$address} sobre {$subject} contendo {$body}; RESPOSTA: Certo. Tentei efetuar a operação e tive o seguinte resultado: {@email $address $subject $body};

Json

Para trabalhar com json em um script, que pode ser retorno ou parâmetro para um serviço web, por exemplo, veja o exemplo abaixo:

json_text = json.encode({
	foo = 'bar',
	some_object = {},
	some_array = { 'a', 'b', 'c' } 
})
json = json.decode(json_text)
out = json.foo .. ' ' .. json.some_array[1]
return out

Na primeira linha o json.encode cria string json com as informações cadastradas na sequência. json.decode transforma a string em um objeto json. out conterá uma string concatenada com algumas informações json.foo, um espaço em branco e a array json.some_array.