Идея ReAct: мысль → действие → наблюдение

ReAct — самый влиятельный паттерн агентов. Он связывает «думать» и «делать» в один чередующийся цикл.

ReAct (Reasoning + Acting) — паттерн, в котором агент на каждом шаге сначала рассуждает вслух (Thought), затем выполняет действие (Action) и получает наблюдение (Observation), и так до ответа.

Две крайности и золотая середина

До ReAct были два полюса:

  • Только рассуждение (chain-of-thought) — модель думает вслух, но не может проверить мысль в мире. Если она ошиблась в факте, рассуждение лишь красиво ведёт к неверному ответу.
  • Только действие — модель дёргает инструменты без объяснений. Трудно понять, почему она выбрала именно этот шаг, и легко уйти не туда.

ReAct объединяет оба: думать, чтобы выбрать шаг, и действовать, чтобы проверить мысль фактом. Рассуждение направляет действия, а наблюдения корректируют рассуждение.

Три типа шагов

ШагКто делаетСмысл
Thought (мысль)модельчто я знаю и что делать дальше
Action (действие)модель просит, код выполняетвызов инструмента
Observation (наблюдение)инструментрезультат действия

Цикл повторяет эту тройку, пока модель не выдаст финальный ответ.

Как выглядит трасса ReAct

Для задачи «сколько будет 15% от 240?» трасса могла бы выглядеть так (это текст, который порождает и читает модель):

Question: Сколько будет 15% от 240?
Thought: мне нужно посчитать 240 * 0.15, использую калькулятор.
Action: calc[240 * 0.15]
Observation: 36.0
Thought: получилось 36, это и есть ответ.
Final Answer: 36

Обратите внимание: мысль предшествует действию и объясняет его, а наблюдение возвращается в рассуждение. Эта структура — и для модели (думать по шагам), и для нас (видно, что происходит).

Имитация одного оборота

Покажем тройку «мысль → действие → наблюдение» на заглушке, без парсинга формата (его разберём в следующем уроке).

def calc(expr):
    return str(eval(expr))

# один оборот ReAct
thought = "нужно посчитать 240 * 0.15"
print("Thought:", thought)

action_arg = "240 * 0.15"
print("Action: calc[" + action_arg + "]")

observation = calc(action_arg)
print("Observation:", observation)

print("Final Answer:", observation)

Вывод:

Thought: нужно посчитать 240 * 0.15
Action: calc[240 * 0.15]
Observation: 36.0
Final Answer: 36.0

Почему это так влиятельно

  • Рассуждение делает выбор инструмента осмысленным, а не случайным.
  • Наблюдения «заземляют» модель в реальности — она реже выдумывает.
  • Трасса прозрачна: по ней видно ход мысли и легко отлаживать.
  • Паттерн универсален: работает с любыми инструментами и моделями.

Итог

  • ReAct чередует рассуждение (Thought), действие (Action) и наблюдение (Observation) в одном цикле.
  • Он сильнее, чем «только думать» или «только действовать»: мысль направляет шаг, наблюдение правит мысль.
  • Трасса ReAct прозрачна и универсальна — потому паттерн лёг в основу большинства агентов.
Проверьте себя
1. Из каких трёх типов шагов состоит цикл ReAct?
AInput, Process, Output
BThought (мысль), Action (действие), Observation (наблюдение)
CQuestion, Answer, Feedback
DPlan, Execute, Reflect
2. В чём преимущество ReAct над чистым рассуждением (chain-of-thought)?
AОн быстрее
BДействия и наблюдения «заземляют» модель в реальности, и она реже выдумывает факты
CОн не требует инструментов
DОн использует меньше токенов
3. Какой порядок шагов в ReAct правильный?
AСначала действие, потом мысль о нём
BСначала мысль, которая объясняет и выбирает действие, затем наблюдение возвращается в рассуждение
CНаблюдение, затем мысль, затем вопрос
DВсе три шага одновременно
Поддержать проект