samedi 5 avril 2014

Ou plus simplement

On peut éviter de toucher au moteur AIML en faisant juste un peu de pré-traitement. Une phrase en entrée va être tour à tour couplée à toutes les phrases actuellement en vigueur. A chaque fois, on fait la recherche de la longest common substring, qu'on remplace dans les deux phrases par un tag <MATCH/>. On concatène les deux phrases dans l'ordre alphabétique en les séparant par un tag <AND/>, et on donne ça à RebeccaAIML. Résultat : de l'association d'idées pour pas cher. Avec un peu de chance, c'est peut-être même Turing-complete !

J'ajoute qu'une telle boucle, consistant à re-traiter chaque pensée générée comme si elle venait d'être sentie par le capteur, mènera nécessairement à une explosion combinatoire des pensées. En restant dans le même esprit de simplicité, on peut imaginer, pour guider la réflexion de l'agent, un mini-cerveau "entonnoir" de retour. Il traite chaque pensée générée, et seules ses réponses non-vides sont ressenties et alimentent la boucle.




jeudi 3 avril 2014

System of a D

ACE ne semble pas convenir non plus, mais je reste attaché à l'idée d'une interaction à base de langage naturel. L'idée du moment, c'est de détourner AIML de sa raison d'être originelle pour en faire un instrument de programmation qui sorte un peu de l'ordinaire. Ome est fondamentalement un univers d'agents logiciels. Imaginons.

Chaque agent a accès à une même base de "bon sens" commun à tous les agents partout dans le réseau P2P. Ce sens commun est fait de règles pattern-template qui se répandent de node en node à chaque connexion. Chaque utilisateur peut alimenter librement cette base, les redondances partielles n'ayant aucune importance.

Second élément, chaque agent conserve en lui un ensemble de phrases descriptives qui forment la représentation subjective qu'il se fait de la situation actuelle de son environnement, et de sa propre position dans cet environnement.

En guise de capteurs sensoriels, l'agent reçoit des phrases en provenance de son environnement, c'est à dire en provenance d'autres agents, exactement comme le chatbot reçoit des phrases de l'utilisateur avec lequel il converse. Seulement au lieu de générer une réponse, livrée immédiatement à l'interlocuteur dans le cas du chatbot, ces entrées vont générer des "pensées" pour ainsi dire, qui vont alimenter cette représentation subjective dont nous parlions dans le paragraphe précédent.

Le moteur AIML doit être modifié, car les règles doivent accepter comme gâchette non seulement une phrase, mais plutôt un ensemble de phrases, partageant éventuellement des variables libres, et qui, si elles sont toutes présentes, vont déclencher la production d'une pensée.

Chaque pensée ainsi produite sera immédiatement retraitée comme si elle provenait du capteur sensoriel de l'agent, ce qui est le cas finalement, puisque l'agent ne fait que sentir ce qui se passe en lui. Ces pensées re-senties peuvent donc à leur tour générer d'autres pensées. Et ainsi de suite.

En sortie, certaines pensées pré-définies déclenchent automatiquement un acte de l'agent vis à vis d'un élément, identifié, de son environnement.

Dans ce schéma, la programmation d'un agent consiste à lui fournir un stock personnel de règles de génération de pensées, et des phrases "mission" pour guider son action. Maintenant il faut poser quelques petits garde-fous, parce que même si l'approche sort de l'ordinaire, on veut que ce soit utilisable.

La première nécessaire limitation concerne la façon dont se propagent les règles de sens commun. Chaque utilisateur peut transformer une règle active de sens commun en inhibition. L'inhibition a le même contenu que la règle active dont elle est issue, mais elle a pour effet d'effacer cette règle active de tous les nodes sur lesquels elle s'installe. Son mode de propagation est légèrement différent : elle ne se propage que sur les nodes qui contiennent la règle dont elle est issue, à raison d'une par jour, et disparait après trois mois. La raison d'être des inhibitions est évidemment de permettre à chaque utilisateur de supprimer certaines règles de la base de sens commun.

