Рис.1. Экосистема систем агентов на основе FM, аннотированных архитектурными шаблонами в серых полях
Описание паттернов будем вести от более простых к более сложным.
Пассивный Создатель Целей анализирует сформулированные пользователями цели через диалоговый интерфейс. Этот паттерн предоставляет повторяемое архитектурное решение, которое захватывает частичные и часто неоднозначные человеческие намерения, обогащает их и преобразует в четкие задачи для выполнения.
Когда пользователи обращаются к агентам для решения определенных проблем, они предоставляют соответствующий контекст и объясняют цели в своих промптах. В мультиагентных системах архитекторы могут применять Пассивного Создателя Целей или Проявляющего Инициативу Создателя Целей в зависимости от сценариев применения и требований к доступности.
Проблема: пользователи могут не обладать достаточным опытом взаимодействия с агентами, и предоставленная информация может быть неоднозначной для достижения целей. Это создает сложности при преобразовании расплывчатых запросов в конкретные задачи, которые могут быть выполнены системой.

Рисунок 3 иллюстрирует простое графическое представление Пассивного Создателя Целей. Агент на основе базовой модели предоставляет диалоговый интерфейс, где пользователи могут напрямую указывать контекст и проблемы, которые передаются Пассивному Создателю Целей для определения целей.
Пассивный Создатель Целей также может извлекать связанную информацию из памяти, включая:
Эта информация добавляется к пользовательскому промпту для поиска целей. Сформированные цели передаются другим компонентам для дальнейшей декомпозиции задачи и ее завершения. В этом случае агент пассивно получает входные данные от пользователей и генерирует стратегии для уточнения и прояснения целей пользователей, так как получает только контекстную информацию, непосредственно предоставленную пользователями.
Важно отметить, что в мультиагентных системах один агент может отправлять промпты, вызывая API другого агента для назначения конкретной задачи, в то время как последний анализирует полученную информацию и определяет цель. Пассивный Создатель Целей сначала обрабатывает входные данные пользователей и передает цели и соответствующую контекстную информацию Оптимизатору Промптов/Ответов для уточнения промпта.
Преимущества
Недостатки
Известные применения
Связанные паттерны
Пример в общем домене (Система поддержки клиентов)
В мультиагентной системе обслуживания клиентов Пассивный Создатель Целей реализован как центральный компонент, принимающий запросы от пользователей. Когда клиент пишет: "Мне не пришел заказ №12345", система:
Эта цель затем передается агенту логистики и агенту коммуникации для выполнения. Система демонстрирует интерактивность и эффективность, преобразуя расплывчатый запрос в конкретные действия без дополнительных уточняющих вопросов к клиенту.
Пример в разработке AI агента для кодинга (Мультиагентная система разработки ПО)
В мультиагентной системе программирования, такой как гипотетический "CodeArchitect AI", Пассивный Создатель Целей может быть реализован следующим образом:
Когда разработчик отправляет запрос: "Оптимизируй этот код для обработки больших данных", система:
Эта цель передается:
Система демонстрирует, как Пассивный Создатель Целей преобразует общий запрос в конкретную техническую задачу, учитывая контекст проекта и историю разработки, что особенно ценно в сложных сценариях программирования, где точное определение целей критически важно для успешной реализации. Этот подход позволяет разработчикам формулировать запросы на естественном языке, в то время как система сама определяет технические детали реализации.
Проактивный создатель целей предвосхищает цели пользователей путем анализа человеческих взаимодействий и сбора контекстной информации с помощью соответствующих инструментов.
Пользователи формулируют цели, которых должен достичь агент, в текстовом запросе.
Проблема: Контекстная информация, собранная исключительно через диалоговый интерфейс, может быть недостаточной, что приводит к неточным ответам на запросы пользователей.
Силы, влияющие на паттерн:

На Рисунке 4 представлена графическая схема работы проактивного создателя целей. Помимо обработки текстовых запросов через диалоговый интерфейс и данных из памяти, паттерн предполагает:
Преимущества:
• Интерактивность: Агент взаимодействует с пользователями или другими агентами, предвосхищая их решения на основе мультимодальных данных.
• Точность целей: Дополнительные данные (жесты, визуальный контекст) повышают точность определения целей и их выполнения.
• Доступность: Инструменты сбора данных (например, анализ мимики или движений) делают систему доступной для людей с ограниченными возможностями.
Недостатки:
• Накладные расходы:
Известные примеры применения:
• GestureGPT: Расшифровывает описания жестов пользователя для определения его намерений.
• Инструмент анализа программных скринкастов: Извлекает шаги кодирования и сниппеты из видеозаписей экрана.
• ProAgent: Наблюдает за действиями других агентов в команде, определяет их цели и корректирует собственный план.
Связанные паттерны:
• Пассивный создатель целей: Проактивный создатель является его альтернативой с поддержкой мультимодального контекста.
• Оптимизатор запросов/ответов: Проактивный создатель передаёт уточнённые цели и контекст этому паттерну для улучшения промптов.
• Мультимодальные защитные барьеры: Обрабатывают данные, собранные проактивным создателем.
Пример реализации в мультиагентных системах Общая предметная область
Умный дом с проактивным контролем
Пример: Агент-помощник в IDE
for с операцией if внутри агент замечает повторяющийся шаблон и предлагает вынести условие в отдельную функцию. Пример из практики:
В системе, подобной ProAgent, агент для разработки кода наблюдает за действиями коллег-агентов:
Ключевые рекомендации для реализации
Этот паттерн особенно эффективен в сценариях, где пользователь не может или не хочет детально описывать цели (например, в условиях стресса или ограниченной моторики), а также в сложных системах, где взаимодействие агентов требует глубокого понимания контекста.
Оптимизатор запросов/ответов улучшает запросы и ответы в соответствии с желаемым содержанием и форматом входных или выходных данных.
Пользователи могут испытывать трудности при написании эффективных запросов, особенно учитывая необходимость включения подробного контекста. Аналогично, в некоторых случаях пользователям может быть сложно понять выводы агента.
Проблема: Как генерировать эффективные запросы и стандартизированные ответы, соответствующие целям или задачам пользователей?

