Как работает hierarchical planning для агентов (разбивка на подзадачи)?

Краткий тезис

Hierarchical planning (Planning|иерархическое планирование) — это метод декомпозиции сложной задачи на вложенные подзадачи (subgoals), которые могут выполняться независимо или последовательно. planner|Высокоуровневый планировщик (LLM или rule-based) разбивает цель на подзадачи, а низкоуровневые агенты или вызовы LLM реализуют каждую подзадачу. Такой подход повышает interpretability (прозрачность) и reliability (надёжность) на длинных horizon (горизонтах планирования), поскольку ошибки локализуются в рамках одной подзадачи, а общий план остаётся контролируемым.


1. Термин: Hierarchical Planning (иерархическое планирование)

Hierarchical planning — это стратегия, при которой задача разбивается на несколько уровней абстракции. В контексте AI-агентов это означает:

  • Высокоуровневый план (high-level plan) — декомпозиция задачи]] на крупные подзадачи (subgoals).
  • Низкоуровневые планы (low-level plans) — конкретные шаги для выполнения каждой подзадачи, часто с вызовом инструментов, API или других агентов.

Термин agent здесь — автономная программа, способная выполнять действия (call|вызов LLM, чтение БД, отправка запросов) для достижения цели.


2. Зачем нужен hierarchical planning? Проблема длинного горизонта

Без иерархии агент пытается спланировать все шаги сразу (flat planning). Это ведёт к проблемам:

ПроблемаОписание
Long horizonЧем больше шагов, тем выше вероятность ошибки на одном из них (каскадный сбой).
Потеря контекстаLLM забывает начальную цель при большом количестве шагов.
НепрозрачностьСложно понять, почему агент сделал именно это действие.
Сложность повторного использованияНет модульности — каждый новый сценарий требует полного перепланирования.

Hierarchical planning решает эти проблемы: разбивка на подзадачи позволяет локализовать ошибки, упростить отладку и переиспользовать подзадачи в разных сценариях.


3. Архитектура: High-level planner + Low-level executors

Типичная архитектура hierarchical planning:

[Пользовательский запрос]
        |
[High-level planner]  (LLM или rule-based)
        |
   +----+----+----+----+
   |    |    |    |    |
Subgoal1 Subgoal2 ... SubgoalN
   |    |    |    |    |
[Low-level executors] (агенты / LLM вызовы / инструменты)
   |    |    |    |    |
   +----+----+----+----+
        |
[Финальный ответ / действие]
  • High-level planner получает задачу, анализирует её и генерирует список подзадач. Часто это отдельный вызов LLM с промптом «Разбей задачу на шаги».
  • Low-level executor для каждой подзадачи может быть:
    • Отдельным агентом (специализированным на поиске, вычислениях, генерации текста).
    • Прямым вызовом LLM с контекстом подзадачи.
    • Вызовом внешнего инструмента (API, калькулятор, база данных).

4. Пример: «Напиши отчёт о продажах за квартал»

Декомпозиция:

SubgoalОписаниеИсполнитель
Subgoal 1Получить данные из CRMАгент с доступом к CRM API
Subgoal 2Агрегировать по месяцамPython-скрипт / LLM с pandas
Subgoal 3Сгенерировать графикиБиблиотека matplotlib / агент-визуализатор
Subgoal 4Написать текст отчётаLLM с контекстом данных и графиков

Каждый subgoal — отдельный LLM call или вызов специализированного агента. Результаты передаются по цепочке или собираются в финальный ответ.


5. Преимущества hierarchical planning

ПреимуществоПояснение
InterpretabilityЛегко увидеть, на каком subgoal произошла ошибка.
ReliabilityОшибка в одном subgoal не ломает весь план — можно перезапустить только его.
ComposabilitySubgoal можно переиспользовать в других задачах (например, «получить данные из CRM» пригодится для разных отчётов).
ScalabilityПлан может быть сколь угодно глубоким, если каждый уровень решает свою подзадачу.
Контроль длины контекстаКаждый subgoal работает с небольшим контекстом, снижая проблему «lost in the middle».

