APIs e Microsserviços

8 dez, 2017

Criando chatbots integrando o DialogFlow (antigo api.ai) com PHP

Publicidade

Fala galera!

Já havíamos comentado em artigos anteriores “Conceitos que você deve conhecer para criar chatbots utilizando ferramentas online” e “Iniciando o treinamento do seu futuro chatbot” sobre como montar um chatbot. E no artigo de hoje, vamos entender como consumir a API do Dialogflow (antigo api.ai) através de uma biblioteca (semi-oficial) com PHP.

Primeiro vamos criar uma pequena interação entre um possível usuário e o chatbot (essas interações já foram explicadas nos artigos citados acima). Sendo assim, devemos entrar em https://api.ai ou simplesmente https://dialogflow.com/.

Caso não tenha uma conta, você deverá cria-la no Google para acessar o console. Com sua conta criada e logado, você deverá ir em “Ir para o console

No console, você deverá criar as interações “Intenções” e “entidades”. Nesse pequeno projeto iremos simular um bot de venda de ingressos.

Para começar, basta você ir em “Intents” e clicar no botão “+”. Neste caso, criaremos uma intenção de “saudação”. Vamos preencher o que provavelmente um usuário faria como saudação em “User says”.

Então, vamos criar as respostas que o bot daria caso recebesse uma saudação:

Sendo assim, quando você enviar no chat um “boa noite”, o chatbot te responderia com algum desses textos. Para testar o chat, basta ir em “Integrations” -> “WebDemo” e clicar no link que aparecer.

Até aqui tudo tranquilo. No nosso caso, como é para estudo, o bot já cria uma resposta induzindo o usuário a pedir a compra de um ingresso. Como foi dito nos artigos anteriores, o maior trabalho ao falarmos de chatbot, é o trabalho com as intenções e entidades. A parte de programação é bem simples, como veremos aqui.

Feito isso, vamos pensar na principal entidade que teremos nesse projeto, o “ingresso”. Para isso criamos uma entidade ingresso. “Entities” e “+“.

Criamos uma entidade ingresso. E incluímos alguns sinônimos que representarão a mesma entidade.

Agora vamos criar uma intenção para o ingresso. No caso, criaremos a intenção “comprar”. Do mesmo modo iremos colocar algumas frases que o usuário geralmente perguntaria para querer comprar um ingresso.

Como temos uma entidade referenciada, configuramos ela como uma entidade para essa intenção.

E então criamos a lista das respostas do bot.

No exemplo temos duas intenções, sendo elas com uma entidade ligada. Em seu projeto real, com certeza esse número será muito maior. Mas, como estamos apenas apresentando, criei apenas essas.

Bem, vimos que o bot funciona. Então como vamos fazer a integração com o PHP?

Como disse, existe uma biblioteca que é indicada pelo pessoal do Dialogflow para a integração com PHP. Usaremos um exemplo através de argumentos do PHP para exemplificar.

O Github do projeto é: https://github.com/iboldurev/dialogflow

Começamos com um “composer require iboldurev/dialogflow” e assim que baixarmos a biblioteca, vamos criar uma pequena interação. (Para mais detalhes de como usar todas as features da biblioteca, é só verificar a documentação da biblioteca no Github.

Abaixo está o código comentado do exemplo que iremos utilizar. Iremos nomeá-lo como dialogflow.php:

<?php

require_once 'vendor/autoload.php'; //autoload das dependências
include_once 'credentials.php'; //arquivo php com uma variável $apiKey que é a chave da sua API do Dialogflow

use Dialogflow\Client; //use na classe Client

use Dialogflow\Model\Query; //use na classe Query
use Dialogflow\Method\QueryApi; //use na classe QueryApi

try { //início do bloco de try/catch
    $client = new Client($apiKey); //iniciando um client Dialogflow
    $queryApi = new QueryApi($client);//iniciando uma query do Dialogflow

    $meaning = $queryApi->extractMeaning($argv[1], [
        'sessionId' => '1234567890',
        'lang' => 'pt-BR',
    ]); //definindo os dados da chamada ao Dialogflow (seria uma simulação de conversa) passamos o primeiro argumento da chamada PHP, uma sessionId aleatória e a linguagem que iremos utilizar. No caso pt-br
    $response = new Query($meaning); //realizando a chamada de query
    print_r($response); //retornando o objeto de resposta para estudo
} catch (\Exception $error) { 
    echo $error->getMessage(); //retorna o erro em caso de erro.
}

Então, vamos fazer no terminal:

php dialogflow.php "quero comprar um ingresso"

E receberemos um objeto assim:

Dialogflow\Model\Query Object
(
[data:Dialogflow\Model\Base:private] => Array
(
[id] => 308ec87d-79e6-4d68-a1e4-8cc8d9412b0c
[timestamp] => 2017-12-08T18:11:00.538Z
[lang] => pt-br
[result] => ApiAi\Model\QueryResult Object
(
[data:Dialogflow\Model\Base:private] => Array

(
[source] => agent
[resolvedQuery] => quero comprar um ingresso
[action] =>
[actionIncomplete] =>
[parameters] => Array
(
[ingresso] =>
)

[contexts] => Array
(
)

[metadata] => Dialogflow\Model\Metada
ta Object
(
[data:Dialogflow\Model\Base:p
rivate] => Array
(
[intentId] => ae
86f92f-a55f-48af-81cf-85327e8c1c6b
[webhookUsed] =>
false
[webhookForSlotF
illingUsed] => false
[intentName] =>
Comprar
)

)

[fulfillment] => Dialogflow\Model\Ful
fillment Object
(
[data:Dialogflow\Model\Base:p
rivate] => Array
(
[speech] => Você quer assistir o que?
[messages] => Ar
ray
(
[0] => A
rray
(

[type] => 0

[speech] => Você quer assistir o que?
)

)

)

)

[score] => 1
)

)

[status] => Dialogflow\Model\Status Object
(
[data:Dialogflow\Model\Base:private] => Array

(
[code] => 200
[errorType] => success
[webhookTimedOut] =>
)

)

[sessionId] => 1234567890
)

)

Perceba, por exemplo, que no retorno. O “intentName” é a intenção que o chatbot detectou, e speech seria as respostas que o chatbot deveriam responder.

Bem, galera, por hoje é só. Espero que tenha aberto um pouco a mente de vocês para a facilidade que é implementar um chatbot. Nos vemos em breve.