Рис. 5 иллюстрирует графическое представление оптимизатора запросов/ответов. Пользователь вводит исходный запрос, который может быть неэффективным из-за отсутствия контекста, избыточности или направленным на поиск уязвимостей (например, с инъекций). Оптимизатор формирует уточнённые запросы и ответы, соответствующие предопределённым ограничениям и спецификациям. Эти ограничения описывают желаемое содержание и формат, обеспечивая соответствие целям.
Шаблон запроса часто выступает в роли «фабрики» для создания конкретных экземпляров запросов/ответов. Он включает:
Пример структуры шаблона:
Инструкция: -------
Пример: ---------
Вопрос: ---------
Преимущества:
Недостатки:
Известные реализации:
Связанные паттерны:
Общий домен: Система поддержки клиентов
Сценарий: Пользователь отправляет расплывчатый запрос: «У меня не работает интернет».
Как работает оптимизатор:
Шаг 1. Агент-оптимизатор анализирует историю взаимодействия (например, пользователь ранее жаловался на обрывы связи по вечерам).
Шаг 2. Формирует структурированный запрос для технического агента:
Инструкция: Диагностируй проблему с интернет-соединением, используя логи за последние 24 часа.
Контекст: Пользователь сообщал о проблемах в 19:00–22:00. Текущий статус: пинг 300 мс, пакеты теряются.
Вопрос: Какие действия предпринять для стабилизации соединения?
Шаг 3. Технический агент возвращает стандартизированный ответ в формате JSON:
{
"рекомендации": ["перезагрузить роутер", "проверить кабель"],
"приоритет": "высокий"
}
Результат: Система избегает двусмысленности, а ответ автоматически интегрируется в CRM.
Пример из разработки AI-агента для кодинга (Software Engineering)
Сценарий: Пользователь просит: «Исправь баг в функции sort_data».
Как работает оптимизатор:
sort_data с ошибкой TypeError: 'NoneType' object is not iterable. Инструкция: Исправь функцию sort_data, обработав случай пустого ввода.
Пример:
Ввод: [] → Ожидаемый вывод: []
Ввод: [3, 1] → Ожидаемый вывод: [1, 3]
Код функции:
def sort_data(arr):
return sorted(arr) # Ошибка при arr = None
Вопрос: Как модифицировать функцию для обработки None и пустых списков? def sort_data(arr):
if arr is None:
return []
return sorted(arr) Результат:
None. Дополнительная реализация в мультиагентной системе:
Ключевые особенности для разработки
Этот паттерн особенно эффективен в системах, где агенты взаимодействуют через API с чёткими контрактами (например, микросервисы), так как стандартизация запросов снижает количество ошибок на стыке компонентов.
Техники расширенного генерирования с извлечением (RAG) повышают способность агентов к обновлению знаний для достижения целей и обеспечивают сохранение конфиденциальности данных в реализациях агентов и систем на основе локальных базовых моделей.
Агенты, построенные на крупных базовых моделях, не обладают знаниями, специфичными для конкретных предметных областей — особенно если речь идёт о высококонфиденциальных или приватных локальных данных, — если только они не были дообучены (fine-tuned) с использованием данных этой области. Стандартные модели полагаются исключительно на знания, полученные во время предварительного обучения, что делает их непригодными для задач, требующих актуальной или защищённой информации.
Перед лицом конкретной задачи как может агент проводить рассуждения, используя данные или знания, которые не были усвоены базовой моделью в процессе её обучения?
Факторы

На Рисунке 6 представлена графическая схема паттерна RAG. RAG — это техника, позволяющая повысить точность и достоверность выводов агента за счёт фактов, извлекаемых из внешних источников (локальных или онлайн-баз данных). Пробелы в знаниях, отсутствующих в памяти агента, заполняются за счёт параметризованных знаний, хранящихся в векторных базах данных.
Например, после генерации плана действия могут возникнуть подзадачи, требующие информации, не содержащейся в изначальной памяти агента. Агент может извлечь необходимые данные из векторного хранилища и использовать их для завершения задачи, после чего сформировать оптимизированный ответ для пользователя.
Реализация RAG включает следующие шаги:
Процесс извлечения не требует дообучения или переобучения модели, что обеспечивает сохранение конфиденциальности локальных данных, снижает затраты на обучение и позволяет использовать актуальные, точные данные. Извлечённые данные могут передаваться агенту через промпты (с учётом ограничений размера контекстного окна), после чего агент обрабатывает их методом in-context learning.
Существует множество разновидностей RAG, ориентированных на различные аспекты улучшения, источники данных и приложения, такие как:
Преимущества:
Недостатки:
Известные примеры использования:
Общий пример: Мультиагентная система поддержки клиентов
Сценарий:
Компания предоставляет техническую поддержку через AI-агентов. У неё есть база знаний с документацией, FAQ, журналами изменений и внутренними руководствами.
Реализация:
retrieve_knowledge, передавая запрос в виде текста.Пример в разработке ПО: AI-агент для кодинга (Software Engineering Agent)
Сценарий:
AI-агент помогает разработчику рефакторить устаревший модуль Python, используя внутреннюю документацию компании и историю коммитов.
Архитектура:
auth.py, сделав его совместимым с новым API авторизации."reflect, чтобы зафиксировать гипотезу: "Необходимо изучить спецификацию нового API и текущую реализацию."retrieve_knowledge с запросом: "API specification v2 auth endpoint" и "best practices for JWT handling in Python".auth.py, добавляет комментарии и ссылки на источники.Дополнительно:
Можно реализовать Graph RAG, где связи между компонентами системы (например, микросервисами) представлены в виде графа. Это позволяет агенту понимать зависимости и предлагать безопасные изменения.
Интеграция с системой управления знаниями (аналог Dialogflow / Bedrock)
Сравнение с облачными решениями:
KNOWLEDGE_BASE_RESPONSE_GENERATION, что позволяет явно контролировать, когда и как происходит извлечение знаний.Связанные паттерны:
RAG может дополнять все остальные паттерны, предоставляя дополнительный контекст из локального хранилища. Особенно эффективно сочетание с:
reflect.RAG — ключевой паттерн в современных мультиагентных системах, особенно когда важны конфиденциальность, актуальность и специфичность знаний. Его реализация позволяет строить гибкие, безопасные и эффективные AI-решения как в общих, так и в технических доменах, таких как разработка программного обеспечения.
Фундаментальная модель используется в одном экземпляре для генерации всех необходимых шагов плана.
Когда пользователи взаимодействуют с агентом для достижения конкретных целей, встроенные фундаментальные модели запрашиваются для генерации плана.
Проблема: как агент может эффективно генерировать шаги плана?
Факторы • Эффективность. Для определенных срочных задач агент должен быть способен проводить планирование и отвечать в короткие сроки. • Накладные расходы. Пользователи должны платить за каждое взаимодействие с коммерческими фундаментальными моделями.

