Что такое 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 агента

Внутренние размышления и подход 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:

Не забудьте подписаться на мой Telegram-канал, где я публикую материалы про разработку ИИ агентов.

Комментарии (2)


  1. Per_Ardua
    19.02.2025 17:06

    Это связано с тем, что на момент написания статьи tool-calling, встроенный в LLM, ещё не существовал

    Это перевод? А где тогда плашка?


    1. ai-agent-dev Автор
      19.02.2025 17:06

      Извиняюсь, видимо ввёл в заблуждение. Имелась здесь в виду эта оригинальная статья с теорией, в которой ввели понятие Re-Act агента - https://arxiv.org/abs/2210.03629.
      Но моя статья не является её переводом.