Le 19/11/2017

Comment créer un chatbot ?

L'autre jour je regardais une conférence sur les smartbot parce que j'avais un peu du mal à voir ce que ca apportait 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 là 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...personnellement pour le moment j'ai pas le niveau pour vous parler de ca.

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 Natural Langage Processing (NLP) et sur les connecteurs.

La science du Natural 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 expliquer les concepts simples et on va pas les coder, juste vous donner les principes pour que vous puissiez le faire chez vous.

Dans mon application, la partie NLP va être un Service 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émentaires pour faire cette action sont "article" controllers magento" pour que le moteur puisse comprendre qu'on veut rechercher un article sur le thème 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. Le 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" (l'intention)
- les informations complémentaires qu'il retournera dans "entities" (les entitées)

On va donc avoir une intention et des entitées qui peuvent prendre la forme d'un pronom, un type de contenu, un mot clef d'article etc...personnellement pour mon chatbot, la reconnaissance se fait en comparant l'input a des bibliothèque que je peux enrichir si besoin pour le rendre plus intélligent. Le moteur va découper la phrase et classer chaque mot ou expression pour nous retourner le tableau ci dessus.

Dans notre exemple, 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 à cette étape.

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 prise de décision qui 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 Service de décision renvoit un nouveau tableau avec les informations suivantes : - le message à renvoyer à l'utilisateur - quel type de contenu vous renvoyez à l'utilisateur (ici des URLs) - les liens vers les 3 articles de la recherche. Vous savez donc maintenant analyser une phrase et prendre une décision sur 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 é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" pour notre chatbot.

Dans notre exemple, on va créer un connecteur pour se connecter à Facebook mais vous pouvez trés bien le connecter à un autre channel comme 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 au chat de votre page facebook.

 $this->_hub_verify_token = 'monTokenDeVerification';
 $this->_access_token = "monAccessToken";	
 
L'application va ensuite pour chaque message recu sur le chat de notre page facebook, reenvoyer 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 bien 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 facebook 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 certainement la partie la plus 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 système qui vous permet de créer un chatbot plutot intélligent et qui pourra se connecter à autant de services que vous le souhaitez, qui pourra devenir plus intélligent en travaillant la couche "prise de décision", qui reconnaitra plus de mots en travaillant la partie "NLP".

Dans ce tutoriel, je ne publie pas mon code car il serait trop complexe et surtout trop long à expliquer, mais le but ici est de vous expliquer les principes et ma vision des choses pour que vous puissiez faire votre propre chatbot. Voici l'url vers ma page facebook qui vous permettra de tester mon bot.

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 à être intéréssé éventuellement je continuerai à creuser le sujet pour qu'il puisse tenir une petite conversation, je me renseignerai un peu plus sur les concepts et je ferai une suite de tutoriels plus détaillée sur comment réaliser un chatbot en PHP. Bien sur cette facon de découper les choses est inspirée de ce que j'ai pu voir en me documentant mais j'imagine qu'il n'y a pas qu'une façon de faire et je ne suis pas un proffessionnel des chatbots donc il y a forcément pleins améliorations à apporter ou de choses pas faite dans les regles de l'art. Si vous maitrisez le sujet je serai vraiment ravis d'avoir vos conseils sur les prochaines étapes pour l'améliorer.
Commentaires sur cet article
Pas encore de commentaires pour cet article. Soyez le premier !

Vous devez être connecté pour commenter un article.