Агенты и паттерн ReAct

Урок объясняет, как агент в цикле рассуждает и вызывает инструменты до решения задачи.

Агент — связка модели и набора инструментов, где модель в цикле сама решает, какой инструмент вызвать на каждом шаге, пока не получит ответ.

От одного вызова к циклу

Tool calling из прошлого урока — это один шаг. Но реальная задача может требовать нескольких: сначала найти, потом посчитать, потом сверить. Агент превращает разовый вызов в цикл: модель рассуждает, выбирает инструмент, видит результат, снова рассуждает — и так до финального ответа.

Паттерн ReAct

Самый известный паттерн агента — ReAct (Reasoning + Acting). Модель чередует мысль и действие:

Thought:   нужно перемножить 23 и 17
Action:    multiply(a=23, b=17)
Observation: 391
Thought:   теперь у меня есть результат
Final Answer: 391

Сам управляющий цикл агента концептуально прост — это «думай-действуй-наблюдай», пока не готово:

def agent_loop(goal, tools, max_steps=5):
    log = []
    for step in range(max_steps):
        # упрощённо: «модель» выбирает инструмент по ключевому слову
        if "умнож" in goal and "multiply" in tools:
            result = tools["multiply"](23, 17)
            log.append(f"Action multiply = {result}")
            return result, log
        log.append("Thought: не знаю инструмент")
        break
    return None, log

tools = {"multiply": lambda a, b: a * b}
answer, log = agent_loop("нужно умножить числа", tools)
print("Ответ:", answer)
print("\n".join(log))

Вывод:

Ответ: 391
Action multiply = 391

Как работает под капотом

Исполнитель агента (в современном LangChain это обычно граф на базе LangGraph) гоняет цикл: отправляет модели запрос с описанием инструментов, получает либо tool_calls, либо финальный ответ. Если пришёл вызов — исполнитель выполняет инструмент, добавляет результат (observation) в историю и снова зовёт модель. Цикл идёт, пока модель не вернёт ответ без вызовов или не упрётся в лимит шагов. Лимит шагов критичен: без него агент может зациклиться.

Частые ошибки

  • Нет лимита шагов. Агент способен крутиться в цикле и сжигать токены — всегда ставьте предел.
  • Слишком много инструментов. Чем их больше, тем чаще модель ошибается в выборе; давайте только нужные.
  • Брать агента там, где хватит цепочки. Если порядок шагов известен заранее — фиксированная цепочка надёжнее и дешевле.

Итог

  • Агент — это цикл «рассуждение → действие → наблюдение» поверх модели и инструментов.
  • ReAct чередует мысли и вызовы инструментов до финального ответа.
  • Исполнитель повторяет вызовы, пока модель не ответит или не кончится лимит шагов.
  • Лимит шагов и минимум инструментов — обязательная страховка.
Проверьте себя
1. Чем агент отличается от одиночного tool calling?
AАгент не использует инструменты
BАгент в цикле повторяет рассуждение и вызовы инструментов до финального ответа
CАгент работает только локально
DМежду ними нет разницы
2. Что чередует паттерн ReAct?
AОбучение и инференс
BРассуждение (Thought) и действие (Action) с наблюдением результата
CДва разных провайдера моделей
DЭмбеддинги и парсеры
3. Почему агенту обязательно задавать лимит шагов?
AТак требует лицензия
BИначе агент может зациклиться и сжигать токены без остановки
CЧтобы ускорить эмбеддинги
DЧтобы отключить инструменты