Глава 22

Оркестрация кодом прежде оркестрации моделью

Выбрав агентную схему, легко переложить всю координацию на модель. Но если порядок можно выразить обычным кодом, он выйдет дешевле, понятнее и проще в тестировании. Модель остаётся внутри отдельных узлов, но не принимает лишних решений о control flow.

Набор проверенных паттернов небольшой.

  • Chain - последовательность. Каждый этап упрощает следующий, между ними стоят schema и gate.
  • Route - разделение. Классификатор выбирает один специализированный prompt или обычный handler.
  • Parallel - независимые ветви. Несколько задач идут одновременно и возвращают типизированные результаты.
  • Loop - повтор с лимитом. Проверка решает, продолжать ли, но max iterations обязателен.
  • Evaluator - generate and revise. Критерии качества ясны, а feedback ведёт к измеримому улучшению.
  • Fallback - деградация. При недоступности модели или tool система выбирает безопасный упрощённый путь.

В коде это выглядит как обычный конвейер, где узлы вызывают модель, а порядок задан явно.

TypeScript
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.

Ссылки