Architecture d'agent

Un agent (agent intelligent) désigne un système d'IA capable de percevoir son environnement de manière autonome, de raisonner et d'agir pour atteindre des objectifs.

De la boucle la plus simple à la collaboration multi-agents, cet article vous permet de bien comprendre les principes, les schémas et les scénarios d'application de six architectures principales, vous aidant à faire des choix techniques appropriés dans des projets réels.


Qu'est-ce que l'architecture d'agent

Dans le développement d'applications d'IA,Agent (agent intelligent)Désigne un système d'IA capable de percevoir son environnement, de prendre des décisions autonomes et d'agir.

Contrairement aux appels traditionnels de grands modèles de type « question-réponse », un agent peut effectuer en continu des opérations en plusieurs étapes, appeler des outils et même coordonner d'autres agents pour accomplir des tâches complexes.

Architecture d'agentDésigne l'organisation des composants dans un système d'agent, qui détermine les limites de capacités, la fiabilité, la flexibilité et les scénarios d'application de l'agent.

L'essence de l'agent : Perception → Raisonnement → Action
Agent Core Loop Shows the three core stages of an Agent: perceiving the environment, reasoning and deciding, executing actions, forming a loop. Perceive environment Reason and decide Execute action Observe results, continue the loop

Le fonctionnement d'un agent est essentiellement uneBoucle— percevoir l'état actuel, raisonner sur l'étape suivante, exécuter une action, percevoir à nouveau... jusqu'à ce que la tâche soit terminée.

La différence entre les architectures réside dans la façon d'organiser et d'étendre cette boucle de base.

Cet article suppose que vous êtes déjà familier avec les concepts de base des grands modèles de langage (LLM) et l'idée de base de l'appel d'outils (Function Calling). Si vous n'êtes pas encore familier, vous pouvez d'abord apprendre ces deux fondamentaux.


Architecture 1 : Boucle d'agent unique

Idéal pour les débutants Simple à mettre en œuvre

L'architecture la plus basique et intuitive : un agent accomplit seul toutes les tâches du début à la fin.

La boucle d'agent unique incarne directement lemodèle ReAct(Raisonnement + Action) : chaque étape consiste à « réfléchir d'abord, puis agir ». Le LLM sert de cerveau, et l'appel d'outils est ses mains.

Figure 1 — Flux de la boucle d'agent unique
Single Agent Loop architecture diagram Illustrates the complete working loop of a single Agent: receive task, perceive environment, reason and decide, call tools, then judge based on the result whether to continue looping or exit when the task is complete. User task input Perceive · Gather context Read files, get status Reason · Decide next step Analyze situation, select tool Act · Call tool Bash / Read / Edit... Done Output result Continue loop Agent loop

Fonctionnement

Percevoir :Lire l'état actuel — contenu des fichiers, variables d'environnement, sortie des étapes précédentes — et l'intégrer dans le contexte actuel.

Raisonner :Le LLM décide de l'action suivante en fonction du contexte — quel outil appeler, quels paramètres transmettre — ou détermine si la tâche est terminée.

Action :Exécuter des appels d'outils, tels que la lecture/écriture de fichiers ou la recherche sur le web. Les résultats d'exécution de l'outil sont ajoutés au contexte, puis il passe à l'itération suivante de la boucle.

Chaque résultat d'appel d'outil est réécrit dans la fenêtre de contexte. Par conséquent, à mesure que la tâche progresse, le contexte continue de croître jusqu'à atteindre la limite de la fenêtre de contexte du LLM — c'est le principal goulot d'étranglement de la boucle d'agent unique.

Exemple

# Implémentation simplifiée de la boucle d'agent unique — montrant la logique centrale du modèle ReAct

