Creare un agente ReAct con LangChain
Assemblerà un agente ReAct completo usando AgentExecutor di LangChain, con uno strumento di ricerca web, uno strumento calcolatrice e uno strumento per la ricerca nei documenti, quindi analizzerà i suoi passaggi di ragionamento.
Creare un agente ReAct con LangChain è una lezione AI Engineering Academy gratuita su CoddyKit. Questa è la lezione 3 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 Engineering Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso AI Engineering Academy include 4 lezioni in totale.
L'ecosistema degli agent LangChain
LangChain offre uno stack completo per creare agent: gli strumenti definiscono ciò che l'agente può fare, i prompt gli forniscono istruzioni e formato di ragionamento, l'LLM esegue il ragionamento e AgentExecutor gestisce il ciclo che invia le chiamate agli strumenti e restituisce le osservazioni all'agente. Ogni componente viene configurato separatamente, così può sostituire i singoli elementi senza riscrivere tutto.
Assemblare un agent ReAct
Il modo più rapido per creare un agent ReAct in LangChain consiste nell'utilizzare create_react_agent. Gli passi un LLM, un elenco di strumenti e un modello di prompt. Restituisce un oggetto eseguibile che genera automaticamente i passaggi Thought/Action/Observation. Lo racchiuda in un AgentExecutor per gestire il ciclo.
from langchain import hub
from langchain.agents import create_react_agent, AgentExecutor
from langchain_openai import ChatOpenAI
from langchain_core.tools import tool
# 1. Define tools
@tool
def search(query: str) -> str:
'''Search the web for current information. Input: a search query string.'''
return f'Search results for "{query}": [mock result]'
@tool
def calculator(expression: str) -> str:
'''Evaluate a math expression. Input: a valid Python math expression.'''
try:
return str(eval(expression))
except Exception as e:
return str(e)
tools = [search, calculator]
# 2. Load a ReAct prompt template
prompt = hub.pull('hwchase17/react')
# 3. Create the agent
llm = ChatOpenAI(model='gpt-4o', temperature=0)
agent = create_react_agent(llm, tools, prompt)Eseguire con AgentExecutor
AgentExecutor gestisce il ciclo Thought/Action/Observation. Durante lo sviluppo, passi verbose=True per stampare ogni passaggio nella console: questa traccia è preziosa per il debug. Il parametro max_iterations funge da protezione contro i cicli infiniti.
agent_executor = AgentExecutor(
agent=agent,
tools=tools,
verbose=True, # Print each step
max_iterations=10, # Safety limit
handle_parsing_errors=True # Don't crash on format errors
)
# Invoke with a user question
result = agent_executor.invoke({
'input': 'What is the square root of 144 multiplied by the number of days in a leap year?'
})
print('Final answer:', result['output'])Leggere la traccia dettagliata
La traccia dettagliata mostra esattamente come ragiona l'agente. A ogni iterazione vengono stampati il Thought del modello, l'Action scelta e l'Observation restituita dallo strumento. In questo modo può individuare esattamente dove l'agente sbaglia, ad esempio se ha scelto lo strumento errato, passato l'argomento sbagliato o interpretato male l'osservazione.
# Example verbose output from AgentExecutor:
#
# > Entering new AgentExecutor chain...
# Thought: I need to find the square root of 144 first, then multiply by days in a leap year.
# Action: calculator
# Action Input: 144 ** 0.5
# Observation: 12.0
# Thought: 12.0 times 366 days in a leap year.
# Action: calculator
# Action Input: 12.0 * 366
# Observation: 4392.0
# Thought: I have the final answer.
# Final Answer: 4392.0
# > Finished chain.Utilizzare gli strumenti integrati di LangChain
LangChain include numerosi strumenti pronti all'uso per le attività più comuni. Può aggiungere uno strumento di ricerca sul Web da langchain_community.tools senza scrivere codice. Questi strumenti gestiscono per Lei l'autenticazione API e l'analisi delle risposte.
from langchain_community.tools import DuckDuckGoSearchRun
from langchain_community.tools import WikipediaQueryRun
from langchain_community.utilities import WikipediaAPIWrapper
# Web search tool
search_tool = DuckDuckGoSearchRun()
# Wikipedia lookup tool
wiki_tool = WikipediaQueryRun(
api_wrapper=WikipediaAPIWrapper(top_k_results=2)
)
# Add to your agent
tools_with_search = [search_tool, wiki_tool, calculator]
agent_executor.tools = tools_with_searchRicerca nei documenti come strumento RAG
Uno dei pattern più potenti consiste nell'esporre la pipeline RAG come strumento dell'agente. L'agente decide quando recuperare informazioni dalla base di conoscenza, quando utilizzare altri strumenti o quando affidarsi al proprio addestramento. In questo modo il sistema RAG diventa dinamico: l'agente lo richiama solo quando è pertinente.
from langchain_core.tools import tool
@tool
def lookup_knowledge_base(query: str) -> str:
'''Search the company knowledge base for internal policies, procedures, and documentation.
Use when the user asks about company-specific information not available publicly.
Input: a natural language question or keyword query.
'''
# Your RAG pipeline here
retrieved_chunks = vector_store.similarity_search(query, k=3)
context = '\n'.join([doc.page_content for doc in retrieved_chunks])
return context if context else 'No relevant documents found.'Trasmettere in streaming l'output dell'agente
Per offrire una migliore esperienza utente, trasmetta in streaming la risposta finale dell'agente token per token invece di attendere la risposta completa. Utilizzi agent_executor.astream_events per ricevere gli eventi nel momento in cui si verificano, inclusi i passaggi intermedi e lo streaming dell'output finale.
import asyncio
async def stream_agent(user_input: str):
async for event in agent_executor.astream_events(
{'input': user_input},
version='v1'
):
kind = event['event']
if kind == 'on_chat_model_stream':
chunk = event['data']['chunk']
if chunk.content:
print(chunk.content, end='', flush=True)
elif kind == 'on_tool_start':
print(f'\n[Calling tool: {event["name"]}]')
elif kind == 'on_tool_end':
print(f'[Tool result: {str(event["data"]["output"])[:100]}]')
asyncio.run(stream_agent('What is the latest news about AI?'))Passare la memoria all'agente
Combini il ragionamento dell'agente con la memoria della conversazione, così l'agente può ricordare le interazioni precedenti. Utilizzi RunnableWithMessageHistory per racchiudere l'executor dell'agente e fornire un archivio della cronologia della chat. L'agente disporrà così sia della memoria dei turni precedenti sia della capacità di richiamare strumenti.
from langchain_core.runnables.history import RunnableWithMessageHistory
from langchain_community.chat_message_histories import ChatMessageHistory
session_store = {}
def get_session_history(session_id: str):
if session_id not in session_store:
session_store[session_id] = ChatMessageHistory()
return session_store[session_id]
agent_with_memory = RunnableWithMessageHistory(
agent_executor,
get_session_history,
input_messages_key='input',
history_messages_key='chat_history'
)Personalizzare il prompt ReAct
Il prompt predefinito dell'hub funziona bene, ma spesso è necessario un prompt di sistema personalizzato per il proprio dominio. Un prompt personalizzato consente di aggiungere istruzioni sulla persona, regole di formattazione dell'output e indicazioni specifiche del dominio prima delle descrizioni degli strumenti. Utilizzi ChatPromptTemplate con i segnaposto ReAct richiesti.
from langchain_core.prompts import ChatPromptTemplate
custom_prompt = ChatPromptTemplate.from_messages([
('system', '''You are a helpful customer support agent for TechCorp.
Always be polite and professional. When you do not know something, use your tools.
You have access to these tools:
{tools}
Tool names: {tool_names}
Use this format:
Thought: ...
Action: tool_name
Action Input: input_value
Observation: result
Final Answer: your response to the customer
'''),
('human', '{input}'),
('assistant', '{agent_scratchpad}')
])
agent = create_react_agent(llm, tools, custom_prompt)Osservare i passaggi di ragionamento dell'agente
AgentExecutor restituisce i passaggi intermedi insieme all'output finale quando si imposta return_intermediate_steps=True. Ogni passaggio è una tupla composta dall'azione dell'agente e dall'osservazione dello strumento. Questo è utile per creare interfacce che mostrano agli utenti il processo di ragionamento dell'agente.
agent_executor = AgentExecutor(
agent=agent,
tools=tools,
return_intermediate_steps=True
)
result = agent_executor.invoke({'input': 'What is 2 to the power of 10?'})
print('Final answer:', result['output'])
print('Reasoning steps:')
for step in result['intermediate_steps']:
action, observation = step
print(f' Tool: {action.tool}, Input: {action.tool_input}')
print(f' Observation: {observation}')Testare accuratamente l'agente
Testi il Suo agente con una suite di domande rappresentative che includa: attività con un solo strumento, attività multi-hop che richiedono diverse chiamate agli strumenti, attività per le quali non è necessario alcuno strumento (il modello risponde usando i dati di addestramento) e input avversari, come domande progettate per confondere la selezione dello strumento. Tenga traccia delle percentuali di superamento e dei pattern di errore per migliorare le descrizioni degli strumenti e il prompt.
Verifica rapida
Verifichi la Sua comprensione della creazione di un agent ReAct con LangChain.
Riepilogo della lezione
In questa lezione ha imparato che: create_react_agent assembla un LLM, gli strumenti e un prompt in un agent ReAct, AgentExecutor gestisce il ciclo Thought/Action/Observation con limiti di sicurezza configurabili e verbose=True e return_intermediate_steps=True offrono piena visibilità sul ragionamento dell'agente. Ora impareremo a gestire i fallimenti degli agenti e a prevenire i cicli infiniti.
Domande Frequenti
La lezione «Creare un agente ReAct con LangChain» è gratuita?
Sì — il testo completo di «Creare un agente ReAct con LangChain» è 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 Engineering Academy, passa a CoddyKit PRO. Il corso AI Engineering Academy include 4 lezioni in totale.
Cosa imparerò in «Creare un agente ReAct con LangChain»?
Assemblerà un agente ReAct completo usando AgentExecutor di LangChain, con uno strumento di ricerca web, uno strumento calcolatrice e uno strumento per la ricerca nei documenti, quindi analizzerà i s… Eserciti AI Engineering Academy 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 Engineering Academy?
Non è richiesta alcuna esperienza precedente. AI Engineering Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.
Quanto tempo richiede la lezione «Creare un agente ReAct con LangChain»?
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 Engineering Academy?
Sì. Ogni lezione AI Engineering Academy 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
- Il framework ReAct: pensare, agire, osservare
- Definire gli strumenti per il proprio agente
- Creare un agente ReAct con LangChain
- Gestire i fallimenti e i loop degli agenti