📑 Table des matières

Multi-agents : faire collaborer plusieurs IA

Agents IA 🔴 Avancé ⏱️ 14 min de lecture 📅 2026-02-24

Multi-agents : faire collaborer plusieurs IA

Et si une seule IA ne suffisait plus ? Bienvenue dans l'ère du multi-agents — où plusieurs intelligences artificielles collaborent, se répartissent les tâches et produisent des résultats qu'un agent isolé ne pourrait jamais atteindre.

Dans ce guide avancé, on explore les architectures multi-agents, les frameworks majeurs (CrewAI, AutoGen, LangGraph) et on construit ensemble un pipeline concret avec trois agents spécialisés.


🏗️ Pourquoi le multi-agents ?

Un agent IA seul, c'est puissant. Mais dès que la tâche se complexifie — rédiger un article optimisé SEO en 3 langues, analyser un dataset puis générer un rapport, orchestrer un déploiement — les limites apparaissent :

  • Context window saturé : un seul agent qui fait tout accumule du contexte inutile
  • Spécialisation impossible : le prompt "expert SEO + rédacteur + traducteur" donne des résultats moyens partout
  • Pas de vérification croisée : personne ne relit le travail
  • Scalabilité limitée : impossible de paralléliser

Le multi-agents résout tout ça en appliquant un principe vieux comme le monde : la division du travail.

Approche Avantage Limite
Agent unique Simple, rapide à setup Limité en complexité
Multi-agents séquentiel Spécialisation, qualité Plus lent
Multi-agents parallèle Rapide + spécialisé Orchestration complexe
Multi-agents hybride Le meilleur des deux Setup avancé

🧠 Les 3 architectures fondamentales

Architecture Orchestrateur / Workers

C'est le modèle le plus courant. Un agent orchestrateur (le "chef de projet") distribue les tâches à des agents workers spécialisés.

┌─────────────────┐
│  Orchestrateur   │
│  (Chef de projet)│
└────────┬────────┘
         │
    ┌────┼────┐
    ▼    ▼    ▼
┌──────┐┌──────┐┌──────┐
│Writer ││ SEO  ││Trans.│
│Agent  ││Agent ││Agent │
└──────┘└──────┘└──────┘

Fonctionnement :
1. L'orchestrateur reçoit la tâche globale
2. Il la décompose en sous-tâches
3. Chaque worker exécute sa partie
4. L'orchestrateur agrège et valide les résultats

Avantages :
- Contrôle centralisé
- Facile à débugger (un seul point de décision)
- Les workers sont interchangeables

