L’avenir de la programmation (3/6) : programmer le langage naturel

Par le 05/09/12 | 4 commentaires | 4,773 lectures | Impression

Pour le créateur de l’informatique, Alan Turing, l’intelligence artificielle triompherait lorsqu’un programme informatique réussirait à convaincre un interlocuteur qu’il était humain. C’est le fameux “test de Turing” qu’aucune machine n’a réussi à passer depuis – même si plusieurs “agents conversationnels” s’en sont approchés. C’est dire si la reconnaissance et la pratique du “langage naturel” sont une discipline clé de l’intelligence artificielle. Mais c’est aussi une de celle qui avance avec le plus de difficultés. Pourtant, ces derniers mois ont été riches en avancées qui laisseraient à penser que le problème serait en phase de résolution. Stephen Wolfram à créé un « moteur de connaissances » interrogeable en langage naturel, WolframAlpha. Apple a beaucoup communiqué sur son assistant personnel Siri (même si les avis des consommateurs sur son efficacité restent assez partagés). Et pour la première fois un ordinateur s’est révélé meilleur que des humains au Jeopardy (un jeu qui n’a pas la noblesse des échecs, mais qui présuppose de la part du joueur une compréhension correcte du langage, non seulement en terme de syntaxe et de vocabulaire, mais surtout la capacité de comprendre le contexte d’un indice, bref, le sens des mots).

Il existe deux types de programmation du langage naturel ; celle qui est effectuée par les grosses compagnies comme IBM et Apple, sur laquelle on ne possède bien souvent que quelques indications, et celle élaborée par les milliers de créateurs, souvent amateurs, de “chatbots” (programmes conversationnels). Celle-ci peut susciter l’intérêt du non-programmeur désireux de s’initier à cette discipline, car les outils sont disponibles et les procédés bien balisés.

Les connaissances structurées : une tâche complexe et couteuse en ressources

Comment fonctionnent les “gros” programmes de reconnaissance du langage naturel ? En gros, on peut travailler selon deux stratégies distinctes. Le premier est de fournir à l’ordinateur une base de connaissances structurée, précise, associant à une multitude de mots clés des relations, suivant un système formalisé. C’est ce qu’on appelle une ontologie : une espèce d’encyclopédie pour machine qui décrit tout un ensemble d’objets et les met en relation. L’autre stratégie, c’est d’engranger une quantité impressionnante d’informations non structurées (textes, livres, articles de journaux, encyclopédies…) et de compter sur des algorithmes divers pour les décrypter. C’est en gros la différence qui existe sur le web entre un moteur de recherche comme Google et les projets issus de du web sémantique. Google utilise toute une palette d’algorithmes pour déterminer les pages à afficher suite à une requête. Tandis que les systèmes sémantiques utilisent des ontologies avec des pages spécialement préparées pour répondre à des questions elle mêmes formulées dans un langage très formel, tel le SPARQL.

A première vue l’approche structurée semble plus sûre parce qu’elle évite par trop les ambiguïtés liées au langage et ne met pas trop de pression sur le programme informatique. Mais le problème c’est que justement la pensée humaine se montre bien souvent rétive à une formulation trop informatique. Et en plus, le temps de préparation des données, convertir des milliers de pages voire des millions, selon un format particulier peut s’avérer une entreprise pharaonesque.

Un gros programme de reconnaissance du langage comme Watson, l’ordinateur champion de Jeopardy, utilise en fait la première approche. Selon Eric Brown d’IBM :

“L’approche de Watson ne consiste pas à préparer les données sous-jacentes ou à construire des bases de données ou de ressources structurées, en particulier de manière manuelle ; elle s’appuie au contraire sur des données non structurées – des documents, comme des encyclopédies, des pages Web, des dictionnaires, et autres contenus non structurés.

Ensuite, nous appliquons une grande variété de systèmes d’analyse de texte, toute une chaine de processus, afin d’analyser le contenu et déduire automatiquement la structure et la signification de celui-ci. De la même façon, lorsque nous recevons une question en entrée, nous n’essayons pas de la mapper selon une ontologie ou une taxinomie, ou sous la forme d’un langage structuré de requêtes.

