Что такое Re-Act? Re-Act (Reason + Act) – это парадигма, предлагающая объединить рассуждение и выполнение действий в работе языковой модели (ReAct: Synergizing Reasoning and Acting in Language Models).
В отличие от других подходов построения агентов, где модель либо только рассуждает, либо выполняет только действия, либо сразу выдаёт ответ, Re-Act заставляет модель чередовать логические рассуждения с вызовами пользовательских функций (или инструментов - Tools) для взаимодействия с внешним миром. Модель генерирует последовательность мыслей и действий, постепенно продвигаясь к решению задачи. Такое сочетание позволяет ИИ одновременно обдумывать решение и при необходимости обращаться к инструментам или внешним данным.
Небольшой дисклеймер: Re-Act не является серебряной пулей построения ИИ агентов, каким-то единственным правильным подходом, скорее является одним из многих. В конце статьи я приведу ссылки на примеры других подходов.
Компоненты Re-Act‑агента:
Языковая модель (LLM) – «мозг» агента, который генерирует шаги решения. Она выпускает мысли (reasoning traces) и указывает действия для выполнения
Инструменты (Tools) – внешние функции или API, которые агент может вызывать для получения информации или выполнения операций. Например, поиск в интернете, вычисления, работа с базой данных и пр. Инструменты регистрируются с именами и описаниями на естественном языке, чтобы модель знала, как ими пользоваться.
Исполнитель действий (Agent Executor) – принимает решение модели о действии, вызывает соответствующий инструмент и возвращает результат обратно модели. В контексте Re-Act этот компонент реализует цикл «мышление (Thought) → действие (Act) и наблюдение (Observe)».
Состояние агента (State) – накопленная история диалога и действий. Сюда входит запрос пользователя, сообщения модели (мысли/действия) и наблюдения (результаты инструментов). Состояние постоянно обновляется по мере выполнения шагов.
Цикл работы Re-Act агента
Получение запроса (Query). Агент принимает входное сообщение пользователя, которое становится исходным состоянием.
-
Генерация рассуждений и действия (Think). Языковая модель на основе текущего состояния генерирует вывод, состоящий из:
Thought: внутреннего рассуждения, где агент анализирует задачу и формирует план.
Action: указания на выполнение конкретного действия (например, вызов инструмента с определёнными аргументами).
Выполнение действия (Action). Если сгенерированный вывод содержит команду (например,
Action: Search["query"]
), исполнитель вызывает соответствующий инструмент и получает результат.Обновление состояния (Observation). Результат работы инструмента сохраняется как наблюдение и добавляется в историю взаимодействия, после чего цикл повторяется: обновлённое состояние передаётся модели для следующей итерации.
Завершение (END). Если модель сгенерировала финальный ответ (например,
Answer: ...
), цикл прерывается и ответ возвращается пользователю.

