Retour au blog

Laya : utiliser l’IA pour des décisions typées en Python en 2026

Salut HaWkers, la plupart des automatisations fondées sur l’IA n’ont pas besoin de rédiger un paragraphe. Elles doivent choisir une file de traitement, estimer une urgence ou déterminer si un risque existe. Le projet open source Laya a attiré l’attention sur GitHub en s’attaquant précisément à ces décisions. Lors de notre consultation du 27 septembre 2026, l’API GitHub indiquait plus de 26 000 étoiles pour le dépôt ; ce compteur évolue en permanence.

Si vous recevez le message d’un client et devez décider de la suite, faut-il appeler un modèle génératif, interpréter sa réponse, puis espérer qu’elle respecte le format demandé ? Dans ce guide, nous allons construire un petit système de tri avec Laya, examiner ce que ses résultats signifient réellement et définir quand une validation humaine reste indispensable. Le code est assez court pour être essayé, mais les choix de mesure et de contrôle comptent autant que l’appel à l’API.

Qu’est-ce qu’une décision typée et pourquoi est-ce utile ?

Une décision typée possède un ensemble de sorties connu avant l’inférence. Vous pouvez demander un choix entre billing, technical et other, un score d’urgence ou la probabilité qu’une affirmation soit vraie. Cette structure est utile quand le système suivant attend un champ défini, plutôt qu’un texte libre qu’il faudra analyser une seconde fois. Elle permet aussi de décrire exactement quelles options existent dans votre processus métier.

Laya propose trois types de questions dans son API : choice, pour sélectionner une option ; score, pour ordonner les possibilités sur une échelle ; et noul, pour estimer la probabilité d’un « oui ». Le nom inhabituel noul figure tel quel dans les exemples officiels. Il faut donc l’utiliser littéralement, au lieu de le remplacer par le plus intuitif yes_no et de découvrir une erreur après avoir intégré le code. Les noms des champs de l’API, eux, ne sont pas traduits.

Le projet présente son moteur comme non autorégressif : il évalue des questions sans produire la réponse mot après mot. Cela réduit le travail nécessaire pour convertir un texte libre en données structurées. Une sortie structurée ne garantit pourtant pas une bonne décision. Des critères ambigus, des exemples mal choisis ou une entrée éloignée du domaine prévu peuvent toujours produire une mauvaise réponse, simplement présentée dans un JSON valide. Ce point mérite une place explicite dans vos tests, car un format rassurant peut masquer des erreurs fréquentes.

La documentation du projet annonce 33 ms pour une question sur un GPU T4 et 7,2 ms par question en lot. Il s’agit de mesures publiées par les auteurs dans des conditions précises, et non d’une promesse de latence pour votre ordinateur, votre serveur ou votre trafic réel. Avant de comparer des outils par leur vitesse, mesurez aussi le chargement du modèle, la taille des entrées, le matériel disponible et l’attente dans la file des requêtes. Une API rapide une fois le modèle chargé peut avoir un premier appel sensiblement plus lent.

Comment le Router choisit le modèle

L’interface recommandée dans le README est Router. Elle détecte la langue et l’écriture de l’entrée, puis dirige la requête vers un checkpoint adapté. Le dépôt décrit trois checkpoints : un modèle anglais, un modèle multilingue et un modèle affiné pour les flux de décisions typées. Le premier téléchargement demande un accès à Hugging Face ; ensuite, l’exécution peut réutiliser le cache local de l’environnement.

Ce détail influence l’architecture de production. Un simple Router() charge les modèles au besoin. En revanche, Router(preload=True) charge les checkpoints au démarrage : vous échangez du temps de démarrage et de la mémoire contre une attente réduite sur les premières requêtes. Si votre application reçoit plusieurs langues, un petit cache peut provoquer des changements de modèle répétés. Pour une API au trafic stable, choisissez une politique de chargement, mesurez la mémoire consommée et observez les temps du premier appel avant de multiplier les instances.

Le routage automatique aide, mais ne dispense pas de tests par langue. Un message presque entièrement en anglais avec une courte phrase en portugais peut emprunter un chemin différent de celui d’un document rédigé entièrement en portugais. La documentation permet de préciser model="multilingual". Utilisez cette option quand vos essais montrent que la sélection automatique ne convient pas à vos données. Gardez ensuite le même jeu d’exemples pour comparer les deux politiques de manière honnête.

