Guillaume Duvernay

La plupart des agents IA ne devraient pas être des agents

agentsn8nAI efficiencyrouting

Quand les agents sont arrivés dans n8n, j’en ai créé beaucoup. Il suffit d’ajouter un nœud Agent, de lui connecter trois outils, et il choisit lequel appeler. On avait l’impression que tout était devenu facile.

Au cours des mois suivants, j’en ai retiré la plupart. Dans les workflows qui devaient passer à l’échelle et fonctionner réellement en production, il ne me reste qu’environ un cinquième des agents que j’avais.

Pas parce que les agents sont mauvais. Mais, pour la plupart des tâches que je faisais, l’agent prenait à l’exécution des décisions que je connaissais déjà au moment de la conception, et me facturait ce privilège à chaque tour.

Le workflow que je prends pour exemple

Un chatbot d’assistance. Un déclencheur de chat, un agent exécuté sur un grand modèle, et un seul outil : une requête HTTP vers un point de terminaison de recherche qui répond aux questions à partir de mes documents. Quelqu’un pose une question sur le produit, l’agent appelle l’outil, lit la réponse et rédige son message.

Quatre nœuds. La création est vraiment rapide, ce qui explique en grande partie pourquoi cette structure est si répandue.

Quelqu’un dit bonjour, et vous payez pour un modèle de pointe

Envoyez « hi » à cet agent. En environ 1.3 seconde, vous obtenez une réponse aimable, rédigée par l’un des plus grands modèles disponibles.

Aucun outil n’a été appelé. Rien n’a été recherché. Tout le prompt système a été envoyé comme jetons d’entrée, y compris chaque ligne décrivant des outils qui n’ont jamais servi.

Mon prompt était léger ici. Avec cinq outils connectés et l’ordre d’appel précisé, c’est la ligne du milieu qui représente l’essentiel de la facture.

Le bonjour est un cas facile à comprendre, mais il n’a rien d’exceptionnel. Dans un chatbot, une grande partie des messages ne nécessite ni recherche ni consultation.

La même chose, écrite noir sur blanc

Voici la version de remplacement. Elle comporte plus de nœuds, mais chacun correspond à une décision que j’ai prise une fois, plutôt qu’à une décision qu’un modèle prend à chaque message.

Trois modèles sur le canevas, chacun adapté à son étape. Le grand modèle ne s’exécute que dans un seul nœud, et uniquement pour les messages qui y parviennent.

D’abord, orienter avec un modèle gratuit

Le seul rôle du classificateur de texte est de choisir le parcours du message. Deux catégories, chacune accompagnée d’une description :

  • Aucune récupération de connaissances nécessaire. Salutations, confirmations, bavardage. Tout ce à quoi on peut répondre sans rien consulter.
  • Récupération de connaissances nécessaire. Le message nécessite des informations tirées des documents pour pouvoir y répondre.

La classification est une tâche légère, que les petits modèles accomplissent très bien. Elle est assez rapide pour que son effet sur la latence totale soit à peine perceptible, et assez peu coûteuse pour que je n’y pense même plus.

Pour le parcours économique, une chaîne LLM de base utilise ce même tout petit modèle avec un court prompt système. « Salut » obtient maintenant une réponse en deux secondes environ, qui se lit exactement de la même façon, avec un modèle dont le coût par jeton représente une fraction de celui qu’il remplace.

Un seul nœud de modèle alimente à la fois le routeur et la réponse simple. Ce sont des tâches différentes, mais de même envergure. Et comme le modèle se change à un seul endroit, il m’arrive vraiment d’en essayer un autre, au lieu de modifier deux nœuds et d’oublier le second.

J’applique la même approche à la barre latérale du chat : générer les titres des conversations à intervalles réguliers avec un petit modèle au lieu de générer un titre à chaque message.

Configurer le déclencheur pour répondre depuis un nœud

Un petit détail qui peut bloquer toute la conception si on le rate. Par défaut, un déclencheur de chat répond à partir du dernier nœud, alors que ce workflow comporte deux parcours qui doivent tous deux répondre.

Réglez le mode de réponse du déclencheur sur « répondre depuis un nœud », puis placez un nœud Répondre dans le chat à la jonction des branches. Sans cela, impossible de proposer à la fois un parcours économique et un parcours coûteux qui répondent tous les deux. Or, c’est précisément l’intérêt du routage.