Inconvénients :
- Single point of failure (l'orchestrateur)
- L'orchestrateur doit être très compétent
- Latence si tout passe par lui

Architecture Peer-to-Peer

Les agents communiquent directement entre eux, sans chef centralisé. Chaque agent décide quand passer le relais.

┌──────┐    ┌──────┐
│Agent A│◄──►│Agent B│
└──┬───┘    └───┬──┘
   │            │
   └────┬───────┘
        ▼
   ┌──────┐
   │Agent C│
   └──────┘

Cas d'usage : débats IA, brainstorming, vérification croisée.

Avantages :
- Pas de bottleneck central
- Résilient (un agent tombe, les autres continuent)
- Émergence de solutions créatives

Inconvénients :
- Risque de boucles infinies (les agents se relancent sans fin)
- Difficile à contrôler et prédire
- Debug complexe

Architecture Hiérarchique

Un mix des deux : plusieurs niveaux de management. Un orchestrateur principal délègue à des sous-orchestrateurs, qui eux-mêmes gèrent des workers.

┌──────────────┐
│ Orchestrateur │
│   Principal   │
└──────┬───────┘
   ┌───┴───┐
   ▼       ▼
┌──────┐┌──────┐
│Manager││Manager│
│Contenu││Distrib│
└──┬───┘└──┬───┘
   │       │
 ┌─┼─┐  ┌─┼─┐
 ▼ ▼ ▼  ▼ ▼ ▼
 W W W  W W W

Cas d'usage : projets complexes avec de nombreux agents (10+).

Architecture Complexité Contrôle Scalabilité Cas d'usage
Orchestrateur/Workers Moyenne Fort Moyenne Pipelines linéaires
Peer-to-Peer Haute Faible Haute Débats, créativité
Hiérarchique Très haute Fort Très haute Projets complexes

🛠️ Les frameworks multi-agents

CrewAI — L'équipe IA prête à l'emploi

CrewAI est le framework le plus accessible. Il modélise une équipe (Crew) composée d'agents avec des rôles, des objectifs et des outils.

from crewai import Agent, Task, Crew

# Définir les agents
redacteur = Agent(
    role="Rédacteur web expert",
    goal="Écrire des articles engageants et informatifs",
    backstory="Tu es un rédacteur web avec 10 ans d'expérience en tech.",
    verbose=True,
    llm="gpt-4o"
)

seo_expert = Agent(
    role="Expert SEO",
    goal="Optimiser le contenu pour les moteurs de recherche",
    backstory="Tu es un consultant SEO spécialisé dans le contenu tech.",
    verbose=True,
    llm="gpt-4o"
)

traducteur = Agent(
    role="Traducteur FR→EN",
    goal="Produire des traductions naturelles et fidèles",
    backstory="Tu es traducteur professionnel bilingue français-anglais.",
    verbose=True,
    llm="claude-3-5-sonnet"
)

# Définir les tâches
tache_redaction = Task(
    description="Rédige un article de 2000 mots sur {sujet}",
    expected_output="Article en markdown, structuré avec H2/H3",
    agent=redacteur
)

tache_seo = Task(
    description="Optimise l'article : title, meta, mots-clés, structure",
    expected_output="Article optimisé + suggestions SEO",
    agent=seo_expert
)

tache_traduction = Task(
    description="Traduis l'article optimisé en anglais",
    expected_output="Article traduit en anglais naturel",
    agent=traducteur
)

# Assembler l'équipe
crew = Crew(
    agents=[redacteur, seo_expert, traducteur],
    tasks=[tache_redaction, tache_seo, tache_traduction],
    verbose=True
)

# Lancer
resultat = crew.kickoff(inputs={"sujet": "Les agents IA en 2025"})
print(resultat)

Points forts de CrewAI :
- API simple et intuitive
- Gestion automatique du passage de contexte entre agents
- Support de nombreux LLM (OpenAI, Anthropic, local)
- Outils intégrés (recherche web, lecture de fichiers)

Limites :
- Moins flexible que LangGraph pour les flows complexes
- Pas de branchement conditionnel natif

AutoGen — Le framework Microsoft

AutoGen de Microsoft Research est conçu pour les conversations multi-agents. Les agents discutent entre eux pour résoudre un problème.

from autogen import AssistantAgent, UserProxyAgent, GroupChat, GroupChatManager

# Configuration LLM
llm_config = {
    "model": "gpt-4o",
    "api_key": "sk-..."
}

# Agents
assistant = AssistantAgent(
    name="assistant",
    system_message="Tu es un assistant IA expert en programmation.",
    llm_config=llm_config
)

critic = AssistantAgent(
    name="critic",
    system_message="Tu révises le code et signales les bugs et améliorations.",
    llm_config=llm_config
)

user_proxy = UserProxyAgent(
    name="user_proxy",
    human_input_mode="NEVER",
    max_consecutive_auto_reply=5,
    code_execution_config={"work_dir": "coding"}
)

# Group chat
group_chat = GroupChat(
    agents=[user_proxy, assistant, critic],
    messages=[],
    max_round=10
)

manager = GroupChatManager(
    groupchat=group_chat,
    llm_config=llm_config
)

# Lancer la conversation
user_proxy.initiate_chat(
    manager,
    message="Écris un script Python qui scrape les prix sur Amazon"
)

Points forts d'AutoGen :
- Conversations naturelles entre agents
- Exécution de code intégrée
- GroupChat pour les discussions multi-agents
- Très bon pour le pair-programming IA

Limites :
- API plus complexe
- Moins structuré que CrewAI pour les pipelines

LangGraph — Le graphe de workflows

LangGraph (par LangChain) modélise les workflows comme des graphes orientés. Chaque nœud est un agent ou une fonction, les arêtes définissent le flux.

from langgraph.graph import StateGraph, END
from typing import TypedDict, Annotated

class ArticleState(TypedDict):
    sujet: str
    brouillon: str
    article_seo: str
    article_traduit: str
    statut: str

def agent_redacteur(state: ArticleState) -> ArticleState:
    """Agent qui rédige le brouillon"""
    # Appel LLM pour rédiger
    brouillon = call_llm(
        f"Rédige un article sur : {state['sujet']}"
    )
    return {"brouillon": brouillon, "statut": "rédigé"}

def agent_seo(state: ArticleState) -> ArticleState:
    """Agent qui optimise le SEO"""
    article_seo = call_llm(
        f"Optimise cet article pour le SEO :\n{state['brouillon']}"
    )
    return {"article_seo": article_seo, "statut": "optimisé"}

def agent_traducteur(state: ArticleState) -> ArticleState:
    """Agent qui traduit"""
    traduit = call_llm(
        f"Traduis en anglais :\n{state['article_seo']}"
    )
    return {"article_traduit": traduit, "statut": "traduit"}

def verifier_qualite(state: ArticleState) -> str:
    """Décide si on continue ou on recommence"""
    score = evaluer_qualite(state["article_seo"])
    if score > 0.8:
        return "traduire"
    return "reécrire"

# Construire le graphe
workflow = StateGraph(ArticleState)

# Ajouter les nœuds
workflow.add_node("rediger", agent_redacteur)
workflow.add_node("optimiser_seo", agent_seo)
workflow.add_node("traduire", agent_traducteur)

# Définir les transitions
workflow.set_entry_point("rediger")
workflow.add_edge("rediger", "optimiser_seo")
workflow.add_conditional_edges(
    "optimiser_seo",
    verifier_qualite,
    {
        "traduire": "traduire",
        "reécrire": "rediger"
    }
)
workflow.add_edge("traduire", END)

# Compiler et exécuter
app = workflow.compile()
result = app.invoke({"sujet": "Les agents IA en 2025"})

Points forts de LangGraph :
- Branchements conditionnels (si qualité insuffisante → recommencer)
- Visualisation du workflow en graphe
- État partagé typé
- Persistence et reprise après erreur

Limites :
- Courbe d'apprentissage plus raide
- Verbeux pour les cas simples

Comparatif des frameworks

Critère CrewAI AutoGen LangGraph
Facilité ⭐⭐⭐⭐⭐ ⭐⭐⭐ ⭐⭐⭐
Flexibilité ⭐⭐⭐ ⭐⭐⭐⭐ ⭐⭐⭐⭐⭐
Conversations ⭐⭐⭐ ⭐⭐⭐⭐⭐ ⭐⭐⭐
Workflows ⭐⭐⭐⭐ ⭐⭐⭐ ⭐⭐⭐⭐⭐
Debug ⭐⭐⭐⭐ ⭐⭐⭐ ⭐⭐⭐⭐
Communauté Grande Grande Très grande
Idéal pour Pipelines simples Pair-programming Workflows complexes

Pour aller plus loin sur ce sujet, consultez notre guide Créer son premier agent IA autonome.


Pour aller plus loin sur ce sujet, consultez notre guide MCP, Function Calling, Tool Use : le guide complet.

🔧 Cas concret : pipeline rédacteur + SEO + traducteur

Mettons tout ça en pratique. On va construire un pipeline complet avec CrewAI qui :

  1. Agent Rédacteur → écrit un article de blog
  2. Agent SEO → optimise le titre, les H2, les mots-clés
  3. Agent Traducteur → traduit en anglais

Setup

# Installation
pip install crewai crewai-tools langchain-openai

# Variables d'environnement
export OPENAI_API_KEY="sk-..."
export ANTHROPIC_API_KEY="sk-ant-..."

Le code complet

"""
Pipeline multi-agents : Rédacteur → SEO → Traducteur
Utilise CrewAI avec différents LLM par agent
"""

from crewai import Agent, Task, Crew, Process
from crewai_tools import SerperDevTool

# Outil de recherche web pour le rédacteur
search_tool = SerperDevTool()

# ═══════════════════════════════════════
# AGENTS
# ═══════════════════════════════════════

redacteur = Agent(
    role="Rédacteur Web Senior",
    goal=(
        "Écrire des articles de blog captivants, bien structurés, "
        "avec des exemples concrets et un ton accessible."
    ),
    backstory=(
        "Tu es rédacteur web depuis 10 ans, spécialisé dans la tech "
        "et l'IA. Tu écris en français avec un style engageant. "
        "Tu utilises des analogies pour expliquer les concepts complexes."
    ),
    tools=[search_tool],
    verbose=True,
    llm="gpt-4o",
    max_iter=3
)

seo_expert = Agent(
    role="Consultant SEO Tech",
    goal=(
        "Optimiser chaque article pour qu'il se positionne en "
        "première page Google sur les mots-clés ciblés."
    ),
    backstory=(
        "Tu es consultant SEO avec une expertise en contenu tech. "
        "Tu connais les dernières guidelines Google (E-E-A-T, "
        "helpful content). Tu optimises sans sur-optimiser."
    ),
    verbose=True,
    llm="gpt-4o",
    max_iter=3
)

traducteur = Agent(
    role="Traducteur Professionnel FR→EN",
    goal=(
        "Produire des traductions anglaises naturelles qui "
        "sonnent comme si elles avaient été écrites par un natif."
    ),
    backstory=(
        "Tu es traducteur professionnel bilingue. Tu ne traduis "
        "pas mot à mot : tu adaptes les expressions, le ton, et "
        "les références culturelles pour le public anglophone."
    ),
    verbose=True,
    llm="claude-3-5-sonnet-20241022",
    max_iter=2
)

# ═══════════════════════════════════════
# TÂCHES
# ═══════════════════════════════════════

tache_recherche_redaction = Task(
    description="""
    Sujet : {sujet}
    Public cible : {audience}

    1. Recherche les informations récentes sur le sujet
    2. Rédige un article de 2000-2500 mots en français
    3. Structure : intro accrocheuse, 4-5 sections H2, conclusion
    4. Inclus des exemples concrets, du code si pertinent
    5. Ton : professionnel mais accessible, pas de jargon inutile
    """,
    expected_output=(
        "Article complet en markdown avec titre H1, sections H2/H3, "
        "exemples, et conclusion avec appel à l'action."
    ),
    agent=redacteur
)

tache_optimisation_seo = Task(
    description="""
    Prends l'article rédigé et optimise-le pour le SEO :

    1. Optimise le titre (H1) : inclure le mot-clé principal, < 60 chars
    2. Écris une meta description (150-160 chars)
    3. Vérifie la densité des mots-clés (1-2%)
    4. Ajoute des liens internes suggérés
    5. Optimise les H2 avec des mots-clés secondaires
    6. Vérifie la lisibilité (phrases courtes, paragraphes aérés)
    7. Ajoute un schema markup suggestion (FAQ ou HowTo)

    NE CHANGE PAS le fond de l'article, juste la forme SEO.
    """,
    expected_output=(
        "Article optimisé en markdown + bloc YAML avec : "
        "seo_title, meta_description, keywords[], suggestions[]"
    ),
    agent=seo_expert
)

tache_traduction = Task(
    description="""
    Traduis l'article optimisé du français vers l'anglais :

    1. Traduis le contenu complet
    2. Adapte les expressions idiomatiques
    3. Garde le markdown intact
    4. Traduis aussi les meta SEO
    5. Si du code est présent, traduis les commentaires uniquement
    """,
    expected_output=(
        "Article traduit en anglais + meta SEO traduites. "
        "Format markdown identique à l'original."
    ),
    agent=traducteur
)

# ═══════════════════════════════════════
# CREW (ÉQUIPE)
# ═══════════════════════════════════════

crew = Crew(
    agents=[redacteur, seo_expert, traducteur],
    tasks=[
        tache_recherche_redaction,
        tache_optimisation_seo,
        tache_traduction
    ],
    process=Process.sequential,  # Séquentiel : un après l'autre
    verbose=True,
    memory=True,  # Les agents se souviennent du contexte
    max_rpm=10    # Rate limiting
)

# ═══════════════════════════════════════
# EXÉCUTION
# ═══════════════════════════════════════

if __name__ == "__main__":
    result = crew.kickoff(inputs={
        "sujet": "Comment les agents IA transforment le développement logiciel",
        "audience": "Développeurs et tech leads francophones"
    })

    print("=" * 60)
    print("RÉSULTAT FINAL")
    print("=" * 60)
    print(result)

    # Sauvegarder les résultats
    with open("article_fr.md", "w") as f:
        f.write(str(result))

Exécution et résultat

$ python pipeline.py

[Rédacteur Web Senior] Recherche en cours sur le sujet...
[Rédacteur Web Senior] Rédaction de l'article...
✅ Article rédigé (2340 mots)

[Consultant SEO Tech] Analyse SEO en cours...
[Consultant SEO Tech] Optimisation des titres et meta...
✅ Article optimisé (score SEO: 87/100)

[Traducteur FR→EN] Traduction en cours...
✅ Article traduit (2280 mots EN)

============================
RÉSULTAT FINAL
============================
[Article FR optimisé + Article EN + Meta SEO]

⚡ Patterns avancés

Pattern 1 : Vérification croisée

Deux agents rédigent indépendamment, un troisième compare et fusionne :

# Deux rédacteurs en parallèle
crew = Crew(
    agents=[redacteur_1, redacteur_2, editeur],
    tasks=[tache_redaction_1, tache_redaction_2, tache_fusion],
    process=Process.sequential
)

Pattern 2 : Boucle de feedback

L'agent critique renvoie le travail au rédacteur jusqu'à satisfaction :

# Avec LangGraph - boucle conditionnelle
def evaluer(state):
    if state["score_qualite"] >= 8:
        return "publier"
    if state["iterations"] >= 3:
        return "publier"  # Max 3 tentatives
    return "reécrire"

workflow.add_conditional_edges("critique", evaluer, {
    "publier": "publication",
    "reécrire": "redaction"
})

Pattern 3 : Agents avec mémoire partagée

Utiliser une base vectorielle comme mémoire commune :

from crewai import Crew
from crewai.memory import LongTermMemory

crew = Crew(
    agents=[...],
    tasks=[...],
    memory=True,
    long_term_memory=LongTermMemory(
        storage=ChromaStorage(collection_name="articles")
    )
)

Pattern 4 : Multi-modèles

Chaque agent utilise le LLM le plus adapté à sa tâche :

Agent LLM recommandé Raison
Rédacteur GPT-4o Créatif, bon en français
SEO GPT-4o-mini Tâche structurée, moins cher
Traducteur Claude 3.5 Sonnet Excellent en traduction
Codeur Claude 3.5 Sonnet Top en code
Analyste Gemini Pro Bon sur les gros contextes

🚀 Multi-agents avec OpenClaw

OpenClaw utilise nativement le multi-agents avec son système de sessions et subagents :

Main Agent (orchestrateur)
├── Subagent 1 : Rédaction article
├── Subagent 2 : Analyse SEO
└── Subagent 3 : Traduction

Le main agent spawne des subagents pour les tâches longues, chacun avec son propre contexte et ses instructions. C'est exactement l'architecture orchestrateur/workers.

Les avantages dans OpenClaw :
- Contexte isolé : chaque subagent a son propre contexte, pas de pollution
- Parallélisme : plusieurs subagents travaillent en même temps
- Spécialisation : chaque subagent peut avoir un modèle différent
- Rapport automatique : le résultat remonte au main agent


⚠️ Les pièges du multi-agents

1. La boucle infinie

Deux agents se corrigent mutuellement sans fin. Solution : toujours mettre un max_iter ou max_round.

# TOUJOURS limiter les itérations
agent = Agent(max_iter=3)  # CrewAI
group_chat = GroupChat(max_round=10)  # AutoGen

2. La dilution de responsabilité

Si personne n'est "responsable" du résultat final, la qualité baisse. Solution : un agent final qui valide.

3. Le coût qui explose

3 agents × 3 itérations × GPT-4o = facture salée. Solution : utiliser des modèles moins chers pour les tâches simples.

# Budget-friendly
redacteur = Agent(llm="gpt-4o")          # ~$10/M tokens
seo = Agent(llm="gpt-4o-mini")           # ~$0.30/M tokens  
traducteur = Agent(llm="claude-3-haiku")  # ~$0.25/M tokens

4. Le contexte perdu

Les agents ne se transmettent pas assez d'info. Solution : des expected_output très précis dans les tâches.


📊 Quand utiliser le multi-agents ?

Situation Agent unique Multi-agents
Question simple ❌ Overkill
Article de blog ⚡ Mieux avec SEO
Pipeline contenu multilingue
Analyse + rapport + actions
Chatbot conversationnel
Revue de code collaborative
Recherche + synthèse + rédaction

Règle simple : si la tâche nécessite plus de 2 expertises différentes ou des vérifications croisées, le multi-agents vaut le coup.


📚 Articles liés