Au contraire, nous utilisons des techniques de traitement du langage naturel pour tenter de comprendre le sens de la question, puis pour trouver et évaluer les meilleurs réponses possibles”.

IBM-Watson-Jeopardy-Practice-RoundWatson essaie de retirer du sens de cette multitude de sources et répond lorsqu’il juge que la probabilité d’avoir la solution dépasse les 80% . Curieusement, selon John Rennie, auteur d’un article sur la mécanique interne de Watson, plus les indices de Jeopardy sont compliqués et se prêtent donc à une multitude d’analyses, mieux Watson se débrouille. Ainsi, nous raconte-t-il, Watson a beaucoup de mal avec les indices très courts, en un ou deux mots. Par exemple, explique-t-il, si on donne à un humain les indices “Ronald Reagan” et “Premières dames”, il n’aura aucun mal à répondre immédiatement “Nancy Reagan” alors que Watson par sa méthode de recherche en profondeur, mettra bien plus de temps.

Wolfram Alpha est un tout autre genre d’animal. Il repose quant à lui sur un ensemble de données structurées, comme le web sémantique, bien que, comme nous l’avons déjà souligné, son créateur Stephen Wolfram ne cache pas son mépris pour l’esprit à son avis “médiéval” du web sémantique. Mais pour autant, il ne repose pas non plus sur les complexes algorithmes de traitement du langage naturel typique de Watson. En fait, lorsqu’il reçoit une question, Wolfram Alpha cherche dans la phrase les éléments qui pourraient donner lieu à une computation. Il traduit ensuite son interprétation de la phrase en une proposition de logique symbolique avant de calculer la réponse à l’aide des données structurées.

Mais ces systèmes utilisent des calculs puissants et des machines qui le sont tout autant : pour exemple Watson est constitué de 90 serveurs, chacun possédant 32 processeurs à 3.55 GHz, chacun à leur tour disposant de 256 gigaoctets de RAM (oui vous avez bien lu, de RAM). Dans ces conditions techniques, est-il possible pour un programmeur débutant de se lancer à son tour dans le traitement du langage naturel ?

Comment programme-t-on un “agent conversationnel”, un “chatbot”, comme on les nomme plus familièrement ? Bien sûr il est possible de tout recréer à la base, mais il existe aujourd’hui des systèmes permettant d’éviter de réinventer la roue, et surtout de ne pas être un génie en IA pour s’y mettre.

Alice, et son langage associé, AIML est le plus vieux (bien que créé en 1995, il reste d’actualité). En 2010, un chatbot AIML s’est encore retrouvé (pour la 4e fois) sur le podium du Loebner prize, un concours récompensant les meilleurs bots du moment.

L’AIML est un langage héritier d’XML. Sa structure de base est simple et les premières instructions peuvent s’apprendre en quelques minutes. Pas besoin de connaître le C, Java et de triturer la mémoire RAM de l’ordinateur. Programmer en AIML se rapproche beaucoup plus de la rédaction d’une page Web (mais sans éditeur Wysiwyg, comme au bon vieux temps).

Programmer un chatbot

AIML repose sur un système de règles très simple, basé sur la “substitution”. Vous avez une base de données de questions/réponses préenregistrées, au sein desquelles se trouvent des “trous”, des “variables”. Imaginons une conversation avec un programme utilisant la substitution :
“Bonjour comment vous appelez-vous ?
- Je m’appelle X.
- Eh bien bonjour X.”

Dans ce cas, bien entendu, X est une variable renseignée par l’interlocuteur humain, et stockée par le programme, qui pourra la ressortir aussitôt après, mais peut être aussi plus tard. Il peut exister non pas une réponse “comment vous appelez-vous” mais toute une série possible par exemple, “mon nom est X” ou “moi, c’est X”.

Les variables ne sont pas forcément des noms. Il peut s’agir d’expressions entières, et il est possible d’effectuer des calculs dessus, d’y appliquer des conditions, etc.

