0Pricing
AI Engineering Academy · Урок

Шаблон «оркестратор — подчинённый агент»

Реализуйте шаблон «оркестратор — подчинённый агент», в котором агент-планировщик разбивает задачи на подзадачи, делегирует их специализированным агентам и объединяет результаты в итоговый вывод.

«Шаблон «оркестратор — подчинённый агент»» — бесплатный урок AI Engineering Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения AI Engineering Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс AI Engineering Academy содержит 4 уроков всего.

Ментальная модель координатора и субагентов

Схема «координатор — субагенты» — наиболее распространённая мультиагентная архитектура. Агент-координатор получает высокоуровневую цель, разбивает её на подзадачи, делегирует каждую подзадачу специализированному субагенту, собирает результаты и формирует итоговый ответ. Представляйте координатора как руководителя проекта, а субагентов — как экспертов предметной области в команде.

Обязанности координатора

У координатора есть три основные обязанности: декомпозиция — разбиение цели на конкретные задачи, которые можно выполнить; делегирование — назначение каждой подзадачи подходящему специалисту; и синтез — объединение результатов субагентов в связный итог. Сам координатор выполняет минимум работы, связанной с конкретной предметной областью: его ценность заключается в координации.

from openai import OpenAI

client = OpenAI()

def orchestrator(goal: str) -> dict:
    # Step 1: Decompose
    plan = client.chat.completions.create(
        model='gpt-4o',
        messages=[
            {'role': 'system', 'content': 'You are a task planner. Decompose the goal into subtasks. Return JSON with keys: researcher_task, writer_task, coder_task.'},
            {'role': 'user', 'content': goal}
        ],
        response_format={'type': 'json_object'}
    )
    return plan.choices[0].message.content

Проектирование специализированных субагентов

Каждый субагент оптимизирован для одной обязанности. Специализация означает наличие сфокусированного системного запроса, определяющего роль; небольшого набора инструментов (3–5), относящихся только к этой роли; и контекстного окна, содержащего лишь информацию, необходимую для данной подзадачи. Сфокусированные агенты принимают более качественные решения, а их оценку и отладку проще выполнять.

def create_researcher_agent():
    return {
        'model': 'gpt-4o',
        'system': '''You are a research specialist. Your only job is to find accurate,
            cited information. Return structured findings with sources.
            Do NOT write prose or code - only research findings.''',
        'tools': ['search_web', 'fetch_url', 'query_arxiv'],  # 3 tools only
        'max_iterations': 10
    }

def create_writer_agent():
    return {
        'model': 'gpt-4o',
        'system': '''You are a technical writer. Transform research findings into clear,
            engaging prose. You receive structured data and return polished text.''',
        'tools': ['format_markdown', 'check_readability'],  # 2 tools only
        'max_iterations': 5
    }

Протокол делегирования

Чтобы делегирование работало, оркестратор должен передавать каждому субагенту корректно составленные пакеты задач. Пакет задачи включает конкретную цель этого субагента, необходимый ему релевантный контекст (но не всю историю беседы), ожидаемый формат результата и все ограничения. Плохо составленные пакеты задач — самый распространённый источник сбоев во взаимодействии оркестратора с субагентами.

from dataclasses import dataclass
from typing import Optional

@dataclass
class TaskPacket:
    task_id: str
    assignee: str          # which subagent receives this
    goal: str              # specific, actionable goal
    context: str           # only relevant background
    output_format: str     # JSON schema or description
    constraints: list[str] # e.g. ['max 500 words', 'cite sources']
    deadline_steps: int    # max iterations allowed

def delegate(packet: TaskPacket, subagent_fn) -> str:
    prompt = f'Goal: {packet.goal}\nContext: {packet.context}\nOutput format: {packet.output_format}\nConstraints: {packet.constraints}'
    return subagent_fn(prompt)

Сбор и синтез результатов

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

def synthesize_results(research: str, draft: str, code: str, goal: str) -> str:
    synthesis_prompt = f'''You are given outputs from three specialist agents.
    Your job is to synthesize them into one coherent final answer for this goal: {goal}

    RESEARCH FINDINGS:
    {research}

    WRITTEN DRAFT:
    {draft}

    CODE EXAMPLES:
    {code}

    Resolve any conflicts, fill gaps, and produce a unified final response.
    '''
    response = client.chat.completions.create(
        model='gpt-4o',
        messages=[{'role': 'user', 'content': synthesis_prompt}]
    )
    return response.choices[0].message.content

Последовательное и параллельное делегирование

Оркестраторы могут делегировать задачи последовательно (результат одного субагента передаётся следующему) или параллельно (несколько субагентов работают одновременно). Последовательное делегирование проще и подходит, когда последующие этапы зависят от предыдущих результатов. Параллельное делегирование работает быстрее, когда подзадачи независимы и могут выполняться одновременно: зачастую это сокращает фактическое время выполнения в 3–5 раз.

import asyncio

# Sequential: writer needs research first
async def sequential_pipeline(goal):
    research = await researcher_agent(goal)
    draft = await writer_agent(research)  # depends on research
    return draft

# Parallel: all three tasks are independent
async def parallel_pipeline(topics):
    tasks = [
        researcher_agent(topics[0]),
        researcher_agent(topics[1]),
        researcher_agent(topics[2])
    ]
    results = await asyncio.gather(*tasks)  # runs simultaneously
    return orchestrator_synthesize(results)

