- BrainTools - https://www.braintools.ru -
Что такое Re-Act? Re-Act (Reason + Act) – это парадигма, предлагающая объединить рассуждение и выполнение действий в работе языковой модели (ReAct: Synergizing Reasoning and Acting in Language Models [1]).
В отличие от других подходов построения агентов, где модель либо только рассуждает, либо выполняет только действия, либо сразу выдаёт ответ, Re-Act заставляет модель чередовать логические рассуждения с вызовами пользовательских функций (или инструментов – Tools) для взаимодействия с внешним миром. Модель генерирует последовательность мыслей и действий, постепенно продвигаясь к решению задачи. Такое сочетание позволяет ИИ одновременно обдумывать решение и при необходимости обращаться к инструментам или внешним данным.
Небольшой дисклеймер: Re-Act не является серебряной пулей построения ИИ агентов, каким-то единственным правильным подходом, скорее является одним из многих. В конце статьи я приведу ссылки на примеры других подходов.
Языковая модель (LLM) – «мозг» агента, который генерирует шаги решения. Она выпускает мысли (reasoning traces) и указывает действия для выполнения
Инструменты (Tools) – внешние функции или API, которые агент может вызывать для получения информации или выполнения операций. Например, поиск в интернете, вычисления, работа с базой данных и пр. Инструменты регистрируются с именами и описаниями на естественном языке, чтобы модель знала, как ими пользоваться.
Исполнитель действий (Agent Executor) – принимает решение модели о действии, вызывает соответствующий инструмент и возвращает результат обратно модели. В контексте Re-Act этот компонент реализует цикл «мышление (Thought) → действие (Act) и наблюдение (Observe)».
Состояние агента (State) – накопленная история диалога и действий. Сюда входит запрос пользователя, сообщения модели (мысли/действия) и наблюдения (результаты инструментов). Состояние постоянно обновляется по мере выполнения шагов.
Получение запроса (Query). Агент принимает входное сообщение пользователя, которое становится исходным состоянием.
Генерация рассуждений и действия (Think). Языковая модель на основе текущего состояния генерирует вывод, состоящий из:
Thought: внутреннего рассуждения, где агент анализирует задачу и формирует план.
Action: указания на выполнение конкретного действия (например, вызов инструмента с определёнными аргументами).
Выполнение действия (Action). Если сгенерированный вывод содержит команду (например, Action: Search["query"]
), исполнитель вызывает соответствующий инструмент и получает результат.
Обновление состояния (Observation). Результат работы инструмента сохраняется как наблюдение и добавляется в историю взаимодействия, после чего цикл повторяется: обновлённое состояние передаётся модели для следующей итерации.
Завершение (END). Если модель сгенерировала финальный ответ (например, Answer: ...
), цикл прерывается и ответ возвращается пользователю.
Одной из ключевых особенностей архитектуры Re-Act является способность агента вести внутренний диалог, который мы обозначаем как «мысли» (Thoughts). Этот процесс включает следующие аспекты:
Анализ и планирование. Агент использует внутренние рассуждения для анализа входной информации, декомпозиции сложных задач на управляемые шаги и определения дальнейших действий. Можно рассматривать это как некий внутренний «брейншторм», где модель выстраивает план решения.
Примеры рассуждений:
Планирование: “Чтобы решить задачу, сначала нужно собрать исходные данные, затем выявить закономерности и, наконец, подготовить итоговый отчёт.”
Анализ: “Ошибка [2] указывает на проблему с соединением к базе данных, скорее всего, дело в неверных настройках доступа.”
Принятие решения: “Оптимальный вариант для пользователя с таким бюджетом – выбрать средний ценовой сегмент, так как он предлагает лучший баланс между ценой и качеством.”
Решение проблем: “Перед оптимизацией кода стоит измерить его производительность, чтобы понять, какие участки работают медленнее всего.”
Интеграция памяти [3]: “Так как пользователь ранее говорил, что предпочитает Python, примеры кода лучше приводить на этом языке.”
Саморефлексия: “Предыдущий подход оказался неэффективным. Попробую другую стратегию для достижения цели.”
Постановка целей: “Прежде чем приступить к задаче, необходимо определить критерии успешного выполнения.”
Приоритизация: “Перед тем как добавлять новые функции, нужно в первую очередь устранить критические уязвимости в безопасности.”
Давайте рассмотрим простейший пример работы 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
Переходя от теории к практике следует сказать, что практическая реализации в разных фреймворках отличается от той, которая была предложена в исходной статье, так как данная статья была опубликована относительно давно и развитие 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-агенты относительно просты в реализации, так как их логика [6] сводится к циклу «think-action-observation». Многие фреймворки (например, LangGraph) уже предлагают готовые реализации Re-Act.
Универсальность. Re-Act агенты применимы в самых разных доменах – от поиска информации до управления устройствами – благодаря возможности подключать необходимые инструменты.
Минусы:
Низкая эффективность в некоторых сценариях: Для каждого шага требуется отдельный вызов LLM, что делает решение медленным, долгим и дорогим при длинных цепочках. Каждое действие (вызов инструмента) сопровождается размышлением модели, увеличивая общее число обращений к модели.
Отсутствие глобального плана: Агент планирует только один шаг вперёд на каждой итерации. Из-за отсутствия целостного плана он может выбирать субоптимальные действия, заходить в тупики или повторяться. Это затрудняет решение задач, требующих стратегического обзора нескольких шагов сразу.
Ограниченная масштабируемость: Если у агента слишком много возможных инструментов или очень длинная история, ему становится трудно выбрать правильное следующее действие. Контекст и количество опций могут превышать способности единственной модели эффективно управлять ими, что снижает качество результатов.
Как я уже сказал, Re-Act не является единственным и самым лучшим способом построения ИИ агентов. Более того даже в официальной оригинальной статье приведены сравнения Re-Act и CoT и результаты показывают, что “ванильный” Re-Act далеко не всегда выигрывает.
Сейчас часто разрабатывают гибридные подходы, в которых используются вариации и комбинации несколько способов построения агентов. К примеру, LangGraph позволяет создавать произвольные графы агентов и мульти-агентных систем.
Приведу примеры и других способов построения агентов и промтинга, с которыми конкурирует или может быть совмещен Re-Act:
Chain-Of-Thought (CoT) – ссылка [7]
Self-Ask Prompting – ссылка [8]
Self-Discover – ссылка [9]
Tree-Of-Thought (ToT) – ссылка [10]
Language Agent Tree Search – ссылка [11]
Reflexion – ссылка [12]
MRKL Systems (Modular Reasoning, Knowledge and Language) – ссылка [13]
PAL (Program-aided Language Models) – ссылка [14]
Toolformer – ссылка [15]
Агенты с планированием:
Мульти-агентные системы (Multi-Agent Systems):
Не забудьте подписаться на мой 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
Нажмите здесь для печати.