中文翻译暂不可用,显示俄语原文。
Multi-agent для планирования
ТЕХНИЧЕСКОЕ ЗАДАНИЕ: Multi-agent для планирования
1. Цель задачи
Разработать multi-agent систему, где Planner-агент декомпозирует сложную задачу на последовательность шагов (plan), а Executor-агент выполняет эти шаги через вызовы внешних API. Система должна справляться с задачей, состоящей из 5 логически связанных шагов, корректно передавая контекст между шагами и обрабатывая ошибки.
Ключевой результат Работающий прототип multi-agent pipeline, который принимает на вход задачу на естественном языке, автоматически строит план из 5 шагов, выполняет каждый шаг через реальные (или симулированные) API вызовы и возвращает итоговый результат.
2. Исходные данные
Перед началом необходимо иметь:
| Что нужно | Откуда взять |
|---|---|
| Доступ к LLM (API или локально) | OpenAI API, Anthropic, или локальная модель через Ollama |
| Python окружение с поддержкой асинхронности | Python 3.10+, aiohttp, asyncio |
| Тестовые API endpoints (реальные или симулированные) | См. раздел ниже |
| Пример задачи из 5 шагов | Составить самостоятельно (например, "Собрать информацию о погоде в Москве, найти ближайшее кафе, проверить его часы работы, заказать столик и отправить подтверждение на email") |
Если нет реальных API — симулируем:
- Создать простой FastAPI/Flask сервер с двумя-тремя mock-ручками (
/weather,/search_nearby,/book_table,/send_email). - Каждая ручка принимает JSON, ждёт случайную задержку (0.5–1.5 сек) и возвращает фиксированный или параметризированный ответ.
- Для усложнения добавить случайные ошибки (5% сбоя) — Executor должен обрабатывать retry.
3. Технологический стек
| Компонент | Инструменты | Назначение |
|---|---|---|
| Язык программирования | Python 3.10+ | Разработка агентов |
| LLM (Planner) | OpenAI GPT-4 / GPT-4o-mini / Claude 3.5 Sonnet (или Ollama + llama3) | Декомпозиция задачи |
| Фреймворк для агентов | LangChain / CrewAI / ручная реализация | Организация multi-agent работы |
| Асинхронный HTTP | aiohttp / httpx | HTTP вызовы из Executor |
| Backend (симуляция API) | FastAPI / Flask | Mock-сервер |
| Логирование | Python logging + файл | Трассировка шагов плана |
| Тестирование | pytest | Юнит-тесты логики агентов |
4. Этапы выполнения
Этап 1: Проектирование архитектуры агентов (30 минут)
Действия
-
Определить структуру Agent-a Каждый агент — это класс с методом
run(context: dict) -> dict. Context содержит:task: исходная задача пользователя.plan: список шагов (генерируется Planner).state: текущий шаг, собранные результаты.errors: список ошибок.
-
Спроектировать Planner Он должен принимать
taskи возвращать:- список шагов (каждый шаг:
{"step_id": 1, "description": "Запросить погоду", "api_endpoint": "weather", "params": {"city": "Moscow"}}).
- список шагов (каждый шаг:
-
Спроектировать Executor Он принимает шаг, вызывает соответствующий API, обрабатывает ответ и дополняет
state. -
Продумать оркестрацию Цикл: Planner → for each step: Executor → проверка результата → переход к следующему шагу.
-
Нарисовать диаграмму потоков (схематично в README или Mermaid).
Ожидаемый результат этапа Документ (или кодовая заготовка) с описанием классов и интерфейсов агентов.
Этап 2: Реализация Planner-агента (1 час)
Действия
-
Реализовать класс
PlannerAgent- Инициализация с LLM клиентом.
- Метод
create_plan(task: str) -> List[Dict]. - Prompt для LLM: "Ты — планировщик. Разбей задачу на ровно 5 шагов. Для каждого шага укажи: step_id, description, api_endpoint (один из: weather, search_nearby, get_hours, book_table, send_email), params (обязательные поля для вызова API). Верни только JSON массив."
- Парсинг ответа: извлечение JSON, валидация (проверить, что ровно 5 шагов, все поля есть).
-
Написать юнит-тест
- Передать тестовую задачу.
- Проверить, что возвращается 5 шагов.
- Проверить, что каждый шаг содержит
step_id,description,api_endpoint,params.
def test_planner_creates_five_steps():
planner = PlannerAgent(llm_client)
task = "Organize a morning routine: check weather, find a café, get opening hours, book a table, send confirmation."
plan = planner.create_plan(task)
assert len(plan) == 5
assert all("api_endpoint" in step for step in plan)
Ожидаемый результат этапа Работающий PlannerAgent, который для заданной задачи возвращает корректный план из 5 шагов.
Этап 3: Реализация Executor-агента и симуляция API (1 час 30 минут)
Действия
-
Создать mock-сервер на FastAPI:
from fastapi import FastAPI import random, asyncio app = FastAPI() @app.post("/weather") async def weather(params: dict): await asyncio.sleep(random.uniform(0.3, 1.0)) if random.random() < 0.05: return {"error": "service_unavailable"}, 503 return {"temperature": 12, "conditions": "cloudy", "city": params.get("city")} # Аналогично для /search_nearby, /get_hours, /book_table, /send_email -
Реализовать класс
ExecutorAgent -
Добавить трассировку логировать каждый вызов (время, эндпоинт, статус, ответ).
-
Написать интеграционный тест запустить mock-сервер, выполнить один шаг, проверить ответ.
Ожидаемый результат этапа ExecutorAgent, который успешно вызывает mock-сервер и обрабатывает ошибки.
Этап 4: Оркестрация и запуск полного пайплайна (1 час)
Действия
-
Реализовать класс
Orchestrator- Инициализация с Planner и Executor.
- Метод
run(task: str) -> dict:context = {"task": task, "plan": [], "state": {}, "errors": []} plan = planner.create_plan(task) context["plan"] = plan for step in plan: result = executor.execute_step(step, context) if "error" in result: context["errors"].append(result) break # или continue — по решению context["state"][step["step_id"]] = result return context
-
Протестировать на задаче, которая состоит из 5 шагов (например, описанная в Этапе 2). Убедиться, что:
- Все 5 шагов выполняются последовательно.
- Результаты предыдущих шагов доступны для следующих (если нужно) через
context. - При возникновении ошибки Executor делает retry.
-
Добавить финальную агрегацию собрать результаты всех шагов в человекочитаемый ответ (через LLM или просто форматированный текст).
-
Провести ручное тестирование 3–5 различных задач, убедиться, что план всегда содержит именно 5 шагов (можно жёстко зашить в prompt требование 5 шагов).
Ожидаемый результат этапа Полный pipeline, который для задачи «узнать погоду → найти кафе → проверить часы → забронировать → отправить email» проходит все 5 шагов без ошибок.
Этап 5: Обработка ошибок и наблюдаемость (30 минут)
Действия
-
Добавить обработку ошибок на уровне Orchestrator:
- Если шаг провалился после всех retry — записать в
errorsи прервать выполнение (опционально перезапустить планер с дополнительным контекстом). - Добавить fallback: если шаг
book_tableне удался, попробовать альтернативный эндпоинт (например,reserve_alternative).
- Если шаг провалился после всех retry — записать в
-
Внедрить логирование в JSON-формате для дальнейшего анализа:
{"timestamp": "...", "step": 1, "action": "execute", "status": "success", "duration_ms": 1200} -
Подготовить простой отчёт (в stdout или файл): сколько шагов выполнено, сколько ошибок, время выполнения.
Ожидаемый результат этапа Система корректно обрабатывает ошибки (retry + fallback) и выводит структурированный лог.
5. Критерии приемки (Definition of Done)
- Planner генерирует ровно 5 шагов для любой подходящей задачи.
- Executor корректно вызывает mock-эндпоинты и обрабатывает ответы.
- При ошибке API Executor делает до 3 retry с задержкой.
- Orchestra передаёт контекст между шагами (результат предыдущего шага доступен следующему).
- При успешном выполнении всех 5 шагов возвращается сводный результат.
- При фатальной ошибке выполнение прерывается и ошибка логируется.
- Весь код покрыт минимум 2 юнит-тестами (Planner, Executor).
- Mock-сервер запускается отдельно и предоставляет все 5 эндпоинтов.
- Система работает с реальной LLM (OpenAI/GPT-4o-mini) или локальной через Ollama.
- Время выполнения полного цикла для 5 шагов не превышает 30 секунд (с учётом сетевых задержек).
6. Ожидаемый результат
После выполнения задачи должен быть создан репозиторий (или папка) со следующей структурой:
multi-agent-planner/
├── agents/
│ ├── __init__.py
│ ├── planner.py # PlannerAgent класс
│ ├── executor.py # ExecutorAgent класс
│ └── orchestrator.py # Orchestrator класс
├── mock_server/
│ ├── __init__.py
│ ├── main.py # FastAPI приложение с 5 ручками
│ └── requirements.txt
├── tests/
│ ├── test_planner.py
│ ├── test_executor.py
│ └── test_integration.py
├── logs/
│ └── trace.log # Пример лога
├── requirements.txt
├── README.md # Архитектура, запуск, примеры
└── config.py # Настройки (базовый URL, API ключи)
Содержание README.md описание архитектуры, инструкция по запуску, пример выполнения задачи.
Опционально Dockerfile для сборки всего решения (mock + агенты) и docker-compose для одного вызова.
7. Возможные сложности и их решение
| Сложность | Решение |
|---|---|
| Planner генерирует не 5 шагов, а больше или меньше | Добавить в prompt жёсткое требование: "Ровно 5 шагов. Если шагов меньше или больше — повтори". Использовать response_format={ "type": "json_object" } для GPT-4 Turbo. |
| Executor зависает на долгом ответе mock-сервера | Установить таймаут на HTTP запросы (например, timeout=5). |
| Контекст не передаётся между шагами | Хранить state в словаре, передавать его по ссылке и явно указывать зависимости в params шага (например, {"cafe_id": "$step2.result.cafe_id"}). |
| LLM возвращает невалидный JSON | В парсинге ответа использовать json.loads() с try/except, при неудаче отправить повторный запрос с сообщением об ошибке. |
| Mock-сервер недоступен при запуске тестов | Использовать pytest фикстуру @pytest.fixture(scope="module") для запуска сервера в отдельном потоке, или использовать requests-mock. |
8. Бюджет времени (оценка)
| Этап | Время |
|---|---|
| Этап 1: Проектирование архитектуры | 30 минут |
| Этап 2: Реализация Planner | 1 час |
| Этап 3: Реализация Executor + mock-сервер | 1 час 30 минут |
| Этап 4: Оркестрация и тестирование | 1 час |
| Этап 5: Обработка ошибок и наблюдаемость | 30 минут |
| Итого | 4 часа 30 минут |
Примечание Если LLM API используется впервые (настройка ключа, установка библиотеки), добавьте 30–60 минут.
9. Связанные вопросы из базы знаний
| Вопрос | Тема |
|---|---|
| 14 | Архитектура LLM-приложений: оркестрация агентов |
| 22 | Chain-of-Thought и планирование |
| 47 | Prompt Engineering для структурированного вывода |
| 89 | Асинхронное программирование в AI-сервисах |
| 101 | Обработка ошибок и retry логика |
| 156 | Mock-сервера для тестирования интеграций |
| 203 | Оценка качества multi-agent систем |
| 241 | Логирование и наблюдаемость агентов |
| 315 | Контекстная память в multi-agent pipelines |
| 418 | Бенчмаркинг multi-agent планировщиков |
10. Чек-лист самопроверки
- Я развернул mock-сервер и убедился, что все 5 эндпоинтов отвечают.
- Я проверил, что Planner всегда генерирует ровно 5 шагов (включая граничные случаи).
- Я протестировал Executor с разными сценариями (успех, ошибка, таймаут).
- Я выполнил end-to-end прогон для задачи с 5 шагами и получил корректный финальный результат.
- Я написал хотя бы один тест, который проверяет обработку сбоя и retry.
- Я подготовил README с инструкцией по запуску.
- Я проверил, что все зависимости перечислены в requirements.txt.