Il faut également distinguer le routage de l’inférence. La commande en ligne sans --predict peut afficher le routage sans télécharger de checkpoint. Elle est pratique pour inspecter la détection de langue, mais elle ne prouve rien sur la qualité de la classification. Pour mesurer la précision, il faut des exemples étiquetés et une exécution complète du modèle. Vérifier seulement le nom du checkpoint reviendrait à tester l’aiguillage sans vérifier la destination du colis.

Installation et premier essai

Selon le README consulté pour cet article, le paquet demande Python 3.10 ou une version plus récente et se trouve sur PyPI. Créez un environnement isolé afin que le paquet et ses dépendances n’affectent pas d’autres projets. Les commandes suivantes suivent la documentation pour macOS et Linux ; sous Windows, adaptez l’activation de l’environnement. Vérifiez également les contraintes de votre infrastructure si les téléchargements depuis Hugging Face passent par un proxy ou sont interdits en production.

# Créez un environnement isolé dans le répertoire du projet.
python3 -m venv .venv

# Installez le paquet publié sur PyPI dans cet environnement.
.venv/bin/python -m pip install laya

# Vérifiez l’installation sans charger le checkpoint.
.venv/bin/python -I -c "import laya; print(laya.__version__)"

Afficher la version ne mesure pas le modèle. Lors de la première inférence, le Router peut devoir télécharger des fichiers volumineux. Prévoyez ce préchauffage lors du déploiement, surtout si le service crée des instances à la demande. Si l’environnement ne peut pas accéder au Hub, préparez le cache ou un processus de distribution des checkpoints avant de placer le point d’accès derrière un répartiteur de charge. Vous éviterez ainsi de confondre une panne de téléchargement avec une erreur de prédiction.

Exemple concret : trier une demande

Transformons maintenant un message en champs qu’un système de support peut exploiter. Les noms des équipes sont des exemples locaux : adaptez criteria à l’organisation réelle de votre entreprise. Chaque question décrit ce qui doit être évalué, au lieu de fournir une simple liste d’étiquettes sans contexte. Dans une application réelle, consignez également la version de cette définition des critères : une modification du texte peut changer les prédictions.

from laya import Router

# Le premier appel peut télécharger le checkpoint nécessaire.
router = Router()
mensagem = (
    "Minha assinatura foi cobrada duas vezes neste mês. "
    "Preciso do estorno hoje ou vou cancelar."
)
perguntas = {
    "equipe": {
        "type": "choice",
        "instructions": "Qual equipe deve receber a solicitação?",
        "criteria": {
            "financeiro": "cobranças, pagamentos e reembolsos",
            "suporte": "falhas, indisponibilidade e erros técnicos",
            "outros": "pedidos que não pertencem às outras equipes",
        },
    },
    "urgencia": {
        "type": "score",
        "instructions": "Quão urgente é a resposta?",
        "criteria": ["pode esperar", "em breve", "bloqueante"],
    },
    "risco_cancelamento": {
        "type": "noul",
        "instructions": "A pessoa ameaça cancelar o serviço?",
    },
}

resultado = router.predict(mensagem, perguntas)
print(resultado["answers"]["equipe"]["choice"])
print(resultado["answers"]["risco_cancelamento"]["noul"])
print(resultado["routing"]["model"])

La structure d’accès à la fin de l’exemple suit le guide de démarrage officiel. Le champ choice fournit l’option sélectionnée ; noul représente une probabilité, pas une autorisation de lancer une action irréversible. Le champ de routage indique le modèle utilisé. Pour l’urgence, inspectez la réponse complète et sa distribution avant de supposer que la première valeur affichée correspond à une priorité métier. Les textes en portugais dans le code reproduisent volontairement l’exemple testé : vous pouvez les remplacer par vos propres messages et critères en français.

Cette séparation entre prédiction et action est essentielle. Le modèle peut suggérer la file financière, mais votre logiciel décide s’il crée un ticket, demande des documents ou sollicite une révision. Une politique de remboursement ne doit pas être déduite d’une seule phrase écrite par le client. Enregistrez l’entrée, la version du modèle, les critères utilisés et le résultat pour pouvoir analyser les erreurs et comparer les changements futurs. Traitez les données personnelles conformément à votre politique de conservation.

