AI-агенты и автоматизация Собрать руками
Workflow, очереди и ретраи для AI-агента
AI-агент — не волшебная коробка: он требует чёткого workflow, устойчивой очереди задач и умения корректно обрабатывать сбои. В этом гайде — как собрать агента, который не падает, а ждёт и пробует снова.
Что такое workflow агента?
Workflow — это последовательность этапов, через которые проходит задача от поступления до завершения. Для AI-агента это: получение запроса → анализ цели → выбор инструмента → выполнение → обработка результата → логирование → ответ. Если на любом этапе происходит ошибка — workflow должен либо завершиться с fallback, либо перейти в очередь на повтор.
Стандартный workflow агента
flowchart TD
A[Запрос поступил] --> B{Проверка контекста}
B -->|OK| C[Разбор цели]
B -->|Ошибка| Z[Fallback / human review]
C --> D[Выбор инструмента]
D --> E[Вызов инструмента]
E --> F{Успех?}
F -->|Да| G[Формирование ответа]
F -->|Нет| H[Лог + ретраи]
H --> I{Попытки исчерпаны?}
I -->|Да| Z
I -->|Нет| E
G --> J[Отправка ответа]
Зачем нужны очереди?
Очередь — это буфер между входящими запросами и агентом. Она решает три проблемы: нагрузка (агент не перегружается), приоритеты (важные задачи — вперёд), отказоустойчивость (запросы не теряются при падении агента). В CodeVibers мы используем Redis Streams или RabbitMQ для асинхронной обработки задач.
Пример: постановка задачи в очередь
// Псевдокод: отправка задачи в очередь
const task = {
id: uuid(),
user_id: "u_123",
goal: "Проверить баланс по счету 4711",
context: { account_id: "4711", timestamp: Date.now() },
priority: "normal",
max_retries: 3,
retry_delay_ms: 2000
};
await redis.xAdd("agent:tasks:queue", "*", "payload", JSON.stringify(task));
// Redis Stream: ключ "agent:tasks:queue" — очередь задач
Обработка с ретраями: простой цикл
async function processTask(task) {
let attempt = 0;
while (attempt < task.max_retries) {
try {
const result = await agent.run(task);
return { status: "success", result };
} catch (err) {
attempt++;
if (attempt === task.max_retries) {
log.error(`Task ${task.id} failed after ${attempt} attempts`, err);
return { status: "failed", error: err.message, needs_human_review: true };
}
await sleep(task.retry_delay_ms * attempt); // экспоненциальная задержка
}
}
}
Типичные ошибки
- Бесконечные ретраи — без лимита и экспоненциальной задержки агент может «зависнуть» и блокировать ресурсы.
- Очередь без TTL — устаревшие задачи накапливаются и мешают обработке актуальных.
- Нет разделения по типам ошибок — сеть? LLM? Данные? — нужно логировать и обрабатывать по-разному.
- Ретраи без проверки идемпотентности — повторный вызов инструмента может создать дубли (например, заказ).
Чеклист надёжного агентного workflow
| Что проверить | Зачем |
|---|---|
| Очередь с TTL и лимитом длины | Избежать накопления «мертвых» задач и перегрузки |
| Ретраи с экспоненциальной задержкой и лимитом | Не спамить внешние API и не блокировать агента |
| Разделение ошибок: сеть / LLM / данные / инструмент | Разные стратегии fallback и логирования |
| Идемпотентные ключи для повторных вызовов | Избежать дублирования действий (заказы, платежи) |
| Метрики: время в очереди, % ретраев, % fallback | Вовремя заметить деградацию системы |
| Ручная проверка через human_review_queue | Не терять критичные случаи и учить агента |
Следующий шаг
Теперь, когда агент умеет работать в потоке и не падать — пора научить его тестировать сам себя и оценивать качество результата. Это критично для автоматического fallback и обучения.