Deux agents IA peuvent modifier le même fichier, recevoir tous deux un accusé de réception « success », et pourtant, une seule de leurs modifications subsiste. Lors d'un test simple avec cinq agents concurrents, quatre des cinq écritures ont disparu sans aucune erreur ni entrée de journal — une anomalie classique de « mise à jour perdue » (lost-update) qui gaspille les jetons payés pour le travail disparu.
Pourquoi ce problème est important
Lorsqu'un agent IA renvoie un résultat, le service sous-jacent facture par jeton (token) généré. Si l'écriture est silencieusement écrasée, le fournisseur facture tout de même le calcul ayant produit la sortie rejetée. Dans les pipelines multi-agents — essaims d'agents, travailleurs de nettoyage de données en parallèle, ou tout système où plusieurs bots partagent un fichier de planification ou un bloc-notes — ces pertes cachées peuvent gonfler pour devenir une fuite de coûts significative. L'anomalie menace également l'intégrité des données : les étapes en aval peuvent agir sur des informations incomplètes ou obsolètes, entraînant des erreurs en cascade.
Comment l'anomalie se produit
La cause profonde est une condition de concurrence (race condition) :
- Deux (ou plus) agents lisent la même version d'une ressource, par exemple un fichier de planification JSON.
- Chacun effectue son propre raisonnement ou sa propre transformation basée sur cet instantané (snapshot).
- Les deux agents émettent une opération d'écriture vers le stockage partagé.
- Le système de stockage accepte la seconde écriture, écrasant la première sans aucune détection de conflit.
- Les deux agents reçoivent un « ACK » confirmant que l'écriture a réussi, même si la première contribution a disparu.
L'accusé de réception du système de stockage prouve seulement qu'une écriture a eu lieu ; il ne garantit pas que l'écriture était sûre par rapport aux autres mises à jour concurrentes. Un journal en mode append-only, souvent présenté comme une protection, se comporte de la même manière : il enregistre qu'une écriture a eu lieu mais n'empêche pas des écritures ultérieures d'écraser les précédentes.
Ce que fait une porte « compare-and-set »
Une porte « compare-and-set » (CAS) ajoute une vérification de version avant que l'écriture ne soit acceptée :
- Read (Lecture) : L'agent récupère le numéro de version actuel (ou le hash) du fichier.
- Compute (Calcul) : L'agent effectue son travail, produisant une nouvelle version du fichier.
- Write (Écriture) : L'agent envoie le nouveau contenu accompagné de la version qu'il a initialement lue.
- Validate (Validation) : La couche de stockage compare la version fournie à la version actuelle. Si elles diffèrent, l'écriture est rejetée ; sinon, elle procède et incrémente la version.
Si la version a changé, l'agent sait que sa vue était obsolète et doit recommencer tout le cycle — lecture, calcul, écriture — en utilisant la version fraîche. Cela transforme un écrasement invisible en une erreur explicite qui peut être journalisée, retentée et comptabilisée.
Le prix de la sécurité
La porte CAS n'est pas gratuite. Dans la même simulation de cinq agents :
| Scénario | Écritures tentées | Contributions réussies | Coût en jetons |
|---|---|---|---|
| Sans porte CAS | 5 | 1 | 5 unités |
| Avec porte CAS | 5 | 5 (après tentatives) | 9 unités |
La porte ajoute des cycles de lecture-calcul-écriture supplémentaires pour les agents qui rencontrent un conflit de version, augmentant ainsi la consommation de jetons. Le compromis est clair : sans la porte, vous perdez des données silencieusement ; avec la porte, vous payez une légère prime mais vous gagnez une visibilité sur chaque conflit.
À quel point l'échec est-il courant ?
Même avec seulement deux agents, le test a montré une probabilité de 75 % qu'une des écritures soit perdue. Avec cinq agents, le taux de perte approchait les 100 %. Ces chiffres suggèrent que l'hypothèse « généralement sans problème » est dangereuse pour tout flux de travail multi-agents de niveau production.
Contre-argument : quand ignorer la porte
Si un système exécute un seul agent par ressource ou impose une sérialisation stricte à un niveau supérieur, les vérifications CAS supplémentaires peuvent être inutiles. Cependant, le calcul du risque doit inclure le coût caché de la réexécution du travail échoué et l'impact potentiel en aval des données manquantes.
Ce qu'il faut surveiller ensuite
- Support des outils : Recherchez des API de stockage qui exposent des numéros de version ou des ETags et fournissent des opérations CAS atomiques nativement.
- Métriques : Instrumentez vos agents pour enregistrer la fréquence à laquelle une écriture est rejetée en raison d'une discordance de version. Un taux de conflit croissant signale que vous devez dimensionner vos ressources ou repenser le flux de travail.
- Stratégies de tentative : Un simple back-off exponentiel fonctionne bien, mais gardez à l'esprit que les tentatives répétées augmentent la consommation de jetons. Équilibrez les limites de tentatives par rapport à la perte de données acceptable.
- Approches hybrides : Certaines équipes combinent un journal en mode append-only pour l'auditabilité avec une porte CAS pour la cohérence, garantissant à la fois un enregistrement de ce qui s'est passé et une protection contre les écrasements.
À retenir
Les anomalies de mise à jour perdue transforment les pipelines d'IA pilotés par des tokens en véritables gouffres financiers. L'ajout d'une barrière de versionnage de type « compare-and-set » entraîne un léger surcoût en tokens, mais transforme une perte de données silencieuse en un événement visible et pouvant faire l'objet d'une nouvelle tentative. Pour tout système où plusieurs agents partagent un état — bases de données, fichiers de planification ou blocs-notes — intégrer une vérification de version avant toute écriture est l'assurance la moins coûteuse contre les coûts cachés et la corruption des flux de travail.
