Pipeline de recherche multi-agents pour un cabinet de conseil en stratégie
McKenzie & Partners, un cabinet de conseil en stratégie de taille intermédiaire, a développé un système de recherche automatisé basé sur Claude pour produire des rapports sectoriels à destination de ses clients. Le pipeline comprend quatre agents spécialisés : un agent de recherche web, un agent d'analyse documentaire, un agent de synthèse et un agent de génération de rapport. Le coordinateur orchestre l'ensemble du flux de travail.nnAprès six mois de production, plusieurs problèmes ont été identifiés : les rapports finaux présentent des lacunes sur certains sous-sujets, des attributions de sources incorrectes, et une gestion incohérente des données temporelles lorsque les agents retournent des chiffres issus d'années différentes. Par ailleurs, des pannes survenues en cours de traitement ont entraîné la perte de travail partiel sur des lots de documents volumineux.nnL'équipe technique doit prioriser des améliorations architecturales pour la prochaine version du système, en tenant compte des contraintes de budget et de délai imposées par la direction.
Les rapports produits par le pipeline contiennent fréquemment des affirmations sans attribution correcte aux sources originales. L'agent de synthèse reçoit des résumés de l'agent de recherche web et de l'agent d'analyse documentaire, mais les métadonnées de provenance (URL, nom du document, numéro de page) sont perdues lors des étapes de résumé. Quelle est l'approche architecturale la plus efficace pour garantir une attribution correcte des sources dans les rapports finaux ?
La solution la plus efficace consiste à faire produire à chaque agent une sortie structurée séparant explicitement le contenu (résumé, insights) des métadonnées de source (URL, nom du document, date de publication, numéro de page). Ces métadonnées doivent être traitées comme des données de premier niveau, transportées à travers chaque étape du pipeline sans jamais être fusionnées dans le texte. Le coordinateur injecte ensuite dans le prompt de l'agent de génération de rapport à la fois le brouillon de synthèse et la liste structurée des sources associées à chaque claim. Cette approche évite la reconstruction post-hoc des citations par similarité sémantique, qui est sujette à des erreurs d'attribution. Elle garantit que l'agent de rapport peut toujours tracer l'origine de chaque affirmation, réduisant mécaniquement le taux de 23% de citations incorrectes.
L'agent de recherche web retourne des statistiques de 2024 (ex. : 35% d'adoption des énergies renouvelables) tandis que l'agent d'analyse documentaire extrait des données de rapports internes datant de 2022 (18% d'adoption). L'agent de synthèse interprète ces chiffres comme des sources contradictoires plutôt que comme une évolution dans le temps. Quel changement architectural permettrait à l'agent de synthèse de correctement interpréter ces différences temporelles ?
Il faut imposer à chaque agent de sous-tâche d'inclure la date de publication ou de collecte des données dans ses sorties structurées. Lorsque l'agent de recherche web retourne '35% (2024)' et l'agent d'analyse documentaire retourne '18% (2022)', le coordinateur peut alors injecter ces informations temporelles explicites dans le prompt de l'agent de synthèse. Celui-ci dispose ainsi du contexte nécessaire pour comprendre que les deux chiffres font référence à des moments différents et représentent une tendance de croissance, et non une contradiction. Cette modification est simple à implémenter (ajout d'un champ 'data_date' dans le schéma de sortie de chaque agent) et résout la majorité des faux conflits détectés par le pipeline, améliorant directement la qualité analytique des rapports finaux.
Le pipeline a planté après le traitement de 12 documents sur 28 en cours. L'agent de recherche web avait identifié les sources, l'agent d'analyse documentaire avait partiellement extrait les insights, et l'agent de synthèse avait commencé à identifier des patterns. Comment concevoir une stratégie de gestion d'état pour permettre la reprise du traitement sans répéter le travail déjà effectué ni perdre la fidélité des résultats partiels ?
La meilleure approche est de faire persister à chaque agent ses sorties structurées dans un emplacement connu (par exemple un fichier JSON ou une base de données légère) au fur et à mesure de son avancement. Le coordinateur maintient un manifeste d'état indiquant quels documents ont été traités par quel agent et avec quel résultat. En cas de reprise, le coordinateur charge ce manifeste et injecte uniquement les résultats pertinents dans les prompts des agents qui doivent continuer, sans retraiter les documents déjà finalisés. Cette approche offre une haute fidélité d'information (les sorties structurées complètes sont préservées) tout en maintenant l'efficacité du contexte (seuls les éléments pertinents sont injectés dans chaque prompt de reprise). Elle évite également de dépasser la fenêtre de contexte des agents en ne chargeant que ce qui est nécessaire pour continuer le traitement à partir du point d'interruption.
Agent de traitement de factures pour une plateforme de comptabilité SaaS
FinTrack SaaS est une plateforme de comptabilité destinée aux PME qui a intégré Claude pour automatiser l'extraction de données structurées depuis des factures reçues en PDF ou image. Le système extrait les champs suivants pour chaque facture : fournisseur, date, montant HT, TVA, total TTC, et lignes de poste détaillées. Ces données alimentent directement les systèmes comptables en aval, qui rejettent tout enregistrement dont les montants ne sont pas cohérents entre eux.nnAprès trois mois de production, l'équipe data observe plusieurs classes de défaillances : des extractions sémantiquement invalides (somme des lignes ne correspondant pas au total extrait), des erreurs sur les plages de valeurs (ex. : '2 à 3 unités' interprété comme un float), et des documents très longs approchant la limite de fenêtre de contexte du modèle qui présentent une dégradation d'extraction sur les dernières pages.nnL'équipe doit concevoir des améliorations systémiques pour réduire le volume de revue manuelle, actuellement à 18% des extractions, tout en maintenant la fiabilité des données transmises aux systèmes comptables.
Dans 18% des extractions, la somme des montants des lignes de poste extraites ne correspond pas au total TTC extrait, soit en raison d'erreurs OCR dans le document source, soit en raison d'erreurs du modèle. Les systèmes comptables en aval rejettent ces enregistrements. Quelle est l'approche la plus efficace pour améliorer la fiabilité de l'extraction tout en maintenant la traçabilité des écarts ?
La solution optimale consiste à ajouter dans le schéma d'extraction un champ 'calculated_total' dans lequel le modèle calcule lui-même la somme des lignes de poste extraites, en parallèle du champ 'stated_total' qui capture le total tel qu'il apparaît dans le document. Un pipeline de validation compare ensuite les deux valeurs : si elles correspondent, l'enregistrement est accepté automatiquement ; si elles diffèrent, le cas est flagué pour revue humaine avec les deux valeurs affichées pour faciliter la décision. Cette approche préserve les deux sources de vérité sans en effacer aucune, permet de distinguer les erreurs OCR (le total imprimé diffère de la somme réelle) des erreurs d'extraction (le modèle a mal lu un montant), et fournit aux réviseurs humains un contexte immédiatement actionnable plutôt que de simples données brutes à re-vérifier manuellement.
Pour les documents entre 175 000 et 190 000 tokens, le taux d'extraction chute à 71%, avec des informations situées dans le dernier tiers du document systématiquement manquées. La fenêtre de contexte du modèle est de 200 000 tokens et le schéma d'extraction pèse environ 2 500 tokens. Quelle est la cause la plus probable de cette dégradation et quelle solution architecturale apporter ?
La cause la plus probable est la saturation de la fenêtre de contexte : le schéma d'extraction (~2 500 tokens) s'additionne aux instructions système et au contenu du document, poussant le total des tokens d'entrée très près de la limite de 200 000 tokens. Lorsque le contexte est quasi-saturé, le modèle perd de l'attention sur les informations situées en fin de document, ce qui explique le pattern de dégradation sur le dernier tiers. Les solutions à implémenter sont : (1) segmenter les documents longs en chunks traités séquentiellement, avec agrégation des résultats ; (2) optimiser le schéma d'extraction pour réduire sa taille en tokens sans en dégrader la précision ; (3) mettre en place un routeur qui détecte la taille du document en amont et applique la stratégie de chunking uniquement pour les documents dépassant un seuil (ex. 150 000 tokens). L'approche de chunking doit inclure un mécanisme de gestion des entités chevauchant les frontières de segments.
Le pipeline traite 50 000 contrats legacy sous deux semaines. Les tests initiaux sur 500 documents montrent 82% de succès au premier essai, les 18% restants échouant pour des raisons diverses (champs manquants, dates mal formatées, parties mal identifiées). Les documents en échec nécessitent des raffinements ciblés sur leurs modes de défaillance spécifiques. Quelle stratégie de traitement par lot est la plus efficace en termes de coût et de respect du délai ?
La stratégie optimale est de soumettre l'intégralité des 50 000 documents en traitement parallèle massif dès le départ (en utilisant l'API Batch si disponible pour les documents standards), tout en mettant en place un pipeline de retry intelligent pour les 18% en échec. Ce pipeline de retry enrichit le prompt avec l'erreur de validation spécifique rencontrée (ex. : 'Le champ date est au format JJ/MM/AAAA, convertir en YYYY-MM-DD') afin de permettre au modèle de corriger son extraction de manière ciblée plutôt que de répéter la même erreur. Cette approche maximise le débit global (pas de séquentialisation artificielle en sous-lots), réduit les coûts en n'appliquant le traitement enrichi qu'aux documents échoués, et respecte le délai en évitant les goulets d'étranglement séquentiels. Le suivi par custom_id permet de réconcilier facilement les résultats et d'identifier les patterns de défaillance récurrents pour affiner les prompts de retry.
Agent conversationnel de gestion de support client pour un opérateur télécom
TeleConnect est un opérateur télécom proposant un agent conversationnel Claude pour gérer les demandes de support client : litiges de facturation, remboursements, mises à jour de compte, et suivi de commandes. L'agent dispose d'un ensemble d'outils MCP incluant get_customer, lookup_order, process_refund, update_profile et escalate_to_human. Les sessions peuvent durer plusieurs dizaines de tours, couvrant plusieurs sujets distincts au cours d'une même conversation.nnAprès analyse des logs de production, trois classes de problèmes ont été identifiées : l'agent gaspille des tours à retenter des erreurs non-récupérables (ex. : fenêtre de retour expirée), il perd le fil des sujets abordés en début de session lors des conversations longues, et il dévie des guidelines comportementales définies dans le system prompt après 25-30 tours malgré une utilisation de contexte bien en dessous de la limite.nnL'équipe produit cherche à améliorer la fiabilité opérationnelle de l'agent, la continuité conversationnelle sur des sessions longues, et la cohérence du respect des politiques de l'entreprise, notamment le seuil d'approbation obligatoire pour les remboursements dépassant 500€.
Les logs montrent que l'outil process_refund retourne deux types d'erreurs : des erreurs techniques transitoires (timeout, 503) représentant 5% des appels, et des erreurs business permanentes (commande hors délai de retour, article déjà remboursé) représentant 12% des appels. L'agent retente les deux types indistinctement, gaspillant en moyenne 3,6 tours sur les erreurs non-récupérables. Quelle modification de l'outil est la plus efficace pour réduire ce comportement ?
La solution la plus efficace est d'enrichir la structure de retour d'erreur de l'outil avec des métadonnées structurées explicites : un champ 'errorCategory' (valeurs possibles : 'transient', 'validation', 'permission', 'business_rule'), un booléen 'isRetryable', et une description humainement lisible de la cause de l'échec. Par exemple, une erreur 'commande hors délai de retour' retournerait {errorCategory: 'business_rule', isRetryable: false, description: 'Order exceeds 30-day return window'}. L'agent peut alors traiter ces signaux de façon déterministe : ne pas retenter si isRetryable est false, appliquer un backoff exponentiel si transient, et expliquer immédiatement la raison au client pour les erreurs business_rule. Cette approche est supérieure au parsing de messages texte (fragile) et à l'ajout d'un outil de pré-vérification (qui ajoute de la latence sans éliminer la duplication logique).
Un client aborde trois sujets distincts lors d'une session : un litige de remboursement (tours 1-15), une question d'abonnement (tours 16-30), et une mise à jour de moyen de paiement (tours 31-45). Au tour 48, le client demande 'Où en est mon remboursement ?' alors que la session approche des limites de contexte. Quelle stratégie permet à l'agent de répondre correctement à toutes les questions tout au long de la session ?
La meilleure approche est d'extraire et de persister les données structurées de chaque sujet traité dans une couche de contexte séparée, mise à jour au fil de la conversation. Concrètement, pour chaque sujet identifié (remboursement, abonnement, paiement), l'agent maintient un objet structuré contenant les identifiants clés, montants, statuts et décisions prises (ex. : {issue: 'refund', order_id: 'ORD-4821', amount: 89€, status: 'approved_pending_processing'}). Cette couche de contexte structuré est injectée dans chaque requête en complément de la fenêtre glissante de messages récents. Contrairement à une simple fenêtre glissante (qui perdrait les tours 1-15), cette approche garantit que les informations factuelles critiques de chaque sujet restent disponibles tout au long de la session, même si le dialogue brut a été compressé ou tronqué.
L'entreprise exige que tout remboursement dépassant 500€ nécessite une approbation managériale avant exécution. Or, les logs révèlent que l'agent contourne parfois cette règle en appelant directement process_refund avec des montants supérieurs à 500€, notamment lorsque le system prompt contient des instructions conflictuelles ou que la conversation est longue. Quelle est l'architecture la plus fiable pour garantir que ce seuil ne puisse pas être contourné ?
Le seuil d'approbation doit être appliqué au niveau de l'implémentation de l'outil process_refund côté serveur, et non dans le system prompt ou la logique de l'agent. Concrètement, l'outil vérifie systématiquement si le montant dépasse 500€ : si c'est le cas, il rejette l'appel avec un code d'erreur explicite ('APPROVAL_REQUIRED') quelle que soit l'instruction reçue de l'agent, et l'agent doit alors appeler escalate_to_human avec un résumé structuré du cas. Cette approche est la seule tamper-proof car elle ne dépend pas du respect des instructions par le modèle (qui peut dériver sur des conversations longues), de la formulation du system prompt (qui peut être contourné par prompt injection), ni d'audits a posteriori (qui ne préviennent pas les infractions). La règle métier est ainsi encodée dans la couche d'exécution, la rendant incontournable indépendamment du comportement de l'agent.
Système d'extraction de données contractuelles pour un cabinet juridique
LexAuto est un cabinet juridique spécialisé dans les fusions-acquisitions qui utilise Claude pour extraire automatiquement des données structurées depuis des milliers de contrats legacy. Le système doit identifier les parties contractantes, les dates clés, les clauses de paiement, les pénalités et les conditions d'amendement. La particularité majeure du corpus est la présence fréquente d'avenants qui modifient des clauses du contrat original, créant des cas où deux valeurs différentes (ex. : délai de paiement de 30 jours dans le contrat original, modifié à 45 jours par l'avenant 1) coexistent dans le même document.nnL'équipe technique a constaté que le modèle extrait de façon incohérente l'une ou l'autre valeur sans indiquer laquelle est applicable, que des erreurs de validation apparaissent sur les plages de valeurs textuelles ('2 à 3 semaines'), et que le pipeline de retry sans feedback ciblé ne réduit pas le taux d'échec. Par ailleurs, la décision d'automatiser les extractions à haute confiance est envisagée pour réduire la charge de revue humaine.nnLe corpus total compte 50 000 contrats à traiter sous deux semaines pour respecter une deadline réglementaire, avec un budget d'API contraint nécessitant d'optimiser les coûts tout en maintenant la qualité juridique requise.
Lorsqu'un contrat contient à la fois des clauses originales et des avenants (ex. : délai de paiement de 30 jours dans le contrat, modifié à 45 jours par l'avenant 1), le modèle extrait de façon incohérente l'une ou l'autre valeur sans indiquer laquelle est actuellement applicable. Quelle est l'approche la plus efficace pour améliorer l'extraction dans ces cas ?
La solution la plus efficace est d'adapter le schéma d'extraction pour capturer explicitement la temporalité des clauses, en incluant pour chaque champ clé : la valeur originale du contrat, les valeurs successivement introduites par chaque avenant avec leur date d'effet, et la valeur actuellement applicable (la plus récente). Par exemple, le champ 'payment_terms' deviendrait un objet structuré : {original: '30 days', amendments: [{amendment_id: 1, value: '45 days', effective_date: '2021-03-15'}], current_value: '45 days'}. Cette approche est supérieure à la suppression des clauses supersédées en prétraitement (risque de perte de contexte juridique important) et à la reconstruction post-extraction (erreurs d'inférence). Le prompt doit explicitement instruire le modèle à identifier les marqueurs linguistiques d'amendement ('modifié par', 'remplacé par', 'nonobstant la clause X') et à les traiter comme des signaux de priorité temporelle.
Après trois mois de revue humaine à 100%, l'analyse montre que les extractions avec un score de confiance modèle >90% ont une précision globale de 97%. L'équipe envisage d'automatiser ces extractions pour réduire la charge de revue. Quelle étape de validation est la plus critique avant de déployer cette automatisation dans un contexte juridique ?
L'étape de validation la plus critique est d'analyser la précision de 97% de façon désagrégée par type de document et par champ extrait, plutôt que de se fier à la précision globale. Dans un contexte juridique, certains champs (ex. : clauses de pénalité, conditions de résiliation) peuvent avoir une précision beaucoup plus faible que la moyenne globale même pour les extractions à haute confiance, et une erreur sur ces champs peut avoir des conséquences contractuelles majeures. Il faut également vérifier si la distribution des documents à haute confiance est représentative du corpus complet (biais de sélection possible : les documents simples ayant systématiquement des scores plus élevés). Enfin, il est indispensable de valider que le signal de confiance est calibré de façon fiable et uniforme à travers les différents formats de contrats, et pas seulement sur les types de documents les plus courants dans les données d'évaluation.
Le pipeline de retry appliqué aux 18% d'extractions en échec retourne les mêmes erreurs sans amélioration notable. Quelle modification du mécanisme de retry permettrait de résoudre efficacement les échecs récupérables tout en évitant de gaspiller des appels API sur les cas non récupérables ?
La clé est de distinguer les classes d'échec avant d'appliquer une stratégie de retry. Les échecs récupérables (format de date incorrect, plage de valeurs mal parsée comme '2 à 3 semaines') bénéficient d'un retry enrichi avec le message d'erreur de validation spécifique injecté dans le prompt (ex. : 'Le champ payment_days doit être un entier. La valeur extraite 2 to 3 est une plage textuelle : veuillez extraire la valeur médiane ou basse'). Les échecs non récupérables — notamment lorsque l'information requise n'est pas présente dans le document source (ex. : le contrat ne mentionne pas de clause de pénalité) — ne bénéficieront jamais de retries supplémentaires et doivent être immédiatement routés vers la revue humaine avec une explication de l'absence détectée. Un classificateur d'erreurs léger (basé sur les codes de validation) permet de router chaque échec vers la bonne stratégie, réduisant les coûts API tout en améliorant le taux de résolution automatique.
Assistant conversationnel de coaching fitness avec gestion d'outils et de contexte long
FitCoach AI est une application mobile de coaching fitness personnalisé intégrant Claude comme assistant conversationnel. L'assistant accompagne les utilisateurs sur plusieurs mois de sessions hebdomadaires, enregistre leurs entraînements via un outil log_workout, adapte les recommandations à leur niveau d'expertise, et maintient la cohérence des conseils sur des conversations pouvant dépasser 80 000 tokens après plusieurs semaines d'utilisation.nnL'équipe produit a identifié plusieurs problèmes en production : l'outil log_workout reçoit fréquemment des combinaisons invalides de paramètres (ex. : mesure 'reps' pour des exercices cardio comme la course à pied), l'assistant perd les préférences et l'historique médical déclarés en début de conversation lors des sessions longues, et des dérives comportementales apparaissent après 25-30 tours malgré un contexte encore disponible, l'assistant abandonnant les adaptations de niveau d'expertise pourtant définies dans le system prompt.nnUne nouvelle fonctionnalité est également en développement : la découverte musicale contextuelle pendant l'entraînement, avec un assistant capable de recommander des playlists adaptées aux préférences progressivement exprimées par l'utilisateur au fil des sessions.
L'outil log_workout accepte les paramètres exercise_type (string), value (number) et measurement (string). En production, 23% des appels présentent des combinaisons invalides (ex. : measurement='reps' pour un exercice cardio comme la course, ou measurement='miles' pour un exercice de force comme le bench press). Les exercices se divisent naturellement en deux catégories : cardio (mesuré en temps ou distance) et force (mesuré en répétitions et séries). Quelle approche réduit le plus efficacement ces erreurs ?
La solution la plus efficace est de scinder l'outil unique log_workout en deux outils spécialisés : log_cardio_workout (acceptant exercise_type, distance avec unité parmi ['km', 'miles'], duration en minutes) et log_strength_workout (acceptant exercise_type, sets, reps, weight_kg optionnel). Chaque outil ne définit que les paramètres pertinents pour sa catégorie d'exercice, éliminant structurellement la possibilité de combinaisons invalides plutôt que de les détecter après coup. Cette approche est supérieure à la validation serveur avec messages d'erreur descriptifs (qui détecte les erreurs mais ne les prévient pas, gaspillant des tours) et à l'ajout de contraintes enum sur le champ measurement (qui réduit les choix mais laisse subsister l'ambiguité sur les associations valides). En réduisant le nombre de paramètres par outil et en nommant les outils de façon sémantiquement claire, la précision de sélection et d'appel passe mécaniquement de 77% à des niveaux proches de 98%.
Après trois mois de sessions hebdomadaires, la conversation d'un utilisateur atteint 85 000 tokens. Lorsqu'il demande 'Récapitule ce qu'on a conclu sur ma tendinite à l'épaule', l'assistant fournit une réponse générique au lieu de référencer les échanges spécifiques des premières sessions. Les discussions entre sessions s'appuient sur les conclusions précédentes. Quelle est l'approche la plus efficace pour maintenir la continuité narrative et médicale sur le long terme ?
La meilleure approche est un système hybride combinant : (1) une couche de 'mémoire persistante structurée' contenant les éléments invariants critiques (historique médical déclaré, blessures actives, contre-indications, objectifs à long terme, préférences confirmées) extraits et stockés dans un objet structuré mis à jour après chaque session ; (2) un index sémantique des conclusions clés de chaque session (via embedding), permettant une récupération ciblée à la requête ; (3) une fenêtre glissante de messages récents pour la cohérence conversationnelle immédiate. Lors d'une requête comme 'qu'a-t-on conclu sur ma tendinite', le système interroge l'index sémantique pour récupérer les passages pertinents et les injecte dans le contexte. Cette architecture est supérieure à la summarisation complète (qui perd les détails médicaux précis) et à la simple fenêtre glissante (qui perd les sessions plus anciennes). La mémoire persistante structurée garantit que les informations médicales critiques sont toujours disponibles quelle que soit la longueur de la conversation.
Les utilisateurs de FitCoach AI font fréquemment des demandes ambiguës comme 'Mets-moi de la musique pour l'entraînement'. Cela peut signifier créer une playlist, lancer une playlist existante, ou configurer des préférences pour des recommandations futures. Le système supporte les trois actions. L'évaluation montre que l'assistant pose en moyenne 4 questions avant d'agir, causant 35% d'abandons. Comment améliorer ce ratio sans sacrifier la pertinence des actions exécutées ?
La stratégie optimale est d'identifier la question de clarification la plus discriminante — celle qui résout la plus grande part d'ambiguïté en un seul échange — et de n'en poser qu'une seule, tout en proposant une action par défaut raisonnée basée sur le contexte disponible. Dans ce cas : 'Voulez-vous lancer quelque chose maintenant ou configurer vos préférences pour plus tard ?' Cette question unique divise l'espace d'intentions en deux branches principales. Si l'utilisateur répond 'maintenant', l'assistant peut directement proposer une playlist adaptée au type d'entraînement en cours (déduit du contexte conversationnel) sans poser de question supplémentaire. Cette approche est supérieure à un formulaire d'intake structuré (qui collecte tout mais bloque la valeur immédiate, augmentant le drop-off) et aux clarifications séquentielles sur plusieurs tours (qui prolongent l'attente et accumulent la frustration). L'assistant doit également apprendre des réponses des tours précédents pour réduire progressivement le besoin de clarification au fil des sessions.