Construire un Agent ReAct avec LangChain
Assemblez un Agent ReAct complet avec AgentExecutor de LangChain, un outil de recherche Web, un outil de calcul et un outil de recherche dans les documents, puis suivez ses étapes de raisonnement.
Construire un Agent ReAct avec LangChain est une leçon AI Engineering Academy gratuite sur CoddyKit. Ceci est la leçon 3 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 Engineering Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours AI Engineering Academy comprend 4 leçons au total.
L’écosystème d’agents de LangChain
LangChain fournit une pile complète pour créer des agents : les outils définissent ce que l’agent peut faire, les invites lui donnent ses instructions et son format de raisonnement, le LLM effectue le raisonnement, et AgentExecutor exécute la boucle qui distribue les appels d’outils et renvoie les observations à l’agent. Vous configurez chaque élément séparément, ce qui vous permet de remplacer des composants sans tout réécrire.
Assembler un agent ReAct
La manière la plus rapide de créer un agent ReAct dans LangChain consiste à utiliser create_react_agent. Vous lui transmettez un LLM, une liste d’outils et un modèle d’invite. Il renvoie un élément exécutable qui génère automatiquement les étapes Pensée/Action/Observation. Encapsulez-le dans un AgentExecutor pour gérer la boucle.
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)Exécuter avec AgentExecutor
AgentExecutor gère la boucle Pensée/Action/Observation. Pendant le développement, transmettez verbose=True pour afficher chaque étape dans la console : cette trace est extrêmement utile pour le débogage. Le paramètre max_iterations sert de mécanisme de sécurité contre les boucles infinies.
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'])Lire la trace détaillée
La trace détaillée montre exactement comment l’agent raisonne. À chaque itération, elle affiche la Pensée du modèle, l’Action qu’il a choisie et l’Observation renvoyée par l’outil. Vous pouvez ainsi repérer précisément où l’agent se trompe : mauvais outil choisi, mauvais argument transmis ou observation mal interprétée.
# 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.Utiliser les outils intégrés de LangChain
LangChain inclut de nombreux outils prêts à l’emploi pour les tâches courantes. Vous pouvez ajouter un outil de recherche Web depuis langchain_community.tools sans écrire de code. Ces outils gèrent pour vous l’authentification auprès de l’API et l’analyse des réponses.
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_searchRecherche de documents comme outil RAG
L’un des modèles les plus puissants consiste à exposer votre pipeline RAG comme outil pour l’agent. L’agent décide quand interroger votre base de connaissances, quand utiliser d’autres outils ou quand s’appuyer sur son entraînement. Votre système RAG devient ainsi dynamique : l’agent ne l’appelle que lorsque c’est pertinent.
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.'Diffuser la sortie de l’agent
Pour améliorer l’expérience utilisateur, diffusez la réponse finale de l’agent jeton par jeton au lieu d’attendre la réponse complète. Utilisez agent_executor.astream_events pour recevoir les événements au fur et à mesure qu’ils se produisent, y compris les étapes intermédiaires et le flux de sortie final.
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?'))Transmettre la mémoire à l’agent
Combinez le raisonnement de l’agent avec la mémoire de conversation afin qu’il se souvienne des interactions précédentes. Utilisez RunnableWithMessageHistory pour encapsuler l’exécuteur de l’agent et lui fournir un stockage de l’historique de discussion. L’agent dispose alors à la fois de la mémoire des échanges précédents et de la capacité d’appeler des outils.
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'
)Personnaliser l’invite ReAct
L’invite par défaut du hub fonctionne bien, mais vous aurez souvent besoin d’une invite système personnalisée pour votre domaine. Une invite personnalisée vous permet d’ajouter des instructions de persona, des règles de formatage de la sortie et des consignes propres au domaine avant les descriptions des outils. Utilisez ChatPromptTemplate avec les espaces réservés ReAct requis.
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)Observer les étapes du raisonnement de l’agent
AgentExecutor renvoie les étapes intermédiaires en plus de la sortie finale lorsque vous définissez return_intermediate_steps=True. Chaque étape est un tuple composé de l’action de l’agent et de l’observation de l’outil. Cette possibilité est utile pour créer des interfaces qui montrent aux utilisateurs le processus de raisonnement de l’agent.
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}')Tester votre agent en profondeur
Testez votre agent avec une série de questions représentatives couvrant : les tâches faisant appel à un seul outil, les tâches à plusieurs étapes nécessitant plusieurs appels d’outils, les tâches ne nécessitant aucun outil (le modèle répond à partir de ses données d’entraînement) et les entrées adversariales, comme des questions conçues pour perturber la sélection des outils. Suivez les taux de réussite et les types d’échec afin d’améliorer vos descriptions d’outils et votre invite.
Vérification rapide
Vérifiez votre compréhension de la création d’un agent ReAct avec LangChain.
Récapitulatif de la leçon
Dans cette leçon, vous avez appris que : create_react_agent assemble un LLM, des outils et une invite pour former un agent ReAct, AgentExecutor gère la boucle Pensée/Action/Observation avec des limites de sécurité configurables, et verbose=True ainsi que return_intermediate_steps=True offrent une visibilité complète sur le raisonnement de l’agent. Ensuite, nous verrons comment gérer les échecs des agents et empêcher les boucles infinies.
Questions Fréquemment Posées
La leçon « Construire un Agent ReAct avec LangChain » est-elle gratuite ?
Oui — le texte complet de « Construire un Agent ReAct avec LangChain » 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 Engineering Academy, passe à CoddyKit PRO. Le cours AI Engineering Academy comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Construire un Agent ReAct avec LangChain » ?
Assemblez un Agent ReAct complet avec AgentExecutor de LangChain, un outil de recherche Web, un outil de calcul et un outil de recherche dans les documents, puis suivez ses étapes de raisonnement. Tu pratiques AI Engineering Academy 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 Engineering Academy ?
Aucune expérience préalable n'est requise. AI Engineering Academy 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 3 sur 4.
Combien de temps prend la leçon « Construire un Agent ReAct avec LangChain » ?
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 Engineering Academy ?
Oui. Chaque leçon AI Engineering Academy 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
- Le cadre ReAct : réfléchir, agir, observer
- Définir des outils pour votre Agent
- Construire un Agent ReAct avec LangChain
- Gérer les échecs et les boucles des agents