class SimpleAgent:
    """Structure de base de la boucle d'agent unique"""

    def __init__(self, model, tools, max_turns=10):
        self.model = model          # Grand modèle de langage
        self.tools = tools          # Liste des outils disponibles
        self.max_turns = max_turns  # Nombre maximal d'itérations de boucle, empêchant une boucle infinie

    def run(self, task: str) -> str:
        """Boucle principale d'exécution de la tâche"""
        context = f"Tâche utilisateur : {task}"

        for turn in range(self.max_turns):
            # Étape 1 : Réfléchir — laisser le modèle décider de l'étape suivante
            response = self.model.think(context)

            # Si le modèle estime que la tâche est terminée, renvoyer la réponse finale
            if response.is_final():
                return response.content

            # Étape 2 : Agir — appeler l'outil choisi par le modèle
            tool_name = response.tool_name
            tool_args = response.tool_args
            tool_result = self.tools[tool_name](**tool_args)

            # Étape 3 : Réinjecter le résultat de l'outil dans le modèle et passer au tour suivant
            context += f"\nOutil {tool_name} a renvoyé : {tool_result}"

        return "Nombre maximal de tours atteint, tâche non terminée"

# Exemple d'utilisation
agent = SimpleAgent(model=llm, tools={
    "read_file": read_file,
    "search_code": search_code,
    "run_test": run_test
})
result = agent.run("Corrige l'erreur de type dans user.py dans le projet d'exemple")

Avantages

  • Le plus simple à implémenter, facile à déboguer
  • Adapté aux scénarios avec des limites de tâche claires
  • Pris en charge par presque tous les frameworks d'agents

Inconvénients

  • La fenêtre de contexte se remplit facilement
  • Tendance à "dévier" dans les tâches complexes
  • Ne peut pas traiter plusieurs sous-tâches en parallèle

Meilleurs cas d'utilisation :Corriger un bug, écrire une fonction, répondre à une question spécifique. La tâche est claire, avec une complexité modérée, et ne nécessite ni parallélisme ni collaboration multi-rôles.

Si votre tâche est censée nécessiter plus de 15 tours d'appels d'outils, une boucle d'agent unique n'est peut-être pas le meilleur choix. Envisagez d'utiliser une collaboration multi-agents ou une architecture planifier-et-exécuter pour décomposer la complexité.


Architecture 2 : Planifier et exécuter

Intuitif Vérifiable

Sépare « déterminer quoi faire » et « le faire réellement » en deux phases indépendantes, ce qui améliore la prévisibilité et l’auditabilité des tâches.

L’architecture Plan + Execute divise le travail de l’Agent en deux phases distinctes : d’abordPlan, puisExecute。

Pendant la phase de planification, le modèle n’effectue aucune action ; il génère uniquement une liste détaillée d’étapes d’exécution. Pendant la phase d’exécution, le système réalise chaque étape dans l’ordre. Cette séparation permet aux utilisateurs de vérifier le plan avant l’exécution, comme le Plan Mode de Claude Code.

Figure 2 — architecture Plan + Execute (avec replanification dynamique)
Plan + Execute architecture diagram Shows the two-phase process: the planning phase generates a list of execution steps, the execution phase completes each step in sequence, and can dynamically replan based on results Planning phase User task Planner Generate a step-by-step execution plan Execution plan Step 1 Gather information Step 2 Analysis processing Step 3 Output result Execution phase Executor Complete each step in order Complete the task Dynamic re-planning (Optional)

Deux variantes

VarianteComportementScénario typique
Planification statiqueLe plan est généré en une seule fois et exécuté linéairement dans l’ordre, sans ajustements en cours de route.Tâches à processus fixe et étapes bien définies, comme les scripts de migration de données.
Planification dynamiqueRéévaluer après chaque étape et ajuster le plan suivant en fonction des résultats.Tâches aux résultats incertains, comme le débogage et l’analyse exploratoire des données.

La planification dynamique est plus robuste, mais elle est plus complexe à mettre en œuvre, et la replanification à chaque étape consomme des tokens supplémentaires.

Le Plan Mode de Claude Code incarne cette architecture : après avoir cliqué sur « Plan », l’IA produit d’abord un plan détaillé pour que vous puissiez le vérifier, et ne commence l’exécution qu’après confirmation. Cela renforce considérablement le sentiment de contrôle de l’utilisateur.