Рис. 7. Однократный запрос к модели.
Рисунок 7 иллюстрирует взаимодействие между пользователем и агентом в рамках паттерна однократного запроса к модели. В данном сценарии агент запрашивает встроенную фундаментальную модель для генерации соответствующего плана на основе целей и ограничений, указанных пользователем. Фундаментальная модель запрашивается только один раз в отношении требований пользователя (например, ограниченный бюджет), чтобы понять предоставленные входные данные. Таким образом, агент может разработать многошаговый план для достижения общей цели и предоставить целостное объяснение этого плана без углубления в детальные шаги рассуждений. Обратите внимание, что этот паттерн применим, когда другие компоненты запрашивают интегрированную фундаментальную модель.
Преимущества: • Эффективность. Агент может генерировать план для достижения целей пользователей, запросив базовую фундаментальную модель только один раз, что экономит время. • Экономическая эффективность. Расходы пользователей могут быть снижены, поскольку фундаментальная модель запрашивается один раз. • Простота. Однократный запрос к модели может удовлетворить задачи, которые не требуют сложных планов действий.
Недостатки: • Упрощение. Для сложных задач однократный запрос к модели может не в состоянии полностью уловить все требования за один раз, поэтому упрощает задачи и не может вернуть правильный ответ. • Отсутствие объяснимости. Однократный запрос к модели может страдать отсутствием объяснимости, поскольку встроенная фундаментальная модель запрашивается только один раз, что может не обеспечить детальных шагов рассуждений для генерации плана. • Размер окна контекста. Качество ответа может быть ограничено с учетом текущих возможностей фундаментальных моделей обрабатывать длинные разговорные контексты и ограничений по токенам.
Однократный запрос к модели можно рассматривать как конфигурацию или использование по умолчанию, когда пользователь использует фундаментальную модель, в то время как Chain of Thought (CoT) и Zero-shot-CoT являются примерами этого паттерна.
Связанные паттерны: • Пошаговый запрос к модели (Incremental model querying). Пошаговый запрос к модели можно рассматривать как альтернативу однократному запросу к модели с итерациями. • Генератор плана с одним путем (Single-path plan generator). Однократный запрос к модели позволяет генерировать планы с одним путем, запрашивая фундаментальную модель только один раз. • Мультимодальные ограничения (Multimodal guardrails). Мультимодальные ограничения служат промежуточным слоем, управляющим входами и выходами запросов к модели.
Пример: cистема планирования путешествий
Представьте мультиагентную систему для планирования путешествий, где пользователь запрашивает "Спланируй 7-дневное путешествие в Париж с бюджетом 2000 евро".
Агент-планировщик использует паттерн однократного запроса к модели:
Пример реализации на Python:
def plan_trip(user_query):
prompt = f"""
Сгенерируй детальный 7-дневный план путешествия в Париж с бюджетом 2000 евро.
Верни результат в YAML формате со следующей структурой:
plan:
budget: [общий бюджет]
daily_budget: [ежедневный бюджет]
days:
- day: 1
morning:
activity: [название]
cost: [стоимость]
location: [местоположение]
afternoon: {...}
evening: {...}
- day: 2
...
Дополнительные примечания:
- Убедись, что общий бюджет не превышает 2000 евро
- Включи как минимум одну достопримечательность каждый день
- Распределение бюджета должно быть сбалансированным
"""
# Однократный запрос к модели
response = llm.generate(prompt)
# Парсинг YAML ответа с защитой от ошибок
try:
trip_plan = yaml.safe_load(response)
return trip_plan
except yaml.YAMLError:
# Применение техник, подобных описанным в статье LinkedIn
# для исправления типичных ошибок форматирования
fixed_response = fix_yaml_errors(response)
return yaml.safe_load(fixed_response)
Пример: система поддержки клиентов
В системе поддержки клиентов агент использует однократный запрос для генерации полного сценария ответа на запрос клиента "Как мне вернуть товар, купленный 2 недели назад?"
Агент формирует один запрос к модели, который включает:
Пример реализации защиты от ошибок, как в случае с LinkedIn:
def generate_customer_response(query, order_data):
prompt = f"""
На основе следующей информации сгенерируй ответ клиенту о возврате товара:
Политика возврата:
- Возврат возможен в течение 30 дней с даты покупки
- Товар должен быть в оригинальной упаковке
- Необходимо предоставить чек
Информация о заказе:
{json.dumps(order_data, indent=2)}
Верни ответ в следующем YAML формате:
response:
greeting: "Текст приветствия"
policy_explanation: "Объяснение политики возврата применительно к этому случаю"
steps:
- "Шаг 1"
- "Шаг 2"
- "Шаг 3"
closing: "Заключительный текст"
estimated_time: "Ожидаемое время обработки"
"""
response = llm.generate(prompt)
# Реализация защитного парсера
# Анализируем типичные ошибки и пытаемся их исправить
if not is_valid_yaml(response):
response = apply_yaml_fixes(response, expected_schema)
return parse_yaml_safely(response)
Пример: агент для генерации функций
AI агент для программирования использует однократный запрос к модели для генерации полной функции на основе спецификации пользователя.
Пример запроса: "Напиши функцию на Python, которая преобразует дату из формата MM/DD/YYYY в YYYY-MM-DD, с проверкой корректности даты."
def generate_code_function(specification):
prompt = f"""
Ты - опытный разработчик Python. Напиши функцию, соответствующую следующей спецификации:
{specification}
Верни результат в следующем YAML формате:
code:
function_name: "Имя функции"
imports: ["Список необходимых импортов"]
code: |
def {function_name}(date_str):
# Реализация функции
...
test_cases:
- input: "Пример входного значения"
expected_output: "Ожидаемый результат"
- input: ...
expected_output: ...
explanation: "Краткое объяснение логики функции"
Требования:
- Функция должна включать проверку корректности даты
- Добавь комментарии к сложным частям кода
- Предоставь как минимум 3 тестовых случая
"""
response = llm.generate(prompt)
# Применение защитного YAML-парсера
try:
result = yaml.safe_load(response)
# Дополнительная проверка структуры
if not validate_code_schema(result):
result = fix_code_schema(result, specification)
return result
except Exception as e:
# Анализируем ошибки и применяем исправления
fixed_response = linkedin_style_yaml_fixer(response)
return yaml.safe_load(fixed_response)
Агент для рефакторинга кода
AI агент для рефакторинга кода использует однократный запрос для генерации улучшенной версии кода с объяснением изменений.
Пример использования:
def refactor_code(original_code, requirements):
prompt = f"""
Ты - senior Python разработчик. Проведи рефакторинг следующего кода:
Исходный код:
{original_code}
Требования к рефакторингу:
{requirements}
Верни результат в YAML формате:
refactored:
code: |
# Полный отрефакторенный код
changes:
- description: "Описание изменения 1"
reason: "Причина изменения"
before: "Фрагмент исходного кода"
after: "Фрагмент измененного кода"
- description: ...
improvements:
- "Улучшение 1 (производительность)"
- "Улучшение 2 (читаемость)"
- ...
potential_issues:
- "Возможная проблема 1"
- ...
tests_needed:
- "Тестовый случай, который нужно добавить"
ВАЖНО:
- Сохрани функциональность исходного кода
- Улучши читаемость и поддерживаемость
- Добавь комментарии там, где это необходимо
- Не изменяй входные и выходные интерфейсы функции
"""
response = llm.generate(prompt)
# Реализация защиты от ошибок форматирования
# Как описано в статье LinkedIn (сокращение ошибок с ~10% до ~0.01%)
safe_response = defensive_yaml_parser(response)
return yaml.safe_load(safe_response)
Инкрементальный запрос модели предполагает взаимодействие с базовой моделью на каждом этапе процесса генерации плана.
Когда пользователи взаимодействуют с агентом для достижения конкретных целей, встроенная базовая модель запрашивается для генерации плана.
Проблема: Базовая модель может не сформировать корректный ответ с первой попытки. Как агенту обеспечить точный процесс рассуждений?
Факторы

Рис. 8. Incremental Model Querying
На рисунке 8 показано взаимодействие между компонентом генерации плана и интегрированной базовой моделью с использованием инкрементального запроса модели. Агент может вести пошаговый процесс рассуждений для разработки плана достижения цели с помощью множественных запросов к базовой модели. При этом пользователь может в любой момент предоставить обратную связь как по процессу рассуждений, так и по сгенерированному плану, что позволяет вносить соответствующие корректировки в процессе запроса модели. Количество запросов может быть предопределено в конфигурации агента или указано в пользовательском промпте. Следует отметить, что инкрементальный запрос модели может опираться на повторно используемый шаблон, который направляет процесс через внедрение контекста или явную систему управления репозиторием рабочих процессов/планов. Этот паттерн применим, когда другие компоненты запрашивают интегрированную базовую модель.
Преимущества:
Недостатки:
Известные применения:
Связанные паттерны:
Пример в общем домене мультиагентных систем
Система с двойной проверкой ответов: Даже небольшие инкрементальные шаги, такие как добавление второго агента для перепроверки ответов или обработки определенного подмножества запросов, могут значительно повысить производительность системы. Например, в системе обслуживания клиентов первый агент генерирует ответ на запрос, а второй агент анализирует его на соответствие политике компании и корректность информации перед отправкой пользователю.
Адаптивная маршрутизация запросов: Центральный агент-роутер распределяет задачи между специализированными агентами, где каждый последующий запрос к модели уточняет детали на основе предыдущих результатов. Например, в системе анализа рынка первый запрос определяет основные тренды, второй — сегментирует аудиторию, третий — формирует рекомендации на основе собранных данных.
** Примеры в разработке AI агентов для кодинга (Software Engineering)
Взаимопроверка агентов: В мультиагентной системе разработки кода один агент генерирует решение задачи, а второй агент проверяет его на наличие ошибок, соответствие стандартам и оптимальность. Этот процесс повторяется итеративно до достижения приемлемого качества кода. Например, агент-разработчик создает функцию обработки данных, а агент-тестировщик генерирует тестовые случаи и запрашивает улучшения у первого агента.
Итеративное улучшение через исполнение кода: Как в EcoAssistant, система запрашивает базовую модель для генерации кода, затем выполняет его в изолированной среде, анализирует результаты и возвращает ошибки или узкие места обратно в модель для уточнения следующей итерации. Например, при генерации алгоритма сортировки модель сначала предоставляет базовую реализацию, система запускает ее на тестовых данных, обнаруживает переполнение стека при больших объемах данных и запрашивает у модели оптимизированную версию.
Замкнутый цикл оптимизации: В процессе разработки сложных систем, таких как компиляторы или фреймворки, агенты используют инкрементальный запрос модели для последовательного улучшения архитектуры. Первый запрос генерирует общую структуру модулей, второй — детали взаимодействия, третий — обработку крайних случаев, при этом на каждом этапе система может запрашивать обратную связь у разработчиков.
Генерация и верификация тестов: Агент для тестирования ПО сначала запрашивает у модели генерацию тестовых сценариев, затем запускает их, анализирует покрытие кода и возвращает информацию о непокрытых участках для генерации дополнительных тестов в следующей итерации. Это особенно полезно в системах непрерывной интеграции, где требуется поддержание высокого качества кода при частых изменениях.
Эти примеры демонстрируют, как паттерн инкрементального запроса модели повышает точность, объяснимость и надежность мультиагентных систем как в общих задачах, так и в специфических сценариях разработки программного обеспечения.
Генератор линейного плана координирует генерацию промежуточных шагов, ведущих к достижению цели пользователя.
Агент воспринимается пользователями как «чёрный ящик», при этом им важно понимать процесс достижения их целей.
Проблема: как агент может эффективно формулировать стратегии для достижения целей пользователей?