Обработка сбоев субагентов

Субагенты время от времени дают сбои: они могут вернуть некорректный результат, превысить установленный предел итераций или столкнуться с ошибкой. Оркестратор должен корректно обрабатывать такие сбои. Распространённые стратегии включают повторную попытку с уточнённым пакетом задачи, переход к более простому подходу, пропуск неудачной подзадачи с указанием этого в итоговом результате или передачу вопроса на проверку человеку.

def delegate_with_retry(packet: TaskPacket, subagent_fn, max_retries=2):
    for attempt in range(max_retries + 1):
        try:
            result = subagent_fn(packet)
            validate_output(result, packet.output_format)
            return result
        except ValidationError as e:
            if attempt < max_retries:
                # Clarify the task for retry
                packet.goal += f'\n\nPrevious attempt failed: {str(e)}. Please fix.'
                print(f'Retry {attempt + 1} for task {packet.task_id}')
            else:
                return {'error': str(e), 'task_id': packet.task_id, 'status': 'failed'}

Как правильно формулировать запросы для оркестратора

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

ORCHESTRATOR_SYSTEM_PROMPT = '''
You coordinate a team of specialist agents to complete complex tasks.

Available agents:
- researcher: Finds and cites factual information. Input: question string. Output: JSON with findings and sources.
- writer: Writes polished prose from structured data. Input: JSON findings. Output: markdown text.
- coder: Writes Python code. Input: natural language spec. Output: Python code string.

Workflow:
1. Analyze the goal and decide which agents are needed.
2. Identify dependencies: can any tasks run in parallel?
3. Delegate tasks with clear, specific goals.
4. Validate each result before proceeding.
5. Synthesize all results into a unified final answer.
'''

Изоляция контекста — это преимущество

Одно из главных преимуществ схемы «оркестратор — субагенты» — изоляция контекста. Каждый субагент видит только информацию, относящуюся к его подзадаче, а не полную историю всего проекта. Благодаря этому контекстное окно каждого субагента остаётся небольшим, что предотвращает исчерпание контекста, от которого страдают одиночные агенты. Оркестратор сохраняет глобальное представление, а субагенты — сфокусированные локальные представления.

Трассировка и наблюдаемость

Мультиагентные системы сложнее отлаживать, чем одиночных агентов, поскольку сбой может произойти на любом этапе делегирования. Всегда добавляйте структурированное журналирование, чтобы отслеживать: какие задачи были делегированы, какому субагенту, какими были входные и выходные данные, сколько времени заняла каждая задача и потребовались ли повторные попытки. Такие инструменты, как LangSmith и Langfuse, поддерживают визуализацию трассировки мультиагентных систем.

import time

def logged_delegate(packet: TaskPacket, subagent_fn):
    start = time.time()
    print(f'[DELEGATE] task_id={packet.task_id} assignee={packet.assignee}')
    print(f'[INPUT] {packet.goal[:100]}...')
    
    result = subagent_fn(packet)
    elapsed = time.time() - start
    
    print(f'[RESULT] task_id={packet.task_id} elapsed={elapsed:.2f}s')
    print(f'[OUTPUT] {str(result)[:100]}...')
    return result

Практический пример: генератор отчётов

Конкретный пример схемы «оркестратор — субагенты» — генератор отчётов о конкурентном анализе. Оркестратор получает запрос «Напишите анализ конкурента для компании X». Он делегирует исследовательскую подзадачу агенту researcher (тот изучает цены, функции и отзывы), аналитическую подзадачу — агенту analyst (выявляет сильные и слабые стороны), а задачу форматирования — агенту writer (создаёт итоговый отчёт). Каждый специалист занимается тем, что умеет лучше всего.

Быстрая проверка

Проверьте, насколько хорошо Вы поняли схему «оркестратор — субагенты» из этого урока.

Итоги урока

В этом уроке Вы узнали, что схема «оркестратор — субагенты» использует агента-координатора для декомпозиции и делегирования работы специалистам, что для успешного делегирования пакеты задач должны чётко определять цель, контекст и ожидаемый формат результата, а изоляция контекста сохраняет небольшим окно каждого субагента, пока оркестратор поддерживает глобальное представление. Далее мы создадим мультиагентные конвейеры с помощью LangGraph.

Часто задаваемые вопросы

Урок «Шаблон «оркестратор — подчинённый агент»» бесплатный?

Да — полный текст урока «Шаблон «оркестратор — подчинённый агент»» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс AI Engineering Academy, подпишись на CoddyKit PRO. Курс AI Engineering Academy содержит 4 уроков всего.

Чему я научусь в уроке «Шаблон «оркестратор — подчинённый агент»»?

Реализуйте шаблон «оркестратор — подчинённый агент», в котором агент-планировщик разбивает задачи на подзадачи, делегирует их специализированным агентам и объединяет результаты в итоговый вывод. Ты практикуешь AI Engineering Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать AI Engineering Academy?

Предыдущий опыт не требуется. AI Engineering Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Шаблон «оркестратор — подчинённый агент»»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке AI Engineering Academy?

Да. Каждый урок AI Engineering Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Почему один агент упирается в пределы
  2. Шаблон «оркестратор — подчинённый агент»
  3. Создание мультиагентных конвейеров с LangGraph
  4. Общая память и взаимодействие между агентами
← Назад к AI Engineering Academy