Exemple

# Implémentation simplifiée de l’architecture Plan & Execute

class PlanExecuteAgent:
    """Agent qui planifie d’abord, puis exécute"""

    def plan(self, task: str) -> list:
        """Phase 1 : Générer un plan d’exécution"""
        plan = self.model.generate(f"""
Veuillez décomposer la tâche suivante en une liste d’étapes exécutables :
Tâche : {task}
Retournez une liste d’étapes au format JSON, chacune contenant :
- step_id: numéro de l’étape
- description: description de l’étape
- tool: nom de l’outil à appeler
        """
)
        return plan

    def execute(self, plan: list, dynamic: bool = False) -> str:
        """Phase 2 : Exécuter le plan étape par étape"""
        results = []
        remaining_plan = plan.copy()

        while remaining_plan:
            step = remaining_plan.pop(0)
            output = self.tools[step["tool"]](step["description"])
            results.append({"step": step["step_id"], "output": output})

            if dynamic and remaining_plan:
                # Planification dynamique : réévaluer le plan suivant en fonction des résultats actuels
                remaining_plan = self.replan(remaining_plan, results)

        return self.summarize(results)

# Exemple d'utilisation
agent = PlanExecuteAgent()
plan = agent.plan("Ajouter une fonctionnalité d'authentification des utilisateurs au projet d'exemple")
# Les humains peuvent d'abord examiner le plan et l'exécuter après avoir confirmé qu'il est raisonnable
result = agent.execute(plan, dynamic=True)

Avantages

  • Le plan peut être examiné manuellement avant l'exécution.
  • Séparation claire des responsabilités de raisonnement et d'exécution.
  • Adapté aux tâches longues.

Inconvénients

  • Le plan initial peut ne pas être suffisamment précis.
  • L'approche en deux phases ajoute de la latence.
  • La version statique a du mal à gérer les situations imprévues.

Le coût de Plan & Execute est l'augmentation du nombre de tours de raisonnement, ce qui est inutile pour les tâches simples. Si une tâche peut être accomplie en 3 étapes, utiliser directement une boucle mono-agent est plus efficace.


Architecture 3 : Collaboration multi-agents

Recommandation de production Tâches complexes

Un Orchestrateur est responsable de la décomposition et de l'ordonnancement des tâches ; plusieurs Sous-agents remplissent chacun leurs propres fonctions, accomplissant les sous-tâches en parallèle ou séquentiellement, et les résultats sont renvoyés à l'Orchestrateur pour synthèse.

Lorsqu'un seul Agent fait face à une fenêtre de contexte insuffisante ou à des tâches trop complexes, l'architecture multi-Agent offre une solution élégante :Faire travailler en parallèle plusieurs sous-Agents spécialisés, tandis qu'un Orchestrateur coordonne la situation globale.

Figure 3 — Architecture de collaboration multi-agents (Orchestrateur + Sous-agents)
Multi-Agent collaboration architecture diagram The Orchestrator distributes tasks to three specialized sub-Agents, which execute in parallel and then return the results to the coordinator Orchestrator Task decomposition · scheduling · result synthesis Distribute tasks Execute in parallel Subagent A Code review Subagent B Security detection Subagent C Performance analysis Return results Result aggregation Synthesize outputs from all sub-Agents

Un contexte indépendant est un avantage essentiel

Chaque sous-Agent dispose d'unefenêtre de contexte indépendante. La lecture approfondie de auth.py par l'Agent de revue de code n'affecte pas le jugement de l'Agent d'analyse des performances ; la grande quantité de sorties intermédiaires de l'Agent de détection de sécurité n'empiète pas sur l'espace des autres Agents.

Un Sous-agent est transitoire et isolé — il est détruit après avoir terminé une tâche. Les Équipes d'Agents, en revanche, sont plusieurs instances d'Agents indépendantes qui collaborent sur une longue période et s'échangent des messages, davantage comme une véritable équipe.

Exemple

# Implémentation simplifiée de la collaboration multi-agents