Рис. 9. Single-path plan generator.
На рис. 9 показано графическое представление генератора линейного плана. После анализа цели пользователя он координирует создание плана для других агентов или инструментов, определяя последовательность шагов. Каждый шаг имеет только один последующий, формируя линейный путь (например, Chain-of-Thought, CoT). Для повышения надёжности используется самосогласованность: основная модель опрашивается несколько раз, и выбирается наиболее согласованный результат. Детализация плана зависит от сложности задачи — например, сложные сценарии могут включать комбинацию рабочих процессов и мелких шагов.
Преимущества:
Недостатки:
Известные применения:
Связанные паттерны:
Пример: Организация международной конференции
Сценарий: Пользователь просит: «Организуй конференцию по ИИ в Амстердаме для 200 участников».
Как работает паттерн:
Пример разработка AI-агента для кодинга: Генерация Full-Stack приложения
Сценарий: Пользователь запрашивает: «Создай приложение для управления задачами с авторизацией и API».
Как работает паттерн:
Почему это соответствует паттерну:
В обоих примерах генератор линейного плана выступает «дирижёром», преобразуя абстрактную цель в последовательность атомарных задач. Это снижает когнитивную нагрузку на пользователей и обеспечивает прозрачность процесса, но требует тщательной проработки начальных этапов для избежания каскадных ошибок.
Генератор многоходовых планов позволяет создавать несколько вариантов выбора на каждом промежуточном шаге, ведущем к достижению целей пользователей.
Агент рассматривается пользователями как "черный ящик", в то время как пользователи могут быть заинтересованы в процессе, каким образом агент достигает поставленных целей. Пользователи хотят понимать и, возможно, влиять на промежуточные этапы решения задачи, а не только получать конечный результат.
Как агент может генерировать высококачественное, согласованное и эффективное решение, учитывая комплексность и разнообразие, когда ему поставлена сложная задача или проблема?
Факторы • Недоопределенность. Пользователи могут ставить задачи с высоким уровнем абстракции, что может быть сложным для агентов в обработке неопределенности или неоднозначности в предоставленном контексте. • Согласованность. Пользователи и другие взаимодействующие инструменты/агенты будут ожидать согласованных ответов или руководств по достижению определенных целей. • Соответствие человеческим предпочтениям. Некоторые цели требуют от агентов учитывать предпочтения пользователей для предоставления персонализированных решений. • Упрощение. Для определенных сложных задач агенты могут чрезмерно упрощать процесс рассуждений, поэтому предоставленные решения не могут удовлетворить требования пользователей.

