Инженерия AI‑агентов: промпт‑паттерны, инструменты, evals и наблюдаемость — практический гайд 2026
Логотип Антон Горошков Антон Горошков
Логотип Антон Горошков Антон Горошков
Инженерия AI‑агентов: промпты, инструменты, evals
Антон Горошков Антон Горошков

Инженерия AI‑агентов: промпт‑паттерны, инструменты, evals и наблюдаемость — практический гайд 2026

Если агент “в демо” выглядит магически, а “в проде” — нестабильно, это нормально. Агентная система — это продукт, где важны архитектура, ограничения, тестирование и наблюдаемость. В этой статье — практичные паттерны: как писать промпты, как проектировать инструменты, как строить evals, и как держать под контролем качество, безопасность и стоимость.

Содержание

  1. Промпты как контракты: входы/выходы/ограничения
  2. Контекст и память: как не утонуть в токенах
  3. Инструменты: дизайн API, ошибки, идемпотентность
  4. Оркестрация: chain → router → orchestrator → evaluator
  5. Evals: сценарии, метрики, регрессия
  6. Наблюдаемость: трассировка, стоимость, SLO
  7. Безопасность: injection, права, sandbox
  8. Официальные источники (nofollow)

1) Промпт‑дизайн для агентов: меньше “литературы”, больше контрактов

Для агента промпт — это не «красивое ТЗ», а контракт: входы, выходы, ограничения. Самые рабочие элементы:

Self‑check как стандарт

Почти всегда помогает встроить шаг самопроверки:

1) Сгенерируй решение.
2) Проверь решение по чек‑листу (факты, ссылки, формат, безопасность, стоимость).
3) Если провал — исправь и повтори (макс 2 итерации).
        
Схема промпт‑паттернов для AI‑агентов: routing, self-check, tool-use, evaluator loop
Промпт‑паттерны, которые чаще всего дают стабильность: контрактный вывод, routing и self‑check.

Структура системного промпта: “кто ты”, “что ты делаешь”, “что нельзя”

Если вы используете один LLM‑вызов для всего — вы неизбежно смешаете роли. Поэтому полезный минимальный рефрейм: агент — это несколько шагов, и у каждого шага своя роль. Но даже в одном шаге системные инструкции стоит держать структурно:

Это банально звучит, но именно такая “шпаргалка” делает агентный промпт отлаживаемым. Когда что-то ломается, вы знаете: это проблема роли, контракта, данных или инструментов.

Паттерн: routing‑промпт, который экономит деньги

Router можно делать очень коротким: задача не “решить проблему”, а выбрать ветку. Чем меньше текста и чем более формальный контракт — тем стабильнее.

    Ты — маршрутизатор запросов.
    Классифицируй запрос в одну из веток: support | sales | research | other.
    Если информации недостаточно — need_clarification=true и задай максимум 2 вопроса.
    Выход: строго JSON {route, confidence, need_clarification, clarifying_questions}.
        

Паттерн: tool‑use промпт с “ограничением права выбора”

Частая поломка: агент начинает вызывать инструменты “на всякий случай”. Лекарство — сказать, что инструмент — это стоимость, и его нужно обосновать. Например: разрешаем максимум 2 tool calls без дополнительного подтверждения.

    Правила tool use:
    1) Перед каждым tool call напиши причину: зачем он нужен и какой результат ожидаешь.
    2) Максимум 2 tool calls; если не хватило — запроси уточнение или эскалируй.
    3) Если tool вернул ошибку 403/401 — остановись (policy).
        

Self‑check без “воды”: чек‑лист, который реально работает

Самопроверка полезна только если она проверяет конкретику. Универсальный минимальный чек‑лист для агентных шагов:

Практика: “двухмодельный” шаг (генератор + проверяющий)

Если вам критично качество (юридические ответы, финансы, безопасность), полезна схема: одна модель генерирует, другая проверяет. Это не магия — это дисциплина. Проверяющая модель должна иметь отдельный промпт и не “жалеть” генератора.

Главное правило: у проверяющего должны быть ясные критерии и право сказать “не прошло”. Иначе вы получите “две модели, которые согласны друг с другом” и никакого улучшения.

Чек‑лист прод‑готовности промптов

Почему “один супер‑промпт” почти всегда проигрывает

В проде вы боретесь не за “умный ответ”, а за стабильное поведение. Один большой промпт часто приводит к:

Паттерн: “контрактный вывод”

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

    Задача: классифицируй запрос и выбери маршрут.
    Выход (строго JSON):
    {
      "route": "support" | "sales" | "research" | "other",
      "confidence": 0..1,
      "need_clarification": true|false,
      "clarifying_questions": ["..."]
    }
        

Паттерн: “просить уточнение раньше, чем делать действие”

Один из самых дешёвых способов повысить качество — научить агента останавливаться и задавать 1–2 вопроса, если данных не хватает. Это лучше, чем “додумать”, потому что “додумать” в агентных системах превращается в инциденты.

1.5) Контекст и память: как не утонуть в токенах

Почти все проблемы “качества” в агенте со временем упираются в контекст: вы добавляете больше правил, больше логов, больше истории — и модель начинает “плавать”. Поэтому контекст инженеринг — отдельная инженерная задача.

Для сценариев, где нужен источник правды (документы/CRM/политики), почти всегда выигрывает RAG: вы подтягиваете релевантные фрагменты вместо хранения “всего мира” в промпте.

Токен‑бюджет как инженерное ограничение

В агентных системах качество часто деградирует не потому, что “модель глупая”, а потому что контекст стал слишком большим и шумным. Поэтому заведите простое правило: у каждого запроса есть бюджет — по токенам и по времени. Если бюджет превышен, агент должен (а) сжать контекст, (б) перейти на более простой план, или (в) запросить уточнение.

Практический минимум для начала:

Важно: бюджеты должны быть программными, а не “надеемся, что модель сама”. Это часть guardrails.

Три вида памяти: рабочая, эпизодическая, семантическая

Удобно думать о “памяти агента” как о трёх слоях:

В проде выигрывает подход “минимум текста, максимум структуры”. Например, вместо того чтобы держать в чате 20 сообщений, вы храните компактный state‑объект:

{
  "goal": "resolve_support_ticket",
  "customer": {"id": "C123", "segment": "pro"},
  "constraints": ["no_personal_data", "no_refunds_without_human"],
  "facts": [
    {"key": "error_code", "value": "E42", "source": "log_search"},
    {"key": "plan", "value": "retry+config_reset", "source": "agent"}
  ],
  "actions_taken": [
    {"tool": "search_logs", "status": "ok"},
    {"tool": "get_account", "status": "ok"}
  ],
  "open_questions": ["Which region is affected?"]
}
        

RAG‑паттерны, которые уменьшают “галлюцинации”

RAG не “делает модель умнее” сам по себе. Он снижает риск выдумок, если вы:

Простая и эффективная схема:

  1. Сформулировать 1–2 поисковых запроса (коротко).
  2. Вытащить 3–5 фрагментов (с метаданными: doc_id, section, дата).
  3. Сжать фрагменты до “claims” (короткие факты).
  4. Решить задачу, ссылаясь на claims, а не на “весь текст”.

Сжатие истории: “события” вместо “чата”

Когда агент ведёт диалог, его легко превратить в нескончаемую простыню. Лучше хранить историю как события: что спросили, что ответили, что сделали. Это упрощает как отладку, так и соблюдение политик (например, очистку PII).

Бонус‑паттерн: храните отдельно “raw chat” (для аналитики, с доступом по ролям) и “runtime summary” (который реально идёт в промпт). Runtime summary можно пересобирать и пересжимать.

2) Инструменты: проектируйте как API для “небрежного пользователя”

Модель иногда ошибается. Поэтому инструменты должны быть:

Инструмент‑каталог: что держать рядом с агентом

  1. Read: поиск, БД, документы, CRM — только чтение.
  2. Write: создание тикетов, отправка писем, обновление статусов — с подтверждением.
  3. Danger: деньги/удаление/доступ — только через человек‑в‑контуре.

Идемпотентность: ваша защита от ретраев

Агент может повторить действие (или вы повторите шаг пайплайна после сбоя). Если “создать тикет” не идемпотентно, вы получите дубли. Поэтому для write‑инструментов полезно иметь idempotency key: “создай тикет с ключом X; если уже есть — верни существующий”.

Типовые ошибки инструментов и как агент должен реагировать

Таблица ошибок: одинаковые коды → одинаковое поведение

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

