Оркестрация кодом прежде оркестрации моделью
Выбрав агентную схему, легко переложить всю координацию на модель. Но если порядок можно выразить обычным кодом, он выйдет дешевле, понятнее и проще в тестировании. Модель остаётся внутри отдельных узлов, но не принимает лишних решений о control flow.
Набор проверенных паттернов небольшой.
- Chain - последовательность. Каждый этап упрощает следующий, между ними стоят schema и gate.
- Route - разделение. Классификатор выбирает один специализированный prompt или обычный handler.
- Parallel - независимые ветви. Несколько задач идут одновременно и возвращают типизированные результаты.
- Loop - повтор с лимитом. Проверка решает, продолжать ли, но max iterations обязателен.
- Evaluator - generate and revise. Критерии качества ясны, а feedback ведёт к измеримому улучшению.
- Fallback - деградация. При недоступности модели или tool система выбирает безопасный упрощённый путь.
В коде это выглядит как обычный конвейер, где узлы вызывают модель, а порядок задан явно.
const result = await pipeline([
step("classify", classifySchema),
branch({
faq: step("retrieve", retrievalSchema),
account: step("read_account", accountSchema),
human: stop("handoff")
}),
step("compose", answerSchema),
gate("citations_exist"),
step("render")
], {
timeoutMs: 8000,
maxModelCalls: 3,
onFailure: "safe_handoff"
});И важное уточнение про терминологию.
Deterministic не означает без LLM. Google ADK называет Sequential, Parallel и Loop workflow-агентами, но подчёркивает: их control flow задаётся кодом, а не решением модели. Внутренние узлы при этом вполне могут использовать LLM.