class Orchestrator:
    """Orchestrateur : responsable de la décomposition des tâches, de la distribution et de l'agrégation des résultats"""

    def __init__(self):
        self.subagents = {
            "code_review": Subagent(
                name="Revue de code",
                tools=["read_file", "static_analysis"],
                system_prompt="Vous êtes un expert en revue de code..."
            ),
            "security": Subagent(
                name="Détection de sécurité",
                tools=["scan_vulnerability", "check_deps"],
                system_prompt="Vous êtes un expert en détection de sécurité..."
            ),
            "performance": Subagent(
                name="Analyse des performances",
                tools=["profile_code", "analyze_complexity"],
                system_prompt="Vous êtes un expert en analyse des performances..."
            )
        }

    def handle_task(self, task: str) -> dict:
        # Étape 1 : analyser la tâche et décider quels Sous-agents sont nécessaires
        needed = self.plan(task)

        # Étape 2 : distribuer en parallèle (chaque Sous-agent travaille simultanément avec un contexte indépendant)
        results = {}
        for agent_name in needed:
            sub_task = self.decompose(task, agent_name)
            results[agent_name] = self.subagents[agent_name].run(sub_task)

        # Étape 3 : agréger les résultats de chaque Sous-agent et produire une sortie complète
        return self.synthesize(task, results)