Рис. 10. Генератор многоходовых планов.
Рисунок 10 иллюстрирует графическое представление высокого уровня генератора многоходовых планов. Основываясь на генераторе одноходовых планов, генератор многоходовых планов может создавать несколько вариантов выбора на каждом шаге к достижению целей, что требует от базовой модели выделить приемлемые и выполнимые действия для каждого выбора на предыдущем шаге. В частности, предпочтения пользователей могут влиять на последующие промежуточные шаги, что приводит к различным конечным планам. Задействованные агенты и инструменты будут корректироваться соответствующим образом. Tree-of-Thoughts является примером этого шаблона проектирования.
Преимущества: • Определенность рассуждений. Генератор многоходовых планов может создавать план с несколькими вариантами промежуточных шагов для разрешения неопределенности или неоднозначности в процессе рассуждений. • Согласованность. Взаимодействующие пользователи, агенты и инструменты получают четкий и последовательный путь к конечным целям. • Соответствие человеческим предпочтениям. Пользователи могут подтверждать каждый промежуточный шаг для окончательного планирования, поэтому человеческие предпочтения включаются в сгенерированную персонализированную стратегию. • Всеобъемлющность. Агент может определить несколько направлений в процессе рассуждений для сложных задач.
Недостатки: • Накладные расходы. Декомпозиция задачи и генерация множества планов могут увеличить коммуникационные накладные расходы между пользователем и агентом.
Известные применения: • AutoGPT. AutoGPT может принимать обоснованные решения, включая Tree-of-Thoughts в качестве генератора многоходовых планов. • Gemini. Для задачи Gemini может генерировать несколько вариантов для выбора пользователями. Получив ответы пользователей, Gemini предоставит несколько вариантов для следующего шага. • Open AI. GPT-4 был использован для реализации генератора многоходовых планов на основе Tree-of-Thoughts.
Связанные паттерны: • Инкрементальный запрос к модели. Агент может фиксировать предпочтения пользователей на каждом шаге и генерировать многоходовые планы путем итеративного запроса к базовой модели. • Генератор одноходовых планов. Генератор многоходовых планов можно рассматривать как альтернативу генератору одноходовых планов для персонализированной стратегии. • Человеческая рефлексия. Генератор многоходовых планов создает планы с различными направлениями, и человеческая рефлексия может помочь окончательно определить план с обратной связью от пользователя для выбора каждого промежуточного шага.
Финансовый консультационный агент
Рассмотрим систему, где мультиагентная система помогает пользователю анализировать финансовую отчетность компании Uber за разные кварталы 2022 года. В этом случае генератор многоходовых планов может предложить следующие варианты на каждом этапе:
Шаг 1: Определение целей анализа
Шаг 2: Выбор источников данных (после выбора Варианта B)
Шаг 3: Глубина анализа (после выбора Варианта C)
В системе на основе LlamaIndex, как описано в примере fine-tuning ReAct агента, агент может генерировать несколько путей анализа финансовых отчетов. Например, при запросе "Какие факторы негативно повлияли на бизнес Uber в 2022 году?" агент может предложить:
Каждый из этих путей может быть детализирован дальше с предложением пользователю выбрать конкретные аспекты для углубленного изучения.
Система рефакторинга кода с несколькими вариантами оптимизации
Рассмотрим AI агента, помогающего разработчикам оптимизировать код. При получении задачи "Оптимизируй этот алгоритм поиска", генератор многоходовых планов может предложить:
Шаг 1: Определение направления оптимизации
Шаг 2: Выбор конкретной техники (после выбора Варианта A)
Шаг 3: Реализация выбранной техники (после выбора Варианта A)
Пример реализации на основе ThinkGPT:
from thinkgpt.llm import ThinkGPT
import json
llm = ThinkGPT(model_name="gpt-4")
def generate_multi_path_plan(task_description):
"""Генерирует многоходовой план для задачи оптимизации кода"""
# Генерация нескольких вариантов на первом уровне
planning_prompt = f"""
Задача: {task_description}
Предложи 3 различных направления для оптимизации этого кода.
Для каждого направления опиши:
1. Основную идею оптимизации
2. Ожидаемые преимущества
3. Возможные риски или ограничения
Представь результат в формате JSON:
{{
"paths": [
{{
"id": "path_1",
"title": "Название первого пути",
"idea": "Основная идея",
"benefits": ["преимущество 1", "преимущество 2"],
"risks": ["риск 1", "риск 2"]
}},
{{
"id": "path_2",
"title": "Название второго пути",
"idea": "Основная идея",
"benefits": ["преимущество 1", "преимущество 2"],
"risks": ["риск 1", "риск 2"]
}},
{{
"id": "path_3",
"title": "Название третьего пути",
"idea": "Основная идея",
"benefits": ["преимущество 1", "преимущество 2"],
"risks": ["риск 1", "риск 2"]
}}
]
}}
"""
response = llm.predict(planning_prompt)
try:
return json.loads(response)
except:
# В случае ошибки парсинга, попробуем извлечь JSON из текста
import re
json_match = re.search(r'\{[\s\S]*\}', response)
if json_match:
return json.loads(json_match.group(0))
return {"error": "Не удалось распарсить ответ"}
def generate_detailed_plan(selected_path, task_description):
"""Генерирует детальный план для выбранного направления"""
detailed_prompt = f"""
Задача: {task_description}
Выбранное направление: {selected_path['title']}
Предложи 3 различных способа реализации этой оптимизации.
Для каждого способа опиши:
1. Подробное описание подхода
2. Пример кода до и после оптимизации
3. Оценка сложности реализации (низкая/средняя/высокая)
Представь результат в формате JSON:
{{
"implementation_options": [
{{
"id": "option_1",
"approach": "Описание подхода",
"before_code": "Пример кода до",
"after_code": "Пример кода после",
"complexity": "низкая/средняя/высокая"
}},
...
]
}}
"""
response = llm.predict(detailed_prompt)
try:
return json.loads(response)
except:
import re
json_match = re.search(r'\{[\s\S]*\}', response)
if json_match:
return json.loads(json_match.group(0))
return {"error": "Не удалось распарсить ответ"}
# Пример использования
task = "Оптимизируй алгоритм поиска в большом массиве данных (1 млн элементов)"
multi_path_plan = generate_multi_path_plan(task)
print("Доступные направления оптимизации:")
for path in multi_path_plan["paths"]:
print(f"- {path['id']}: {path['title']}")
print(f" Идея: {path['idea']}")
print(f" Преимущества: {', '.join(path['benefits'])}")
print(f" Риски: {', '.join(path['risks'])}")
print()
# Предположим, пользователь выбрал первый путь
selected_path = multi_path_plan["paths"][0]
detailed_plan = generate_detailed_plan(selected_path, task)
print(f"Детали для {selected_path['title']}:")
for option in detailed_plan["implementation_options"]:
print(f"- Вариант {option['id']}:")
print(f" Подход: {option['approach']}")
print(f" Сложность: {option['complexity']}")
print(" Пример кода:")
print(f" До: {option['before_code']}")
print(f" После: {option['after_code']}")
print()
Этот пример демонстрирует, как в системе разработки ПО может быть реализован паттерн Multi-Path Plan Generator. Агент генерирует несколько вариантов реализации задачи и позволяет пользователю выбрать наиболее подходящий план, а затем управляет выполнением выбранного плана с помощью агента-исполнителя и набора специализированных инструментов.
Такой подход позволяет учитывать предпочтения разработчиков, предлагать альтернативные решения для сложных задач и минимизировать риски, связанные с выбором неоптимального пути реализации.
Саморефлексия позволяет агенту генерировать обратную связь по плану и процессу рассуждений и предоставлять рекомендации по улучшению от самого себя.
Учитывая цели и требования пользователей, агент сгенерирует план для декомпозиции целей на набор задач, направленных на достижение этих целей.
Сгенерированный план может быть подвержен галлюцинациям базовой модели, как проверить план и этапы рассуждений и эффективно включить обратную связь?

