🤖 Архитектура AI-агентов

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

Рабочее определение

Агент = LLM + цикл (решить → сделать → увидеть результат) + инструменты (через которые он действует) + память (контекст и история). Ценность — в автономности; цена — в непредсказуемости и стоимости (06-stoimost-i-ekonomika).


Agent loop — сердцебиение агента

В основе любого агента лежит цикл:

flowchart TD
    Goal["🎯 Цель / запрос"] --> Think["🧠 Reason<br/>(что делать дальше?)"]
    Think --> Decide{"Нужен инструмент?"}
    Decide -- да --> Act["🔧 Act<br/>(вызов инструмента)"]
    Act --> Observe["👁 Observe<br/>(смотрит результат)"]
    Observe --> Think
    Decide -- нет, ответ готов --> Answer["✅ Финальный ответ"]
    Decide -- зашёл в тупик / лимит --> Stop["⏹ Останов<br/>(max steps, fallback)"]

Цикл стоит денег

Каждый виток цикла — это новый вызов модели (и токены). Чем сложнее задача и чем больше шагов, тем дороже один «кейс». Сложность агента напрямую бьёт по экономике (06-stoimost-i-ekonomika). Поэтому первый вопрос проектирования — «минимально достаточный» агент, а не «максимально умный».

Паттерны рассуждения

Как именно модель «думает» на каждом шаге цикла — описывается паттернами:

ПаттернСутьКогда
ReAct (Reason + Act)Чередует рассуждение и действие: «подумаю → вызову инструмент → посмотрю → подумаю»Универсальный базовый паттерн
Plan-and-ExecuteСначала составляет план шагов, потом выполняет их по очередиДля многошаговых задач, где важен фронт-план
Reflection / Self-critiqueПосле ответа критикует собственный результат и исправляетДля задач с высоким требования к качеству
Tool-routerОдин вызов решает, какой инструмент/какая подсистема нужнаДля быстрой маршрутизации без длинного цикла

ReAct на практике

Пользователь: «Проверь, есть ли у нас действующий договор с ООО “Ромашка”, и если есть — сумму». ReAct-агент:

  1. Reason: «Нужно найти договор в CRM».
  2. Act: вызывает search_contracts("Ромашка").
  3. Observe: получает запись о договоре.
  4. Reason: «Нужна сумма и статус — вызову get_contract_details(id)».
  5. Act: вызывает инструмент.
  6. Observe: получает сумму и статус «действует».
  7. Answer: «Да, договор действующий, сумма — …».

Память агента

Без памяти агент не ведёт диалог и не учится. Память обычно двухуровневая:

  • Краткосрочная — контекст текущего диалога/задачи (то, что в контекстном окне, 02-tokens-context-window). Быстро переполняется.
  • Долгосрочная — сохранённые факты, предпочтения пользователя, результаты прошлых задач. Часто реализуется через RAG (09-rag) по векторной базе или отдельное хранилище «памяти».
flowchart LR
    User["👤"] --> Agent["🤖 Агент"]
    Agent <-->|"краткосрочная<br/>(контекст окна)"| STM["💬 Текущий диалог"]:::short
    Agent <-->|"долгосрочная<br/>(RAG / профиль)"| LTM["🗂 База памяти<br/>(факты, история)"]:::long
    classDef short fill:#e3f2fd,stroke:#4a90d9;
    classDef long fill:#e8f5e9,stroke:#4caf50;

Управление контекстом

Память и история не бесконечны — окно ограничено (02-tokens-context-window). В длинных сессиях контекст приходится управлять:

  • Обрезка старых сообщений (с сохранением самого важного).
  • Сжатие/суммаризация — предыдущую часть диалога модель пересказывает короче и держит саммари.
  • Вынос в RAG — вместо того чтобы тащить всю историю в окно, кладём её в базу и подтягиваем только нужное (09-rag).

Контекст — это и деньги, и внимание

Чем больше контекст, тем дороже запрос и тем хуже модель замечает важное в середине (02-tokens-context-window). Управление контекстом — это одновременно экономия и повышение качества.

Когда агент действительно нужен

Главная ловушка — оверинжиниринг

Большинство бизнес-задач решаются одним хорошо построенным вызовом LLM + RAG, без всякого агента. Агент добавляют, только когда без цикла и инструментов задача не решается. «Давайте сделаем агента» — дорогая фраза: это и сложность отладки, и непредсказуемость, и рост затрат.

flowchart TD
    Task{"Какова задача?"}
    Task -->|"Простой вопрос/summary/классификация"| Simple["💬 Один вызов LLM<br/>(+ промпт)"]
    Task -->|"Ответ по вашим документам"| Rag["🔎 RAG + один вызов"]
    Task -->|"Несколько шагов и/или инструменты"| Single["🤖 Один агент<br/>(ReAct + инструменты)"]
    Task -->|"Несколько ролей / сложный процесс"| Multi["🐝 Мультиагент<br/>(см. 12)"]

Критерии, когда агент оправдан:

  • Задача не решается за один шаг — нужно искать, уточнять, комбинировать.
  • Нужны инструменты (MCP): действия в CRM, расчёты, отправка.
  • Поведение зависит от промежуточных результатов (если нашли X — делаем A, иначе B).

Риски и управление ими

РискЧто делать
Бесконечный цикл (агент «крутится»)Жёсткий лимит шагов (max steps) + fallback
СтоимостьМинимально достаточный паттерн, маршрутизация на дешёвые модели (05-vybor-modeli)
НепредсказуемостьStructured outputs (11-tools-mcp), guardrails (08-gallyutsinatsii-i-nadezhnost)
Опасные действияHuman-in-the-loop на критичных операциях, принцип наименьших привилегий (15-compliance-i-bezopasnost)
Сложность отладкиТрассировка каждого шага, наблюдаемость (14-ocenka-kachestva)
Промпт-инъекцииРазделение доверенных и недоверных данных (07-prompt-engineering)

Архитектурное правило

Чем меньше агент может сделать сам — тем надёжнее система. Давайте ему ровно те инструменты, что нужны для задачи, и никаких «на всякий случай». Каждый лишний инструмент — это и риск (промпт-инъекция), и шанс, что агент пойдёт не туда.


📌 Что запомнить

  • Агент = LLM + цикл (reason → act → observe) + инструменты + память.
  • Паттерны: ReAct (база), Plan-and-Execute, Reflection.
  • Память: краткосрочная (контекст) и долгосрочная (часто через RAG).
  • Контекстом надо управлять: обрезка, суммаризация, вынос в RAG.
  • Большинство задач решается без агента — один вызов + RAG. Агент — только когда нужен цикл и инструменты.
  • Главные рычаги надёжности: лимит шагов, минимум инструментов, human-in-the-loop, трассировка.

Дальше: 🔧 Инструменты и MCP → — как агент вызывает внешние системы и почему Structured Outputs и MCP стали стандартом.