0Pricing
AI Agents · Lekcja

Implementacja ReAct od podstaw

Napisz 100-wierszową implementację w Pythonie bez LangChain: parsuj wiersze Action, uruchamiaj narzędzia i powtarzaj pętlę do momentu Final Answer.

Implementacja ReAct od podstaw to bezpłatna lekcja AI Agents na CoddyKit. To lekcja 2 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 Agents, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs AI Agents zawiera 4 lekcji w sumie.

Części tej lekcji nie zostały jeszcze przetłumaczone i są wyświetlane po angielsku.

Samodzielne zbudowanie pętli

ReAct można napisać w około 100 wierszach kodu Python — bez użycia frameworka. Jednorazowe wykonanie tego zadania pozwala lepiej zrozumieć, co ukrywają przed użytkownikiem frameworki.

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)

Krok 6: Dodawanie logowania

Należy rejestrować każdy krok na potrzeby debugowania:

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

Krok 7: Licznik kroków jako narzędzie

Niektóre agenty umieszczają liczbę kroków w promptcie systemowym, aby model wiedział, kiedy zakończyć działanie:

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

Krok 8: Format końcowej odpowiedzi

Jeśli wymagany jest ustrukturyzowany wynik, należy wymusić końcowe wywołanie narzędzia:

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.

Krok 9: Błędy narzędzi

Błędy należy zawsze zwracać jako wyniki narzędzi, aby agent mógł je obsłużyć:

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.

Krok 10: Równoległe wywołania narzędzi

Jeśli msg.tool_calls zawiera wiele wpisów, należy wykonać je równolegle:

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

Krok 11: Ograniczanie rozmowy

Nawet przy ustawieniu MAX_STEPS lista wiadomości może nadmiernie urosnąć. Między kolejnymi turami należy ją skracać na podstawie liczby tokenów:

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

Krok 12: Przygotowanie do produkcji

W środowisku produkcyjnym należy dodać: limity czasu dla wywołań narzędzi, limity dla poszczególnych narzędzi, ponawianie prób z wykładniczym opóźnieniem w przypadku awarii API oraz pełne logowanie śladów. Powyższa pętla stanowi jednak podstawowy szkielet.

Obsługa błędów narzędzi

Co należy zrobić, gdy narzędzie zgłosi wyjątek?

Podsumowanie

ReAct w około 80 wierszach: lista wiadomości + pętla while + tablica routingu. Frameworki dodają wygodne funkcje, ale rdzeń rozwiązania wygląda właśnie tak.

Często zadawane pytania

Czy lekcja „Implementacja ReAct od podstaw” jest bezpłatna?

Tak — pełny tekst „Implementacja ReAct od podstaw” 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 Agents, przejdź na CoddyKit PRO. Kurs AI Agents zawiera 4 lekcji w sumie.

Co nauczysz się w „Implementacja ReAct od podstaw”?

Napisz 100-wierszową implementację w Pythonie bez LangChain: parsuj wiersze Action, uruchamiaj narzędzia i powtarzaj pętlę do momentu Final Answer. Ćwiczysz AI Agents 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 Agents?

Nie wymagamy żadnego doświadczenia. AI Agents 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 2 z 4.

Ile czasu zajmuje lekcja „Implementacja ReAct od podstaw”?

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 Agents?

Tak. Każda lekcja AI Agents 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

  1. ReAct: wzorzec rozumowanie + działanie
  2. Implementacja ReAct od podstaw
  3. Typowe zestawy narzędzi (sieć, kalkulator, RAG)
  4. Wykrywanie błędów narzędzi i odzyskiwanie po nich
← Powrót do AI Agents