Рис. 11. Генератор многоходовых планов.
Рисунок 11 изображает графическое представление высокого уровня саморефлексии. В частности, рефлексия является процессом оптимизации, формализованным для итеративного просмотра и уточнения процесса рассуждений и сгенерированного содержимого агента. Пользователь вводит конкретные цели агенту, который затем генерирует план для выполнения требований пользователей. Последующее, пользователь может поручить агенту отразиться на плане и соответствующем процессе рассуждений. Агент будет отслеживать процесс вывода, чтобы проверить, являются ли определенные промежуточные результаты неверными и, следовательно, вводящими в заблуждение все последующие шаги, затем скорректирует и согласует свой процесс рассуждений, чтобы создать соответствующим образом уточненный план. Такие процессы и результаты рефлексии могут быть сохранены в памяти агента для непрерывного обучения. Окончательный план будет выполняться шаг за шагом. Самосогласованность является примером этого паттерна.
Преимущества:
Недостатки:
Известные применения:
Связанные паттерны:
Пример. Tree of Thoughts (ToT) от Princeton NLP
Одним из наиболее ярких примеров реализации паттерна саморефлексии является метод "Дерево мыслей" (Tree of Thoughts), разработанный Princeton NLP. Этот подход позволяет языковым моделям более сознательно решать сложные задачи через итеративный процесс рефлексии и выбора оптимальных путей рассуждений.
В отличие от традиционного Chain of Thought (цепочки рассуждений), где модель генерирует линейную последовательность мыслей, ToT создает "дерево" возможных рассуждений, где каждая ветвь представляет собой альтернативный путь решения. Ключевой компонент этой архитектуры — механизм саморефлексии, который позволяет модели оценивать качество своих промежуточных рассуждений и выбирать наиболее перспективные направления.
Например, в задаче "игра в 24" (где нужно использовать четыре числа и арифметические операции для получения результата 24), агент ToT:
Как видно из примера кода в документации:
import argparse
from tot.methods.bfs import solve
from tot.tasks.game24 import Game24Task
args = argparse.Namespace(backend='gpt-4', temperature=0.7, task='game24', naive_run=False,
prompt_sample=None, method_generate='propose', method_evaluate='value',
method_select='greedy', n_generate_sample=1, n_evaluate_sample=3, n_select_sample=5)
task = Game24Task()
ys, infos = solve(args, task, 900)
print(ys[0])
Этот код реализует алгоритм поиска в ширину (BFS) с саморефлексией, где method_evaluate='value' указывает на использование механизма оценки промежуточных состояний, а n_evaluate_sample=3 определяет, сколько раз модель будет запрашиваться для оценки каждого состояния. Это позволяет агенту критически оценивать свои собственные рассуждения и корректировать дальнейшие действия.
Генеративные агенты с периодической рефлексией
Система генеративных агентов (Generative Agents) реализует саморефлексию через запланированные сеансы рефлексии. Агенты в этой системе проводят саморефлексию 2-3 раза в день, следуя следующему процессу:
Например, агент-персонаж в виртуальном мире может после встречи с другим агентом провести сеанс саморефлексии: "Почему моя шутка вызвала негативную реакцию? Возможно, я не учел текущее настроение собеседника. В будущем мне следует сначала оценить эмоциональное состояние других перед тем, как шутить." Эта рефлексия сохраняется в памяти и влияет на будущее поведение агента.
Агент с саморефлексией для генерации и оптимизации кода
AI агент для программирования может использовать саморефлексию следующим образом при реализации алгоритма:
def generate_sorting_algorithm(data):
# Генерация первоначального кода
initial_code = llm_generate("""
Реализуй функцию сортировки для данного массива данных.
Вход: список чисел
Выход: отсортированный список
Пример:
Вход: [3, 1, 4, 1, 5, 9]
Выход: [1, 1, 3, 4, 5, 9]
Реализация:
""")
# Саморефлексия: оценка качества сгенерированного кода
reflection = llm_reflect(f"""
Проанализируй следующий код сортировки на наличие ошибок, неэффективности и возможностей улучшения:
{initial_code}
Учти:
1. Корректность алгоритма
2. Обработка крайних случаев (пустой массив, один элемент)
3. Сложность алгоритма
4. Соответствие best practices
5. Читаемость кода
Предложи конкретные улучшения.
""")
# Генерация улучшенного кода на основе рефлексии
improved_code = llm_generate(f"""
Улучши следующий код сортировки, учитывая замечания из рефлексии:
Исходный код:
{initial_code}
Рефлексия:
{reflection}
Улучшенный код:
""")
# Дополнительная проверка через саморефлексию
final_reflection = llm_reflect(f"""
Проверь улучшенный код на соответствие требованиям и отсутствие ошибок:
{improved_code}
Выполни мысленный тест на следующих примерах:
1. Пустой массив []
2. Массив с одним элементом [5]
3. Уже отсортированный массив [1, 2, 3, 4]
4. Обратно отсортированный массив [4, 3, 2, 1]
Если есть проблемы, предложи окончательные исправления.
""")
# Генерация финального кода
final_code = llm_generate(f"""
Создай окончательную версию кода, учитывая последние замечания:
Текущий код:
{improved_code}
Замечания:
{final_reflection}
Окончательный код:
""")
return final_code
В этом примере агент проходит через несколько этапов саморефлексии:
Этот процесс напоминает работу опытного разработчика, который не просто пишет код, но и постоянно его проверяет и улучшает.
Интеграция Tree of Thoughts в агент для решения программистских задач
Можно адаптировать метод Tree of Thoughts для решения задач программирования. Например, при реализации алгоритма поиска кратчайшего пути в графе:
Пример реализации с использованием ToT для программистской задачи:
from tot.methods.bfs import solve
from tot.tasks.code_task import CodeTask
# Настройка задачи поиска кратчайшего пути
args = argparse.Namespace(
backend='gpt-4',
temperature=0.7,
task='shortest_path',
naive_run=False,
method_generate='propose',
method_evaluate='value',
method_select='greedy',
n_generate_sample=3, # Генерировать 3 различных подхода
n_evaluate_sample=5, # Оценивать каждый подход 5 раз для надежности
n_select_sample=2 # Выбирать 2 лучших подхода для дальнейшей детализации
)
task = CodeTask(
problem="Реализуй алгоритм поиска кратчайшего пути в невзвешенном графе",
constraints="Граф представлен как список смежности, узлы пронумерованы от 0 до N-1"
)
# Решение с использованием Tree of Thoughts и саморефлексии
solutions, trace = solve(args, task, max_steps=10)
# Вывод лучшего решения
print("Лучшее решение:")
print(solutions[0])
# Вывод процесса рефлексии
print("\nПроцесс саморефлексии:")
for step, info in enumerate(trace):
print(f"\nШаг {step+1}:")
print(f"Сгенерированные мысли: {info['thoughts']}")
print(f"Оценки: {info['values']}")
print(f"Выбранные пути: {info['selected']}")
Этот код демонстрирует, как агент может использовать саморефлексию для выбора между различными алгоритмами (BFS, DFS и т.д.) и последующей оптимизации выбранного подхода. Механизм оценки (method_evaluate='value') позволяет агенту критически оценивать свои собственные предложения и выбирать наиболее перспективные для дальнейшей разработки.
Агент с саморефлексией для рецензирования кода
Еще один пример — агент, который проводит рецензирование собственного кода через саморефлексию:
def self_review_code(generated_code, requirements):
# Первичная саморефлексия: соответствие требованиям
requirement_reflection = llm_query(f"""
Проверь, соответствует ли следующий код требованиям:
Требования: {requirements}
Код:
{generated_code}
Укажи:
1. Какие требования выполнены
2. Какие требования не выполнены
3. Конкретные места в коде, где есть проблемы
""")
# Саморефлексия: поиск ошибок и уязвимостей
error_reflection = llm_query(f"""
Проанализируй следующий код на наличие:
- Логических ошибок
- Потенциальных исключений
- Проблем с безопасностью
- Неэффективных операций
Код:
{generated_code}
Предложи конкретные исправления для каждой найденной проблемы.
""")
# Саморефлексия: оптимизация производительности
performance_reflection = llm_query(f"""
Оцени производительность следующего кода:
{generated_code}
Укажи:
1. Операции с высокой временной/пространственной сложностью
2. Возможные оптимизации
3. Альтернативные подходы с лучшей производительностью
""")
# Объединение всех рефлексий и генерация исправленного кода
fixed_code = llm_query(f"""
На основе следующих рефлексий создай исправленную и оптимизированную версию кода:
Анализ требований:
{requirement_reflection}
Анализ ошибок:
{error_reflection}
Анализ производительности:
{performance_reflection}
Исходный код:
{generated_code}
Исправленный код:
""")
return fixed_code, {
"requirement_reflection": requirement_reflection,
"error_reflection": error_reflection,
"performance_reflection": performance_reflection
}
Этот пример демонстрирует многоуровневую саморефлексию, где агент последовательно проверяет свой код на соответствие требованиям, наличие ошибок и возможности оптимизации. Каждый этап рефлексии фокусируется на конкретном аспекте качества кода, что позволяет агенту систематически улучшать свой вывод.
Подобная архитектура особенно ценна в сложных проектах, где важно не только решить задачу, но и обеспечить высокое качество кода, соответствие стандартам и эффективность реализации.
Паттерн Взаимное рефлексирование (Cross-Reflection) предполагает использование различных агентов или базовых моделей для анализа, оценки и улучшения сгенерированного плана и соответствующего процесса рассуждений. Вместо того чтобы полагаться на саморефлексию одного агента, данный подход делегирует задачу проверки и критического анализа второму (или нескольким) специализированным агентам, что повышает качество и достоверность конечного решения.
Агент формирует план действий для достижения цели пользователя. Однако качество этого плана может быть неудовлетворительным из-за ошибок в логике, пропущенных шагов, нереалистичных допущений или недостаточной детализации. Особенно это актуально, если основной агент ограничен по вычислительным ресурсам, размеру контекста или уровню рассуждений.
Как оценить корректность выходных данных и шагов рассуждений агента, если он сам не способен провести качественную саморефлексию? Саморефлексия требует высокой метакогнитивной способности — умения анализировать собственные выводы, находить противоречия и исправлять ошибки. Не все модели обладают такой возможностью на достаточном уровне.
Это приводит к следующим рискам:
Низкая точность решений.
Отсутствие прозрачности в процессе принятия решений.
Невозможность исправления систематических ошибок в рассуждениях.
Неопределённость рассуждений. Противоречия и ошибки в процессе рассуждений могут снижать точность ответов и подрывать доверие к системе.
Отсутствие объяснимости. Пользователь не видит, как был сформирован план, что затрудняет понимание и контроль за процессом.
Ограниченные возможности агента. Агент может не справиться с саморефлексией из-за сложности задачи или своих архитектурных ограничений.
Паттерн Взаимное рефлексирование предлагает использовать отдельного агента — агент-рефлексии (reflective agent), чья специализация заключается в анализе и оценке планов, гипотез и рассуждений других агентов. Процесс выглядит следующим образом:
Также возможно задействовать нескольких агентов-рефлексии, каждый из которых оценивает план с определённой точки зрения (например, безопасность, эффективность, соответствие стандартам кодирования), после чего их выводы агрегируются.
Преимущества
Недостатки
Общий пример: мультиагентная система для автоматизации бизнес-задач
Сценарий: Автоматизация процесса подготовки отчётности.
Основной агент (Planner): Получает задачу: «Подготовь ежемесячный финансовый отчёт за октябрь 2025 года».
Формирует план:
Агент-рефлексии (Reviewer): Получает этот план и анализирует:
Основной агент обновляет план с учётом замечаний, используя инструмент update_plan:
update_plan(
steps=[
"Уточнить источник данных у пользователя",
"Подключиться к PostgreSQL с retry-логикой",
"Экспортировать данные в CSV",
"Построить графики",
"Сгенерировать PDF с шаблоном",
"Проверить список получателей",
"Отправить email через SMTP"
],
reason="Добавлены уточнения источника, обработка ошибок и проверка безопасности"
)
Пример в разработке AI-агента для программирования (SWE Agent)
Сценарий: Написание Python-функции для парсинга JSON с валидацией.
Агент-программист (Coder): Генерирует код:
def parse_user_data(json_str):
import json
data = json.loads(json_str)
return {
'name': data['name'],
'age': int(data['age'])
}
Агент-рефлексии (например Code Reviewer): Анализирует код и отправляет замечания:
json.JSONDecodeError, KeyError, ValueError.»Агент-программист исправляет код:
import json
from typing import Dict, Optional
def parse_user_data(json_str: str) -> Optional[Dict[str, any]]:
"""
Парсит JSON со строкой данных пользователя.
Возвращает словарь с полями name и age или None при ошибке.
"""
try:
data = json.loads(json_str)
name = data.get('name')
age = data.get('age')
if not name or not isinstance(name, str):
return None
if not isinstance(age, (int, float)) or not (0 <= age <= 120):
return None
return {'name': name, 'age': int(age)}
except (json.JSONDecodeError, TypeError):
return None
Затем может быть задействован агент-тестировщик (Tester), который генерирует тесты:
def test_parse_user_data():
assert parse_user_data('{"name": "Alice", "age": 25}') == {"name": "Alice", "age": 25}
assert parse_user_data('{"name": "Bob", "age": 150}') is None
assert parse_user_data('invalid json') is None
Архитектура взаимодействия:
- Основной агент (координатор) создаёт субагентов:
Programmer,Reviewer,Tester.- Каждый работает в своём контексте, возвращает краткий отчёт.
- Координатор интегрирует результаты, сохраняя общий контекст лёгким.
- Все действия сопровождаются аргументом
reasonдля прослеживаемости.
Реализация инструмента reflect в Python
Для поддержки паттерна Cross-Reflection можно реализовать специальный инструмент reflect, который явно фиксирует внутренние размышления:
from typing import Callable, Awaitable
async def reflect(content: str, source_agent: str, target_agent: str) -> str:
"""
Инструмент для записи внутренних размышлений или отзывов между агентами.
Используется в мультиагентной системе для кросс-рефлексии.
"""
# Сохраняем в общий журнал или передаём целевому агенту
note = f"[REFLECT] From: {source_agent} | To: {target_agent}\n{content}"
# Здесь может быть запись в файл, очередь или передача в другого агента
print(note)
return "Reflection logged."
Пример вызова:
await reflect(
content="Функция parse_user_data требует обработки исключений и валидации входных данных.",
source_agent="Reviewer",
target_agent="Programmer"
)
# Вывод: [REFLECT] From: Reviewer | To: Programmer\nФункция parse_user_data требует...
Известные применения (Known Uses)
tool agent) отправляет обратную связь агенту-планировщику (plan agent), указывая, завершена ли задача или требуется доработка.thinker) даёт рекомендации агенту-исполнителю (actor), помогая ему принимать более обоснованные решения.Связанные паттерны
Паттерн Взаимное рефлексирование является мощным механизмом повышения качества и надёжности мультиагентных систем. Он особенно ценен в сложных доменах, таких как разработка программного обеспечения, где ошибка в логике может привести к серьёзным последствиям. Разделение роли создания плана и его критической оценки позволяет достичь большей глубины анализа, объяснимости и устойчивости решений. При этом важно учитывать накладные расходы и проектировать систему так, чтобы она оставалась эффективной и прозрачной для пользователя.
Например для агента программирования данный паттерн можно реализовать через сеть субагентов: Architect, Reviewer, Tester, Optimizer, каждый из которых вызывается по мере необходимости, а основной агент сохраняет роль координатора, получающего краткие отчёты и принимающего финальные решения.
Агент собирает обратную связь от людей для уточнения плана, чтобы эффективно соответствовать предпочтениям человека.
Агенты создают планы и стратегии, которые разбивают цели и требования пользователей на набор задач. Эти задачи будут выполняться другими инструментами и агентами.
Как обеспечить полное и правильное отражение предпочтений человека и их интеграцию в процесс рассуждений и сгенерированные планы?
Факторы
Рисунок 11 представляет собой графическое представление высокого уровня паттерна "Рефлексия с участием человека". Когда пользователь формулирует свои цели и указанные ограничения, агент сначала создает план, состоящий из ряда промежуточных шагов. Составленный план и журнал процесса рассуждений могут быть представлены пользователю для проверки или отправлены другим экспертам-людям для подтверждения их осуществимости и полезности. Пользователь или эксперт может предоставить комментарии или предложения, указывающие, какие шаги можно обновить или заменить. План будет итеративно оцениваться и улучшаться до тех пор, пока не будет одобрен пользователем/экспертом.
Преимущества
Недостатки
Известные применения
Связанные паттерны
Пример: Система рекомендаций ресторанов в XAgent
В системе XAgent реализован инструмент AskForHumanHelp, который активно использует паттерн "Рефлексия с участием человека". Когда пользователь запросил рекомендации ресторанов для дружеской встречи, но не предоставил конкретных деталей, XAgent распознал недостаточность предоставленной информации. Агент автоматически активировал процесс рефлексии, запросив у пользователя следующие уточнения:
Этот процесс позволил собрать недостающие данные, необходимые для формирования качественных рекомендаций. После получения обратной связи от пользователя XAgent смог сгенерировать персонализированные рекомендации ресторанов, соответствующие конкретным потребностям пользователя. В данном случае реализация паттерна обеспечила не только соответствие предпочтениям пользователя, но и позволила избежать потенциальных ошибок, связанных с недостатком информации.
Пример: Система поддержки принятия решений
В мультиагентной системе поддержки принятия решений для бизнес-аналитики, один агент-аналитик формирует стратегический план на основе данных компании. Перед окончательным утверждением плана система активирует процесс рефлексии:
Эта реализация позволила повысить доверие к системе со стороны пользователей, так как они могли непосредственно участвовать в формировании стратегий и видеть, как их замечания влияют на конечный результат.
Пример: XAgent для анализа данных Iris
https://github.com/OpenBMB/XAgent
В XAgent реализован пример использования паттерна "Рефлексия с участием человека" при анализе данных набора Iris. Когда пользователь предоставил файл iris.zip и запросил помощь в анализе данных, XAgent разбил задачу на подзадачи, включая проверку окружения Python на наличие необходимых библиотек для анализа данных.
Однако, при обнаружении, что пользователь не указал конкретные требования к визуализации, XAgent активировал процесс рефлексии:
Этот процесс позволил адаптировать анализ данных под конкретные потребности пользователя, избежав создания избыточных или недостаточных визуализаций. В результате пользователь получил именно ту информацию, которая была ему необходима для принятия решений.
Пример: Мультиагентная система разработки ПО
В системе разработки программного обеспечения с использованием нескольких специализированных агентов (аналитик требований, архитектор, разработчик, тестировщик) реализована следующая схема рефлексии:
Пример: Обучение модели BERT для анализа отзывов
В сценарии, где XAgent использовался для анализа отзывов о фильмах, паттерн "Рефлексия с участием человека" был реализован следующим образом:
Агенты могут свободно высказывать свои мнения и достигать консенсуса через сотрудничество на основе голосования.
В составной ИИ-системе могут использоваться несколько агентов. Агентам необходимо сотрудничать над одной задачей, сохраняя собственные точки зрения.
Проблема: Как правильно окончательно принять решения агентов, чтобы обеспечить справедливость между разными агентами?
Факторы:

Рис. 12. Voting-based cooperation.
На рис. 12 показано, как агенты могут сотрудничать для окончательного принятия решения через голосование. Конкретно, агент сначала формирует кандидатский ответ на запрос пользователя, затем проводит голосование, в котором различные рефлексивные предложения представлены как варианты выбора. Другим агентам предлагается проголосовать за наиболее подходящий отзыв в соответствии с их возможностями и опытом. В этом случае агенты общаются централизованно, при этом исходный агент выступает в роли координатора. Результат голосования формализуется и возвращается исходному агенту, который может соответствующим образом уточнить ответ перед тем, как ответить пользователю. Обратите внимание, что процесс голосования может быть реализован различными способами, например, через прямую связь между агентом-координатором и другими агентами, смарт-контракты на основе блокчейна и т.д. Кроме того, управление идентификацией всех участвующих агентов имеет важное значение для обеспечения прослеживаемости и проверяемости голосов.
Преимущества:
Недостатки:
Известные применения:
Связанные паттерны:
Пример: Система управления городскими проектами:
Несколько агентов, представляющих различные департаменты (транспорт, экология, социальные услуги), параллельно анализируют предложения по улучшению городской инфраструктуры. Каждый агент формирует свою оценку проекта, после чего система инициирует голосование через центрального координатора. Голоса могут быть взвешены в зависимости от компетенции агентов (например, транспортный агент имеет больший вес при голосовании по дорожным проектам). Такой подход аналогичен работе комитета, где решения принимаются на основе коллективного мнения, что повышает качество принимаемых решений.
Пример: Система рекомендаций в онлайн-магазине: Разные агенты, специализирующиеся на различных категориях товаров (одежда, электроника, книги), независимо генерируют рекомендации для пользователя на основе его истории покупок. Затем система проводит голосование, где каждый агент оценивает рекомендации других агентов. Координатор-агент собирает результаты голосования, формирует итоговый список рекомендаций и отправляет его пользователю. Это позволяет использовать коллективный интеллект системы для повышения точности рекомендаций по сравнению с работой одного агента.
Пример: Система код-ревью с использованием LLM: При проверке пул-реквеста несколько специализированных агентов (безопасность, производительность, стилевое оформление кода) независимо анализируют изменения и предлагают замечания. После этого инициируется процесс голосования, где каждый агент оценивает критичность замечаний других. Координатор-агент собирает результаты, учитывая веса голосов (например, агент по безопасности имеет больший вес при оценке потенциальных уязвимостей), и формирует финальный отчет. Такой подход позволяет избежать доминирования одного мнения и повысить качество ревью, используя различные экспертизы.
Генерация оптимального кода через коллективное принятие решений: При решении сложной задачи программирования (например, реализация алгоритма сортировки) несколько агентов генерируют различные варианты кода. Дополнительные агенты-эксперты оценивают каждый вариант по критериям эффективности, читаемости и соответствия стандартам, затем голосуют за лучшее решение. Процесс реализован через фреймворк LangChain с использованием Voting-Based Council Pattern, где результаты голосования суммируются как большинство голосов или средняя оценка. Такой подход позволяет использовать коллективный интеллект для создания более надежного кода, чем при использовании одного агента, и особенно полезен в сложных сценариях, где требуется баланс между различными качествами кода.
Итеративное улучшение кода через циклы голосования: Агенты генерируют первоначальный код, затем система входит в цикл, где другие агенты предлагают улучшения, и каждый раунд завершается голосованием за лучший вариант. Этот Loop Pattern с включением голосования позволяет итеративно улучшать код, используя обратную связь от нескольких экспертов, что особенно полезно для сложных задач программирования, требующих многократного тестирования и уточнения.
Агентам назначаются различные роли, а решения окончательно формируются в соответствии с их ролями.
В составных ИИ-системах могут использоваться несколько агентов. Агентам необходимо сотрудничать над одной и той же задачей, сохраняя при этом собственные точки зрения.
Как агенты могут сотрудничать над определенными задачами с учетом их специализаций?
Факторы