Comment gérer la confiance et la validation humaine

Un nombre présenté comme une probabilité ressemble à une décision prête à l’emploi, mais il n’est vraiment utile que s’il est calibré pour votre domaine. Une prévision de 0,8 devrait correspondre approximativement à la fréquence observée de l’événement parmi des exemples comparables. Il faut mesurer cette correspondance sur des données étiquetées ; elle ne découle pas automatiquement du format de l’API. La documentation de Laya évoque l’ajustement de la calibration et propose du matériel pour l’affinage, mais la validation de votre flux reste votre responsabilité.

Commencez avec une politique simple : automatisez uniquement les décisions à faible impact et orientez les cas incertains vers une personne. Ne reprenez pas un seuil universel trouvé dans un autre produit. Choisissez votre seuil après avoir comparé faux positifs, faux négatifs et coût opérationnel sur votre propre ensemble de validation. Un outil qui répartit des tickets peut tolérer une erreur qui serait inacceptable pour bloquer des comptes ou refuser un accès. Définissez donc le coût d’une erreur avant de fixer le pourcentage affiché dans le code.

# Réutilisez la réponse produite dans l’exemple précédent.
resposta = resultado["answers"]["risco_cancelamento"]
probabilidade = resposta["noul"]

# Ce seuil est illustratif : calibrez-le sur des données réelles.
if probabilidade >= 0.80:
    encaminhamento = "revisao_humana_prioritaria"
else:
    encaminhamento = "fluxo_normal"

print({"encaminhamento": encaminhamento, "probabilidade": probabilidade})

Même ici, « flux normal » ne devrait pas signifier ignorer la personne. Il peut désigner le traitement standard, avec un délai et un responsable définis. Examinez aussi les messages courts, ironiques, contenant plusieurs demandes ou écrits dans une langue peu fréquente. Ces groupes révèlent souvent des problèmes qu’un taux de réussite moyen dissimule. Une revue régulière d’un échantillon de décisions aide à repérer les nouveaux cas avant qu’ils ne s’accumulent dans les files de support.

Tests multilingues sans supposer une équivalence

Le projet annonce la prise en charge de plus de cent langues par son checkpoint multilingue. Cette couverture est intéressante pour un blog comme pour un produit dont les clients écrivent en portugais, en anglais, en espagnol et en français. Mais « prendre en charge » une langue ne signifie pas offrir la même précision partout. Le vocabulaire des annulations, des factures et de l’urgence varie selon la culture et le secteur. Constituez donc des exemples étiquetés pour chaque marché avant d’automatiser des décisions.

Le README montre que le même Router peut recevoir une phrase en espagnol et envoyer la requête au modèle multilingue. Le test suivant réutilise la question de l’équipe définie plus haut. La sortie de routage permet de voir quel checkpoint a été sélectionné, tandis que l’étiquette montre la prédiction. Si vous souhaitez comparer plusieurs modèles, fixez explicitement le checkpoint et conservez un ensemble de tests constant ; sinon, un changement d’aiguillage risque de brouiller la comparaison.

# Réutilisez router et perguntas définis précédemment.
entradas = [
    "Me cobraron dos veces este mes; necesito un reembolso.",
    "J'ai été facturé deux fois ce mois-ci ; je demande un remboursement.",
    "Fui cobrado duas vezes neste mês; preciso de reembolso.",
]

for texto in entradas:
    resposta = router.predict(texto, {"equipe": perguntas["equipe"]})
    print(texto, resposta["routing"]["model"])
    print(resposta["answers"]["equipe"]["choice"])

Pour une évaluation sérieuse, ne vous contentez pas de traduire les mêmes exemples. Incluez des messages rédigés directement dans chaque langue, des abréviations, des fautes de frappe et des phrases qui mélangent plusieurs langues. Séparez l’entraînement et le test par client ou par période afin d’éviter que des exemples très semblables ne se retrouvent des deux côtés. Notez également le taux de renvoi vers une validation humaine pour chaque langue : un modèle peut sembler précis parce qu’il s’abstient davantage pour un groupe donné.

