Создание мульти-агентных систем: Оркестрация и делегирование
Введение: От солиста к оркестру
Добро пожаловать в шестой модуль. До этого момента мы работали с Gemini как с «гениальным одиночкой». Вы отправляли запрос, модель думала и выдавала ответ. Это отлично работает для написания кода, суммаризации или креатива. Но когда задачи становятся сложными и многоступенчатыми, одиночка начинает ошибаться.
Представьте, что вы просите одного человека быть одновременно: архитектором базы данных, frontend-разработчиком, копирайтером и тестировщиком. Даже если он знает всё это, переключение контекста убьет продуктивность. Качество упадет.
Мульти-агентные системы (Multi-Agent Systems, MAS) решают эту проблему. Вместо одного супер-промпта мы создаем команду специализированных агентов. В этом уроке мы разберем самый надежный паттерн для бизнес-задач: Оркестрацию и Делегирование.
Мы научимся создавать «Менеджера» (Orchestrator), который не выполняет работу сам, а знает, кому её поручить, и контролирует результат.
Архитектура Оркестратора
В мире AI-агентов есть два основных подхода к взаимодействию:
- Хореография (Choreography): Агенты знают друг о друге и передают задачи по цепочке (Агент А -> Агент Б -> Агент В). Это похоже на эстафету. Проблема: если Агент Б ошибется или «уронит» контекст, вся цепочка развалится.
- Оркестрация (Orchestration): Есть центральный мозг (Оркестратор). Агенты-исполнители не знают друг о друге. Они общаются только с Оркестратором. Это похоже на работу звездной команды с сильным проджект-менеджером.
В этом уроке мы строим Оркестратор. Почему? Потому что это дает нам контроль. Если Копирайтер написал плохой текст, Оркестратор может увидеть это и попросить переписать, не дергая при этом Дизайнера.
Роли в нашей системе:
- The Router (Маршрутизатор/Оркестратор): Обычно это модель Gemini с системной инструкцией, заточенной на планирование и выбор инструментов.
- The Workers (Рабочие): Специализированные инстансы модели (или даже другие модели), у каждой из которых свой
system_instructionи набор инструментов. - The Interface (Инструменты): Механизм, с помощью которого Оркестратор вызывает Рабочих. В Gemini API для этого идеально подходит Function Calling.
import google.generativeai as genai
import os
# Настройка API (предполагается, что ключ в переменных среды)
genai.configure(api_key=os.environ["GEMINI_API_KEY"])
# 1. Определение специалиста: Агент-математик
# У него узкая специализация и строгий тон.
math_agent_instruction = """
Ты - эксперт по чистой математике.
Твоя задача - решать уравнения и давать точные вычисления.
Не пиши стихи, не шути. Только цифры и логика.
"""
# 2. Определение специалиста: Агент-поэт
# У него творческая задача и свободный стиль.
poet_agent_instruction = """
Ты - лирический поэт.
Твоя задача - объяснять сложные концепции через метафоры и рифмы.
Избегай сухих формул.
"""
# Функции-обертки для вызова агентов
# Эти функции будут инструментами для нашего Оркестратора
def call_math_agent(query):
model = genai.GenerativeModel('gemini-1.5-pro', system_instruction=math_agent_instruction)
response = model.generate_content(query)
return response.text
def call_poet_agent(query):
model = genai.GenerativeModel('gemini-1.5-pro', system_instruction=poet_agent_instruction)
response = model.generate_content(query)
return response.text
# Инструменты для Оркестратора
tools = [call_math_agent, call_poet_agent]
Магия делегирования через Function Calling
Обратите внимание на код выше. Мы не пишем сложные if-else конструкции для выбора агента. Мы используем нативную способность Gemini работать с инструментами.
Главный секрет: Оркестратор — это тоже модель Gemini. Но её system_instruction не содержит знаний о математике или поэзии. Её инструкция содержит знание о том, какие работники у неё есть.
Когда пользователь спрашивает: «Посчитай интеграл от x^2», Оркестратор понимает: «Я сам не считаю, но у меня есть инструмент call_math_agent. Я вызову его».
Это позволяет строить системы невероятной гибкости. Вы можете менять логику работы «Математика», не трогая логику «Оркестратора».
Управление состоянием и контекстом
В Gemini 3 с его огромным контекстным окном (до 2 миллионов токенов) мы можем использовать паттерн Shared State (Общее состояние). Вместо того чтобы передавать агенту-работнику только последний вопрос, мы можем передавать ему резюме предыдущей беседы или даже весь лог, если это необходимо для контекста.
Однако, для экономии и скорости, чаще используется подход Task Handoff: Оркестратор формулирует четкое ТЗ (Prompt) для работника, получает результат и сам интегрирует его в общий диалог с пользователем.
# 3. Создание Оркестратора
orchestrator_instruction = """
Ты - главный менеджер системы помощи студентам.
У тебя есть команда экспертов:
1. call_math_agent - для любых вычислений, формул и задач.
2. call_poet_agent - если пользователь просит объяснить что-то красиво или написать стих.
Твоя задача:
1. Проанализировать запрос пользователя.
2. Выбрать правильный инструмент.
3. Передать ответ инструмента пользователю.
Если запрос не касается математики или поэзии, отвечай сам вежливо.
"""
orchestrator = genai.GenerativeModel(
'gemini-1.5-pro',
system_instruction=orchestrator_instruction,
tools=tools # Подключаем наших агентов как функции
)
# Эмуляция диалога
chat = orchestrator.start_chat(enable_automatic_function_calling=True)
user_queries = [
"Сколько будет корень из 144?",
"Напиши хокку про этот корень.",
"Как дела?"
]
print("--- ЗАПУСК СИСТЕМЫ ---")
for query in user_queries:
print(f"\nUser: {query}")
response = chat.send_message(query)
# Gemini сам вызовет функцию, получит ответ и сформирует финальное сообщение
print(f"Orchestrator: {response.text}")
Продвинутая техника: Рефлексия и Исправление
Простое делегирование — это только начало. Настоящая мощь агентов раскрывается, когда Оркестратор начинает оценивать работу агентов.
Представьте задачу написания кода. Агент-Кодер пишет скрипт. Часто он может содержать баги. В одиночном режиме пользователь должен сам найти ошибку и попросить исправить. В мульти-агентной системе мы добавляем роль Рецензента (Reviewer).
Цикл обратной связи (Loop):
- Оркестратор получает задачу: «Напиши змейку на Python».
- Оркестратор поручает это Кодеру.
- Кодер возвращает код.
- Оркестратор не отдает код пользователю сразу. Он передает его Рецензенту.
- Рецензент ищет ошибки. Если есть -> возвращает список правок Оркестратору.
- Оркестратор возвращает правки Кодеру: «Переделай».
- Цикл повторяется, пока Рецензент не скажет «ОК» или пока не закончится лимит попыток (чтобы избежать бесконечных споров ботов).
Этот паттерн критически важен для автономности. Он снижает галлюцинации, так как одна модель проверяет другую.
Создайте систему 'Редакция новостей'. Вам нужно определить три system_instruction для разных ролей: 1. 'Researcher' (Искатель фактов) - получает тему, генерирует список из 3-5 ключевых фактов (выдуманных для примера). 2. 'Writer' (Писатель) - берет факты и пишет короткую заметку в официально-деловом стиле. 3. 'Editor' (Главред/Оркестратор) - получает запрос от пользователя (тему), вызывает Researcher, передает факты Writer, получает текст и отдает пользователю финальный результат.
Почему при создании мульти-агентной системы рекомендуется использовать Оркестратор вместо прямой передачи сообщений между агентами (Chain/Choreography)?
Заключение и лучшие практики
Создание мульти-агентных систем с Gemini 3 — это переход от «инжиниринга промптов» к «инжинирингу систем».
Главные советы:
- Атомарность: Делайте агентов максимально узкоспециализированными. Агент, который умеет только переводить SQL в текст, работает лучше, чем агент «Data Analyst», который умеет всё.
- Четкие интерфейсы: Используйте Function Calling для передачи структурированных данных (JSON) между агентами, а не просто сырой текст. Это снижает вероятность недопонимания между ботами.
- Fail-safe: Всегда ограничивайте количество итераций (циклов) между агентами, чтобы они не вошли в бесконечный цикл исправлений.
- Видимость: При отладке всегда логируйте «мысли» Оркестратора. Понимание того, почему он выбрал именно этого агента, ключ к исправлению ошибок.
В следующем уроке мы разберем, как подключить этим агентам доступ к реальной памяти и базе данных.