12-Factor Agents: как строить надёжные LLM-агенты для продакшена

Dex Horthy, основатель HumanLayer, опубликовал открытый гайд 12-Factor Agents — набор из 12 инженерных принципов для создания LLM-приложений, которые реально работают у клиентов. В начале 2025 года Horthy дистиллировал свой опыт в руководство, представленное на AI Engineer World’s Fair и теперь доступное в виде популярного GitHub-репозитория. Методология уже вызвала широкое обсуждение в сообществе: гайд быстро попал на первую страницу Hacker News, набрал тысячи звёзд на GitHub и спровоцировал дискуссию о том, как правильно строить AI-native приложения.


Откуда взялась проблема

Большинство продуктов, позиционирующих себя как «AI Agents», на деле вовсе не такие агентивные — это преимущественно детерминированный код, в котором шаги с LLM расставлены в нужных местах, чтобы создать ощущение магии.

«Хорошие агенты не следуют паттерну “вот твой промпт, вот набор инструментов, крути цикл пока не достигнешь цели”. Они в основном просто программный код.»

В процессе создания HumanLayer Horthy пообщался как минимум со 100 SaaS-строителями (преимущественно техническими основателями), которые хотели сделать свои продукты более агентивными. Команды брали агентный фреймворк, чтобы быстро двигаться, достигали 70–80% нужного функционала, а затем упирались в потолок: агент начинал галлюцинировать шаги, зацикливаться или иным образом выходить за рамки допустимой надёжности. Преодоление этой отметки требовало копаться в кишках фреймворка.

⚠ Ловушка 80%
Даже если агент справляется в 90% случаев — это далеко от «достаточно хорошего для клиентов». Представьте веб-приложение, которое падает на каждой десятой загрузке страницы.

Как устроен агентный цикл (и почему он не работает сам по себе)

Типичный цикл агента выглядит так:

const initial_event = { message: "..." };
let context = [initial_event];

while (true) {
  const next_step = await llm.determine_next_step(context);
  context.push(next_step);
  if (next_step.intent === "done") return next_step.final_answer;
  const result = await execute_step(next_step);
  context.push(result);
}

Начальный контекст — это стартовое событие (сообщение пользователя, срабатывание cron, вебхук и т.д.), и мы просим LLM выбрать следующий шаг (инструмент) или определить, что задача выполнена. Большинство разработчиков быстро отказываются от идеи «бесконечного цикла вызовов инструментов», когда видят, что более 10–20 ходов превращаются в запутанный хаос, из которого LLM не может выбраться.


graph TD
    A[Стартовое событие] --> B[LLM определяет следующий шаг]
    B --> C{Цель достигнута?}
    C -- Да --> D[Финальный ответ]
    C -- Нет --> E[Выполнить шаг / инструмент]
    E --> F[Результат → в контекст]
    F --> B
    B --> G[Ошибка / зацикливание]
    G -.-> H[Агент ломается]


12 факторов: краткий обзор

Даже если LLM продолжают экспоненциально мощнеть, существуют базовые инженерные техники, которые делают LLM-powered software надёжнее, масштабируемее и проще в поддержке.

ФакторСуть
1Natural Language to Tool CallsLLM переводит текст в структурированный JSON для вызова инструментов
2Own your promptsПромпты — это код. Полный контроль без «чёрных ящиков» фреймворков
3Own your context windowContext window — не хранилище, а бюджет внимания
4Tools are just structured outputsИнструменты — просто типизированный вывод LLM
5Unify execution state and business stateЕдиное состояние для выполнения и бизнес-логики
6Launch/Pause/Resume with simple APIsАгент должен уметь ставиться на паузу и возобновляться
7Contact humans with tool callsHuman-in-the-loop — первоклассная операция, не edge case
8Own your control flowЯвные пути выполнения, никакого делегирования
9Compact Errors into Context WindowОшибки → компактное представление в контексте для самоисправления
10Small, Focused AgentsОдин агент — одна задача. 3–20 шагов максимум
11Trigger from anywhereОдин код — любой триггер: Slack, API, cron, вебхук
12Make your agent a stateless reducerАгент как чистая функция: f(events) → next_action
💡 Ключевой принцип
Вместо автономного «чёрного ящика» агент следует рассматривать как stateless reducer (функцию без состояния) над журналом событий. Это делает тестирование, воспроизведение ошибок и отладку детерминированными.

Самые важные факторы на практике

Factor 3: Владей своим context window

Context window — это не просто хранилище. Это бюджет внимания модели. Horthy проанализировал 100 000 сессий разработчиков и выявил «зону тупости» (dumb zone): средние 40–60% большого контекстного окна, где recall модели деградирует, а рассуждения начинают ломаться. После заполнения 40% контекста отдача стремительно падает.

Factor 10: Маленькие, сфокусированные агенты

Агент должен быть ограничен 3–20 шагами. Для сложных задач несколько «Micro-Agents» соединяются вместе в детерминированный DAG (направленный ациклический граф).

Factor 7: Люди — через tool calls

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

ℹ Context Engineering
Примерно через 2 месяца после публикации 12-factor agents термин «context engineering» приобрёл широкую популярность — и именно Factor 3 лежит в его основе.

Не фреймворки, а принципы

Многие успешные AI-продукты не используют готовые агентные фреймворки вовсе — вместо этого они берут несколько модульных техник из «агентного» подхода и встраивают их в собственный стек.

Будущее разработки агентов — не в более «магических» фреймворках, а в качественной инженерии, применённой к возможностям LLM. Агенты — это программный код. Относитесь к ним соответственно, и они вознаградят надёжностью и maintainability.

Сосредотачиваясь на базовых паттернах (stateless reducers, unified state), вы можете менять LLM-провайдеров или библиотеки без переписывания бизнес-логики.

📝 Аналогия
Как методология 12-Factor App от Heroku сформировала целое поколение облачного ПО, 12-Factor Agents претендует стать стандартом для AI-native разработки. Принципы одинаково применимы на TypeScript, Python и любом другом языке.

Значение для отрасли

Методология уже оказала влияние за пределами сообщества разработчиков. Даже авторы популярных фреймворков приняли эти уроки к сведению. Команда LangChain, например, рекомендовала 12-Factor Agents как обязательное чтение, отметив, что многие тезисы Horthy сводятся к лучшему «context engineering» и контролю разработчика.

Наиболее успешные команды, поставляющие AI в enterprise, избегают тяжёлых orchestration-фреймворков в пользу кастомных циклов, построенных на простых примитивах.

Репозиторий открыт для вклада сообщества: https://github.com/humanlayer/12-factor-agents