6. Вызовы и ограничения

  1. Сложность координации — нужно правильно передавать результаты между subgoal (порядок, зависимости).
  2. Ошибки декомпозиции — high-level planner может разбить задачу неоптимально или пропустить важный шаг.
  3. Overhead — больше вызовов LLM, выше latency и стоимость.
  4. Глубина иерархии — слишком глубокое дерево может привести к экспоненциальному росту числа подзадач.

7. Сравнение: Flat planning vs Hierarchical planning

ХарактеристикаFlat planningHierarchical planning
СтруктураОдин список шаговДерево подзадач
Обработка ошибокОшибка на шаге 5 ломает всёМожно перезапустить только subgoal
ПрозрачностьНизкаяВысокая (видна иерархия)
ПереиспользованиеНетДа (subgoal как модули)
LatencyМеньше вызововБольше вызовов, но каждый короче
Подходит дляКоротких задач (1–3 шага)Длинных, многошаговых задач

8. Реализация на Python (псевдокод)

from openai import OpenAI
import json

client = OpenAI()

def high_level_planner(task: str) -> list[str]:
    prompt = f"Разбей задачу на подзадачи (subgoals). Ответь в формате JSON-списка строк.\nЗадача: {task}"
    response = client.chat.completions.create(
        model="gpt-4",
        messages=[{"role": "user", "content": prompt}],
        response_format={"type": "json_object"}
    )
    subgoals = json.loads(response.choices[0].message.content)["subgoals"]
    return subgoals

def execute_subgoal(subgoal: str, context: dict) -> str:
    # Здесь может быть вызов специализированного агента или инструмента
    prompt = f"Выполни подзадачу: {subgoal}. Контекст: {context}"
    response = client.chat.completions.create(
        model="gpt-4",
        messages=[{"role": "user", "content": prompt}]
    )
    return response.choices[0].message.content

def hierarchical_agent(task: str) -> str:
    subgoals = high_level_planner(task)
    results = []
    for sg in subgoals:
        result = execute_subgoal(sg, {"task": task, "previous_results": results})
        results.append(result)
    # Финальная агрегация
    final_prompt = f"Собери финальный ответ на основе результатов подзадач: {results}"
    final = client.chat.completions.create(
        model="gpt-4",
        messages=[{"role": "user", "content": final_prompt}]
    )
    return final.choices[0].message.content

Это упрощённый пример. В реальных системах (LangChain, CrewAI) иерархия реализуется через цепочки агентов с явным графом зависимостей.


9. Метрики оценки hierarchical planning

МетрикаОписание
Success rateДоля задач, выполненных полностью и корректно.
Subgoal completion rateДоля подзадач, выполненных без ошибок.
Plan qualityОценка правильности декомпозиции (экспертная или LLM-as-judge).
LatencyОбщее время выполнения (включая все вызовы).
CostСуммарное количество токенов / вызовов API.

10. Инструменты и фреймворки

  • LangChain — поддерживает Plan-and-Execute агентов, где планировщик и исполнители разделены.
  • CrewAI — позволяет создавать иерархию агентов с ролями (менеджер, исполнители).
  • AutoGPT — использует иерархическое планирование через «thought-action-observation» циклы.
  • BabyAGI — классический пример с task queue и приоритетами.

Пет-проект для закрепления

Задача Создать агента для планирования путешествия, который использует hierarchical planning.

Инструменты Python, OpenAI API, LangChain (опционально), библиотека requests для погоды и билетов.

Шаги:

  1. Реализовать high-level planner, который разбивает задачу «Спланируй поездку в Париж на 3 дня» на подзадачи: «Найти авиабилеты», «Забронировать отель», «Составить маршрут», «Проверить погоду».
  2. Для каждой подзадачи создать low-level executor (LLM вызов с контекстом).
  3. Добавить зависимость: сначала билеты, потом отель, потом маршрут.
  4. Вывести итоговый план в читаемом виде.

Ожидаемый результат Агент возвращает структурированный план с конкретными рекомендациями (даты, цены, достопримечательности), а не просто текст. Можно добавить сохранение в JSON.


Связь с другими вопросами

ВопросТема
576Как работают multi-agent системы?
577Что такое ReAct паттерн для агентов?
578Как оценивать производительность агентов?
579Какие стратегии memory для агентов существуют?
580Как обеспечить безопасность агентов?
581Что такое tool use и function calling?

Навигация