\n\n\n\n Mon choix de cadre d'agent : Construire au-delà du PoC - AgntDev \n

Mon choix de cadre d’agent : Construire au-delà du PoC

📖 13 min read2,455 wordsUpdated Mar 26, 2026

Salut tout le monde, Leo ici de agntdev.com ! Aujourd’hui, je veux parler de quelque chose qui résonne dans ma tête depuis quelques semaines, depuis que j’ai plongé dans le dernier lot de frameworks pour agents. Plus précisément, je pense à l’aspect « construction » – pas seulement construire un agent, mais comment nous les construisons, et les implications souvent négligées de choisir une approche fondamentale plutôt qu’une autre. Nous avons dépassé la phase du « proof of concept » avec les agents, et maintenant il s’agit de les rendre fiables, maintenables et vraiment utiles.

L’angle spécifique sur lequel je me penche aujourd’hui est Les Coûts Cachés des Composants d’Agent Préfabriqués : Pourquoi Créer le Sien Peut Parfois Être Moins Cher.

Maintenant, je sais ce que certains d’entre vous pensent : « Leo, es-tu sérieux ? Nous venons d’obtenir tous ces outils et frameworks géniaux qui nous fournissent des modules de mémoire pré-construits, des composants de planification et des exécuteurs d’outils. Pourquoi diable voudrais-je créer le mien ? » Et croyez-moi, je me suis posé cette question exacte plusieurs fois. Pendant longtemps, j’étais un fervent adepte du mantra « utilisez le framework ». Pourquoi réinventer la roue, n’est-ce pas ?

Mon point de vue a commencé à changer lors d’un récent projet client. Nous construisions un agent de support interne pour une entreprise SaaS de taille moyenne. L’idée était simple : un agent capable de répondre aux questions courantes des clients en fouillant dans la documentation, en vérifiant les statuts de la base de données et même en escaladant des tickets si nécessaire. Nous avons commencé avec l’un des frameworks d’agents Python populaires – vous savez ceux-là, ils vous promettent un agent en quelques minutes. Et pendant les premiers jours, cela ressemblait à de la magie.

Nous avons assemblé quelques composants préfabriqués pour la mémoire (une intégration de base de données vectorielle), la planification (une chaîne LLM basique) et l’exécution d’outils (appelant certaines API internes). La démo était superbe. Le client était impressionné. Nous avons ouvert une kombucha de célébration. Mais ensuite, il y a eu les tests en conditions réelles.

L’Illusion de la Vitesse : Quand le « Démarrage Rapide » Devenait « Débogage Lent »

Les problèmes ont commencé de manière subtile. L’agent hallucinnait de temps en temps, ce qui est habituel avec les LLM, mais la façon dont il hallucinnait était particulière. Ce n’était pas juste pour inventer des choses ; il affirmait des faits qui étaient presque corrects, mais légèrement erronés, puisés dans ce qui semblait être un mélange d’interactions historiques et de contexte actuel. Nous avons commencé à examiner le composant mémoire.

Le module de mémoire de ce framework particulier était conçu pour un historique de conversation général. Il stockait les échanges, les résumait, et récupérait des morceaux pertinents basés sur la similarité sémantique. Ça a l’air bien sur le papier, non ? Mais notre agent devait distinguer entre la requête actuelle d’un utilisateur, le contexte historique de ce même utilisateur, et les connaissances générales de la documentation. Le composant préfabriqué traitait tout comme un grand sac de mots.

Mon équipe a passé des jours à essayer de régler les paramètres de ce composant mémoire « boîte noire ». Nous avons modifié les tailles de morceaux, testé différents modèles d’incorporation, même essayé de pré-filtrer les entrées avant qu’elles n’atteignent la mémoire. Rien ne fonctionnait vraiment. Le problème n’était pas la *fonctionnalité* du composant ; c’était sa *philosophie de conception* qui ne s’alignait pas avec notre problème spécifique.

Nous avons finalement réalisé que pour obtenir le comportement dont nous avions besoin, nous devrions soit écrire un wrapper élaboré autour de la mémoire préfabriquée (ce qui ressemblait à un combat contre le framework) soit plonger profondément dans son code source et le modifier (ce qui ressemblait à s’inscrire pour un cauchemar de maintenance). C’est là que le « coût caché » a commencé à montrer son visage.

Le Poids de l’Abstraction : Quand la Généralité Devenait un Fardeau

Les frameworks, par leur nature, visent la généralité. Ils veulent servir un large public aux besoins divers. Cela signifie que leurs composants sont souvent conçus pour être flexibles, configurables et quelque peu opinionnés sur la façon dont les choses *devraient* fonctionner. Et pour 80 % des cas d’utilisation, c’est fantastique ! Cela accélère véritablement le développement.

Mais qu’en est-il des 20 % restants ? Que se passe-t-il quand votre agent a besoin d’un type de mémoire très spécifique qui distingue entre le contexte de conversation éphémère, les préférences utilisateur à long terme et les connaissances statiques ? Ou lorsque sa logique de planification doit être étroitement intégrée à l’état d’un système externe complexe, plutôt que de simplement enchaîner des appels d’outils génériques ?