Évidemment, pour créer un chatbot crédible, il faut avoir prévu énormément de réponses, ce qui peut être très dur à réaliser. C’est là qu’interviennent les “ensembles AIML”, et où Alice entre en jeu. Ce n’est pas seulement un bot créé en AIML. Il est le bot fondamental, c’est-à-dire qu’il dispose déjà d’une base de données de 40 000 questions/réponses susceptible de prendre en charge la plupart des éléments d’une conversation. Lorsqu’on veut créer un bot en AIML, on utilise donc l’un de ces “sets” (il en existe un en français, mais pas aussi important que l’anglais), qu’on complète ou qu’on modifie selon ses intentions.

Tout cela peut paraître primaire et très lourd, mais on l’a vu, ça marche et les enfants d’Alice font encore merveille au Loebner prize.

Dans un article du site spécialisé Gamasutra, Bruce Wilcox s’étend sur les limites du AIML et présente deux autres systèmes de programmation de bot, plus récents, celui incorporé dans le jeu Façade (dont nous avons déjà traité) et son propre système Chatscript, qui, lui, a obtenu la première place au Loebner prize de 2010 (Alice arrivant tout de même à la seconde place).

Dans Façade, on ne cherche pas à faire coller de manière exacte les propos de l’humain et celui du bot : les différentes phrases sont classées en fonction “d’actes de discours” (être d’accord, contredire, etc.) et les bots de Façade réagissent plus à ces actes, à ces attitudes, qu’à la signification des mots eux-mêmes. C’est assez logique dans la perspective de Façade : rappelons-le, le joueur est immergé au sein d’une scène de ménage entre deux bots, et chacune de ses paroles va entraîner diverses réactions de la part du couple. Du coup, on n’est pas obligé de répondre mot pour mot à ses propos.

Mais Wilcox consacre – c’est de bonne guerre- la majeure partie de son article à son propre système, Chatscript. Pour Wilcox, le gros problème de l’AIML en plus d’une syntaxe XML particulièrement lourde et verbeuse, est l’énorme quantité d’instructions qu’il faut réaliser pour obtenir toutes les réponses possibles. Par exemple, à la question “est-ce que vous aimez la viande ?”, il faut préparer une réponse spécifique réagissant au mot “viande”. Mais, si la question est “aimez-vous les steaks ?”, alors il faut aussi préparer une réponse particulière liée au mot “steak”. Au contraire, Chatscript permet de regrouper des mots par groupes par exemple : “concept: ~meat ( bacon ham beef meat flesh veal lamb chicken pork steak cow pig )”. La question aimez-vous les steaks et aimez-vous le porc, pourra ainsi recevoir la même réponse…

Autre défaut de AIML, selon Wilcox : les bots qu’ils créent ne maintiennent pas leur état. On a déjà vu que cela signifiait dans un précédent article mettant en scène un autre bot, Cleverbot : si un chatbot ne maintient pas son état il répondra indépendamment à chaque question. Pris isolément chaque propos semblera cohérent, mais la conversation finale risquera d’être absurde.

Selon Wilcox, Chatscript propose des technologies qui permettent effectivement au bot de suivre une conversation. J’ai voulu vérifier cela en parlant à “Suzette“, un bot écrit en Chatscript. Voici un extrait de notre conversation -traduite de l’anglais, car bien sûr tous ces programmes sont anglophones !

Remi : êtes-vous un bot ?
Suzette : Ne soyez pas ridicule.
Remi : Passez-vous le test de Turing ?
Suzette : Il devrait être aisé pour moi, en tant qu’être humain, de passer le test de Turing. Si j’échouais, les juges devraient être vraiment stupides ou corrompus.
Remi : Je sais que vous êtes un bot.
Suzette : Non, je suis un être humain.
Remi : Prouvez-le !
Suzette : Vous voulez que je vous envoie des portions de mon ADN ?

Noter le dernier échange : “prouvez-le” (“prove it”) ne possède aucun contexte, mais Suzette a correctement compris que je parlais de son identité en tant que bot. Autrement dit, elle a suivi la conversation, contrairement à Cleverbot, qui s’est montré incapable de suivre le fil d’une discussion. Cela dit, bien que Suzette ait gagné le prix Loebner (dans une version améliorée, il est vrai) notre conversation a quand même connu son lot de bizarreries et d’incohérences, et je ne vois pas comment elle pourrait passer le test de Turing…