Un autre garde-fou : les règles de sens commun ne peuvent à elles seules provoquer un acte de l'agent. Si une pensée d'action est sur le point d'être générée par une règle de sens commun, alors cette règle se transforme immédiatement en inhibition, qui commence à se propager. Sans cela, il deviendrait rapidement impossible de programmer efficacement un agent. Seul le stock personnel de règles actives de l'agent peut générer des pensées d'action.

Avec un tel système, même en tenant compte des garde-fous, il est bien sûr difficile de programmer des comportements complexes, et on n'est jamais totalement certain de ce qui va se passer à l'exécution. Cela dit, l'objectif est surtout de pouvoir donner des ordres simples aux éléments peuplant Ome, en langage naturel, et en privilégiant la dimension ludique de l'ensemble.

mercredi 26 mars 2014

Ambitions

Après l'étude du langage Io, il m'est apparu que ce n'était pas le bon choix. C'est un magnifique langage, mais je ne me sens pas à même de protéger mes utilisateurs si je l'utilise, parce que c'est un langage tellement libre, d'une pureté si sauvage, que je ne m'y sens pas en sécurité. Les conséquences des règles simples qui constituent ses fondements sont extrêmement complexes, quand on y pense. De plus, son concepteur semble se diriger petit à petit vers une seconde version du langage, ce qui n'arrange pas mes affaires.

D'autre part, après avoir découvert ACE, le Attempto Controlled English, il me semble que le projet d'un langage naturel de programmation soit réaliste. Attempto fonctionne sur SWI-Prolog, et puisqu'il existe une couche orientée objet appelée Logtalk qui peut utiliser SWI-Prolog comme back-end, il est fort probable que je travaille dans les prochaines semaines à la conception d'un environnement qui sera à la fois logique et event-driven, basé sur des messages écrits en anglais naturel contrôlé. Je garderai de Io une relative simplicité de l'architecture de base.

lundi 24 février 2014

Choix techniques

Un certain nombre de choix ont été faits quant aux outils utilisés pour construire Ome. La base n'est plus FirefoxOS. Au coeur du projet, le langage de programmation Io de Steve Dekorte, qui implémente de belle façon des concepts simples et puissants. Au-dessus de Io, la couche réseau sera motorisée par Raknet, qui est à l'origine conçu pour le développement de jeux MMO, un gage d'efficacité. Pour l'interface, à la fois pour le rendu visuel et la capture des actions utilisateurs, on utilisera Clutter, qui intègre notamment Gecko et Webkit, dont nous avons absolument besoin. Enfin, nous devrons utiliser OpenCV pour la reconnaissance visuelle des éléments dont on veut automatiser la manipulation, puisqu'on ne veut pas de java.

L'architecture sera similaire à celle d'un jeu massivement multijoueur, classiquement client/serveur. Il se trouve que Clutter est capable de construire une interface à partir de messages JSON, et c'est donc sans doute ce langage qui sera retenu pour les communications client-serveur.

Pour les communications serveur-serveur, c'est à dire entre les Ome de différents utilisateurs, on utilisera tout simplement cette caractéristique naturelle de Io qui est de tout faire par émission de messages. Les objets contenus dans un serveur pourront envoyer des messages à des objets contenus dans d'autres serveurs, à condition bien sûr qu'ils en aient l'autorisation. Les serveurs eux-mêmes sont des lobbys, dans la terminologie Io.

La seule modification du langage Io qui soit prévue pour l'instant est l'ajout d'un slot "before", qui serait activé automatiquement, s'il existe, avant même la recherche d'un slot correspondant au message reçu. Cela permettra de vérifier si l'expéditeur du message a l'autorisation d'atteindre le slot cible. J'ai évoqué l'idée de ce slot "before" sur la mailing list de Io, et elle semble avoir été appréciée.

Pour l'instant, nous en sommes là.

samedi 25 janvier 2014

Présentation du projet Ome