Le parcours de récupération, en trois nœuds

Regardez ce que l’agent a fait pour une vraie question. Le grand modèle a été appelé, a passé 600ms à traiter la demande et a décidé d’appeler l’outil. Bonne décision. Mais le résultat de toute cette intelligence se résume à une courte chaîne de requête, à peu près une version nettoyée de ce que l’utilisateur venait de saisir. Et pour la rédiger, il a fallu renvoyer tout le prompt système.

Seule la dernière profite d’un modèle coûteux. Pourtant, dans la configuration avec agent, les trois tâches l’utilisent.

Le parcours se compose donc de trois nœuds plutôt que d’un seul agent.

Préparer la requête de récupération est une chaîne LLM de base qui utilise un modèle mini. Son prompt système : à partir du message de l’utilisateur, formuler une requête courte et concise à envoyer à l’outil de récupération de connaissances, puis la fournir directement sous forme de question. Lors de mes tests, le petit modèle a formulé la même requête que le grand.

RAG via Lookio est une simple requête HTTP. La requête est placée dans le corps, tandis que l’identifiant de l’assistant et le mode sont des valeurs fixes que j’ai choisies, et non des paramètres qu’un modèle pourrait faire varier. La plupart des outils ajoutés à un agent reposent sur une API, et la plateforme fournit généralement un nœud prêt à l’emploi, qu’il suffit d’insérer.

L’étape « Rédiger la réponse finale » reçoit le message d’origine et le contenu récupéré, clairement identifiés, puis rédige la réponse. Elle reste sur le grand modèle, car c’est dans la formulation de la réponse finale que la qualité se voit.

La mémoire est désormais à votre charge

C’est ce que l’agent faisait pour vous, et ce qu’il vous faut maintenant réintégrer.

Un nœud d’agent prend en charge un sous-nœud de mémoire. Si vous découpez l’agent en étapes, plus rien ne s’en occupe : la conversation est donc chargée une fois au début et enregistrée une fois à la fin.

Cela demande plus de câblage qu’un sous-nœud de mémoire, mais s’appuie sur le même tampon. En contrepartie, vous voyez précisément, pour chaque étape, quelle quantité d’historique elle a reçue.

C’est plus de travail. Mais c’est aussi là qu’on réalise qu’un agent transmettait toute la conversation à chaque étape, alors qu’une étape de réécriture de requête n’a besoin que des deux derniers messages, pas des vingt derniers.

Ce que l’on y gagne

La prévisibilité, que j’aurais classée dernière il y a un an, est aujourd’hui ma priorité.

La troisième ligne est celle qui compte le plus à mes yeux. Quand un agent ignore un outil et répond en fonction de ce qu’il sait, c’est un échec impossible à reproduire et à tester. Un workflow ne peut pas faire ça. Le nœud est là, il s’exécute.

Quand je fais encore appel à un agent

Quand je ne connais vraiment pas l’ordre des étapes. Pour une recherche ouverte, par exemple, où la deuxième requête dépend des résultats de la première. Ou pour tout ce dont le nombre d’étapes est impossible à prévoir.

C’est le critère que j’utilise maintenant : est-ce que je peux dessiner le processus sur papier avant son exécution ? Si oui, l’agent fait payer un modèle pour qu’il redécouvre mon schéma à chaque requête.

La même question, à un autre niveau

C’est cette habitude que l’on peut transposer. Dans Claude Code ou Codex, beaucoup de choses que je fais suivent le même schéma que ce bot d’assistance, et les postes coûteux sont les mêmes : renvoyer tout le contexte pour une étape qui n’en avait besoin que d’une fraction, ou laisser un modèle redécouvrir quelque chose que je savais déjà.

Savoir ce que coûte un appel d’outil, parce qu’on en a configuré un manuellement et observé le nombre de jetons, permet de repérer ce qui se passe dans un environnement d’exécution qui ne montre presque rien.

Ouvrez vos propres agents et examinez leurs exécutions. Pour chacune, demandez-vous si vous auriez pu en dessiner les étapes avant qu’elle ne démarre. Pour la plupart des miens, la réponse est oui.

Sources