Класс ошибки Что это значит Как должен реагировать агент
validation_error Параметры не прошли схему, неверный формат, отсутствует обязательное поле Исправить параметры, сделать максимум 1 повтор; если повтор не помог — уточнить данные
not_found Объект не найден (ID неправильный, сущность удалена, доступ ограничен) Спросить уточнение (ID/контекст), попробовать альтернативный поиск, затем эскалация
forbidden Запрещено политикой или ролью (401/403), нет прав или действие не разрешено Остановиться, объяснить ограничение, предложить безопасный путь (человек‑в‑контуре)
rate_limited Лимит API превышен, провайдер просит подождать Подождать и повторить по backoff, но не больше лимита; предложить fallback, если критично
timeout / transient Временный сбой сети/сервиса, нет ответа вовремя 1–2 ретрая, затем fallback на кэш/другой источник; если нельзя — эскалация

Дополнительно полезно нормализовать “внутренние” ошибки в те же классы (например, исключения SDK, сетевые ошибки, некорректные ответы). Тогда ваши метрики и алерты становятся стабильными, а runbook проще: вы реагируете на классы, а не на тысячи частных сообщений. И не забывайте логировать не только текст ошибки, но и контекст: какой инструмент, какие параметры, какая версия промпта, и что было запланировано агентом. Именно это чаще всего сокращает время диагностики.

Последний штрих — прогоняйте сценарии ошибок в eval‑наборе намеренно: искусственный timeout, validation_error, rate limit. Если агент “красиво” деградирует на тестах, он не будет удивлять вас в проде. Это также помогает проверить, что бюджеты ретраев, fallback‑ветки и эскалации действительно работают всегда.

Золотое правило: инструмент возвращает структуру, а не “похоже на правду”

Старайтесь, чтобы tool output был машинно проверяемым: коды, поля, статусы. Тогда вы можете делать программные проверки перед следующим шагом.

Tool schemas: чем строже, тем дешевле отладка

Если вы используете tool calling, относитесь к инструментам как к публичному API. Чем строже схема (типы, enum, required поля), тем меньше “угадывания” параметров. Практические советы:

Мини‑пример “хорошего” инструмента:

tool: create_support_ticket
inputs:
  title: string (max 120)
  priority: enum("low","medium","high")
  customer_id: string
  idempotency_key: string
output:
  {"ticket_id": "T123", "status": "created", "url": "..."}
errors:
  validation_error | forbidden | rate_limited | timeout
        

Политика ретраев: не давайте агенту “крутиться” бесконечно

Ретраи — частая причина “пожара” по стоимости. Введите политику в коде:

Если у вас есть “дорогие” действия (письма, изменение статусов, деньги), делайте двухфазную схему: plan → confirm → execute. Тогда агент сначала формирует план и просит подтверждение (человека или policy‑модуля), и только потом действует.

Идемпотентность + журнал действий: защита от повторов

Для write‑инструментов хорошо иметь “action log”: запись о попытках, ключ идемпотентности, статус выполнения и результат. Это помогает:

3) Паттерны оркестрации: выбирайте самый простой, который проходит eval

Многие “супер‑агенты” разваливаются, потому что архитектура сложнее, чем требования. Практичная лестница усложнения:

Когда хватает chain

Chain хорош, когда задача линейна: “собери данные → сделай вывод → оформи ответ”. Важный бонус — вы легко ставите контрольные точки: валидация формата, проверка фактов, лимиты.

Когда нужен router

Router нужен, когда есть разные типы запросов и разные политики. Например: “поддержка” (можно читать CRM) и “финансы” (нельзя). Router снижает риск.

Когда оправдан orchestrator‑worker

Orchestrator‑worker оправдан, когда: (1) нужно параллелить сбор данных, (2) нужны разные роли/контексты, (3) один большой контекст начинает деградировать.

Evaluator loop — только когда у вас есть критерии

Частая ошибка: добавить “самопроверку” без критериев. Эвалюатор должен проверять конкретику: факты, ссылки, формат, соответствие policy. И обязательно иметь лимит итераций.

Состояния и переходы: делайте оркестрацию как state machine

Когда сценарий перестаёт быть линейным, самый устойчивый подход — описывать процесс как конечный автомат: состояния (collect_data, propose_plan, execute, verify, escalate) и переходы. Это уменьшает “магические” решения модели и делает поведение повторяемым.

Важные инженерные детали:

Практика: лучше иметь 6–10 “проверяемых” состояний, чем один “интеллектуальный” шаг на всё.

4) Evals и тестирование: агент — это не unit‑тесты, а сценарии

Минимально жизнеспособный eval‑набор:

Наблюдаемость: что логировать в первую очередь

Как сделать eval‑набор “быстро, но честно”

