- BrainTools - https://www.braintools.ru -

Устройство Re-Act ИИ агента

Что такое Re-Act? Re-Act (Reason + Act) – это парадигма, предлагающая объединить рассуждение и выполнение действий в работе языковой модели​ (ReAct: Synergizing Reasoning and Acting in Language Models [1]).

В отличие от других подходов построения агентов, где модель либо только рассуждает, либо выполняет только действия, либо сразу выдаёт ответ, 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). Этот процесс включает следующие аспекты:

  • Анализ и планирование. Агент использует внутренние рассуждения для анализа входной информации, декомпозиции сложных задач на управляемые шаги и определения дальнейших действий. Можно рассматривать это как некий внутренний «брейншторм», где модель выстраивает план решения.

  • Примеры рассуждений:

    • Планирование: “Чтобы решить задачу, сначала нужно собрать исходные данные, затем выявить закономерности и, наконец, подготовить итоговый отчёт.”

    • Анализ: “Ошибка [2] указывает на проблему с соединением к базе данных, скорее всего, дело в неверных настройках доступа.”

    • Принятие решения: “Оптимальный вариант для пользователя с таким бюджетом – выбрать средний ценовой сегмент, так как он предлагает лучший баланс между ценой и качеством.”

    • Решение проблем: “Перед оптимизацией кода стоит измерить его производительность, чтобы понять, какие участки работают медленнее всего.”

    • Интеграция памяти [3]: “Так как пользователь ранее говорил, что предпочитает 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

Детали реализации Re-Act агентов

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

