The 11/19/2017

Comment créer un chatbot ?

En ce moment je suis dans ma période YOLO, alors quand je vois un truc sympas passé ou que j'ai une idée en tête je me dit Ok c'est parti on tente... L'autre jour je regardais une conférence sur les smartbot parce que j'avais un peu du mal à voir ce que ca apportais de plus que le petit trombone qui me répond sur windows 98 et j'aime pas trop les phénomènes de mode et je voyais pas ou était l'intélligence artificielle la dedans. En fait je réalise que je confonds 2 notions : l'intélligence artificielle et le machine learning sont 2 concepts différents. L'intelligence artificielle d'apres wikipédia c'est "L'ensemble de théories et de techniques mises en œuvre en vue de réaliser des machines capables de simuler l'intelligence" c'est donc un terme assez vague. Avec cette définition un algorithme tout bête qui simule une réponse en fonction d'une question c'est déjà dans de l'IA. Le terme de "machine learning" est différent. Le machine learning c'est un champs d'étude de l'intélligence artificielle qui ce concentre sur l'apprentissage de la machine à travers des situations qui lui permettent d'évoluer, autant dire que là on est dans un autre niveau de complexité quand on parlera de réseaux de neurones, d'arbres de décision, de boosting etc... Mais revons à nos moutons, je veux me documenter alors je regarde une conférence sur les chatbot et je découvre un truc trés intéréssant. C'est la partie sur le Neuro Langage Processing (NLP) et sur les connecteurs...mais alors qu'est ce que c'est ?

La science du Neuro Langage Processing (NLP) et l'analyse de mes phrases

La NLP en gros c'est la facon d'intérpréter ce que vous écrivez pour que le script comprenne ce que vous voulez faire. Ca peu être assez compliqué donc dans ce tutoriel on va simplifier fortement les concepts. Dans notre application ca va ressembler à un Service Symfony qui va permettre d'analyser nos phrases et qui retourne un json avec l'action demandée et les autres informations importantes pour exécuter cette action. Comme par exemple dans la phrase

Est-ce que tu peux me trouver un article sur les controllers magento ?
Ici dans cette phrases l'action est "trouver", le moteur va donc savoir qu'on veut faire une recherche car il va détecter que "trouver" c'est un synonyme du verbe d'action "rechercher". Les mots complémentaire pour faire cette action sont "article" controllers magento" pour que le moteur puisse comprendre qu'on veut rechercher un article sur le theme des controllers magento. Bref, le moteur va donc faire cette analyse et vous renvoyer un tableau du style :

array(2) {
  [0]=>
  array(2) {
    ["intents"]=>
    array(2) {
      ["all"]=>
      array(1) {
        [0]=>
        string(6) "search"
      }
      ["search"]=>
      array(1) {
        [0]=>
        string(7) "trouver"
      }
    }
    ["entities"]=>
    array(4) {
      ["all"]=>
      array(3) {
        [0]=>
        string(6) "pronom"
        [1]=>
        string(12) "content_type"
        [2]=>
        string(16) "article_keywords"
      }
      ["pronom"]=>
      array(1) {
        [0]=>
        string(2) "tu"
      }
      ["content_type"]=>
      array(1) {
        [0]=>
        string(7) "article"
      }
      ["article_keywords"]=>
      array(1) {
        [0]=>
        string(7) "magento"
      }
    }
  }
}
Aucune action n'est encore réalisé à cette étape. C'est juste une analyse de phrase qui retourne un tableau et ce service sera utilisé uniquement pour analyser mes phrases et les découper. Notre analyse va chercher 2 choses : - l'action à effectuer qu'il retournera dans "intents" - les informations complémentaires qu'il retournera dans "entities" On va donc avoir une intention et des attributs qui peuvent être un pronom, un type de contenu, un mot clef d'article etc...le moteur va découper la phrase et classer chaque mot ou expression pour nous retourner le tableau ci dessus. Dans notre exemple ci dessus, vous remarquez que la phrase a été découpée et classée. On ne prend pas de décision, on classe juste les informations.

La prise de décison

Une fois qu'on a un tableau avec toutes les données nécéssaires pour prendre une décision grace à notre service de NLP, on peut maintenant définir des régles du style :

SI action = "recherche"
ET mot clef = "article"
ALORS faire une recherche sur les articles du blog avec le reste des mots clefs, ici "controllers magento".
Vous pouvez le faire en créant service de régle dynamique mais pour notre exemple on va le coder directement pour ne pas complexifier ce tutoriel puis on va envoyer un tableau qui définira ce qu'on doit faire. Ce tableau peu être par exemple :

