Идея 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 прозрачна и универсальна — потому паттерн лёг в основу большинства агентов.