0Pricing
AI Agents · Lezione

Implementare ReAct da zero

Scriva un'implementazione Python di 100 righe senza LangChain: analizzi le righe Action, esegua gli strumenti e ripeta il ciclo fino a Final Answer.

Implementare ReAct da zero è una lezione AI Agents gratuita su CoddyKit. Questa è la lezione 2 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento AI Agents, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso AI Agents include 4 lezioni in totale.

Parti di questa lezione non sono ancora state tradotte e vengono mostrate in inglese.

Costruire personalmente il ciclo

Potete scrivere ReAct in circa 100 righe di Python, senza bisogno di un framework. Farlo almeno una volta vi aiuta a capire cosa astraggono i framework.

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)

Passaggio 6: aggiungere il logging

Acquisite ogni passaggio per il debugging:

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})')
        ...

Passaggio 7: contatore dei passaggi come strumento

Alcuni agenti includono il conteggio dei passaggi nel prompt di sistema, così il modello sa quando convergere:

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

Passaggio 8: formato della risposta finale

Se volete un output strutturato, forzate una chiamata finale a uno strumento:

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.

Passaggio 9: errori degli strumenti

Restituite sempre gli errori come risultati degli strumenti, così l'agente può recuperare:

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.

Passaggio 10: chiamate parallele agli strumenti

Se msg.tool_calls contiene più elementi, eseguiteli in parallelo:

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])

Passaggio 11: limitare la conversazione

Anche entro MAX_STEPS, gli elenchi dei messaggi possono crescere rapidamente. Riduceteli in base al conteggio dei token tra un turno e l'altro:

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

Passaggio 12: preparazione per la produzione

Per la produzione, aggiungete timeout alle chiamate degli strumenti, quote per strumento, nuovi tentativi con backoff in caso di errori delle API e logging completo delle tracce. Il ciclo precedente resta comunque il vostro scheletro.

Gestione degli errori degli strumenti

Che cosa dovreste fare quando uno strumento genera un'eccezione?

Riepilogo

ReAct in circa 80 righe: elenco dei messaggi + ciclo while + tabella di dispatch. I framework aggiungono rifiniture, ma il nucleo è questo.

Domande Frequenti

La lezione «Implementare ReAct da zero» è gratuita?

Sì — il testo completo di «Implementare ReAct da zero» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso AI Agents, passa a CoddyKit PRO. Il corso AI Agents include 4 lezioni in totale.

Cosa imparerò in «Implementare ReAct da zero»?

Scriva un'implementazione Python di 100 righe senza LangChain: analizzi le righe Action, esegua gli strumenti e ripeta il ciclo fino a Final Answer. Eserciti AI Agents con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare AI Agents?

Non è richiesta alcuna esperienza precedente. AI Agents su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 4.

Quanto tempo richiede la lezione «Implementare ReAct da zero»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione AI Agents?

Sì. Ogni lezione AI Agents include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. ReAct: pattern Ragionamento + Azione
  2. Implementare ReAct da zero
  3. Set di strumenti comuni (Web, calcolatrice, RAG)
  4. Rilevare e gestire gli errori degli strumenti
← Torna a AI Agents