Рис. 13. Role-based cooperation.
Рисунок 13 иллюстрирует графическое представление ролевого взаимодействия высокого уровня, где агенты координируются по иерархической схеме. В частности, агентам могут быть назначены определенные роли, что позволяет установить рабочий процесс через спецификацию персоны, определение задач, использование инструментов и оркестровку процессов. Например, агент-планировщик может генерировать многошаговый план, разбивая цель пользователя на цепочку задач. Последовательно, агент-распределитель может оркестрировать назначение задач, то есть некоторые задачи могут быть выполнены самим распределителем, в то время как другие могут быть делегированы определенному агенту-исполнителю на основе их предметно-ориентированных возможностей и экспертизы. Кроме того, если доступного агента нет, может быть вызван агент-создатель для создания нового агента с конкретной ролью, предоставляя необходимые ресурсы, четкие цели и первоначальное руководство для обеспечения бесшовного перехода задач и обязанностей. Обратите внимание, что могут быть определены и назначены более сложные роли агентам.
Медицинская диагностика с использованием MedAgents В системе MedAgents для комплексной диагностики пациента создаются агенты с ролями различных медицинских специалистов. Например:
Агент-координатор (agent-as-an-assigner) распределяет симптомы пациента между специализированными агентами, собирает их выводы и формирует комплексное заключение. Если выявляется редкое заболевание, для которого нет специализированного агента, агент-создатель генерирует нового агента с соответствующей экспертизой на основе медицинских баз знаний.
Управление городской инфраструктурой В умном городе агенты с ролями:
Агент-планировщик разрабатывает общий план реагирования на пиковые нагрузки, а агент-распределитель делегирует задачи соответствующим специализированным агентам.
MetaGPT для разработки веб-приложения В системе MetaGPT при создании веб-приложения задействованы агенты с четкими ролями:
Агент-планировщик генерирует roadmap проекта, после чего агент-распределитель назначает задачи соответствующим исполнителям. При возникновении сложной задачи, требующей новой специализации (например, интеграции с блокчейном), агент-создатель формирует нового агента с необходимой экспертизой.
Система для автоматизации CI/CD процессов В современных мультиагентных системах программной инженерии можно выделить следующие роли:
Эта система демонстрирует явное разделение ответственности, что соответствует принципам Role-Based Cooperation и позволяет легко масштабировать процесс разработки.
Пример из передовой практики 2025 года Современные LLM-основанные мультиагентные системы для программной инженерии все чаще используют ролевой подход, где явное определение и назначение ролей агентам становится стандартом проектирования. Такие системы позволяют эффективно распределять ответственность, что особенно важно при работе с большими кодовыми базами, где разные части требуют различных типов экспертизы. В частности, в 2025 году наблюдается тенденция к созданию гибридных систем, где агенты могут временно брать на себя дополнительные роли в случае недоступности специализированных коллег, сохраняя при этом устойчивость системы.