La conception d’un bon assistant, capable de répondre à la moindre question naturellement, n’est pas une chose facile, mais il existe aujourd’hui des solutions techniques qui vont vous permettre de réaliser votre robot à moindre coût, grâce à différentes techniques d’apprentissage, sans avoir même à toucher à une ligne de code. Mais si vous cherchez à atteindre la perfection, vous risquez d’être vite limité et frustré avec ce genre d'outils.
La valeur de votre chabot ne résidera pas forcément dans la partie technique, celle qui va dispatcher les différentes réponses, mais plutôt dans la base de connaissances, c’est-à-dire l’ensemble des questions auxquelles il sera capable de répondre. Il faut considérer votre robot comme un gros routeur, qui va savoir répondre à une question parce que vous lui avez donné la réponse. L’idée de cet article est de vous présenter la façon dont il est possible de répondre à une question de manière dynamique, en sachant tenir une discussion et en essayant au maximum d’éviter le stade auquel votre robot ne saura plus répondre.
Pour réaliser un bot complexe, il va falloir se tourner vers la NLP (Neuro-linguistic programment / Programmation Neuro-Linguistique en français), qui repose sur un ensemble mathématique et qui consiste globalement à modéliser une partie du langage naturel. C’est un sujet assez complexe, mais qui peut donner naissance à des petites merveilles en matière d’intelligence artificielle.
Il existe également des algorithmes purement mathématiques comme la distance de Levenshtein, qui permet d’assimiler les fautes d’orthographe ou fautes de frappe mais également travailler sur la phonétique avec des algorithmes comme metaphone (PHP, NodeJs) qui est capable d'indexer des mots en fonction de leur sonorité. L’idée derrière ces algorithmes est d’aplatir un maximum la chaîne en entrée afin de pouvoir l’exploiter au mieux dans votre algorithme et de ne pas prendre en compte ces différences de votre côté. Voici deux moyens concrets pour réaliser un assistant complexe. La première, plus théorique, peut être développée de différentes façons, la seconde, plus structurée, est plus facile et rapide à mettre en oeuvre.
L’extraction de données
Pour construire une bonne réponse, il faut savoir interpréter correctement la question, avoir un maximum d’informations sur le sujet et être sûr que vous allez répondre à la bonne question. Pour cela il faut extraire un maximum de données (micro-data) issues de la question. Si besoin, n’hésitez pas à demander des informations complémentaires à votre interlocuteur.
La technique peut sembler complexe mais nous pouvons la vulgariser en la représentant par un ensemble de dictionnaires, certains disponibles gratuitement et d’autres qui vous seront personnels, propres à vos réponses. Les dictionnaires vont permettre d’assimiler un contexte ainsi que des variables. Vous pouvez les structurer de manière à avoir d’un côté des mots qui serviront de variables comme des villes, des couleurs, des jours, des marques de voiture, des sports, et de l’autre côté des patterns du genre "gagné" ou "dernier modèle", qui seront des éléments ou des sujets de redirection vers vos différents petits algorithmes. Enfin, le dictionnaire de stopwords : ce sont les mots qui seront retirés systématiquement de la chaîne d’entrée.
Voici un petit exemple très simple d’extraction de micro-data :
« Qui a gagné entre Marseille et Paris samedi ? »
Après avoir sorti les stopwords, il vous reste "gagné", "Marseille", "Paris", "samedi". A partir de là, il est facile de répondre à la question sachant qu’il est essentiel de structurer votre dictionnaire de patterns avec des variables obligatoires. Dans cet exemple, on trouve deux mots du dictionnaire, des villes. A vous d’élaborer une question si l’utilisateur ne vous donne qu’une seule ville ou club dans sa question.
Un exemple qui prouve qu’il facile de répondre de façon automatisée après une extraction de métadonnées, mais qu’il est très difficile de répondre à un ensemble de questions totalement aléatoires. Le risque d’échec est fort, il faut donc se concentrer sur un sujet donné et ne pas trop s’étendre, pour conserver la pertinence du robot et implémenter petit à petit les nouvelles fonctions.
L’université de Stanford propose gratuitement des outils, des dictionnaires ainsi que des algorithmes sur http://nlp.stanford.edu/, afin de mieux comprendre le langage naturel et d’en tirer un maximum d’informations. L’université Paris Sud propose également un cours de très bonne qualité sur le sujet : https://perso.limsi.fr/anne/coursM2R/M2R_TAL_Extraction_Information.pdf
Artificial Intelligence Markup Language
L’AIML est un langage développé dans les années 2000 et dédié aux bots. Il est dérivé du XML, propose une vingtaine de balises (https://docs.google.com/document/u/1/d/1wNT25hJRyupcG51aO89UcQEiG-HkXRXusukADpFnDs4/pub) et permet de structurer votre AI. ALICE qui est à l’origine de l’AIML – http://www.alicebot.org/ – propose également sur son site des ressources pour apprendre à développer en AIML et tester votre bot.
Vous allez pouvoir structurer votre bot de façon très fine, le tout assez facilement, extraire des métadonnées et définir des conditions de réponse. L’exemple le plus simple est le suivant :
<category>
<pattern>Bonjour *</pattern>
<template>
<srai>Bonjour</srai> <sr/>
</template>
</category>
Une fois vos fichiers structurés, il va falloir les interpréter et pour cela il existe différents moyens en open source comme programAB (https://code.google.com/archive/p/program-ab/) mais également une solution AIaaS (Artificial Intelligence as a Service) https://developer.pandorabots.com/. L’inconvénient de cette solution est la facturation à l’interaction, et la note peut vite être salée.
Pour finir il existe une solution qui vous évitera de mettre les mains dans le JAVA sans passer par un service AlaaS, c’est http://www.program-o.com/, développée en PHP. Votre bibliothèque d’AIML va être exposée et stockée dans une base de données MYSQL. Elle est facilement intégrable sous WordPress et dotée d’une interface qui permet de gérer la personnalité de votre bot, ainsi que les exclusions, les synonymes… etc.
Il n’existe pas de solution globale capable de répondre à l’ensemble des problématiques du langage naturel, c’est donc à vous de construire votre algorithme en fonction de vos besoins. À titre d’exemple, le robot JAM répond à 30% des demandes en mode automatique et 70% des réponses sont directement données par un humain (http://www.liberation.fr/futurs/2015/09/11/jam-un-assistant-par-sms_1380391).
Il est possible de réduire ce ratio en vous focalisant sur votre sujet, sans vouloir couvrir à tout prix l’ensemble de la langue Française.
Il existe d’autres langages orientés intelligence artificielle, mais l’AIML est le plus abouti et le plus performant, d’autant plus que vous trouverez aisément de la documentation à ce sujet, ce qui est rarement le cas pour les autres langages que nous avons croisés sur notre chemin, sans parler des solutions laissées à l’abandon depuis plusieurs années.
Attention aux régressions
Une raison de plus de vous focalisez dans un premier temps sur un spectre déterminer et minimaliste, vous allez devoir faire face aux régressions, l'idéal est d'écrire directement directement vos tests unitaires après avoir développé un pattern, un peu comme dans la programmation en générale.
Il faudra donc vérifier à chaque déploiement un jeu d'expressions où votre bot devra répondre et certifier la réponse, vous allez jouer avec un nombre inconsidérable de wildcard (*) il y aura forcément des conflits entre vos patterns sur la durée.