Как проектировать SLA между агентом-менеджером и агентами-исполнителями?
Краткий тезис
SLA (Agreement) — это набор контрактов между агентом-менеджером (координатором) и агентами-исполнителями (специализированными микросервисами/моделями). Он фиксирует обязательства по времени ответа (latency), доступности (availability), качеству ответов (faithfulness) и частоте запросов (rate limits). Проектирование SLA включает выбор измеримых метрик (SLI), целевых порогов (SLO), механизмов мониторинга (Prometheus, health checks) и действий при нарушениях (breaker|circuit breaker, fallback, алерты). Правильный SLA балансирует между отказоустойчивостью системы и стоимостью ресурсов.
1. Термины: агент-менеджер и агент-исполнитель
- Агент-менеджер (Manager Agent) — центральный координатор, который принимает пользовательский запрос, планирует цепочку действий, распределяет подзадачи между исполнителями и собирает результат.
- Агент-исполнитель (Worker Agent) — легковесный агент, специализирующийся на одной функции: поиск (retrieval), вызов внешнего API, генерация текста, валидация фактов и т. д.
Взаимодействие между ними — это вызов по RPC/gRPC/HTTP. SLA регулирует этот вызов: что исполнитель обязан сделать и с каким качеством, а менеджер — как реагировать на сбои.
2. Зачем нужен SLA в агентной системе?
Без SLA:
- Исполнитель может отвечать бесконечно долго → весь пайплайн зависает.
- Качество ответа может быть низким → менеджер выдаёт пользователю галлюцинации.
- Перегрузка одного исполнителя убивает всю систему.
SLA даёт:
- Предсказуемость — знаем худшее время ответа.
- Возможность мониторинга — отслеживаем, когда SLO нарушается.
- Автоматическую реакцию — при нарушении включаем резервную стратегию.
3. Ключевые метрики SLA (SLI — Service Level Indicator)
| Метрика (SLI) | Описание | Типичный порог (SLO) | Единица измерения |
|---|---|---|---|
| Latency (задержка) | Время от отправки запроса до получения полного ответа | P99 < 500 ms | миллисекунды |
| Availability (доступность) | Доля успешных вызовов (HTTP 2xx / gRPC OK) | 99.9% | процент |
| Quality / Faithfulness | Степень соответствия ответа фактам из контекста (косяки в RAG) | Faithfulness > 0.9 | число от 0 до 1 |
| Rate limit (лимит запросов) | Максимальное количество запросов в секунду, которое может обработать исполнитель | 100 req/s | запросов/сек |
Дополнительно можно учитывать:
- Error budget — допустимый процент нарушений в месяц.
- Concurrency — максимальное число одновременных вызовов.
- Freshness — как часто исполнитель обновляет свои кеши/модели.
4. Как задавать SLO и цели
SLO (Service Level Objective) — это целевое значение SLI, которое система обещает соблюдать.
Пример:
- SLI: latency (P99)
- SLO: 95% вызовов латентность < 500 ms
Советы по установке SLO
- Используйте исторические данные (если система уже работает) или baseline-тесты.
- Отталкивайтесь от пользовательских ожиданий: для чата latency P99 < 2 c, для батч-задач — минуты.
- Задавайте не один, а несколько SLO: жёсткие (must-have) и мягкие (nice-to-have).
- Включайте Error budget (например, 0.1% нарушений в месяц) — при его исчерпании система перестаёт принимать новый трафик или снижает качество (graceful degradation).
5. Мониторинг и health checks
Каждый исполнитель обязан предоставлять:
- Health check endpoint (например, /health), возвращающий 200 при работоспособности.
- Metrics endpoint (например,
/metricsдля Prometheus), где выставляются:worker_request_duration_seconds(гистограмма)worker_requests_total(счётчик, с метками status)worker_uptime_secondsworker_faithfulness_score(если есть компонент оценки)
Менеджер периодически опрашивает health check (каждые 10 с) и при падении исключает исполнителя из пула, запуская fallback.
Пример минимального health check на Flask:
from flask import Flask, jsonify
import time
app = Flask(__name__)
start_time = time.time()
@app.route('/health')
def health():
return jsonify({"status": "ok", "uptime": time.time() - start_time}), 200
if __name__ == '__main__':
app.run(port=5000)
6. Механизмы реакции на нарушение SLA
Когда менеджер обнаруживает, что исполнитель нарушил SLA (например, таймаут или низкий faithfulness), он:
- Логирует и алертит — отправляет сигнал в PagerDuty / Telegram.
- Исключает исполнителя из пула активных — перестаёт отправлять на него новые запросы.
- Включает fallback:
- Если исполнитель был RAG-ретвивером → временно использует более простой BM25.
- Если генератор → возвращает ответ «извините, не могу обработать».
- Если всё упало → переключается на кеш предыдущих ответов.
- Использует circuit breaker — после N нарушений подряд перестаёт даже пробовать исполнителя в течение T секунд (паттерн из микросервисов).
Пример определения circuit breaker:
# config.yaml
workers:
retrieval:
endpoint: http://retrieval-service:5000
circuit_breaker:
failure_threshold: 5 # 5 ошибок подряд
recovery_timeout: 30 # 30 секунд ожидания
half_open_max_requests: 3 # после таймаута 3 пробных запроса
Менеджер при каждом вызове проверяет статус circuit breaker для исполнителя.
7. Проектирование SLA: компромиссы и trade-offs
| Фактор | Жёсткий SLA (высокая надёжность) | Мягкий SLA (экономия ресурсов) |
|---|---|---|
| Latency | 200 ms P99 | 1 s P99 |
| Availability | 99.99% | 99.0% |
| Cost | Дорогие инстансы, репликация | Дешёвые инстансы, возможны простои |
| Faithfulness | 0.95 (требует верификатора) | 0.85 (без верификатора) |
| Rate limits | 1000 req/s | 50 req/s |
Рекомендация: начинайте с мягкого SLA, увеличивайте жёсткость по мере роста требований и бюджета. Вводите tiered SLA: для премиум-пользователей — высокий, для базовых — низкий.
8. Пример полного контракта (contract) в YAML
worker:
id: generator-w1
endpoint: http://generator:5000/generate
sla:
latency_ms:
p99: 800
error_quota_per_month: 0.001 # 0.1%
availability:
target: 0.999
measurement_window: 1h
quality:
faithfulness_score_min: 0.9
measure_every_n_requests: 100
rate_limit:
max_rps: 200
burst: 20
consequences:
on_latency_breach: "circuit_breaker(5, 60s)"
on_availability_breach: "remove_from_pool, alert"
on_faithfulness_breach: "fallback_to_static_template, escalate"
Такой контракт хранится в файле или сервисе конфигурации и загружается менеджером при старте.
9. Как тестировать SLA до продакшена
- Load testing — с помощью Locust или k6 генерируем нагрузку, измеряем latency/availability.
- Chaos engineering — отключаем отдельные исполнители, проверяем, как система справляется.
- Quality testing — на размеченном датасете проверяем faithfulness, чтобы SLO не был слишком оптимистичным.
После тестов корректируем пороги.
Пет-проект для закрепления
Задача: построить мини‑agentic систему из менеджера и двух исполнителей (retrieval и sum‑up). Реализовать SLA, мониторинг и fallback.
Инструменты:
- Python + FastAPI (менеджер и исполнители)
- Prometheus + Micrometer (для метрик)
- Circuit breaker библиотека (например,
pybreaker)
Шаги:
- Создайте исполнителя retrieval с endpoint
/search, который принимает query и возвращает документы. Добавьте health check и metrics endpoint. - Создайте исполнителя sum‑up с GPT‑запросом. Измеряйте faithfulness с помощью маленького классификатора (или заглушки с рандомным скором).
- Менеджер получает запрос, сначала вызывает retrieval, потом sum‑up. Реализуйте таймаут в 500 ms на каждый вызов.
- Интегрируйте Prometheus: в исполнителе регистрируйте гистограмму latency, счётчик success/fail.
- Настройте circuit breaker: если исполнитель упал 3 раза за 10 секунд, отключать его на 30 секунд и использовать fallback (просто вернуть текст «временно недоступно»).
- Напишите тест (например, с
time.sleep(2)в sum‑up), чтобы искусственно нарушить SLA. Убедитесь, что менеджер отключает исполнителя.
Ожидаемый результат: менеджер корректно детектит нарушение, переключается на fallback, а через 30 секунд пробует снова (half‑open). Метрики в Prometheus отображают скачки latency и доступности.
Связь с другими вопросами
| Вопрос | Тема |
|---|---|
| 760 | Проектирование архитектуры Agentic RAG |
| 761 | Роли агентов в системе |
| 770 | Мониторинг и логирование агентов |
| 755 | Отказоустойчивость RAG (circuit breaker, fallback) |
| 762 | Обработка ошибок на уровне агентов |
Навигация
- Предыдущий: 766
- Следующий: 768
- Индекс: 00. Индекс разборов