Plausible n'est pas exact
Un modèle de langage prédit le texte le plus probable. Il ne vérifie rien. Dès qu'il faut enchaîner plusieurs règles, son taux d'erreur augmente nettement.
Au cœur de ProSuite, le serveur VAILS et son langage VVL réunissent deux familles d'intelligence artificielle : les modèles de langage, qui comprennent le texte, et le raisonnement symbolique, qui applique des règles de façon exacte et vérifiable. Cette page présente nos choix de modélisation et nos premières mesures.
Confier à l'IA une part de la gestion, c'est lui confier des milliers de petites décisions par jour : trier une demande, qualifier un client, contrôler un document, appliquer un tarif. Un grand modèle de langage, utilisé seul, n'est pas conçu pour cela.
Un modèle de langage prédit le texte le plus probable. Il ne vérifie rien. Dès qu'il faut enchaîner plusieurs règles, son taux d'erreur augmente nettement.
Il rend une réponse, jamais une probabilité exploitable. Or c'est ce dont un processus a besoin pour décider seul, demander une vérification ou passer la main à une personne.
Chaque tri ou contrôle devient un appel lent et facturé. À l'échelle d'une entreprise, la latence et le coût deviennent le premier frein.
Quand la règle de gestion est cachée dans une consigne rédigée en langage naturel, personne ne peut l'auditer, la versionner ni prouver qu'elle a été appliquée.
L'IA neuro-symbolique associe un réseau de neurones, qui apporte la compréhension du langage, à une couche symbolique, qui apporte la logique, la structure et la preuve. Dans VAILS, cette association suit quatre couches.
Le modèle de langage lit le cas particulier : une demande, un devis, un CV ou une facture est transcrit dans le schéma de l'entreprise. Le modèle transcrit, il ne raisonne pas.
L'ontologie porte la connaissance générale : catégories, règles, exceptions et profils types, écrits une fois, compilés en règles logiques.
Règle, puis Jev, puis modèle de langage, puis humain : chaque décision part vers le moteur le plus simple capable de la prendre avec assez de confiance.
Contrats, preuves et journal des décisions : quel moteur a tranché, avec quelle confiance, sur quelle règle.
Dans la plupart des outils, les appels à l'IA sont ajoutés par-dessus un langage de programmation classique. Dans VAILS, c'est le langage lui-même, VVL, qui sait manipuler le sens.
Par défaut, une valeur VVL se comporte comme une valeur ordinaire : un texte, un nombre, une liste. Le programme reste déterministe et rapide. Lorsqu'une valeur est marquée comme sémantique, les opérateurs habituels se mettent à juger selon le sens : l'égalité devient une équivalence de sens, l'appartenance une inclusion de concepts, l'ordre une comparaison de rang.
Cette séparation est un choix de conception essentiel : la partie imprévisible du système reste petite, visible et localisée. VVL compte 21 opérateurs de ce type, une instruction qui choisit une branche selon le sens, des tables de décision, des projections sur une échelle ordonnée et des degrés de logique floue mesurés sur un texte.
[semanticMode "jev"]
[print ([§ "a baby penguin"] == [§ "a young penguin"])] # 1
[print ([§ "a salmon"] in [§ "freshwater and saltwater fish"])] # 1
[print ([§ "a colonel"] < [§ "a captain"])] # 0Jev est un modèle de décision qui ne rédige pas : il tranche. On lui soumet un texte et des questions typées, de trois formes : oui ou non, un choix parmi des options, une position sur une échelle. Il répond en une seule passe, avec une probabilité calibrée pour chaque réponse.
Nous l'utilisons comme ce que la psychologie cognitive appelle un Système 1 : un mode de décision rapide et économe. Le grand modèle de langage joue le rôle du Système 2, plus lent et plus coûteux, sollicité seulement quand Jev hésite.
Soit p la probabilité donnée par Jev et τ le seuil choisi par le métier, 0,8 par défaut.
Si p ≥ τ, la réponse est oui. Si p ≤ 1 − τ, la réponse est non. Entre les deux, la question passe au modèle de langage, puis à une personne si le doute persiste.
Le seuil devient ainsi un paramètre de gestion : plus il est élevé, plus les cas délicats remontent vers le modèle de langage ou vers une personne. Plusieurs questions portant sur le même texte partent en un seul appel. Chaque décision est journalisée avec le moteur qui l'a prise, sa probabilité et son temps de réponse.
| Temps d'une décision Jev | 0,35 à 0,45 s, dont 2 ms de traitement VAILS |
|---|---|
| Classification des questions posées au routeur | 16 sur 16 correctes, confiance ≥ 0,99 |
| Scénarios de routage de référence | 11 sur 13 tranchés par Jev, tous justes ; les 2 cas volontairement ambigus laissés au modèle de langage |
| Juge de fin de tâche d'un agent | 10 sur 10, environ 0,4 s |
| Trois décisions sur un même ticket, préchargées | 1 appel au lieu de 3, 0,5 s au lieu de 1,1 s |
Mesures de mise au point sur de petits échantillons. Elles seront élargies à plusieurs centaines de cas par type de décision.
La connaissance générale de l'entreprise est écrite dans une ontologie ; le modèle de langage ne fait que transcrire le cas particulier dans cette ontologie ; le raisonnement est confié au moteur symbolique.
Une ontologie VAILS décrit des classes, des attributs typés et des relations. Elle est traduite automatiquement en clauses logiques, exécutées par un moteur de type Prolog intégré au serveur. L'héritage devient une règle : tout ce qui est un devis de chantier est aussi un devis. Une relation déclarée transitive, comme « se trouve dans », est calculée par une fermeture qui mémorise les éléments déjà visités, ce qui garantit qu'elle termine même lorsque les données contiennent des cycles. Les règles d'exception s'écrivent sous l'hypothèse du monde clos : ce qui n'est ni énoncé ni déductible est considéré comme faux.
rel(X, r, Z) :- tc(X, r, Z, [X]).
tc(X, r, Z, _) :- dedge(X, r, Z).
tc(X, r, Z, V) :- dedge(X, r, Y), not(member(Y, V)), tc(Y, r, Z, [Y|V]).Pour représenter un profil, un archétype ou une norme, VAILS s'appuie sur la théorie des objets abstraits du logicien Edward Zalta. Un objet abstrait encode les propriétés qui le définissent. Comparer un candidat, un client ou un dossier à un profil donne un degré de satisfaction entre 0 et 1 : la part des propriétés encodées que l'instance possède.
[semanticMode "jev"]
$rh = [ontology:define rh
[ontology:class Candidat [attributes
[nom String] [competence String] [remote String] [niveau String]]]
[ontology:abstract ProfilDevConfirme : Candidat
[encode competence "ingenieure logicielle"]
[encode remote "teletravail complet"]
[encode niveau "confirmee"]]]
$bob = [new Candidat [nom "Bob"] [competence "boulanger"]
[remote "sur site uniquement"] [niveau "apprenti"]]
[print ($bob ~~ "ProfilDevConfirme")] # ~0.04Emprunté au génie logiciel des systèmes critiques, un contrat précise ce qui doit être vrai avant et après une opération. Un contrat ontologique n'accepte une extraction du modèle de langage que si elle satisfait l'ontologie au-dessus d'un seuil ; sinon, l'extraction est relancée avec l'erreur constatée, puis refusée proprement. Pour la logique propositionnelle, le modèle peut proposer une preuve, mais c'est un petit noyau vérificateur qui l'accepte ou la rejette.
Nous sommes précis sur ce que cela apporte : un contrat ne rend pas le modèle infaillible. Il garantit que ce qui passe a été vérifié contre des règles explicites.
Pour comparer rigoureusement un modèle de langage seul et la modélisation neuro-symbolique, nous avons construit un générateur de petits mondes : des faits, des règles, des distracteurs et une question dont la réponse est oui ou non. Les noms sont inventés, pour qu'aucune connaissance préalable du modèle ne puisse l'aider.
| k | Modèle seul, direct | Modèle seul, pas à pas | Moteur VAILS |
|---|---|---|---|
| 1 | 97 % | 99 % | 100 % |
| 2 | 87 % | 95 % | 100 % |
| 3 | 75 % | 88 % | 100 % |
| 4 | 69 % | 86 % | 100 % |
| 5 | 64 % | 84 % | 100 % |
| 6 | 60 % | 82 % | 100 % |
| Ensemble | 74 % | 88 % | 100 % |
Les règles d'exception : même en raisonnant pas à pas, il ne répond juste qu'à 72 % de ces questions. Il cite les bonnes phrases, puis conclut qu'on ne peut pas savoir, au lieu d'appliquer l'hypothèse du monde clos énoncée dans le texte.
Le modèle de langage extrait les faits, VAILS raisonne : un premier pilote de 52 questions donne 98 % de bonnes réponses, contre 65 % et 87 % pour le modèle seul sur les mêmes questions. Toutes les erreurs restantes viennent de l'extraction et sont mesurées séparément. La campagne complète est en cours.
Quand on laisse la connaissance générale dans le texte transmis au modèle d'extraction, celui-ci se met à raisonner à la place du moteur. Informé qu'une relation est transitive, notre extracteur a produit 369 déductions non demandées sur 52 cas, malgré une consigne explicite de ne rien déduire. Retirer cette connaissance du texte et la placer dans l'ontologie a fait disparaître le problème. Le même banc d'essai, rejoué en sessions simultanées, nous a aussi permis de détecter et de corriger un défaut d'isolation entre sessions dans le serveur : mesurer, c'est aussi fiabiliser.
Une règle de gestion écrite en VVL reste lisible par le métier. Voici un routeur de demandes clients : trois décisions typées, confiées à Jev en un seul appel, et une branche d'escalade vers une personne lorsque rien ne correspond.
[semanticMode "jev"]
$route = [match [§ $ticket]
`[[§ "urgent, time-critical"] [§ "Payments, invoicing, refunds"]] "on-call billing"
`[[§ "urgent, time-critical"] [§ "Bugs, outages, integrations"]] "on-call technical"
`[_ ?team] ("queue " + $__team)
"human escalation"]Routage des demandes, urgence, humeur du client, détection du spam et de la fraude, escalade.
Extraction guidée par un schéma, classement, contrôle de cohérence avant tout traitement.
Application exacte des règles tarifaires modélisées dans une ontologie, sur des centaines de devis.
Comparaison de candidats, de clients ou de dossiers à des profils types, avec un degré de satisfaction.
Nous préférons dire précisément où nous en sommes.
Ces outils sont des instructions du langage VVL : nos partenaires les mettent en œuvre chez leurs clients, sur les plateformes ProSuite.