AvancéAgents IA
18 min de lecture12 vues

Architectures Multi-Agents et Orchestration avec Agno

Maîtrisez les systèmes multi-agents : patterns de collaboration, orchestration avec Agno Team (coordinate, route, broadcast, tasks), mémoire persistante et déploiement avec AgentOS.

Pourquoi des Multi-Agents ?

Un seul agent atteint vite ses limites face à des tâches complexes :

  • Trop d''outils : un agent avec 50 outils fait des mauvais choix
  • Trop de contexte : le prompt devient énorme et le LLM perd en précision
  • Pas de spécialisation : un généraliste est moyen partout

La solution : plusieurs agents spécialisés qui collaborent.

Analogie : Une entreprise ne confie pas tout à une seule personne. Elle a un comptable, un développeur, un commercial, un manager. Chacun est expert dans son domaine. Les multi-agents fonctionnent pareil.


Patterns de Collaboration

Pattern 1 : Superviseur (Manager → Workers)

Un agent superviseur distribue les tâches à des agents spécialisés :

# Le superviseur décide quel agent appeler
SUPERVISOR_PROMPT = """Tu es un manager d''équipe IA.
Tu as 3 agents spécialisés :
- "researcher" : cherche des informations sur le web
- "analyst" : analyse des données et produit des statistiques
- "writer" : rédige des textes et rapports

Pour chaque demande, décide quel agent appeler et dans quel ordre.
Retourne le plan sous forme JSON."""

Avantages : Contrôle centralisé, facile à débugger Inconvénients : Le superviseur est un point unique de défaillance

Pattern 2 : Pipeline Séquentiel

Les agents s''enchaînent comme une chaîne de montage :

Chaque agent reçoit la sortie du précédent et la transforme.

# Pipeline séquentiel simple
def run_pipeline(query: str) -> str:
    # Étape 1 : Recherche
    raw_data = research_agent.invoke(query)

    # Étape 2 : Extraction des faits clés
    facts = extraction_agent.invoke(raw_data)

    # Étape 3 : Analyse
    analysis = analysis_agent.invoke(facts)

    # Étape 4 : Rédaction du rapport
    report = writing_agent.invoke(analysis)

    return report

Avantages : Simple, prévisible, facile à tester Inconvénients : Rigide, pas de retour en arrière possible

Pattern 3 : Débat / Critique

Deux agents confrontent leurs points de vue :

def debate(question: str, max_rounds: int = 3) -> str:
    proposal = proposer_agent.invoke(question)

    for round in range(max_rounds):
        critique = critic_agent.invoke(
            f"Analyse cette proposition et identifie les faiblesses :\n{proposal}"
        )

        if "APPROUVÉ" in critique:
            return proposal

        proposal = proposer_agent.invoke(
            f"Question : {question}\n"
            f"Ta proposition précédente : {proposal}\n"
            f"Critique reçue : {critique}\n"
            f"Améliore ta proposition."
        )

    return proposal  # Retourner la dernière version

Avantages : Améliore la qualité des réponses, réduit les hallucinations Inconvénients : Coûteux (2x les appels API), plus lent


Agno Team : Orchestration Multi-Agents

Agno Team implémente tous ces patterns en quelques lignes de code. Au lieu de coder manuellement la logique de coordination, vous choisissez un mode de collaboration et Agno gère le reste.

Les 4 Modes de Team

ModeFonctionnementPattern équivalent
TeamMode.coordinateUn leader délègue aux membres puis synthétiseSuperviseur
TeamMode.routeRedirige la requête vers le bon spécialisteRouteur / Classification
TeamMode.broadcastEnvoie la même tâche à tous les agentsDébat / Multi-perspectives
TeamMode.tasksDécompose en liste de tâches, itèrePipeline séquentiel

Exemple : Équipe de Recherche (mode coordinate)

from agno.agent import Agent
from agno.models.anthropic import Claude
from agno.team.team import Team
from agno.team.mode import TeamMode

# 1. Créer les agents spécialisés
researcher = Agent(
    name="Chercheur",
    role="Spécialiste en recherche d''informations",
    model=Claude(id="claude-sonnet-4-5"),
    instructions=[
        "Tu recherches des informations fiables et récentes.",
        "Cite toujours tes sources.",
    ],
)

analyst = Agent(
    name="Analyste",
    role="Expert en analyse de données",
    model=Claude(id="claude-sonnet-4-5"),
    instructions=[
        "Tu analyses les données et identifies les tendances.",
        "Présente tes résultats avec des chiffres précis.",
    ],
)