Вот к примеру некоторые интересные детали реализации pre-build агента из библиотеки LangGraph:

  • LangGraph использует tool-calling (function-calling) технику (https://platform.openai.com/docs/guides/function-calling [4]), чтобы LLM принимали решение о вызове пользовательских функций, тогда как в статье для этого использовался промтинг и парсинг raw текста, который выдавала LLM в ответе. Это связано с тем, что на момент написания статьи tool-calling, встроенный в LLM, ещё не существовал. Сейчас же многие современные LLM (даже open source и on premise) специально обучены технике вызова функций (к примеру, tool calling в Qwen [5]).

  • LangGraph использует массив параметров для вызова tools вместо передачи всех параметров в виде одной большой строки. Опять же связано с ограничениями LLM, которые имелись на момент написания статьи.

  • LangGraph позволяет вызывать несколько tools за один раз.

  • Наконец, в статье явно генерировался этап Thought перед тем, как решать, какие инструменты вызывать. Это является частью Reasoning в Re-Act. LangGraph по умолчанию этого не делает, главным образом потому, что возможности LLM значительно улучшились, и это уже не так необходимо.

Плюсы и минусы Re-ACt

Re-Act не является универсальным решением и имеет свои плюсы и минусы.

Плюсы:

  • Гибкое пошаговое решение. Агент самостоятельно планирует и осуществляет серию действий. Он может выбирать из множества инструментов и выполнять несколько шагов, сохраняя при этом контекст с помощью памяти​. Это позволяет динамически решать сложные проблемы, разбивая их на подзадачи.

  • Простота разработки: Re-Act-агенты относительно просты в реализации, так как их логика [6] сводится к циклу «think-action-observation». Многие фреймворки (например, LangGraph) уже предлагают готовые реализации Re-Act.

  • Универсальность. Re-Act агенты применимы в самых разных доменах – от поиска информации до управления устройствами – благодаря возможности подключать необходимые инструменты.

Минусы:

  • Низкая эффективность в некоторых сценариях: Для каждого шага требуется отдельный вызов LLM, что делает решение медленным, долгим и дорогим при длинных цепочках. Каждое действие (вызов инструмента) сопровождается размышлением модели, увеличивая общее число обращений к модели​.

  • Отсутствие глобального плана: Агент планирует только один шаг вперёд на каждой итерации​. Из-за отсутствия целостного плана он может выбирать субоптимальные действия, заходить в тупики или повторяться. Это затрудняет решение задач, требующих стратегического обзора нескольких шагов сразу.

  • Ограниченная масштабируемость: Если у агента слишком много возможных инструментов или очень длинная история, ему становится трудно выбрать правильное следующее действие. Контекст и количество опций могут превышать способности единственной модели эффективно управлять ими​, что снижает качество результатов.

Примеры других подходов построения агентов

Как я уже сказал, Re-Act не является единственным и самым лучшим способом построения ИИ агентов. Более того даже в официальной оригинальной статье приведены сравнения Re-Act и CoT и результаты показывают, что “ванильный” Re-Act далеко не всегда выигрывает.

Сейчас часто разрабатывают гибридные подходы, в которых используются вариации и комбинации несколько способов построения агентов. К примеру, LangGraph позволяет создавать произвольные графы агентов и мульти-агентных систем.

Приведу примеры и других способов построения агентов и промтинга, с которыми конкурирует или может быть совмещен Re-Act:

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

Автор: ai-agent-dev

Источник [26]


Сайт-источник BrainTools: https://www.braintools.ru

Путь до страницы источника: https://www.braintools.ru/article/12346

URLs in this post:

[1] ReAct: Synergizing Reasoning and Acting in Language Models: https://arxiv.org/abs/2210.03629

[2] Ошибка: http://www.braintools.ru/article/4192

[3] памяти: http://www.braintools.ru/article/4140

[4] https://platform.openai.com/docs/guides/function-calling: https://platform.openai.com/docs/guides/function-calling

[5] tool calling в Qwen: https://qwen.readthedocs.io/en/latest/framework/function_call.html#qwen2-5-function-calling-templates

[6] логика: http://www.braintools.ru/article/7640

[7] ссылка: https://arxiv.org/abs/2201.11903#:~:text=,parameter

[8] ссылка: https://arxiv.org/abs/2210.03350#:~:text=the%20compositionality%20gap%20by%20reasoning,questions%2C%20which%20additionally%20improves%20accuracy

[9] ссылка: https://arxiv.org/abs/2402.03620

[10] ссылка: https://arxiv.org/abs/2305.10601#:~:text=initial%20decisions%20play%20a%20pivotal,significantly%20enhances%20language%20models%27%20problem

[11] ссылка: https://arxiv.org/abs/2310.04406

[12] ссылка: https://arxiv.org/abs/2303.11366

[13] ссылка: https://arxiv.org/abs/2205.00445

[14] ссылка: https://arxiv.org/abs/2211.10435

[15] ссылка: https://arxiv.org/abs/2302.04761

[16] ссылка 1: https://arxiv.org/abs/2305.04091

[17] ссылка 2: https://langchain-ai.github.io/langgraph/tutorials/plan-and-execute/plan-and-execute/

[18] ссылка 1,: https://langchain-ai.github.io/langgraph/tutorials/rewoo/rewoo/

[19] ссылка 2: https://arxiv.org/abs/2305.18323

[20] ссылка 1: https://langchain-ai.github.io/langgraph/tutorials/llm-compiler/LLMCompiler/

[21] ссылка 2: https://arxiv.org/abs/2312.04511

[22] ссылка: https://langchain-ai.github.io/langgraph/tutorials/multi_agent/multi-agent-collaboration/

[23] ссылка: https://langchain-ai.github.io/langgraph/tutorials/multi_agent/agent_supervisor/

[24] ссылка: https://langchain-ai.github.io/langgraph/tutorials/multi_agent/hierarchical_agent_teams/

[25] подписаться на мой Telegram-канал: https://t.me/dev_ai_agents

[26] Источник: https://habr.com/ru/articles/882432/?utm_source=habrahabr&utm_medium=rss&utm_campaign=882432

www.BrainTools.ru

Рейтинг@Mail.ru
Rambler's Top100