Tworzenie agenta ReAct za pomocą LangChain
Uczestnicy zbudują pełnego agenta ReAct z użyciem AgentExecutor z LangChain, wyposażonego w narzędzie wyszukiwania internetowego, kalkulator i narzędzie wyszukiwania w dokumentach, a następnie prześledzą jego kroki rozumowania.
Tworzenie agenta ReAct za pomocą LangChain to bezpłatna lekcja AI Engineering Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej AI Engineering Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs AI Engineering Academy zawiera 4 lekcji w sumie.
Ekosystem agentów LangChain
LangChain udostępnia kompletny stos do budowania agentów: narzędzia definiują, co agent może robić, prompty przekazują mu instrukcje i format rozumowania, LLM wykonuje rozumowanie, a AgentExecutor uruchamia pętlę, która wysyła wywołania narzędzi i przekazuje z powrotem obserwacje. Każdy element konfiguruje się osobno, dzięki czemu można wymieniać komponenty bez przepisywania całości.
Budowanie agenta ReAct
Najszybszym sposobem na zbudowanie agenta ReAct w LangChain jest użycie create_react_agent. Należy przekazać mu LLM, listę narzędzi i szablon promptu. Zwraca on obiekt wykonywalny, który automatycznie generuje kroki Thought/Action/Observation. Następnie należy opakować go w AgentExecutor, aby zarządzać pętlą.
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)Uruchamianie za pomocą AgentExecutor
AgentExecutor zarządza pętlą Thought/Action/Observation. Podczas tworzenia aplikacji należy przekazać verbose=True, aby wyświetlać każdy krok w konsoli — taki ślad jest niezwykle pomocny podczas debugowania. Parametr max_iterations stanowi zabezpieczenie przed nieskończonymi pętlami.
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'])Odczytywanie szczegółowego śladu
Szczegółowy ślad pokazuje dokładnie, w jaki sposób agent wykonuje rozumowanie. W każdej iteracji wyświetlane są Thought modelu, wybrane przez niego Action oraz Observation zwrócona przez narzędzie. Dzięki temu można dokładnie ustalić, gdzie agent popełnia błąd — czy wybrał niewłaściwe narzędzie, przekazał nieprawidłowy argument, czy błędnie odczytał obserwację.
# 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.Korzystanie z wbudowanych narzędzi LangChain
LangChain zawiera wiele gotowych narzędzi do typowych zadań. Można dodać narzędzie do wyszukiwania w sieci z pakietu langchain_community.tools bez pisania własnego kodu. Narzędzia te obsługują za Ciebie uwierzytelnianie API i analizowanie odpowiedzi.
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_searchWyszukiwanie dokumentów jako narzędzie RAG
Jednym z najpotężniejszych wzorców jest udostępnienie potoku RAG jako narzędzia agenta. Agent decyduje, kiedy pobierać informacje z bazy wiedzy, kiedy użyć innych narzędzi, a kiedy polegać na danych uzyskanych podczas trenowania. Dzięki temu system RAG staje się dynamiczny — agent wywołuje go tylko wtedy, gdy jest to istotne.
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.'Strumieniowanie wyników agenta
Aby zapewnić lepsze doświadczenia użytkownika, należy strumieniować końcową odpowiedź agenta token po tokenie, zamiast czekać na pełną odpowiedź. Użyj agent_executor.astream_events, aby odbierać zdarzenia w miarę ich występowania, w tym kroki pośrednie i strumień końcowego wyniku.
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?'))Przekazywanie pamięci agentowi
Połącz rozumowanie agenta z pamięcią konwersacji, aby agent pamiętał wcześniejsze interakcje. Użyj RunnableWithMessageHistory, aby opakować executor agenta i udostępnić magazyn historii czatu. Agent będzie wtedy dysponował zarówno pamięcią poprzednich tur rozmowy, jak i możliwością wywoływania narzędzi.
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'
)Dostosowywanie promptu ReAct
Domyślny prompt z huba sprawdza się dobrze, ale często potrzebny jest niestandardowy prompt systemowy dopasowany do konkretnej domeny. Własny prompt pozwala dodać instrukcje dotyczące persony, reguły formatowania wyników oraz wskazówki specyficzne dla domeny przed opisami narzędzi. Użyj ChatPromptTemplate wraz z wymaganymi placeholderami ReAct.
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)Obserwowanie kroków rozumowania agenta
AgentExecutor zwraca kroki pośrednie wraz z końcowym wynikiem, gdy ustawisz return_intermediate_steps=True. Każdy krok jest krotką zawierającą akcję agenta i obserwację narzędzia. Jest to przydatne podczas tworzenia interfejsów pokazujących użytkownikom proces rozumowania agenta.
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}')Dokładne testowanie agenta
Przetestuj agenta za pomocą zestawu reprezentatywnych pytań obejmujących: zadania z użyciem jednego narzędzia, zadania wieloetapowe wymagające kilku wywołań narzędzi, zadania, w których narzędzie nie jest potrzebne (model odpowiada na podstawie danych treningowych), oraz dane wejściowe o charakterze wrogim, takie jak pytania zaprojektowane w celu zmylenia wyboru narzędzia. Śledź odsetek zaliczonych testów i wzorce błędów, aby ulepszać opisy narzędzi oraz prompt.
Szybkie sprawdzenie
Sprawdź swoją wiedzę na temat budowania agenta ReAct za pomocą LangChain.
Podsumowanie lekcji
W tej lekcji nauczyłeś się, że: create_react_agent łączy LLM, narzędzia i prompt w agenta ReAct, AgentExecutor zarządza pętlą Thought/Action/Observation z konfigurowalnymi limitami bezpieczeństwa, a verbose=True i return_intermediate_steps=True zapewniają pełny wgląd w rozumowanie agenta. Następnie dowiemy się, jak obsługiwać awarie agentów i zapobiegać nieskończonym pętlom.
Często zadawane pytania
Czy lekcja „Tworzenie agenta ReAct za pomocą LangChain” jest bezpłatna?
Tak — pełny tekst „Tworzenie agenta ReAct za pomocą LangChain” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu AI Engineering Academy, przejdź na CoddyKit PRO. Kurs AI Engineering Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Tworzenie agenta ReAct za pomocą LangChain”?
Uczestnicy zbudują pełnego agenta ReAct z użyciem AgentExecutor z LangChain, wyposażonego w narzędzie wyszukiwania internetowego, kalkulator i narzędzie wyszukiwania w dokumentach, a następnie prześl… Ćwiczysz AI Engineering Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć AI Engineering Academy?
Nie wymagamy żadnego doświadczenia. AI Engineering Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.
Ile czasu zajmuje lekcja „Tworzenie agenta ReAct za pomocą LangChain”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji AI Engineering Academy?
Tak. Każda lekcja AI Engineering Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Framework ReAct: myślenie, działanie, obserwacja
- Definiowanie narzędzi dla agenta
- Tworzenie agenta ReAct za pomocą LangChain
- Obsługa awarii i pętli agentów