# Exemple d'utilisation : Une exécution, analyse parallèle tridimensionnelle
orch = Orchestrateur()
report = orch.handle_task(Réviser la PR #42 du projet d'exemple)

Avantages

  • Prend naturellement en charge le parallélisme, rapide
  • Les sous-agents sont indépendants, les contextes n'interfèrent pas les uns avec les autres
  • Permet de spécialiser le rôle de chaque sous-agent

Inconvénients

  • Logique de coordination complexe, difficile à déboguer
  • Coût en tokens plus élevé pour l'exécution parallèle multi-agents
  • L'orchestrateur lui-même peut devenir un goulot d'étranglement

Le principal coût de la collaboration multi-agents est la surcharge d'orchestration. Si les sous-tâches sont très simples (chacune ne nécessitant que 1-2 étapes), la surcharge d'orchestration peut dépasser le coût du travail réel, auquel cas un agent unique est plus approprié.


Architecture 4 : Réflexion et autocorrection

Sortie de haute qualité Facile à intégrer

Ajouter une évaluation de la qualité à l'étape de sortie de l'agent ; si le résultat n'est pas satisfaisant, régénérer ou corriger, formant ainsi une boucle d'itération interne.

L'architecture de réflexion ajoute une « étape d'inspection de la qualité » pour l'agent : après chaque génération de sortie, unCritiqueévalue la qualité, et si elle ne répond pas au standard, demande des corrections jusqu'à ce que la sortie satisfasse aux critères.

C'est comme un développeur qui exécute des tests sur son propre code après l'avoir écrit—une auto-vérification avant la livraison.

Figure 4 — Architecture de réflexion et d'autocorrection
Reflection and Self-Correction Architecture Diagram After the agent executes the task, the Critic scores the output quality; if it passes, the task is complete; otherwise, it enters the correction stage. Executor Generates initial output Critic Evaluates quality and correctness Pass Output final result Fail Reviser Improves output based on feedback Regenerate (Usually with a maximum iteration limit set)

Deux approches de mise en œuvre

ApprocheMécanismeAvantagesInconvénients
AutoréflexionLe même modèle exécute d'abord, puis évalue sa propre sortieMise en œuvre simple, aucun coût de modèle supplémentaireLe modèle peut être "aveugle" à ses propres erreurs
Modèle critiqueUtiliser un modèle critique indépendant pour évaluer la sortie du modèle exécuteurPlus objectif, peut détecter les angles morts du modèle exécuteurAjoute un coût d'appel au modèle et de la latence

"Écrire des tests unitaires → Exécuter les tests → Observer les échecs → Corriger le code → Exécuter à nouveau" — c'est une application classique de l'architecture de réflexion. Les résultats des tests eux-mêmes servent de signal de rétroaction au critique.

Exemple

# Implémentation simplifiée de l'architecture de réflexion

class ReflectiveAgent:
    """Agent avec capacité d'auto-réflexion"""

    def __init__(self, model, tools, max_reflections=3):
        self.model = model
        self.tools = tools
        self.max_reflections = max_reflections  # Nombre maximal de corrections pour éviter les boucles infinies

    def run(self, task: str) -> str:
        # Étape 1 : Exécuter normalement, produire la sortie initiale
        output = self.model.generate(task)

        for i in range(self.max_reflections):
            # Étape 2 : Réflexion — évaluer la qualité de la sortie
            critique = self.model.generate(f"""
Veuillez évaluer strictement la sortie suivante :
Tâche originale : {task}
Sortie actuelle : {output}
Vérifier : erreurs factuelles ? lacunes logiques ? informations manquantes ? problèmes de formatage ?
Si la sortie est parfaite, répondez "PASS".
            """
)

            if "PASS" in critique:
                break  # La sortie a passé la revue

            # Étape 3 : Correction — améliorer d'après la critique
            output = self.model.generate(f"""
Tâche originale : {task}
Sortie précédente : {output}
Retour sur le problème : {critique}
Veuillez corriger la sortie en fonction des retours.
            """
)

        return output

# Exemple d'utilisation
agent = ReflectiveAgent(model=llm, tools={})
code = agent.run("Écrivez une fonction Python qui implémente le chiffrement AES pour la chaîne EXAMPLE")
# Après avoir généré le code, l'Agent vérifie lui-même l'implémentation du chiffrement et la gestion des clés,
# corrige automatiquement les vulnérabilités après détection, garantissant une sortie sûre et fiable

Avantages

  • Améliore considérablement la qualité de la sortie
  • Permet de définir des normes de qualité claires
  • Adapté aux tâches avec des critères d'évaluation objectifs

Inconvénients

  • Des itérations multiples augmentent la latence et le coût
  • Il faut définir un nombre maximal d'itérations pour éviter les boucles infinies
  • Efficacité limitée lorsque les critères d'évaluation sont difficiles à formaliser

Chaque itération de la boucle de réflexion est un appel LLM supplémentaire, ce qui augmente considérablement la latence. De plus, une limite supérieure du nombre de réflexions doit être définie, sinon le modèle peut tomber dans une boucle infinie de "jamais satisfait".


Architecture 5 : RAG + Agent (Agent augmenté par récupération)

Tâches à forte intensité de connaissances Grandes bases de connaissances

Ajouter une capacité de recherche vectorielle à la boîte à outils de l'Agent, permettant à l'Agent d'interroger dynamiquement des bases de connaissances externes pendant le raisonnement, surmontant ainsi les limites de la fenêtre de contexte.

RAG (Retrieval-Augmented Generation) est à l'origine une technique qui permet aux LLM d'interroger des bases de connaissances externes. Lorsqu'elle est combinée à un Agent, elle devient plus puissante : l'Agent peutdécider proactivement quand effectuer une récupération et quoi récupérer, plutôt que de récupérer passivement une fois à chaque fois.

Figure 5 — Architecture de récupération augmentée RAG + Agent
RAG + Agent Architecture Diagram During reasoning and decision-making, the Agent actively initiates retrieval from external knowledge bases, incorporates the retrieved relevant content into context, and then performs more accurate reasoning and actions. User Query Active Retrieval Decide when and what to retrieve Knowledge Base Documents / Vector Database Codebase / Memory Query Return Enhanced Context Enhanced Reasoning Reasoning Combined with Knowledge Base Content On-demand Re-retrieval Execute Actions Precise Knowledge-Based Operations

Principales différences avec le RAG ordinaire

Le RAG ordinaire est "passif et à usage unique" : lorsqu'un utilisateur pose une question, il effectue une seule récupération et insère les résultats dans le Prompt.

RAG + Agent est différentL'Agent détermine de manière autonome à quelle étape du raisonnement des connaissances supplémentaires sont nécessaires et ce qu'il faut récupérer, et peut interroger la base de connaissances plusieurs fois jusqu'à obtenir suffisamment d'informations pour accomplir la tâche.

Lorsque l'on demande à l'Agent de questions-réponses sur la base de code "Pourquoi le patron singleton est-il utilisé ici ?", il récupère de manière proactive la documentation du projet, les comptes rendus de décisions de conception et les fichiers de code pertinents, plutôt que de deviner uniquement à partir de la mémoire d'entraînement du LLM.

Exemple

# Implémentation simplifiée de RAG + Agent

class RAGAgent:
    """Agent avec capacité de récupération dynamique"""

    def __init__(self, model, vector_db, max_retrievals=5):
        self.model = model
        self.vector_db = vector_db  # Base de données vectorielle
        self.max_retrievals = max_retrievals

    def should_retrieve(self, context: str, question: str) -> bool:
        """L'Agent décide s'il a besoin de récupérer plus d'informations"""
        decision = self.model.generate(f"""
Informations connues actuelles : {context}
Question actuelle : {question}
Les informations existantes suffisent-elles à répondre à la question ? Répondez YES ou NO.
        """
)
        return "NO" in decision

    def run(self, task: str) -> str:
        context = ""
        retrieval_count = 0

        while retrieval_count < self.max_retrievals:
            # L'agent détermine de manière autonome si une récupération est nécessaire
            if not self.should_retrieve(context, task):
                break

            # L'agent décide de manière autonome quoi récupérer
            search_query = self.model.generate(f"""
Tâche : {task}
Informations existantes : {context}
Pour accomplir la tâche, quelles informations doivent être récupérées ensuite ?
            """
)

            # Effectuer la récupération, ajouter les résultats au contexte
            docs = self.vector_db.search(search_query)
            context += "\n".join(docs)
            retrieval_count += 1

        # Synthétiser toutes les informations pour générer la réponse finale
        return self.model.generate(f"Tâche : {task}\nDocuments de référence : {context}")

# Exemple d'utilisation
agent = RAGAgent(model=llm, vector_db=example_docs_db)
answer = agent.run("Comment configurer un pool de connexions à une base de données dans le framework EXAMPLE ?")
# L'agent récupère d'abord « configuration du pool de connexions » et trouve des mentions de « connexions maximales »
# S'il ne comprend pas, il récupère à nouveau « bonnes pratiques pour les connexions maximales »
# Enfin, il synthétise les résultats de récupération en plusieurs tours pour fournir une réponse complète

Avantages

  • Dépasser les limitations de la fenêtre de contexte
  • La sortie est bien documentée, ce qui réduit les hallucinations
  • La base de connaissances peut être mise à jour indépendamment

Inconvénients

  • La qualité de la récupération affecte les résultats globaux
  • Coût de maintenance des bases de données vectorielles
  • La latence de récupération augmente le temps de réponse

Architecture 6 : Orchestration de workflow (Workflow / DAG)

Privilégié pour la production Fiabilité élevée

Consolider le comportement de l'Agent dans un graphe orienté acyclique (DAG), où chaque nœud est un appel LLM ou un appel d'outil, les arêtes représentent les dépendances de données, et l'exécution est pilotée par le framework.

Voici l'architecture d'Agent la plus proche de l'ingénierie logicielle traditionnelle. La plus grande différence avec les architectures précédentes est :L'espace de décision autonome de l'Agent est limité à un seul nœud, et le flux entre les nœuds est prédéfini et immuable.

Figure 6 — Architecture de workflow DAG (graphe orienté acyclique)
Workflow DAG architecture diagram Directed acyclic graph illustration: After data input, Task A and Task B execute in parallel; after both complete, the aggregation node processes; finally, output the result. Data input Task A Independent parallel execution Task B Independent parallel execution Parallelizable Triggered only after both A and B complete Aggregation node Wait for dependencies, integrate results Output

Agent pur vs Workflow DAG

FonctionnalitéAgent purWorkflow DAG
Contrôle du fluxLe modèle décide de manière autonome de l'étape suivanteDéterminé par le graphe DAG prédéfini
PrévisibilitéFaible, le chemin d'exécution peut différer à chaque foisÉlevé, le chemin d'exécution est fixe
DébogabilitéDifficile, repose sur le traçage des logsFacile, l'entrée et la sortie de chaque nœud sont claires
Tolérance aux pannesRepose sur l’auto-récupération du modèleLe framework permet de réessayer et de reprendre à partir d’un point de contrôle
FlexibilitéÉlevée, peut gérer des situations imprévuesFaible, ne peut suivre que des chemins prédéfinis

La propriété « acyclique » d’un DAG signifie que le workflow estDéterministe— pas de boucles infinies, le chemin d’exécution peut être entièrement prédit, et les nœuds en échec peuvent être réessayés individuellement.

Le DAG est l’extrême de « faible autonomie, forte prévisibilité ». Vous devez concevoir à l’avance l’ensemble du processus. Ce n’est pas un inconvénient, mais un compromis de conception délibéré — dans les environnements de production, le déterminisme est parfois plus important que la flexibilité.

Exemple

# Définition simplifiée d’un workflow DAG (style LangGraph)

from langgraph import StateGraph

# Définir l’état du workflow — objet de données transmis entre les nœuds
class PipelineState:
    raw_data: str = ""         # Données d’entrée brutes
    cleaned_data: str = ""     # Données nettoyées
    analysis_result: dict = {} # Résultat de l’analyse
    final_report: str = ""     # Rapport final

# Définir les nœuds du DAG — chaque nœud est une unité de traitement indépendante
def extract_data(state: PipelineState) -> PipelineState:
    """Nœud 1 : Extraire les données brutes depuis la base de données d’exemple"""
    state.raw_data = query_database("SELECT * FROM logs")
    return state

def clean_data(state: PipelineState) -> PipelineState:
    """Nœud 2 : Nettoyer les données (dédupliquer, normaliser le format)"""
    state.cleaned_data = preprocess(state.raw_data)
    return state

def analyze_data(state: PipelineState) -> PipelineState:
    """Nœud 3 : Analyse statistique"""
    state.analysis_result = statistical_analysis(state.cleaned_data)
    return state

def generate_report(state: PipelineState) -> PipelineState:
    """Nœud 4 : Générer un rapport à l'aide d'un LLM"""
    state.final_report = llm.generate(
        f"Générer un rapport basé sur les résultats d'analyse suivants : {state.analysis_result}"
    )
    return state

# Construire le DAG : définir les nœuds et les arêtes (flux de données)
workflow = StateGraph(PipelineState)
workflow.add_node("extract", extract_data)
workflow.add_node("clean", clean_data)
workflow.add_node("analyze", analyze_data)
workflow.add_node("report", generate_report)

# Définir les arêtes : extract → clean → analyze → report
workflow.add_edge("extract", "clean")
workflow.add_edge("clean", "analyze")
workflow.add_edge("analyze", "report")
workflow.set_entry_point("extract")
workflow.set_finish_point("report")

# Compiler et exécuter
app = workflow.compile()
result = app.invoke(PipelineState())
print(result.final_report)

Avantages

  • Prévisible, auditable, réessayable
  • Prend en charge l'accélération parallèle
  • Maturité d'ingénierie élevée, conviviale pour les ops

Inconvénients

  • Le flux nécessite une conception préalable, faible flexibilité
  • Difficile de gérer les situations imprévues
  • Nécessite d'apprendre des frameworks d'orchestration

Comparaison horizontale et comment choisir

Comparez six architectures selon plusieurs dimensions pour vous aider à identifier rapidement la bonne option.

ArchitectureAutonomiePrévisibilitéCapacité parallèleComplexité de tâche adaptéeImplémentation typique
Boucle à agent uniqueÉlevéeFaibleAucuneMoyenne-faibleMode par défaut de Claude Code
Planification + ExécutionMoyenneMoyennePartielleMoyenne-élevéeMode Plan de Claude Code
Collaboration multi-agentÉlevéeFaibleForteÉlevéeAutoGen, CrewAI
Réflexion / auto-correctionMoyenneMoyenneAucuneMoyenneReflexion, Self-Refine
RAG + AgentÉlevéeMoyenneAucuneMoyenne-élevéeLangChain RAG Agent
Orchestration de workflowFaibleÉlevéeForteÉlevée (flux fixe)LangGraph, Prefect

Modèles de combinaison courants

Les systèmes de production réels combinent souvent plusieurs architectures. Voici plusieurs modèles de combinaison matures :

Orchestration de workflow + Multi-Agent: Utiliser un DAG pour définir le flux principal, chaque nœud étant un Agent indépendant. Par exemple, dans un pipeline CI/CD, le nœud de revue de code est un Agent de revue de code, et le nœud d'analyse de sécurité est un Agent de sécurité.

Multi-Agent + RAG: Plusieurs sous-agents partagent la même base de connaissances vectorielle, chacun effectuant une récupération à la demande en fonction de sa sous-tâche. Par exemple, dans un système de service client, l'Agent de requête de commande et l'Agent de traitement des remboursements interrogent la même base de connaissances mais récupèrent un contenu différent.

Planification-exécution + Réflexion: Planifier d'abord, puis exécuter, mais ajouter une étape de réflexion après chaque étape pour garantir la qualité. Adapté aux tâches dont les exigences de qualité sont extrêmement élevées.

Si vous ne savez pas où commencer, commencez par une boucle à agent unique. C'est la plus simple à implémenter et à déboguer. Lorsque vous constatez que la fenêtre de contexte ne suffit plus, envisagez le multi-agent ; lorsque vous avez besoin d'une assurance qualité, ajoutez une couche de réflexion ; lorsque le processus se stabilise, refactorisez-le en DAG pour améliorer la fiabilité.

Idées fausses courantes

Idée fausse 1 : plus l'architecture est complexe, mieux c'est

La collaboration multi-agent semble puissante, mais si votre tâche peut être accomplie en 5 étapes avec une boucle à agent unique, l'introduction d'une surcharge d'orchestration réduit en réalité l'efficacité. Principe : utilisez l'architecture la plus simple qui répond aux exigences.

Idée fausse 2 : La réflexion améliorera forcément la qualité

L'efficacité de l'auto-réflexion dépend de la capacité du modèle à s'auto-évaluer. Si les exigences de qualité sont extrêmement strictes, envisagez d'utiliser un modèle Critic ou d'introduire une validation externe (comme des tests de code automatisés).

Idée fausse 3 : Les workflows DAG n'ont pas besoin d'Agents

Le DAG définit le squelette du processus, mais chaque nœud peut toujours être en interne un appel d'Agent. L'orchestration des workflows et les capacités des Agents ne sont pas mutuellement exclusives mais complémentaires — le DAG apporte la fiabilité, et les Agents apportent la flexibilité.

Idée fausse 4 : Une fenêtre de contexte plus grande signifie que RAG n'est pas nécessaire

Même si le modèle prend en charge une fenêtre de contexte de 1M token, y fourrer tous les documents n'est toujours pas optimal. La valeur de RAG ne réside pas seulement dans le fait de « pouvoir tout faire tenir », mais aussi dansla recherche précise— réduire le bruit, diminuer les coûts d'inférence et améliorer l'exactitude des réponses.


Résumé

Six architectures d'Agent couvrent tout le spectre, de hautement autonome à hautement contrôlable.

Lors du choix d'une architecture, il n'y a que deux considérations essentielles :Quelle flexibilité vous devez avoir pour gérer les situations imprévues, etQuel degré de certitude vous devez avoir pour garantir des résultats fiables。

Commencez simplement et n'ajoutez de la complexité que lorsqu'elle est vraiment nécessaire — c'est le premier principe du choix d'architecture d'Agent.

Autres extensions