0Pricing
AI Agents · Leçon

Implémenter ReAct à partir de zéro

Écrivez une implémentation Python de 100 lignes sans LangChain : analysez les lignes Action, exécutez les outils et bouclez jusqu’à Final Answer.

Implémenter ReAct à partir de zéro est une leçon AI Agents gratuite sur CoddyKit. Ceci est la leçon 2 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage AI Agents, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours AI Agents comprend 4 leçons au total.

Certaines parties de cette leçon n'ont pas encore été traduites et s'affichent en anglais.

Créer vous-même la boucle

Vous pouvez écrire ReAct en environ 100 lignes de Python, sans aucun cadre. Le faire une fois vous donnera une intuition de ce que les cadres prennent en charge à votre place.

Step 1: Define Tools

import json, math

def calculator(expression: str) -> str:
    try:
        return str(eval(expression, {'__builtins__': {}}, vars(math)))
    except Exception as e:
        return f'Error: {e}'

def search_wikipedia(query: str) -> str:
    # placeholder — call a real search API
    return f'Wikipedia summary for: {query}'

TOOLS = {
    'calculator': calculator,
    'search_wikipedia': search_wikipedia,
}

print(calculator('2 + 2 * sqrt(16)'))
print(search_wikipedia('agents'))

Step 2: Tool Schemas

schemas = [
    {'type': 'function', 'function': {
        'name': 'calculator',
        'description': 'Evaluate a math expression like 2 + 2 * sqrt(16)',
        'parameters': {'type': 'object', 'properties': {'expression': {'type': 'string'}}, 'required': ['expression']}
    }},
    {'type': 'function', 'function': {
        'name': 'search_wikipedia',
        'description': 'Search Wikipedia and return a summary',
        'parameters': {'type': 'object', 'properties': {'query': {'type': 'string'}}, 'required': ['query']}
    }}
]
import json
print(json.dumps(schemas, indent=2))

Step 3: System Prompt

system = '''
You are a research assistant. Use the available tools when needed.
Think step by step. If you have enough information, give a final answer.
'''
print(system.strip())

Step 4: The Loop

from openai import OpenAI
client = OpenAI()

def react(question, max_steps=10):
    messages = [
        {'role': 'system', 'content': system},
        {'role': 'user', 'content': question}
    ]
    for step in range(max_steps):
        r = client.chat.completions.create(
            model='gpt-4o-mini',
            messages=messages,
            tools=schemas,
        )
        msg = r.choices[0].message
        messages.append(msg)
        if not msg.tool_calls:
            return msg.content
        for tc in msg.tool_calls:
            args = json.loads(tc.function.arguments)
            try:
                result = TOOLS[tc.function.name](**args)
            except Exception as e:
                result = f'Tool error: {e}'
            messages.append({'role': 'tool', 'tool_call_id': tc.id, 'content': str(result)})
    return 'Step limit reached.'

Step 5: Run It

answer = react('What is the population of Tokyo times the square root of pi?')
print(answer)

Étape 6 : ajouter la journalisation

Enregistrez chaque étape pour faciliter le débogage :

def react_verbose(question, max_steps=10):
    messages = [...]
    for step in range(max_steps):
        r = client.chat.completions.create(model='gpt-4o-mini', messages=messages, tools=schemas)
        msg = r.choices[0].message
        print(f'[step {step}] thought: {msg.content}')
        if msg.tool_calls:
            for tc in msg.tool_calls:
                print(f'[step {step}] action: {tc.function.name}({tc.function.arguments})')
        ...

Étape 7 : utiliser un compteur d’étapes comme outil

Certains agents incluent le nombre d’étapes dans l’invite système afin que le modèle sache quand converger :

system = f'You have at most {MAX_STEPS} steps. Step {current_step}/{MAX_STEPS}. ...'

Étape 8 : format de la réponse finale

Si vous voulez une sortie structurée, forcez un appel d’outil final :

tools.append({'type': 'function', 'function': {
    'name': 'final_answer',
    'description': 'Submit the final answer to the user.',
    'parameters': {'type': 'object', 'properties': {'answer': {'type': 'string'}}, 'required': ['answer']}
}})
# Loop terminates when final_answer is called.

Étape 9 : erreurs des outils

Retournez toujours les erreurs comme résultats d’outils afin que l’agent puisse se rétablir :

try:
    result = TOOLS[name](**args)
except Exception as e:
    result = f'TOOL ERROR: {type(e).__name__}: {e}'
# Model sees the error and can try a different approach.

Étape 10 : appels d’outils en parallèle

Si msg.tool_calls contient plusieurs entrées, exécutez-les en parallèle :

import asyncio

async def run_tools(tool_calls):
    async def run_one(tc):
        args = json.loads(tc.function.arguments)
        return tc.id, TOOLS[tc.function.name](**args)
    return await asyncio.gather(*[run_one(tc) for tc in tool_calls])

Étape 11 : limiter la conversation

Même avec MAX_STEPS, les listes de messages peuvent devenir très volumineuses. Réduisez-les selon le nombre de jetons entre les tours :

if total_tokens(messages) > 6000:
    messages = trim_messages(messages)

Étape 12 : renforcer la solution pour la production

Pour la production, ajoutez des délais d’expiration aux appels d’outils, des quotas par outil, des nouvelles tentatives avec temporisation progressive en cas d’échec d’API et une journalisation complète des traces. Mais la boucle ci-dessus constitue votre squelette.

Gestion des erreurs des outils

Que devez-vous faire lorsqu’un outil lève une exception ?

Récapitulatif

ReAct en environ 80 lignes : une liste de messages, une boucle while et une table de répartition. Les cadres ajoutent des fonctionnalités, mais le cœur est là.

Questions Fréquemment Posées

La leçon « Implémenter ReAct à partir de zéro » est-elle gratuite ?

Oui — le texte complet de « Implémenter ReAct à partir de zéro » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours AI Agents, passe à CoddyKit PRO. Le cours AI Agents comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Implémenter ReAct à partir de zéro » ?

Écrivez une implémentation Python de 100 lignes sans LangChain : analysez les lignes Action, exécutez les outils et bouclez jusqu’à Final Answer. Tu pratiques AI Agents avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer AI Agents ?

Aucune expérience préalable n'est requise. AI Agents sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 2 sur 4.

Combien de temps prend la leçon « Implémenter ReAct à partir de zéro » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon AI Agents ?

Oui. Chaque leçon AI Agents inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. ReAct : schéma raisonner puis agir
  2. Implémenter ReAct à partir de zéro
  3. Ensembles d’outils courants (Web, calculatrice, RAG)
  4. Détecter et gérer les erreurs des outils
← Retour à AI Agents