C’est là que l’abstraction commence à vous peser. Vous n’utilisez pas juste un composant ; vous héritez de ses hypothèses, de ses limitations et de ses biais inhérents. Essayer de forcer une pièce carrée dans un trou rond, même avec beaucoup de coups de marteau, conduit généralement à une pièce brisée ou à un trou mal formé.

Dans notre scénario d’agent de support, le composant mémoire préfabriqué était conçu pour un flux de conversation où tout le contexte historique est plus ou moins égal. Notre agent, cependant, devait prioriser une nouvelle requête contre une base de données de FAQs, n’intégrant l’historique de conversation que si la requête était ambiguë ou faisait clairement référence à une interaction précédente. Le composant du framework n’était tout simplement pas construit pour cette distinction nuancée sans une personnalisation lourde.

Quand Créer le Sien A du Sens : Contrôle et Clarté

Après beaucoup de délibérations (et quelques sessions pizza tard dans la nuit), nous avons décidé d’abandonner le module mémoire préfabriqué et de mettre en œuvre le nôtre. Cela a d’abord semblé être un pas en arrière, mais la clarté qu’il a apportée a été immédiate.

Nous avons conçu un système de mémoire spécifiquement pour nos besoins :

  1. Buffer de Conversation Éphémère : Une simple deque (queue double) pour les N derniers échanges de la conversation actuelle. Effacée après X minutes d’inactivité ou lorsqu’une nouvelle requête distincte arrive.
  2. Stockage de Profil Utilisateur : Une base de données légère (Redis, dans notre cas) stockant les préférences spécifiques à l’utilisateur, les tickets récents et les questions fréquemment posées pour cet utilisateur. Cela persiste à travers les sessions.
  3. Index de Base de Connaissances : Notre magasin vectoriel de choix, spécifiquement pour la documentation et les FAQs.

La logique de récupération a ensuite été sur mesure :

  • Tout d’abord, essayez de faire correspondre la requête directement avec la Base de Connaissances.
  • Si la confiance n’est pas suffisante, vérifiez le Stockage de Profil Utilisateur pour des interactions passées ou des préférences pertinentes.
  • En dernier recours, ou pour ajouter de la fluidité conversationnelle, tirez le contexte du Buffer Éphémère.

Voici un croquis Python simplifié de ce à quoi pourrait ressembler notre récupération de mémoire personnalisée, juste pour vous donner une idée :


class CustomAgentMemory:
 def __init__(self, user_id, knowledge_base_client, user_profile_store):
 self.user_id = user_id
 self.kb_client = knowledge_base_client
 self.profile_store = user_profile_store
 self.conversation_history = collections.deque(maxlen=10) # Buffer éphémère

 def add_to_history(self, role, message):
 self.conversation_history.append({"role": role, "content": message})

 def get_context(self, current_query: str) -> list[str]:
 context_chunks = []

 # 1. Prioriser la Base de Connaissances pour les réponses directes
 kb_results = self.kb_client.search(current_query, top_k=3)
 if kb_results:
 context_chunks.extend([res["text"] for res in kb_results])
 # Si un très bon match, peut-être que nous n'avons pas besoin de beaucoup plus pour le moment
 if any(res["score"] > 0.8 for res in kb_results): 
 return context_chunks

 # 2. Vérifier le Profil Utilisateur pour un contexte personnalisé
 user_prefs = self.profile_store.get_user_preferences(self.user_id)
 if user_prefs:
 context_chunks.append(f"Préférences utilisateur : {user_prefs}")
 
 recent_user_issues = self.profile_store.get_recent_issues(self.user_id, current_query)
 if recent_user_issues:
 context_chunks.extend(recent_user_issues)

 # 3. Ajouter l'historique de conversation récent pour la fluidité, mais de manière moins prioritaire
 # Nous pourrions résumer cela ou le filtrer pour la pertinence afin d’éviter le bruit
 if self.conversation_history:
 # Approche simple : ajouter juste les derniers échanges. Plus avancé : résumer ou filtrer par LLM.
 for item in list(self.conversation_history):
 context_chunks.append(f"{item['role']}: {item['content']}")

 return context_chunks

# Exemple d'utilisation (simplifié pour la brièveté)
# kb_client = MyVectorDBClient()
# profile_store = MyRedisProfileStore()
# memory = CustomAgentMemory("user123", kb_client, profile_store)
# memory.add_to_history("user", "Mon imprimante ne fonctionne pas.")
# memory.add_to_history("agent", "Quel modèle est-ce ?")
# context = memory.get_context("Comment réparer le bourrage papier sur mon HP OfficeJet 3000 ?")
# print(context)

Cette approche nous a donné un contrôle total. Le LLM a reçu exactement le contexte que nous souhaitions, dans l’ordre que nous souhaitions, avec le bon niveau de persistance. Le débogage est devenu simple car nous connaissions chaque ligne de code. Nous ne devions pas deviner ce que faisait la boîte noire interne du framework.