Comment savoir si Laya vaut la peine en production

Le dépôt présente son propre benchmark de décisions typées, avec deux mille décisions réparties sur quatre flux. Selon les auteurs, le checkpoint affiné y a atteint une exactitude de 0,766, contre 0,362 pour le modèle anglais de base sur les mêmes tâches. Cela illustre le potentiel d’un modèle adapté au domaine ; cela ne permet pas de conclure que toutes les entreprises obtiendront le même progrès. La distribution des classes, la qualité des étiquettes et la définition des critères influencent fortement le résultat. Lisez donc ces valeurs comme un résultat expérimental publié par le projet.

Concevez votre test avant de comparer Laya, des règles et un modèle génératif. Choisissez des mesures liées au résultat métier : exactitude par classe, matrice de confusion, calibration, latence aux percentiles élevés, coût d’exploitation et part des cas transmis à des personnes. Pour le support, mesurez aussi le temps nécessaire à l’équipe pour corriger une mauvaise orientation. Un classificateur rapide qui crée beaucoup de travail supplémentaire peut coûter cher malgré une bonne moyenne technique.

Utilisez une référence simple. Certains messages possèdent des mots et des motifs suffisants pour des règles déterministes ; d’autres demandent un contexte qu’un classificateur ne possède pas. Comparez les solutions sur le même ensemble et gardez les critères fixes pendant l’essai. Si une modification de prompt ou de checkpoint améliore la moyenne, mais dégrade des cas critiques, ne la déployez pas automatiquement. Conservez un petit ensemble de régression comprenant des exemples difficiles et des incidents réels anonymisés, puis examinez les erreurs, pas seulement le score total.

Si votre application utilise déjà des modèles génératifs, les deux approches peuvent coexister. Une étape typée peut choisir la file ou prioriser une revue, tandis qu’une étape générative rédige une réponse qu’un agent approuve. L’essentiel est de délimiter les responsabilités : classifier, produire du texte et prendre la décision finale sont des opérations distinctes. Pour choisir des modèles génératifs selon leur coût et leur usage, consultez notre guide sur GPT-6 Sol et Luna.

Perspectives : moins de texte libre, plus de décisions vérifiables

La tendance aux modèles plus petits et spécialisés a du sens lorsqu’une application doit répondre toujours aux mêmes questions. Laya fournit une interface concrète pour tester cette hypothèse : un schéma de questions, un routage par langue, des réponses structurées et des checkpoints exécutables dans votre environnement. L’intérêt visible sur GitHub signale l’attention des développeurs ; il ne prouve ni une maturité opérationnelle ni une qualité suffisante pour votre cas particulier.

Commencez par un flux réversible, comme la suggestion de la file d’un ticket. Définissez des critères clairs, recueillez des exemples réels avec le consentement nécessaire et supprimez les données personnelles superflues. Mesurez les erreurs par langue et par type de demande. Vous pourrez ensuite déterminer si l’automatisation économise du temps sans cacher de problèmes. Lorsque des questions d’argent, d’accès ou de sécurité sont en jeu, conservez une voie de contestation et une supervision humaine.

Le code de cet article sert de point de départ pour expérimenter, pas de système de production complet. La documentation officielle peut évoluer, et les chiffres publiés par le projet doivent être reproduits sur votre matériel avant de devenir des objectifs. La leçon la plus durable concerne l’architecture : quand vous avez besoin d’un choix, décrivez ce choix précisément, mesurez l’incertitude et gardez l’action sous le contrôle de votre logiciel.

Allez, on y va! 🦅

📚 Vous voulez suivre ce qui arrive ?

Cet article a présenté les décisions typées avec Laya, mais l’écosystème évolue chaque semaine et toutes les nouveautés ne deviennent pas des articles ici.

Sur X, je partage mes essais, les coulisses de mes projets et les nouveautés que je découvre avant de les traiter sur le blog.

Suivez-moi là-bas

👉 Suivre @jeffbruchado sur X

💡 Du contenu quotidien sur le développement, la carrière et les outils que j’utilise vraiment

Commentaires (0)

Cet article n'a pas encore de commentaires. Soyez le premier!

Ajouter des commentaires