Opinion

Agent IA étroit contre couteau suisse : comment nous avons ramené la latence de 17 à 7,7 secondes

Remplacer le profil d'outils universel par un plugin étroit et spécialisé, tout en désactivant les sondes d'environnement et une étape de raisonnement superflue, a comprimé le préfixe système de 15 266 à 1 424 tokens (10,7 fois) et accéléré la réponse de 17 à 7,7 secondes. Tous les calculs où le modèle de langage risque de se tromper ou de se laisser convaincre par l'utilisateur — séries de jours d'étude, attribution d'expérience, grille de notation et légalité des coups d'échecs — sont confiés à un plugin Python déterministe au-dessus de SQLite. Pour que la progression de l'utilisateur reste stable, il faut normaliser explicitement l'identifiant de session ; sinon, la rotation d'une clé de service au redémarrage de la passerelle remet silencieusement à zéro l'historique de l'élève.

Agent IA étroit contre couteau suisse : comment nous avons ramené la latence de 17 à 7,7 secondes
Hamidun News.
Écouter l'article
Fiche synthèse et chiffres clés
ParamètreDonnées
Rédacteur en chef
Réduction de la latence de réponsela médiane est passée de ~17 s (13,3–20,6 s) à 7,7 s (7,25–7,93 s)
Compression du préfixe d'entréede 15 266 à 1 424 tokens par requête (gain de 10,7 fois sans modifier la logique métier)
Taille du noyau déterministe766 lignes de plugin de gamification en Python au-dessus de SQLite et 342 lignes pour le vérificateur de notation
Chiffre clé #3Plafond pratique du fichier de personnalité : environ 20 000 octets pour `SOUL.md`, sans que le modèle perde l'attention sur le milieu des instructions

La première tentation lorsqu'on assemble un agent IA est de lui donner accès à tout d'un coup : terminal, navigateur, recherche web, fichiers et serveurs MCP. La douche froide est venue d'un entraîneur d'échecs pour enfants, exposé via un endpoint local /v1/chat/completions. L'enfant déplaçait une pièce sur l'échiquier, et le commentaire de l'entraîneur arrivait 17 secondes plus tard, alors que le jeune joueur avait déjà joué deux coups de plus.

L'analyse a montré que, sur les 15 266 tokens du préfixe d'entrée, près de 14 000 étaient occupés par des schémas JSON d'outils qui n'ont jamais été appelés dans une partie d'échecs, auxquels s'ajoutait la collecte automatique d'informations sur l'OS au démarrage. Pire, au moindre obstacle, un agent ayant accès à execute_code se mettait à écrire et à exécuter des scripts dans un sandbox, transformant un seul coup en vingt appels d'API.

Comment trois lignes de configuration réduisent le prompt de 10,7 fois et suppriment la latence ?

Pour transformer un généraliste pensif en service rapide, il n'a pas fallu réécrire le code du plugin. Nous avons serré trois paramètres dans la configuration du runtime :

  1. Nous n'avons laissé à la plateforme api_server qu'un seul jeu d'outils de domaine ([chess]), en retirant les outils de fichiers et de shell.
  2. Nous avons désactivé environment_probe, qui interrogeait l'hôte à chaque démarrage et plaçait un instantané de l'environnement dans le prompt système.
  3. Nous avons fixé reasoning_effort: none : comme les faits tactiques sont déjà calculés par le moteur Stockfish, le modèle n'a pas besoin de construire une chaîne de raisonnement avant de répondre ; sa tâche est de énoncer avec vivacité un verdict déjà prêt.

Sur les mesures de contrôle avec cache chaud, le temps de réponse est passé de 13,3 / 17,3 / 20,6 s à 7,25 / 7,74 / 7,93 s (médiane de 7,7 s), et la consommation de tokens d'entrée a chuté de 10,7 fois, de 15 266 à 1 424. Réduire le jeu d'outils économise des tokens et protège le circuit des initiatives intempestives dans le terminal, tandis que la désactivation de l'étape de raisonnement superflue apporte l'essentiel du gain en secondes. Détail important : les profils d'outils pour la messagerie et pour le planificateur (cron) se définissent séparément ; si l'on oublie d'inscrire le plugin dans la section cron, l'envoi du matin ira silencieusement chercher ses données en lisant des fichiers.

Comment séparer la personnalité en deux couches et déporter le calcul des séries dans SQLite ?

La personnalité d'un agent étroit se conçoit en deux niveaux : un court bloc de déclencheurs dans config.yaml (10–15 lignes) définit le routage (tutor_state au début du dialogue, tutor_record_lesson après l'exercice), et le règlement du ton et de la pédagogie vit dans SOUL.md. Le plafond de travail de ce fichier est d'environ 20 000 octets (chez mes bots : 6,7–19,9 Ko) : au-delà, le modèle perd les règles situées au milieu.