writer = Agent(
    name="Rédacteur",
    role="Rédacteur de contenu",
    model=Claude(id="claude-sonnet-4-5"),
    instructions=[
        "Tu rédiges des textes clairs et bien structurés.",
        "Utilise un ton professionnel mais accessible.",
    ],
)

# 2. Créer l''équipe
team = Team(
    name="Équipe Recherche & Analyse",
    mode=TeamMode.coordinate,  # Le leader délègue et synthétise
    model=Claude(id="claude-sonnet-4-5"),
    members=[researcher, analyst, writer],
    instructions=[
        "Coordonne les membres pour produire un rapport complet.",
        "Le chercheur trouve les infos, l''analyste les analyse,",
        "et le rédacteur produit le rapport final.",
    ],
    show_members_responses=True,
    markdown=True,
)

# 3. Lancer l''équipe
team.print_response(
    "Analyse les tendances de l''IA en 2025 et rédige un rapport",
    stream=True,
)

En mode coordinate, le leader de l''équipe analyse la demande, délègue les sous-tâches aux bons membres, attend leurs réponses, puis synthétise le résultat final. C''est le pattern Superviseur automatisé.

Exemple : Support Client (mode route)

# Agents spécialisés par domaine
technical_agent = Agent(
    name="Support Technique",
    role="Expert technique",
    model=Claude(id="claude-sonnet-4-5"),
    instructions=["Tu résous les problèmes techniques et bugs."],
)

billing_agent = Agent(
    name="Support Facturation",
    role="Expert facturation",
    model=Claude(id="claude-sonnet-4-5"),
    instructions=["Tu gères les questions de paiement et facturation."],
)

general_agent = Agent(
    name="Support Général",
    role="Agent généraliste",
    model=Claude(id="claude-sonnet-4-5"),
    instructions=["Tu réponds aux questions générales."],
)

# Mode route : redirige vers le bon spécialiste
support_team = Team(
    name="Support Client",
    mode=TeamMode.route,
    model=Claude(id="claude-sonnet-4-5"),
    members=[technical_agent, billing_agent, general_agent],
    instructions=[
        "Analyse la requête du client.",
        "Redirige vers le support technique pour les bugs,",
        "vers la facturation pour les paiements,",
        "vers le support général pour le reste.",
    ],
)

support_team.print_response(
    "Mon paiement a été débité deux fois",
    stream=True,
)
# → Automatiquement redirigé vers billing_agent

Le mode route est idéal pour le support client, les chatbots multi-domaines, et tout scénario où une requête doit être dirigée vers LE bon spécialiste.

Exemple : Multi-Perspectives (mode broadcast)

# Mode broadcast : tous les agents reçoivent la même question
debate_team = Team(
    name="Panel d''Experts",
    mode=TeamMode.broadcast,
    model=Claude(id="claude-sonnet-4-5"),
    members=[optimist_agent, pessimist_agent, pragmatist_agent],
    instructions=["Synthétise les différentes perspectives des membres."],
    markdown=True,
)

debate_team.print_response(
    "L''IA va-t-elle remplacer les développeurs ?",
    stream=True,
)
# → Chaque agent donne sa perspective, le leader synthétise

Exemple : Projet Séquentiel (mode tasks)

# Mode tasks : décompose en étapes séquentielles
project_team = Team(
    name="Pipeline de Contenu",
    mode=TeamMode.tasks,
    model=Claude(id="claude-sonnet-4-5"),
    members=[researcher, analyst, writer],
    instructions=[
        "Décompose le projet en tâches séquentielles.",
        "Assigne chaque tâche au membre le plus qualifié.",
    ],
    max_iterations=10,  # Limite le nombre d''itérations
    markdown=True,
)

project_team.print_response(
    "Crée un guide complet sur le fine-tuning de LLMs",
    stream=True,
)

Le mode tasks est idéal pour les workflows séquentiels. L''équipe décompose automatiquement l''objectif en sous-tâches, les assigne aux membres, et itère jusqu''à complétion (ou max_iterations).


Patterns Avancés

Agents avec Mémoire Partagée (Blackboard)

Chaque agent lit et écrit dans une mémoire partagée (vector store, base de données, ou simple dictionnaire).

Mémoire Persistante avec Agno

Agno intègre nativement la gestion de mémoire pour les agents et les équipes :

from agno.agent import Agent
from agno.db.sqlite import SqliteDb
from agno.memory import MemoryManager
from agno.models.anthropic import Claude

# Base de données pour la persistance
db = SqliteDb(db_file="tmp/agents.db")