Минимальный процесс:

  1. Соберите 20–50 реальных задач (анонимизируйте).
  2. Согласуйте “что считается успехом” (rubric).
  3. Добавьте 10 плохих кейсов (инъекции, пустые данные, конфликты).
  4. Прогоняйте после каждого изменения промптов/инструментов.

Важно: если вы не можете измерить успех — вы не инженерите, вы “гадалка с логами”.

Rubric: что считать “успехом” и “провалом”

Чтобы evals работали, вам нужен рубрикатор. Это 5–10 критериев с понятной шкалой. Пример для support‑агента:

LLM‑as‑judge: полезно, но требует калибровки

Судья‑модель экономит время, но может “проглатывать” ошибки. Поэтому:

Регрессия: почему “сегодня лучше” завтра может стать хуже

Агентные системы легко ломаются от небольших изменений: вы поправили промпт — и выросло число tool calls; вы добавили новый инструмент — и модель начала “прыгать” между ними. Поэтому evals — это регрессионные тесты: прогон после каждого значимого изменения.

Минимальный “инженерный” отчёт по прогону:

4.5) Наблюдаемость: трассировка, стоимость, SLO

Наблюдаемость в агентных системах — это не “логи ради логов”. Это способ отвечать на вопросы: “почему агент принял это решение?”, “сколько это стоило?”, “где он сломался?”

Метрики, которые окупаются первыми

Если вы не знаете, что мерить — начинайте с того, что влияет на деньги и риски:

Хорошая практика — сделать дешёвый “dashboards v0” ещё до масштабирования. Тогда вы увидите, что именно портит качество: промпты, данные, инструменты или политика.

Версионирование промптов и “prompt diff”

В агентной инженерии промпт — это код. Его надо версионировать: хранить идентификатор версии в трассировке, уметь сравнивать изменения и связывать с регрессией. Без этого вы будете “улучшать”, не понимая, что именно улучшили.

SLO, алерты и runbooks: чтобы инциденты были короткими

Когда агент становится частью процесса (поддержка, продажи, операции), у вас появятся инциденты. Нормальная цель наблюдаемости — не “чтобы не было инцидентов”, а чтобы они: (1) быстро обнаруживались, (2) быстро диагностировались, (3) имели понятный план действий.

Примеры SLO, которые хорошо подходят агентам:

Для каждого алерта полезен короткий runbook: где смотреть трассы, какие последние изменения (промпт/модель/инструменты), какие безопасные fallback‑действия (выключить write‑tools, поднять порог эскалации, уменьшить retrieval).

Пример “дашборда v0”

Если нужно начать быстро — сделайте 4 графика и таблицу:

5) Безопасность: ваши guardrails должны жить вне промпта

Промпт — не граница безопасности. Граница — код: allowlist, политики доступа, фильтры, sandbox и лимиты. Если вам нужен прикладной пример на живом проекте — полезно посмотреть OpenClaw‑гайд: Безопасное развёртывание OpenClaw.

Prompt injection как базовая угроза

Если агент читает внешние данные (страницы/письма/доки), он может “получить инструкцию” внутри данных. Правильный ответ — не “доверяй промпту”, а:

Least privilege и роли

У агента должен быть минимальный набор прав. Если у вас несколько сценариев (поддержка/финансы/админка), лучше сделать разные “профили” инструментов и маршрутизировать по policy.

Границы данных: что агенту можно “видеть”

В проде проблема редко в том, что агент не умеет рассуждать. Проблема — в том, что он может получить лишние данные. Поэтому:

Sandbox для опасных действий

Если агент может выполнять код, ходить в сеть или менять данные, вам нужен sandbox. Минимальная идея: агент формирует план и команду, а выполняет отдельный сервис с жёсткими ограничениями (файловая система, сеть, таймаут, лимит CPU/памяти). Даже если LLM “попросит” сделать что-то странное, sandbox должен это заблокировать.

Red‑teaming: готовьте “вредные” кейсы заранее

Безопасность агента нельзя “добавить потом”. Добавьте в eval‑набор кейсы:

И главное: проверяйте, что “блокировки” реализованы в коде (политики/allowlist), а не только в промпте.

5.5) Производительность и стоимость: как сделать агента быстрым и предсказуемым

Почти любой агентный проект через 2–6 недель упирается в стоимость. Причина простая: вы добавляете память, инструменты и самопроверку — и система становится “дорогой по умолчанию”. Инженерный выход — проектировать экономику заранее: что дорого, что дешево, что можно кэшировать, и где нужен более мощный интеллект.

