Проєктування мультиагентного конвеєра

В агентній системі агент рідко є складною частиною. Складні — черга перед ним, бюджет навколо нього, довговічний запис під ним і незалежна перевірка після нього. Я будував це кілька разів — рантайм за AI-visibility платформою, дослідницький каскад для валідації стартапів, контент-конвеєр, що чекає підтвердження людини, перш ніж опублікувати, — і саме каркас переноситься між ними.
Чому конвеєр, а не промпт
Промпт повертає відповідь. Щоб повертати ту саму відповідь надійно й за передбачуваною ціною, потрібні стадії навколо нього: план, який можна оглянути, стан, який можна відтворити, і крок, що може відхилити результат. Це й є конвеєр — і це більша частина інженерії.
Форма запуску
Кожен запуск проходить ті самі стадії й пише в той самий запис. Якщо дізнатися, що сталося, можна лише запустивши його знову, — запис не виконує свою роботу.
Став повільну роботу за чергу
Виклики агентів повільні й подекуди дорогі, тож API не робить їх синхронно. Він ставить роботу в чергу, а фонові воркери її виконують. API лишається чуйним, невдалий крок ретраїться, не тримаючи запит відкритим, а дубльований запит зводиться до вже запущеного прогону, замість платити двічі.
Дай кожному запуску бюджет і зупиняйся, коли його вичерпано:
interface RunBudget {
maxSteps: number;
maxTokens: number;
deadline: number; // epoch ms
}
function withinBudget(spent: RunBudget, limit: RunBudget): boolean {
return (
spent.maxSteps <= limit.maxSteps &&
spent.maxTokens <= limit.maxTokens &&
Date.now() <= limit.deadline
);
}
Ретраї без дублювання
Ретраї — нормально; повторені сайд-ефекти — ні. Ключуй кожен крок так, щоб ретрай був ідемпотентним: друга спроба підтверджує першу, а не робить її знову.
Зроби стан явним
Кожен запуск — довговічний запис, і кожен крок пише свої входи й виходи. Тоді трасування є джерелом істини, а не реконструкцією заднім числом.
| Що | Де живе | Чому |
|---|---|---|
| Метадані запуску | таблиця runs |
Один рядок на запуск, статус і бюджет |
| Входи/виходи | таблиця steps |
Входи, виходи, час кожного кроку |
| Артефакти | об’єктне сховище | Великі дані тримаємо поза БД |
Виробник не оцінює себе сам
Агент, що переглядає власний вихід, не каже тобі нічого. Конвеєри, яким я довіряю, мають незалежний прохід: верифікатор, що не виробляв те, що перевіряє; рев’ю, яке автор не може затвердити. Обмеж його бюджетом, щоб не зациклився, а коли щось лишається відкритим після вичерпання бюджету, віддай це людині, а не познач як зроблене.
Спостережність
Якщо ти не бачиш, чому агент зробив те, що зробив, ти не можеш запускати його в продакшні. Span на кожен крок перетворює запуск на трасування, яке читаєш згори донизу, тож «вихід неправильний» стає «планувальник обрав не той інструмент на кроці чотири», а це вже баг, який можна полагодити.
Що переноситься
Ніщо з цього не залежить від фреймворку чи моделі. Це та сама дисципліна — чи агенти підсумовують документ, чи вирішують, готова сторінка до публікації: зроби роботу спостережною й зроби так, щоб її затверджував хтось, окрім виробника.