Ome est un environnement informatique, autrement dit un bureau, disponible sur plusieurs plateformes, dont Windows, Linux, et d'autres. En fait il est disponible sur toute plateforme acceptant Firefox, puisqu'il est conçu sur la base de FirefoxOS, et utilise Gecko de Mozilla.

Ome a plusieurs fonctionnalités, dont les suivantes :
- Les Applications (et "Rooms") distribuées sous forme de fichier *.OAPP
- Les Rooms, qui sont des environnements mélangeant plusieurs applications
- Une capacité d'automatisation des tâches (macros)
- Un réseau social de type peer2peer
- Des Cellules d'information actualisées automatiquement

Les fichiers OAPP sont librement inspirés du format de fichier APK d'Android. Il y a un "market" où l'on peut facilement télécharger les Applications et les Rooms, les noter et les commenter. Installation et désinstallation se font d'un simple clic. Enfin, pour les Applications, on utilise "asm.js" comme language portable de bas-niveau. Le code est exécuté par Spidermonkey, quelque soit la plateforme.

Les "Rooms" sont des environnements uniques mélangeant plusieurs Applications. Par exemple, personnellement j'utilise souvent conjointement Gimp, Blender et AVI2GIF. Donc je vais créer une Room dédiée à mes activités de design graphique, une Room qui sera un peu comme mon petit studio personnel. Je peux organiser comme je veux l'emplacement des boutons, des widgets, des fenêtres, ...etc, et les fonctions basiques (comme ouvrir-un-projet, ouvrir-projet-récent, enregistrer, enregistrer-sous, annuler, refaire, ...) appartiennent désormais à la Room et non aux Applications.

La fonctionnalité d'automatisation donne à Ome les mêmes capacités que Sikuli et Selenium. Chaque Application peut posséder son propre curseur de souris et agir comme un utilisateur, cliquant ici et là, travaillant automatiquement à votre demande, pendant que vous faites autre chose. OpenCV est utilisé pour localiser visuellement les éléments qui doivent être manipulés.

Votre Ome fait partie d'un réseau social de type peer2peer (décentralisé). Vous pouvez vous connecter à vos amis ou aux membres de votre famille, chatter et envoyer des courriers, et surtout les inviter dans une de vos Rooms. Quand vous invitez des gens, vous partagez tous le même écran (ils voient votre écran sur leur ordinateur), chaque invité a son propre curseur de souris (avec un petit avatar en dessous), et tout le monde peut travailler ensemble, sur la même page de la Room.

Dans Ome, l'information est contenue dans des Cellules qui s'actualisent automatiquement, et elle est traitée en tant que flux. Cela fonctionne un peu comme les cellules d'Excel : pour chaque Cellule, une formule permet de calculer une valeur, basée sur les valeurs contenues dans d'autres Cellules. Ici dans Ome, les Cellules contiennent souvent des Collections de valeurs typées. Les principales fonctions sur ces Collections sont l'Union et l'Intersection de Collections d'autres Cellules. Ce qui est intéressant, c'est que ces "autres Cellules" ne sont pas nécessairement situées sur votre ordinateur, elles peuvent être situées sur l'ordinateur de votre frêre par exemple. (Les valeurs peuvent être de gros fichiers, comme des chansons en MP3, donc si votre frêre ajoute une chanson à sa collection, celle-ci sera automatiquement téléchargée dans votre collection)

De plus, Union et Intersection ne sont pas les seules choses que vous puissiez faire avec les Collections. Les valeurs contenues dans une Cellule peuvent être automatiquement traitées par une Application sur votre ordinateur, et le résultat sera inséré automatiquement dans une autre Cellule. Chaque fois que le contenu d'une Cellule source sera modifié, le contenu de la Cellule cible sera automatiquement modifié. Les Collections peuvent aussi être filtrées à l'aide d'Applications retournant un booléen, avant d'être insérées dans d'autres Collections. L'ensemble forme une gigantesque mécanique, composée de tous les ordinateurs connectés faisant tourner Ome.

Le développement de ce projet prendra du temps, puisque ce n'est qu'un hobby pour moi.
Cela dit, un petit coup de main n'est pas de refus :)