Agent Architecture

Архитектура агента — это сборка надёжного агентного цикла «своими руками», слой за слоем, а не вызов фреймворка. Тезис: агент на ~90% — классическая инженерия вокруг ~10% «магии» LLM. Понимание низкоуровневой логики (Python + SQLite) важнее, чем фреймворк, прежде чем переходить к LangGraph.

Суть

Если Agent Anatomy отвечает на вопрос «из чего агент состоит» (4 компонента), то архитектура отвечает «как собрать цикл, который выживает и не разоряет». Frontier-агент собирается из ~10 слоёв на чистом Python, без «чёрных ящиков».

Зачем это нужно

Демо-агент падает в проде: теряет прогресс при рестарте, зацикливается, верит сам себе, жжёт бюджет. Надёжность даёт не «умная модель», а инженерная обвязка: персистентность, самоисцеление, внешняя верификация, экономика.

Как работает (ключевые слои)

  • Master Loop (OODA) — «скучная оркестрация» (Anthropic boring orchestration): while True опрашивает граф задач → берёт готовую → вызывает LLM → обновляет стейт. Управляющий слой намеренно глуп и предсказуем, «магия» — внутри.
  • Task DAG + персистентность — задачи как направленный ациклический граф; статус мгновенно пишется в SQLite (agent_state.db). При рестарте (упал Colab/сервер на шаге 49 из 50) агент продолжает с чекпоинта, а не заново. Зависимости в поле depends (JSON); get_ready_nodes() разблокирует следующий шаг.
  • Self-Healing — при первой же ошибке API/кода цикл делает retry, ведёт лог attempts в SQLite (по нему видно, какие задачи чаще всего валятся).
  • Thinking Channel — разделение <thinking> и <answer> (см. Chain of Thought); снижает логические ошибки.
  • Tool Grounding — агент не «считает в уме», а пишет Python/SQL и выполняет в песочнице (REPL), сверяя мысли с реальностью (см. Tool Calling).
  • Architect/Editor split — «умная» дорогая модель проектирует короткий JSON-план, «дешёвая быстрая» печатает сотни строк кода: экономия 50–80% бюджета (см. Agent CostControl).
  • Best-of-N + внешний верификатор, Trust Gate (тесты, неизменяемые агентом) — вынесено в Generator Evaluator.
  • Prompt caching — «статика вверх, динамика вниз» (см. Prompt Caching).
  • Bi-temporal memory — аудит смены убеждений агента (см. Agent Memory).
  • MCP Tool Registry — интероперабельность инструментов (см. MCP).

Пример

Master loop (OODA) — намеренно «глупый» управляющий цикл: опрашивает Task DAG, исполняет готовый узел, фиксирует статус в SQLite, на сбое — retry до лимита (self-healing).

def robust_master_loop(dag, max_retries=3):
    while True:
        ready = dag.get_ready_nodes()              # узлы без незавершённых зависимостей
        if not ready:
            break                                  # всё done либо есть failed/блокировка
        node_id, title = ready[0]
        if execute_task(node_id, title):
            dag.set_status(node_id, "done")        # персист в SQLite сразу
        elif dag.increment_attempt(node_id) >= max_retries:
            dag.set_status(node_id, "failed")      # self-healing сдаётся после N попыток

Своя сборка против фреймворка

Развилка решается не «мощностью» фреймворка, а тем, что именно вы получаете и чем за это платите.

  • Голый цикл оправдан, когда шагов немного и поток линейный: вы платите своим кодом за отсутствие чужих абстракций и полное понимание происходящего. На проде это работает ровно до появления ветвлений и необходимости переживать перезапуск.
  • LangGraph покупает управление потоком и состоянием: ветвления, циклы с лимитами, персистентность между шагами, отмотку истории. Брать его есть смысл тогда, когда вы уже начали писать это сами.
  • PydanticAI решает другую задачу — типобезопасность и валидацию на границе с моделью; он не конкурент графу, а слой рядом с ним.
  • CrewAI — ролевая метафора для быстрого старта команды агентов, за скорость платят предсказуемостью (MAS Frameworks).

Практический критерий один: сколько чужих абстракций вы готовы отлаживать в инциденте. Если ответ «мало» — берут голый цикл и пишут только то, что нужно; если поток уже сложнее линейного, своя реализация повторит фреймворк, но без его тестов. Чтобы развилка не стоила переписывания, оркестрацию отделяют адаптером (Orchestrator Adapter).

Про тестирование self-healing. Редкий отказ API не ловится ожиданием — его воспроизводят: контрактные тесты с подменённым инструментом, отдающим таймаут, пустоту и невалидную схему, гоняются как обычные тесты (Agent Failure Modes, контрактное тестирование). Отдельный класс — сам отказ восстановления: тест recovery в CI, без которого о сломанном self-healing узнают в проде (LangGraph Checkpointers).

Связано с

  • Agent Execution Platform — что должно окружать этот цикл, когда появляются права, арендаторы и подтверждения
  • Agent Anatomy — «из чего» (4 компонента) дополняется «как собрать» (слои)
  • ReAct — master loop = реализация reasoning-цикла в коде
  • Generator Evaluator — слой верификации (Best-of-N, Trust Gate)
  • Agent CostControl — Architect/Editor и бюджеты как часть архитектуры
  • Plan and Execute — оркестрация/планировщик в этой сборке
  • Multi Agent Systems — когда «своя» сборка разрастается в команду агентов (CrewAI)