Внутренние размышления и подход Re-Act
Одной из ключевых особенностей архитектуры Re-Act является способность агента вести внутренний диалог, который мы обозначаем как «мысли» (Thoughts). Этот процесс включает следующие аспекты:
Анализ и планирование. Агент использует внутренние рассуждения для анализа входной информации, декомпозиции сложных задач на управляемые шаги и определения дальнейших действий. Можно рассматривать это как некий внутренний «брейншторм», где модель выстраивает план решения.
-
Примеры рассуждений:
Планирование: "Чтобы решить задачу, сначала нужно собрать исходные данные, затем выявить закономерности и, наконец, подготовить итоговый отчёт."
Анализ: "Ошибка указывает на проблему с соединением к базе данных, скорее всего, дело в неверных настройках доступа."
Принятие решения: "Оптимальный вариант для пользователя с таким бюджетом – выбрать средний ценовой сегмент, так как он предлагает лучший баланс между ценой и качеством."
Решение проблем: "Перед оптимизацией кода стоит измерить его производительность, чтобы понять, какие участки работают медленнее всего."
Интеграция памяти: "Так как пользователь ранее говорил, что предпочитает Python, примеры кода лучше приводить на этом языке."
Саморефлексия: "Предыдущий подход оказался неэффективным. Попробую другую стратегию для достижения цели."
Постановка целей: "Прежде чем приступить к задаче, необходимо определить критерии успешного выполнения."
Приоритизация: "Перед тем как добавлять новые функции, нужно в первую очередь устранить критические уязвимости в безопасности."
Пример работы Re-Act агента
Давайте рассмотрим простейший пример работы Re-Act агента. В нашем примере допустим пользователь хочет перевести 100 долларов в евро по текущему курсу валют.
В простой реализации (использует "под капотом" tavily для поиска в интернете и python REPL для запуска произвольного python кода) промт общения с моделью будет выглядеть так:
Answer the following questions as best you can. You have access to the following tools:
python_repl(command: str, timeout: Optional[int] = None) -> str - A Python shell. Use this to execute python commands. Input should be a valid python command. If you want to see the output of a value, you should print it out with print(...).
tavily_search_results_json - A search engine optimized for comprehensive, accurate, and trusted results. Useful for when you need to answer questions about current events. Input should be a search query.
Use the following format:
Question: the input question you must answer
Thought: you should always think about what to do
Action: the action to take, should be one of [python_repl, tavily_search_results_json]
Action Input: the input to the action
Observation: the result of the action ... (this Thought/Action/Action Input/Observation can repeat N times)
Thought: I now know the final answer
Final Answer: the final answer to the original input question
Begin!
Question: How much will 100 dollars be in euros at the current exchange rate?
Thought:
И пример того, что ответит LLM в первой итерации цикла Think -> Action -> Observation:
Thought: To find the answer, we need to know the current exchange rate between dollars and euros.
Action: tavily_search_results_json
Action Input: "give me current exchange rate dollars euros"
Как видим LLM подумала (Thought), что сначала ей нужно получить актуальный курс. И решила вызвать tavily для его поиска (Action).
Полный же цикл работы агенты для ответа на вопрос из этого примера будет выглядеть так:

Сначала модель узнает текущий курс с помощью tavily (tavily_search_results_json), затем она предлагает вызвать python_repl для конвертации 100 долларов в евро и на выходе отдаёт ответ:
The result of the calculation shows that 100 US dollars will be converted into approximately 95.7 euros at the current exchange rate.
Final Answer: 95.7 euros
Код Python на основе LangGraph для такого примера будет выглядеть примерно так:
from langchain import hub
from langchain.agents import AgentExecutor, create_react_agent
from langchain_community.tools.tavily_search import TavilySearchResults
from langchain_core.tools import Tool
from langchain_openai import ChatOpenAI
from langchain_experimental.utilities import PythonREPL
python_repl = PythonREPL()
repl_tool = Tool(
name="python_repl",
description="A Python shell. Use this to execute python commands. Input should be a valid python command. If you want to see the output of a value, you should print it out with `print(...)`.",
func=python_repl.run,
)
llm = ChatOpenAI(model_name="gpt-4o-mini")
tools = [repl_tool, TavilySearchResults(max_results=1)]
prompt = hub.pull("hwchase17/react")
# Construct the ReAct agent
agent = create_react_agent(llm, tools, prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
agent_executor.invoke({"input": "How much will 100 dollars be in euros at the current exchange rate?"})
Детали реализации Re-Act агентов
Переходя от теории к практике следует сказать, что практическая реализации в разных фреймворках отличается от той, которая была предложена в исходной статье (ReAct: Synergizing Reasoning and Acting in Language Models), так как она была опубликована относительно давно и развитие LLM шагнуло далеко вперед за это время.
Вот к примеру некоторые интересные детали реализации pre-build агента из библиотеки LangGraph:
LangGraph использует tool-calling (function-calling) технику (https://platform.openai.com/docs/guides/function-calling), чтобы LLM принимали решение о вызове пользовательских функций, тогда как в статье для этого использовался промтинг и парсинг raw текста, который выдавала LLM в ответе. Это связано с тем, что на момент написания статьи tool-calling, встроенный в LLM, ещё не существовал. Сейчас же многие современные LLM (даже open source и on premise) специально обучены технике вызова функций (к примеру, tool calling в Qwen).
LangGraph использует массив параметров для вызова tools вместо передачи всех параметров в виде одной большой строки. Опять же связано с ограничениями LLM, которые имелись на момент написания статьи.
LangGraph позволяет вызывать несколько tools за один раз.
Наконец, в статье явно генерировался этап Thought перед тем, как решать, какие инструменты вызывать. Это является частью Reasoning в Re-Act. LangGraph по умолчанию этого не делает, главным образом потому, что возможности LLM значительно улучшились, и это уже не так необходимо.
Плюсы и минусы Re-ACt
Re-Act не является универсальным решением и имеет свои плюсы и минусы.
Плюсы:
Гибкое пошаговое решение. Агент самостоятельно планирует и осуществляет серию действий. Он может выбирать из множества инструментов и выполнять несколько шагов, сохраняя при этом контекст с помощью памяти. Это позволяет динамически решать сложные проблемы, разбивая их на подзадачи.
Простота разработки: Re-Act-агенты относительно просты в реализации, так как их логика сводится к циклу «think-action-observation». Многие фреймворки (например, LangGraph) уже предлагают готовые реализации Re-Act.
Универсальность. Re-Act агенты применимы в самых разных доменах – от поиска информации до управления устройствами – благодаря возможности подключать необходимые инструменты.
Минусы:
Низкая эффективность в некоторых сценариях: Для каждого шага требуется отдельный вызов LLM, что делает решение медленным, долгим и дорогим при длинных цепочках. Каждое действие (вызов инструмента) сопровождается размышлением модели, увеличивая общее число обращений к модели.
Отсутствие глобального плана: Агент планирует только один шаг вперёд на каждой итерации. Из-за отсутствия целостного плана он может выбирать субоптимальные действия, заходить в тупики или повторяться. Это затрудняет решение задач, требующих стратегического обзора нескольких шагов сразу.
Ограниченная масштабируемость: Если у агента слишком много возможных инструментов или очень длинная история, ему становится трудно выбрать правильное следующее действие. Контекст и количество опций могут превышать способности единственной модели эффективно управлять ими, что снижает качество результатов.
Примеры других подходов построения агентов
Как я уже сказал, Re-Act не является единственным и самым лучшим способом построения ИИ агентов. Более того даже в официальной оригинальной статье приведены сравнения Re-Act и CoT и результаты показывают, что "ванильный" Re-Act далеко не всегда выигрывает.
Сейчас часто разрабатывают гибридные подходы, в которых используются вариации и комбинации несколько способов построения агентов. К примеру, LangGraph позволяет создавать произвольные графы агентов и мульти-агентных систем.
Приведу примеры и других способов построения агентов и промтинга, с которыми конкурирует или может быть совмещен Re-Act:
Chain-Of-Thought (CoT) - ссылка
Self-Ask Prompting - ссылка
Self-Discover - ссылка
Tree-Of-Thought (ToT) - ссылка
Language Agent Tree Search - ссылка
Reflexion - ссылка
MRKL Systems (Modular Reasoning, Knowledge and Language) - ссылка
PAL (Program-aided Language Models) - ссылка
Toolformer - ссылка
-
Агенты с планированием:
-
Мульти-агентные системы (Multi-Agent Systems):
Не забудьте подписаться на мой Telegram-канал, где я публикую материалы про разработку ИИ агентов.
Per_Ardua
Это перевод? А где тогда плашка?
ai-agent-dev Автор
Извиняюсь, видимо ввёл в заблуждение. Имелась здесь в виду эта оригинальная статья с теорией, в которой ввели понятие Re-Act агента - https://arxiv.org/abs/2210.03629.
Но моя статья не является её переводом.