Quand les Composants Préfabriqués Rendent Encore Service : La Règle des 80%

Maintenant, je ne dis pas de jeter tous les frameworks et composants préfabriqués. Loin de là ! Pour de nombreux projets d’agents, ce sont absolument le bon choix. Si les besoins de votre agent s’alignent bien avec les hypothèses du framework, vous économiserez une quantité énorme de temps.

Par exemple, si vous construisez un chatbot simple qui a juste besoin de répondre à des questions d’une seule source de connaissance et de maintenir un flux de conversation basique, les composants de mémoire préfabriqués et de génération augmentée de récupération (RAG) d’un framework sont parfaits. Vous obtenez de la vitesse, des valeurs par défaut raisonnables et une base bien testée.

Un autre domaine où les frameworks excellent est l’orchestration des outils. Avoir une manière standardisée de définir les outils, de passer des arguments et de gérer leurs sorties est incroyablement précieux. Même dans notre scénario de mémoire sur mesure, nous avons toujours utilisé le composant d’exécution d’outils du framework, car sa conception correspondait parfaitement à nos besoins. Nous n’avions pas besoin de réinventer la manière dont un LLM décide quel API appeler ; nous devions simplement lui donner le bon contexte pour prendre cette décision.

La clé est de comprendre les compromis. C’est la décision classique « acheter contre construire », mais avec une touche d’agent. Acheter (utiliser un composant préconstruit) vous offre de la rapidité et souvent un coût de développement initial plus bas. Construire (fabriquer le vôtre) vous donne le contrôle, la spécificité, et souvent des coûts de maintenance à long terme plus bas pour des agents hautement spécialisés.

Leçons Actionnables pour Votre Prochain Projet d’Agent

  1. Comprendre Profondément le Problème Central de Votre Agent : Avant même de regarder les frameworks, définissez exactement ce que votre agent doit faire. Quel type d’information doit-il se souvenir ? Comment prend-il des décisions ? Avec quels systèmes externes interagit-il ? Plus vous pouvez être spécifique, mieux c’est.

  2. Évaluer les Composants du Framework de Manière Critique : Ne choisissez pas un framework simplement parce qu’il est populaire. Pour chaque composant critique (mémoire, planification, exécution d’outils), demandez :

    • La philosophie de conception de ce composant est-elle en accord avec les exigences uniques de mon agent ?
    • Combien de configuration ou d’encapsulation devrais-je faire pour qu’il convienne ?
    • Quelles sont ses hypothèses sous-jacentes ? (par exemple, sa mémoire traite-t-elle tout le contexte de manière égale ?)
    • Est-il facile de déboguer si quelque chose ne va pas dans ce composant ? Puis-je examiner facilement son état interne ?
  3. Ne Craignez Pas de Mixer et Associer : Vous n’avez pas à vous engager entièrement sur un seul framework ou à construire entièrement le vôtre. Vous pouvez utiliser un framework pour son excellente orchestration des outils, tout en implémentant votre propre mémoire sur mesure. Ou utiliser son module de planification mais lui fournir des outils personnalisés. La modularité est votre alliée.

  4. Priorisez la Clarté sur l’Ingéniosité (Surtout pour la Logique Principale) : Lorsque vous construisez un système qui dépend d’un LLM pour interpréter le contexte et prendre des décisions, l’ambiguïté est votre ennemie. Si la création de votre propre composant vous donne un contrôle clair sur l’entrée du LLM ou l’état de votre agent, cette clarté vaut souvent le temps de développement supplémentaire.

  5. Considérez le Coût de Maintenance : Si vous personnalisez beaucoup un composant préconstruit ou l’encapsulez dans des couches d’abstraction, vous pourriez vous engager pour plus de maux de tête en maintenance que si vous l’aviez simplement construit depuis le départ. Les mises à jour du framework sous-jacent pourraient casser votre logique personnalisée, entraînant plus de refactorisations.

Mon parcours avec le projet de support d’agent a vraiment souligné l’idée que « plus rapide » n’est pas toujours « moins cher » à long terme. Parfois, prendre le temps de construire une pièce maîtresse de votre système d’agent vous-même, adaptée précisément à vos besoins uniques, vous fera économiser d’innombrables débogages, frustrations et refactorisations éventuelles. Cela vous donne un sentiment de possession et une compréhension plus profonde du cerveau de votre agent.

Alors, la prochaine fois que vous commencerez un projet d’agent, faites une pause avant d’atteindre aveuglément le composant préconstruit le plus pratique. Pensez à ce qui distingue vraiment votre agent, et envisagez si une solution personnalisée pourrait être le choix le plus économique à long terme. Bon développement !

Articles Connexes

🕒 Published:

✍️
Written by Jake Chen

AI technology writer and researcher.

Learn more →
Browse Topics: Agent Frameworks | Architecture | Dev Tools | Performance | Tutorials
Scroll to Top