AnatomyofAlice

Chatbots DIY

Ces systèmes sont parfaits pour l’apprenti programmeur soucieux de créer ses propres “chatbots”. Mais ne peut-on réunir le meilleur des deux mondes ? Est-il possible pour un chabot “artisanal” de se nourrir des ressources des grandes bases de connaissances, élaborées par les chercheurs en intelligence artificielle ou les adeptes du web sémantique ?

Plusieurs expériences vont en ce sens. AIML et Chatscript se sont tous deux attaqués aux problèmes.

AIML a bien sûr été le premier. Pour augmenter les capacités cognitives du bot originel, certains programmes “clients” ont fait appel à un système particulier, Opencyc. A l’origine, Cyc créé par un des pionniers de l’intelligence artificielle, Douglas Lenat, était un programme ayant pour ambition d’apprendre le sens commun : autrement dit, Cyc voulait comprendre l’ensemble du monde réel, à partir d’assertions du genre : un oiseau à des ailes et des plumes ; les pingouins ne volent pas, les chauves-souris ont des ailes mais ne sont pas des oiseaux, etc. Cyc est un programme commercial, mais bientôt apparut une version open source, nommée justement Opencyc, ouverte à la collaboration de nombreux utilisateurs.

Un “client AIML” nommé AimlPad, qui prit par la suite le nom de Cyn, proposa dès le début des années 2000 une connexion à AIML permettant ainsi d’utiliser le chatbot AIML pour effectuer des inférences, opérations logiques sur les connaissances accumulées par Opencyc. Selon la page d’accueil de Cyn, cela devait permettre de poser des questions comme : “Un lion est-il un animal ?”, ce à quoi le bot répondait “affirmatif, je suis d’accord”.

J’emploie ici le passé, car bien que les programmes soient encore accessibles, le développement d’Aimlpad/Cyn semble s’être arrêté en 2004, et Opencyc ne semble pas se porter beaucoup mieux. A cause de la documentation très spartiate, il m’a été impossible de faire fonctionner ce système.

Chatscript fait lui aussi appel à une ontologie, nommée Wordnet. Cette base de connaissances en langage naturel se concentre surtout sur l’analyse grammaticale, mais possède aussi un dictionnaire de concepts très poussé (en anglais bien sûr, mais il existe un projet d’adaptation à notre langue).

On a vu l’exemple donné par Wilcox à propos de la “viande” qui regroupe tout un ensemble de mots. S’il s’agit d’une avancée par rapport à l’AIML, il n’en reste pas moins qu’il peut être difficile de créer une telle nomenclature “à la main”. C’est là qu’intervient Wordnet. Ainsi explique Wilcox, le concept Chatscript “bâtiments” (buildings) peut être exprimé ainsi : “concept: ~buildings ( shelter~1 living_accomodations~1 building~3 )”, ce qui, continue Wilcox, regroupe pas moins de 760 mots disponibles dans le dictionnaire Wordnet, chacun étant rattaché à l’une des trois définitions plus globales, le bâtiment en tant qu’abri (shelter) en tant que logement (accomodation) ou, plus généralement, en tant que “bâtiment”.

En tout cas, il n’est pas très difficile pour un débutant de se lancer dans Chatscript ou l’AIML. Il existe même des services, comme Pandorabots, qui non seulement proposent d’héberger gratuitement votre bot, mais offrent également des éditeurs qui permettent de simplifier au maximum la rédaction du code.

Les chatbots, connectés ou non à des ontologies, seront-ils un jour en mesure de passer le test de Turing ? Peut être, mais certainement pas avant longtemps. Mais déjà, ils constituent une activité artistique d’un tout nouveau genre : un bon moyen de créer un personnage avec sa personnalité et ses idiosyncrasies. Une façon d’aborder la programmation toute trouvée pour les “littéraires”. Et à la clé, d’inventer de nouvelles formes de narration, peut-être ?

Rémi Sussan

Retrouvez le dossier L’avenir de la programmation :