Un agent de recherche IA peut fonctionner dans une démo mais échouer sous des charges de production lorsque la récupération renvoie des preuves incomplètes, que les nouvelles tentatives répètent des actions infructueuses, ou que l'exécution dépasse les limites de temps et de coût. TinyFish, qui fournit une infrastructure web pour les agents IA, a publié deux guides techniques traitant de ces défis. Le premier définit une architecture de recherche agentique en production, tandis que le second partage les enseignements tirés de la construction d'un système de recherche approfondie. Ensemble, ils examinent comment un agent de recherche autonome peut planifier la récupération, évaluer les preuves, gérer les échecs et contrôler la frontière entre le raisonnement du modèle et l'exécution déterministe.
TL;DR
TinyFish a présenté son architecture de recherche agentique et les principaux enseignements d'ingénierie tirés de la construction de systèmes de recherche approfondie. Construit sur quatre primitives web (TinySearch, TinyFetch, TinyBrowser et TinyAgent), le système fonctionne via une boucle de contrôle en sept phases autour du modèle de base. Sur OpenBenchmarks, TinyFish a atteint un taux de complétion de 79.0% sur les tâches de codage tout en affichant le coût médian par tâche le plus bas (0.050 $) et la plus faible empreinte en tokens, soulignant l'importance des boucles de contrôle rigides, des tentatives spécifiques aux échecs et du raisonnement unifié par rapport aux planificateurs autonomes.
Qu'est-ce que l'architecture de recherche agentique ?
L'architecture de recherche agentique permet à un agent IA de planifier la récupération, d'accéder aux sources, d'évaluer les preuves et d'adapter son approche à mesure que de nouvelles informations deviennent disponibles. Le modèle fournit le raisonnement, tandis que l'application environnante gère l'état, l'exécution des outils, le traitement des preuves, les politiques d'exécution et la validation des sorties. Ensemble, ces composants permettent à un agent de gérer les résultats incomplets, les échecs récupérables et les besoins d'information changeants.
L'architecture de TinyFish s'appuie sur des concepts fondamentaux issus d'une prépublication d'architecture de février 2026, qui découple le raisonnement de l'exécution grâce à des interfaces d'outils typées. L'article établit des garde-fous système essentiels, incluant un traçage détaillé ainsi que des plafonds stricts sur les tokens, le temps d'exécution, le coût global et les invocations d'outils.
Comment se déroule une exécution de recherche en production ?
TinyFish décompose une exécution en 7 phases :
- Définir la tâche : Transformer l'objectif en un « contrat de preuves » : champs requis, sources, fraîcheur et règles de complétion.
- Planifier la récupération : Séparer les besoins indépendants des besoins dépendants. Les requêtes dépendantes attendent les réponses antérieures.
- Choisir la première route : Choisissez un outil en fonction de ce que le système sait de la preuve.
- Découvrir, sélectionner, récupérer : Traitez les résultats de recherche comme des candidats jusqu'à l'arrivée du contenu de la page.
- Évaluer : Qualifiez la preuve de suffisante, incomplète, contradictoire, inaccessible ou de budget épuisé.
- Récupérer ou escalader : Révisez la requête, réessayez, changez de sources ou de méthode d'accès.
- Arrêter et valider : Retournez terminé, incomplet, échoué, annulé ou revue humaine requise.
La phase 2 répond à un échec connu. ChainRAG (ACL 2025) l'appelle le problème « lost-in-retrieval », où des entités clés disparaissent lors de la décomposition de questions en plusieurs sauts. La phase 6 s'appuie sur Search-R1, qui démontre comment les modèles peuvent apprendre à générer des requêtes de recherche supplémentaires pendant le raisonnement lorsque la récupération initiale est insuffisante. Sur 7 jeux de données QA, sa recherche multi-tours apprise a surpassé les bases RAG de 41 % (Qwen2.5-7B) et 20 % (Qwen2.5-3B).
Comment un agent de recherche devrait-il router les outils ?
Le routage doit suivre le manque d'information, et non une échelle fixe.
| Condition de départ | Primitive | Ce que l'application contrôle encore |
| Emplacement de la source inconnu | Search | Planification des requêtes, politique de sources, arrêt |
| URL connue et lisible | Fetch | Vérifications de complétude, validation des affirmations |
| L'application doit contrôler les actions sur la page | Browser | Chaque action, chaque nouvelle tentative et chaque point de contrôle |
| Des décisions réparties sur plusieurs pages | Agent web | Règles métier, budgets, validation |
L'escalade n'est pas toujours la solution. Des résultats faibles nécessitent une meilleure requête. Des sources contradictoires nécessitent des preuves plus solides. Un outil plus lourd ne règle ni l'un ni l'autre.
Les nouvelles tentatives doivent être fondées sur le type d'échec et rester dans des limites définies. Les erreurs transitoires peuvent justifier de répéter une requête, tandis que des preuves incomplètes ou contradictoires exigent une approche différente. Les nouvelles tentatives du navigateur doivent également tenir compte des actions déjà accomplies afin d'éviter des conséquences non voulues, comme la soumission du même formulaire deux fois.
better',{'font-size':13,'font-weight':700,fill:G,'text-anchor':'start'}); D.sf.forEach(function(d){var tf=d[0]==='TinyFish',g=el('g',{},s4); var ring=el('circle',{r:tf?17:0,fill:'none',stroke:G,'stroke-opacity':.4,'stroke-width':2},g); var c=el('circle',{r:tf?10:8,fill:tf?G:'#6a6a6a',stroke:'#111','stroke-width':2},g); var t=tx(g,0,0,'',{'font-size':13,'font-weight':700,fill:tf?G:TX,'text-anchor':'start'}); pts[d[0]]={g:g,c:c,t:t,ring:ring,x:sx(d[1]),y:sy(d[2])}}); pts['Exa fast']=pts['Exa deep'];boost(s4,1.2)} var anim4=null,OFF={sf:{'TinyFish':[-16,-20,'end'],'Exa deep':[-14,-18,'end'],'Perplexity':[14,-12,'start'],'Firecrawl':[14,16,'start']}, so:{'TinyFish':[16,0,'start'],'Exa fast':[-14,0,'end'],'Perplexity':[14,0,'start'],'Firecrawl':[14,0,'start']}}; function drawScatter(fromZero){var data=D[cur],start={},t0=null; data.forEach(function(d){var p=pts[d[0]];start[d[0]]=fromZero?{x:sx(0),y:Y0}:{x:p.x,y:p.y};p.tx=sx(d[1]);p.ty=sy(d[2]); p.t.textContent=d[0]+' '+d[2].toFixed(1)+'% · $'+d[1].toFixed(3)}); anim4=function(ts){if(!t0)t0=ts;var f=Math.min(1,(ts-t0)/900),e=1-Math.pow(1-f,3); data.forEach(function(d){var p=pts[d[0]],s=start[d[0]];p.x=s.x+(p.tx-s.x)*e;p.y=s.y+(p.ty-s.y)*e;p.g.setAttribute('transform','translate('+p.x+','+p.y+')'); var o=OFF[cur][d[0]];p.t.setAttribute('x',o[0]);p.t.setAttribute('y',o[1]);p.t.setAttribute('text-anchor',o[2])}); if(f>=1)anim4=null}} build4();chips('c4','b',function(b){cur=b;drawScatter(false)});drawScatter(true); function loop(ts){if(active==='p1'&&run1)run1.tick(ts);if(active==='p3')tick3(ts);if(anim4)anim4(ts); if(pts.TinyFish)pts.TinyFish.ring.setAttribute('r',15+3*Math.sin(ts/220));requestAnimationFrame(loop)} requestAnimationFrame(loop); window.addEventListener('load',post);window.addEventListener('resize',post);setTimeout(post,300); })(); </script> </body></html> ">Qu'a appris TinyFish en construisant une recherche approfondie ?
Le l'agent de recherche approfondie effectue des recherches, navigue et génère des rapports complets avec citations. La plupart des défis d'ingénierie tournaient autour de la gestion du contexte, de l'orchestration du système et de la conception du produit.
Leçon n°1 : Suppression du planificateur séparé
Les itérations initiales utilisaient un planificateur autonome appelé à chaque fois. Seul un état structuré y était transmis. Pour des requêtes de suivi comme « concentre-toi uniquement sur les risques de tarification en Asie du Sud-Est », l'agent dérivait vers une large étude de marché. TinyFish a ensuite déplacé la planification dans la boucle de raisonnement unifiée de l'orchestrateur lui-même.
Leçon n°2 : Suppression des sous-agents :
TinyFish attribuait initialement un sous-agent séparé à chaque requête de recherche, ce qui augmentait la surcharge de changement de contexte, la latence et le coût. L'équipe a ensuite remplacé ces sous-agents par des appels d'outils pour les tâches répétables telles que le classement des résultats de recherche, la classification des sources et l'extraction de preuves. Cela a réduit les informations renvoyées à l'orchestrateur, lui permettant de se concentrer sur la planification de la recherche et la décision de ce qu'il fallait examiner ensuite.
Leçon n°3 : Adapter les chercheurs :
TinyFish optimisait initialement son système de recherche pour la couverture des sources, mais les utilisateurs accordaient une plus grande importance à la qualité et à la pertinence des preuves à l'appui. L'équipe a ajusté le classement des sources pour tenir compte de l'objectif de recherche et a ajouté des contrôles pour prioriser, exclure ou restreindre des domaines. Elle a également développé un harnais d'évaluation interne utilisant un juge LLM pour évaluer les rapports sur la pertinence, la solidité des preuves, la fiabilité des citations et la diversité des sources.
Comment le coût et la latence s'accumulent-ils ?
TinyFish budgétise la tâche complète, pas les appels individuels :
- Latence de la tâche = planification + recherche + récupération + évaluation + nouvelles tentatives + étapes interactives + mise en file d'attente.
- Coût de la tâche = tokens + appels d'outils + utilisation de pages ou du navigateur + nouvelles tentatives + infrastructure.
SearchAgent-X (ICLR 2026) montre pourquoi. La récupération exacte ajoutait une surcharge, et la récupération grossière forçait un raisonnement supplémentaire. Ses correctifs ont atteint jusqu'à 3.4x de débit et une latence 5x inférieure par rapport aux références testées.
Comment TinyFish se compare-t-il en recherche et en récupération ?
OpenBenchmarks fixe le modèle (gpt-5.6-sol), 100 tâches et budgets, et ne fait varier que le fournisseur. Les scores sont des moyennes de 3 exécutions.
| Mesure | TinyFish | Exa deep | Perplexity | Firecrawl |
| Recherche + récupération terminée | 79.0% ± 2.0 | 83.0% ± 1.0 | 77.7% ± 1.5 | 76.0% ± 1.0 |
| Temps médian de la tâche | 24s | 37s | 22s | 34 s |
| Coût médian des tâches | $0.050 | $0.127 | $0.083 | $0.082 |
| Tokens médians par tâche | 12,844 | 23,660 | 20,062 | 17,379 |
| Complétion en recherche seule | 59.3% | 66,3 % (Exa fast) | 77.3% | 70.3% |
| Prix catalogue de la recherche | $0 | $0.012 | $0.005 | $0.005 |
Source : OpenBenchmarks board, mis à jour le 26 septembre 2026. Les tâches couvrent uniquement la documentation d'entreprise.
OpenBenchmarks rapporte également séparément les résultats en recherche seule. Dans cette configuration, TinyFish a atteint 59,3 % de complétion des tâches, contre 77,3 % pour Perplexity, 70,3 % pour Firecrawl et 66,3 % pour Exa Fast. Ces résultats ne doivent pas être directement comparés aux scores recherche-et-récupération car les capacités de récupération disponibles diffèrent.
Points clés à retenir
- Contrôler toute la trajectoire, pas 1 seul appel de recherche.
- Router selon le manque d'information ; escalader uniquement lorsque l'accès échoue.
- Garder la planification et l'exécution dans 1 boucle de raisonnement.
- Déplacer les étapes déterministes vers des appels d'outils, pas des sous-agents.
- Classer les sources selon l'objectif de recherche, pas selon un score de qualité unique.
Lisez le guide d'architecture, les leçons sur la recherche approfondie et les docs de TinyFish.
Merci à l'équipe Tinyfish pour son leadership intellectuel et ses ressources pour cet article. Cet article est sponsorisé par TinyFish.
L'article TinyFish décortique l'architecture de recherche agentique pour les agents IA en production est apparu en premier sur MarkTechPost.