array(3) {
  ["message"]=>
  string(77) "You are searching for a article regarding magento? Here what is on the blog :"
  ["type"]=>
  string(3) "url"
  ["result"]=>
  array(3) {
    [0]=>
    array(4) {
      ["url"]=>
      string(70) "http://www.pierrefayfr.lan/formation-magento/developper-un-module.html"
      ["title"]=>
      string(34) "La structure d’un module Magento"
    }
    [1]=>
    array(4) {
      ["url"]=>
      string(78) "http://www.pierrefayfr.lan/formation-magento/creer-un-controller-tutoriel.html"
      ["title"]=>
      string(35) "Créez votre Controller sur Magento"
    }
    [2]=>
    array(4) {
      ["url"]=>
      string(73) "http://www.pierrefayfr.lan/formation-magento/creez-un-block-tutoriel.html"
      ["title"]=>
      string(15) "Créer un Block"
    }
  }
}

Ici à partir de l'analyse NLP (le premier tableau de ce tutoriel), le moteur de regle renvoit un nouveau tableau avec les informations suivantes : - le message à renvoyer à l'utilisateur - l'information pour vous dire que vous allez renvoyer des urls vers l'utilisateur - les liens vers les 3 articles de la recherche. Vous savez donc quoi faire...maintenant abordons les channels et les connecteurs.

Les channels et les connecteurs

On sait maintenant analyser une phrase et faire une action associée mais il nous fait pouvoir maintenant écouter un chat et pouvoir répondre. Ce chat peut être sur slack, facebook, twitter, ou n'importe quel service qui permet de recevoir une info et de répondre. Le service sur lequel on va se connecter s'appel un "channel" et pour pouvoir s'y connecter, on va développer un connecteur. Dans notre exemple, on va créer un connecteur pour se connecter à Facebook mais vous pouvez trés bien le connecter à un autre channel exemple : twitter, votre systeme de chat, etc... l'important est juste d'avoir un input et pouvoir envoyer un output.

Le connecteur de notre chatbot à facebook

Pour se connecter à facebook, il faut créer une application facebook. Vous récupérez ensuite un token de vérification et un access token qui vous permettent de vous connecter à facebook.

 $this->_hub_verify_token = 'monTokenDeVerification';
 $this->_access_token = "monAccessToken";	
L'application va ensuite pour chaque chat sur notre page, envoyer l'input sur une URL de notre site. Pour écouter ce qui se passe sur le chat de notre page on a donc besoin de vérifier que le message vient de facebook :

	if (isset($_REQUEST['hub_verify_token']) && $_REQUEST['hub_verify_token'] === $this->_hub_verify_token) {
		echo $_REQUEST['hub_challenge'];
		exit;
}	
Et de récupérer les informations envoyées par l'application :

$input = json_decode(file_get_contents('php://input'), true);
$this->_senderId = $input['entry'][0]['messaging'][0]['sender']['id'];
$this->_messageText = $input['entry'][0]['messaging'][0]['message']['text'];
On récupére 2 informations : le sender_id qui va nous permettre de répondre au bon utilisateur et le message envoyé par cet utilisateur. C'est ce message qu'on va passer dans notre service NLP et notre service qui prendra la décision. Pour répondre à l'utilisateur il nous suffit ensuite juste d'utiliser l'api facebook pour lui envoyer notre message :

$response = [
	'recipient' => [ 'id' => $this->_senderId ],
	'message' => [ 'text' => $message ]
];
$ch = curl_init('https://graph.facebook.com/v2.6/me/messages?access_token='.$access_token);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($response));
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
$result = curl_exec($ch);
curl_close($ch);
En fait créer le connecteur est assez simple.

Créer un bot modulaire

La modularité est importante, en découpant notre application en 3 services : - l'analyseur de phrase : le service NLP - la prise de décision : le service de décision - le connecteur : qui permet de récupérer un input et de répondre On a un systeme qui vous permet de créer un chatbot plutot intélligent, qui pourra se connecter à autant de service que vous le souhaitez. Dans ce tutoriel, je ne publie pas mon code car il serait trop complexe et surtout trop long à expliquer dans un seul tutoriel, mais vous avez les principes pour faire votre propre chatbot. Voici l'url vers ma page facebook : https://www.facebook.com/expertmagentotutorial/ Pour le moment mon chatbot n'est pas trés intélligent mais petit à petit j'essaierai de l'améliorer, si vous avez des questions concernant le blog ou si vous voulez me contacter il pourra vous répondre si vous utilisez un vocabulaire pas trop évolué sinon il restera muet. Si vous avez des suggestions d'utilisation de ce chatbot pour mon blog n'hésitez pas à proposer. Voilà c'était un test, dites moi ce que vous en pensez. Si vous êtes beaucoup a être intéréssé éventuellement je ferai une suite de tutoriels plus détaillée.
Comments on this article
No comments yet for this article. Be the first !

You must be logged in to comment an article.