Un modèle de langage joue à merveille les émotions, mais calcule mal les dates, les points d'expérience et les notes par grille. Dans le tuteur de langues, toute la mathématique de la gamification (10 niveaux de 0 à 8000 XP, paliers de séries de 3 à 365 jours, 15 badges et cristaux) est confiée à un plugin Python de 766 lignes au-dessus de SQLite :

``python if last_date == today: streak = max(1, prev_streak) elif last_date == yesterday or not last_date: streak = (prev_streak + 1) if last_date == yesterday else 1 else: gap_days = (parse_date(today) - parse_date(last_date)).days if freezes > 0 and gap_days == 2: freezes -= 1 streak = prev_streak + 1 events.append({"type": "freeze_used", "msg": "Заморозка спасла серию дней!"}) else: if prev_streak > 1: events.append({"type": "streak_reset", "old": prev_streak}) streak = 1 ``

L'outil renvoie un tableau events, et le champ description du schéma JSON de la fonction contient une directive : féliciter l'élève avec émotion pour chaque événement de events et ne rien inventer de son cru sur le solde. De même, dans le simulateur de négociations d'achat, une grille de 4 modules sur une échelle de 40 points vérifie par du code les marqueurs de radicaux (risques, vérification des faits, marchandage), afin que le participant ne puisse pas « convaincre » le réseau de neurones de relever sa note.

Pourquoi la progression se remettait à zéro en silence après un redémarrage, et comment soigner le framework ?

Dans les premières versions, le moteur transmettait au gestionnaire d'outil un paramètre task_id égal à l'ID de la session en cours, et je l'utilisais comme clé primaire de l'élève. En cas de /new ou de redémarrage du conteneur, un nouveau task_id était généré, et la personne voyait une page blanche au lieu de 30 jours d'apprentissage. Le problème a été réglé par un résolveur de clé à deux niveaux, qui extrait par expression régulière l'ID permanent du compte à partir de telegram:dm:<user_id> ou le recoupe avec sessions.json, garantissant une clé stable tg:<id>.

Pour éviter de reconstruire une image de plusieurs gigaoctets à chaque bibliothèque, le déploiement installe les paquets via pip install --target dans le volume data/pylibs, applique chown -R pour un utilisateur non root et nettoie __pycache__. Et là où le transport de base manquait du clavier inférieur ou avalait /start, des correctifs auto-réparateurs de bootstrap.sh vérifient au démarrage les ancres dans le code de l'adaptateur, injectent le bloc et valident le fichier via py_compile.

Le schéma « un plugin déterministe calcule, un modèle étroit joue le rôle » est au cœur de Nomad AI et de l'environnement cloud agent.nomadnet.ai. Des labs pour construire de tels agents sont disponibles à la Hamidun Academy (72 heures d'essai gratuit), et nous décortiquons des plugins prêts à l'emploi et plus de 370 compétences au Vibe Club.

Dossier

Questions clés sur cet article

Comment trois lignes de configuration réduisent le prompt de 10,7 fois et suppriment la latence ?

Pour transformer un généraliste pensif en service rapide, il n'a pas fallu réécrire le code du plugin. Nous avons serré trois paramètres dans la configuration du runtime : Nous n'avons laissé à la plateforme api_server qu'un seul jeu d'outils de domaine ([chess]), en retirant les outils de fichiers et de shell. Nous avons désactivé environment_probe, qui interrogeait l'hôte à chaque démarrage et plaçait un instantané de l'environnement dans le prompt système.

Comment séparer la personnalité en deux couches et déporter le calcul des séries dans SQLite ?

La personnalité d'un agent étroit se conçoit en deux niveaux : un court bloc de déclencheurs dans config.yaml (10–15 lignes) définit le routage (tutor_state au début du dialogue, tutor_record_lesson après l'exercice), et le règlement du ton et de la pédagogie vit dans SOUL.md. Le plafond de travail de ce fichier est d'environ 20 000 octets (chez mes bots : 6,7–19,9 Ko) : au-delà, le modèle perd les règles situées au milieu.

Pourquoi la progression se remettait à zéro en silence après un redémarrage, et comment soigner le framework ?

Dans les premières versions, le moteur transmettait au gestionnaire d'outil un paramètre task_id égal à l'ID de la session en cours, et je l'utilisais comme clé primaire de l'élève. En cas de /new ou de redémarrage du conteneur, un nouveau task_id était généré, et la personne voyait une page blanche au lieu de 30 jours d'apprentissage.

ZK
Zhemal Khamidun — CPO d'Alpina Digital, product manager d'AlpinaGPT. Conçoit des produits IA depuis 2019. Hamidun News est un projet personnel devenu un agrégateur en production avec plus de 6 000 lecteurs.
✦ Unified AI Workspace · Nomad

Test Frontier LLMs & Autonomous Agents in One Workspace

Run Claude Opus 5.5, GPT-6, Gemini 3.1, and DeepSeek side-by-side in Nomad AI (nomadnet.ai) — unified model routing, deep research, and multimodal workflows under one subscription.

Try Nomad AI →Launch Nomad Agent
Qu'en pensez-vous ?
Chargement des commentaires…