# Le MemoryManager extrait automatiquement les faits importants
memory_manager = MemoryManager(
    model=Claude(id="claude-sonnet-4-5"),
    db=db,
)

agent = Agent(
    model=Claude(id="claude-sonnet-4-5"),
    db=db,
    memory_manager=memory_manager,
    enable_agentic_memory=True,       # L''agent gère sa mémoire
    add_history_to_context=True,      # Historique dans le contexte
    num_history_runs=5,               # 5 dernières conversations
    markdown=True,
)

# L''agent se souvient entre les sessions
agent.print_response("Je préfère les réponses courtes et en français", stream=True)
# → Le MemoryManager stocke cette préférence

# Session suivante...
agent.print_response("Explique le RAG", stream=True)
# → Réponse courte, en français (il a retenu la préférence !)

Avec enable_agentic_memory, l''agent extrait automatiquement les informations importantes de chaque conversation (noms, préférences, faits clés) et les stocke. Pas besoin de gérer la mémoire manuellement — c''est la mémoire "magique" que les utilisateurs attendent.

Agent avec Auto-Réflexion

def reflexion_node(state: dict) -> dict:
    """L''agent évalue sa propre réponse."""
    score_response = llm.invoke(
        f"Évalue cette réponse (qualité 1-10, points à améliorer) :\n"
        f"Question : {state[''query'']}\n"
        f"Réponse : {state[''response'']}"
    )

    if "score: " in score_response.content:
        score = int(score_response.content.split("score: ")[1][0])
        if score < 7:
            state["needs_improvement"] = True
        else:
            state["needs_improvement"] = False

    return state

Déploiement avec AgentOS

AgentOS est le runtime de production d''Agno. Il transforme vos agents en API REST complète en une seule commande.

De l''Agent au Service

from agno.agent import Agent
from agno.models.anthropic import Claude
from agno.os import AgentOS

# Vos agents existants
research_agent = Agent(
    name="Research",
    model=Claude(id="claude-sonnet-4-5"),
    tools=[search_web, get_weather],
    markdown=True,
)

analysis_agent = Agent(
    name="Analysis",
    model=Claude(id="claude-sonnet-4-5"),
    tools=[analyze_data],
    markdown=True,
)

# Déployer en une ligne
agent_os = AgentOS(
    agents=[research_agent, analysis_agent],
    authorization=True,  # Authentification activée
)

# Servir sur le port 7777
agent_os.serve(port=7777)

Ce que fournit AgentOS

FonctionnalitéDescription
50+ endpointsAPI REST complète pour chaque agent
AuthentificationRBAC, tokens, contrôle d''accès
SessionsSuivi des conversations par utilisateur
TracingTrace chaque étape de raisonnement
MétriquesLatence, tokens consommés, coûts par requête

Architecture de Production

Bonnes Pratiques de Production

PratiquePourquoi
Activer authorization=TrueContrôler qui peut utiliser vos agents
Monitorer les métriquesSuivre coûts, latence et erreurs
Limiter les outils sensiblesUn agent ne doit pas avoir accès à tout
Tester chaque agentTests unitaires + tests d''intégration
Utiliser des sessionsTraçabilité des conversations

Le coût des multi-agents peut exploser rapidement. Un workflow de 4 agents qui font chacun 3 appels LLM = 12 appels API par requête utilisateur. Avec Claude Sonnet à $3/M tokens en entrée, surveillez vos métriques dans AgentOS.


Résumé des Patterns

PatternAgno Team ModeQuand l''utiliser
SuperviseurTeamMode.coordinateTâches variées, besoin de synthèse
RoutageTeamMode.routeClassification, support client
Multi-perspectivesTeamMode.broadcastQualité maximale, perspectives multiples
PipelineTeamMode.tasksProcessus séquentiel bien défini
Mémoireenable_agentic_memoryConversations persistantes

Points clés à retenir :

  • Les multi-agents résolvent les limites d''un agent unique (trop d''outils, pas de spécialisation)
  • Agno Team fournit 4 modes de collaboration prêts à l''emploi (coordinate, route, broadcast, tasks)
  • La mémoire persistante avec MemoryManager enrichit les agents de contexte entre les sessions
  • AgentOS transforme vos agents en API de production avec authentification, tracing et métriques
  • Surveillez toujours les coûts — les multi-agents multiplient les appels API

Specialiste IA — Master Intelligence Artificielle

Diplome d'un Master en Intelligence Artificielle, je travaille au quotidien sur des projets IA en entreprise. J'ai cree IwanttolearnAI pour rendre l'apprentissage de l'IA accessible a tous, gratuitement.