Маршрутизация по стоимости: дешёвые шаги — на дешёвых моделях

Не каждый шаг требует “лучшей модели”. Часто router, нормализация, извлечение полей или форматирование отлично работают на более дешёвом варианте. А вот планирование сложного сценария или проверка безопасности — кандидаты на более сильную модель.

Важно: “сильная модель” без guardrails может сделать больше вреда — поэтому связка strong model + строгие политики обычно лучше, чем “просто сильная модель”.

Кэширование: самый недооценённый рычаг

Кэш можно делать на нескольких уровнях:

Но кэш — это ещё и риск. Поэтому держите правила:

Параллелизм и батчинг: ускоряем без потери контроля

Если агент делает несколько независимых “read” действий (поиск логов, запрос в CRM, загрузка доков), их можно выполнять параллельно. Но обязательно ограничивайте параллелизм, иначе вы: (1) упрётесь в rate limits, (2) сожжёте деньги, (3) усложните отладку.

Практический паттерн: оркестратор создаёт список подзадач, запускает их параллельно, затем агрегирует результаты в один компактный объект state и только потом вызывает LLM для решения. Это часто дешевле, чем делать LLM‑шаг после каждого tool call.

Fallback‑стратегии: как деградировать “красиво”

В проде неизбежны ситуации: модель недоступна, инструмент падает, retrieval возвращает пусто. Пользователь не обязан страдать от вашей инфраструктуры. Заранее определите fallback‑ветки:

Важно: fallback — это тоже часть evals. Проверьте, что агент не “ломается” в деградации.

Финальный чек‑лист: что должно быть в “инженерном” агенте

5.75) Референс‑архитектура: “агент как сервис”, а не как чат

Чтобы агент был надёжным, удобно мыслить не “LLM отвечает на вопрос”, а “сервис обрабатывает запрос”. В таком сервисе LLM — лишь один компонент, вокруг которого есть хранение состояния, политики, инструменты и логирование.

Минимальный вариант прод‑архитектуры (без лишней сложности):

  1. API слой принимает запрос и создаёт trace_id + request_id.
  2. Policy слой проверяет: можно ли выполнять действия, есть ли запреты, какие инструменты доступны.
  3. Router выбирает маршрут и профиль инструментов (support/sales/research).
  4. Orchestrator запускает state machine и контролирует бюджеты.
  5. Tools layer выполняет read/write инструменты с валидацией и идемпотентностью.
  6. Memory/RAG даёт только релевантные фрагменты + метаданные.
  7. Evaluator валидирует контракт, политику и качество; при провале — эскалация.
  8. Observability пишет метрики (стоимость/латентность/ошибки) и события (tool calls, переходы состояний).

Ключевой момент: даже если вы используете “один LLM вызов”, вы можете оборачивать его в структуру — и постепенно добавлять элементы (policy, budgets, state) по мере роста требований.

Пример: контракт “план → выполнение → отчёт”

Для многих задач (поддержка, операции, маркетинг) хорошо работает трёхфазная схема: агент сначала предлагает план, затем выполняет действия, затем формирует отчёт. Это даёт контроль и снижает риск “не туда нажать”.

Фреймворки и библиотеки: когда они помогают, а когда мешают

Экосистема агентных фреймворков развивается быстро. На практике выбор сводится к вопросу: вам нужно быстро собрать прототип или контролируемая прод‑система?

Практическое правило: начинайте с минимального слоя абстракции. Если вы ловите себя на том, что боретесь с фреймворком больше, чем решаете бизнес‑задачу — скорее всего, вам нужен более простой каркас (router + state machine + tools + observability).

6) Куда дальше: связанный кластер статей

Мини‑чек‑лист прод‑готовности (чтобы не “потерять агента” в эксплуатации)

Если вы прочитали статью и хотите быстро понять, “мы близко к прод‑системе или у нас ещё демка”, пройдитесь по короткому чек‑листу. Он не заменяет полноценный аудит, но хорошо ловит 80% типовых проблем.

Если из списка закрыто меньше половины — лучше сознательно оставаться в copilot‑режиме: агент будет полезным, но вы не получите неприятных сюрпризов.

Заключение

Высокопроизводительные агенты — это дисциплина: контракты вместо “поэзии”, инструменты как API, evals как регрессия и наблюдаемость как часть продукта. С таким подходом агент перестаёт быть “демкой” и становится системой, которой можно доверять.

Официальные источники и документация (nofollow)

Темы:
Основная тема: AI агенты