Section 11.4.13 : Agents IA — Concepts et architecture
🎯 Objectif pédagogique
Comprendre ce qu'est un agent IA, en quoi il diffère d'un chatbot, et les patterns d'architecture fondamentaux. Vous serez capable de concevoir un agent IA avec boucle de raisonnement et capacité d'action.
Du chatbot à l'agent — Le saut quantique
Le chatbot de Marc répond aux questions. Un agent IA agit : il raisonne, planifie, utilise des outils (APIs, bases de données, code), et itère jusqu'à atteindre son objectif. C'est la différence entre un interlocuteur et un collaborateur.
Chatbot vs Agent — Comparaison
| Aspect | Chatbot | Agent IA |
|---|---|---|
| Interaction | Réponse à une question | Exécution d'une tâche |
| Autonomie | Aucune — suit le flux | Planifie et décide |
| Outils | Aucun (texte seulement) | APIs, BDD, fichiers, code |
| Itérations | 1 appel LLM | N appels (boucle) |
| Exemple | "Qu'est-ce que Python ?" | "Analyse 50 offres et classe-les par pertinence" |
Le pattern ReAct : Reason + Act
Pattern ReAct (Reason and Act) :
1. THOUGHT (réflexion) : "Je dois trouver les offres Data Analyst à Paris"
2. ACTION : search_jobs(query="Data Analyst", location="Paris")
3. OBSERVATION : [liste de 23 offres]
4. THOUGHT : "J'ai 23 offres, je dois les analyser par rapport au profil de Marc"
5. ACTION : analyze_offer(offer=offres[0], profile=marc)
6. OBSERVATION : \{match_score: 4, skills_gap: ["Tableau"]\}
7. THOUGHT : "Bonne offre mais il manque Tableau. Je continue avec les autres."
8. ACTION : analyze_offer(offer=offres[1], profile=marc)
...
N. THOUGHT : "J'ai analysé les 23 offres. Les 5 meilleures sont..."
N+1. FINAL ANSWER : [top 5 offres avec analyses]
Implémentation basique d'un agent
import json
from openai import OpenAI
client = OpenAI()
# Définir les outils disponibles
TOOLS = \{
"search_jobs": \{
"description": "Recherche des offres d'emploi",
"params": ["query", "location", "max_results"]
\},
"analyze_offer": \{
"description": "Analyse une offre par rapport à un profil",
"params": ["offer_text", "profile"]
\},
"get_market_data": \{
"description": "Obtient des données sur le marché de l'emploi",
"params": ["role", "location"]
\}
\}
def run_agent(objective, max_iterations=5):
"""Agent simple avec boucle ReAct."""
tools_desc = "\n".join([f"- \{name\}: \{info['description']\} (params: \{info['params']\})"
for name, info in TOOLS.items()])
system = f"""Tu es un agent de recherche d'emploi.
## Outils disponibles :
\{tools_desc\}
## Format de réponse :
À chaque étape, réponds en JSON :
\{\{
"thought": "ta réflexion",
"action": "nom_de_loutil" ou "FINAL_ANSWER",
"action_input": \{\{...params...\}\} ou "réponse finale"
\}\}
## Règles :
- Réfléchis AVANT d'agir
- Utilise un outil par étape
- Quand tu as assez d'infos, utilise FINAL_ANSWER"""
messages = [
\{"role": "system", "content": system\},
\{"role": "user", "content": f"Objectif : \{objective\}"\}
]
for i in range(max_iterations):
response = client.chat.completions.create(
model="gpt-4o",
messages=messages,
response_format=\{"type": "json_object"\},
temperature=0.2
)
result = json.loads(response.choices[0].message.content)
print(f"\n--- Étape \{i+1\} ---")
print(f"Thought: \{result['thought']\}")
if result["action"] == "FINAL_ANSWER":
print(f"\n🎯 Résultat final : \{result['action_input']\}")
return result["action_input"]
print(f"Action: \{result['action']\}(\{result['action_input']\})")
# Exécuter l'outil (mock pour l'exemple)
observation = execute_tool(result["action"], result["action_input"])
print(f"Observation: \{observation[:200]\}...")
# Ajouter au contexte
messages.append(\{"role": "assistant", "content": json.dumps(result)\})
messages.append(\{"role": "user", "content": f"Observation: \{observation\}"\})
return "Limite d'itérations atteinte."
def execute_tool(tool_name, params):
"""Exécuter un outil (mock)."""
if tool_name == "search_jobs":
return json.dumps([
\{"title": "Data Analyst", "company": "TechCorp", "salary": "45-55k€"\},
\{"title": "Junior Data Analyst", "company": "FinStart", "salary": "40-48k€"\}
])
elif tool_name == "analyze_offer":
return json.dumps(\{"match_score": 4, "skills_match": ["Python", "SQL"], "gaps": ["Tableau"]\})
elif tool_name == "get_market_data":
return json.dumps(\{"avg_salary": "48k€", "demand": "forte", "growth": "+15%/an"\})
return "Outil non trouvé"
# Utilisation
run_agent("Trouve les 3 meilleures offres Data Analyst à Paris pour un profil finance + Python")
Frameworks d'agents populaires
Frameworks à connaître :
1. LangChain — Le plus populaire, très complet
+ Écosystème riche, many integrations
- Lourd, abstraction complexe
2. LlamaIndex — Spécialisé RAG et data agents
+ Excellent pour les documents
- Moins générique que LangChain
3. CrewAI — Multi-agents collaboratifs
+ Simple, agents spécialisés travaillent ensemble
- Nouveau, moins mature
4. AutoGen (Microsoft) — Agents conversationnels
+ Agents qui discutent entre eux
- Complexe à configurer
5. Custom (ce qu'on fait ici) — Code from scratch
+ Contrôle total, pas de dépendance
- Plus de code à écrire
→ Recommandation débutant : commencez custom pour comprendre,
puis migrez vers LangChain/CrewAI pour la production.
Agent ≠ AGI
Un agent IA n'est pas une intelligence artificielle autonome. C'est un programme qui utilise un LLM pour décider quels outils appeler et dans quel ordre. Il est aussi limité que les outils qu'on lui donne et les instructions qu'on lui écrit. Pas de science-fiction — juste de l'ingénierie logicielle.
🏋️ Exercice pratique (25 minutes)
- →Implémentez l'agent ReAct simplifié ci-dessus
- →Testez avec l'objectif : "Trouve les meilleures offres Data Analyst à Paris"
- →Observez la trace (thought → action → observation)
- →Modifiez le nombre max d'itérations et observez l'effet
Quelle est la différence fondamentale entre un chatbot et un agent IA ?
Pourquoi le pattern ReAct (Reason + Act) est-il efficace pour les agents ?
Apprendre l’IA, du premier prompt aux agents