🤖 Архитектура 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-агент:
- Reason: «Нужно найти договор в CRM».
- Act: вызывает
search_contracts("Ромашка").- Observe: получает запись о договоре.
- Reason: «Нужна сумма и статус — вызову
get_contract_details(id)».- Act: вызывает инструмент.
- Observe: получает сумму и статус «действует».
- 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 стали стандартом.