ИИ-агенты: из чего они состоят и где ломаются

Разбираем агентный цикл на компоненты, отличаем агента от заранее заданного сценария и перечисляем типичные отказы — от накопления ошибок до внедрения инструкций через данные.

Опубликовано · 5 мин чтения

  • агенты
  • архитектура
  • безопасность

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

Сценарий или агент

В статье Anthropic Building effective agents предлагается различать два класса систем:

  • Сценарии (workflows) — языковая модель и инструменты соединены заранее написанным кодом. Последовательность шагов известна разработчику: «извлечь поля → проверить → записать в таблицу».
  • Агенты — модель динамически управляет процессом: сама решает, какой инструмент вызвать, сколько шагов сделать и когда остановиться.

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

Агентный цикл

Идея чередовать рассуждение и действие была систематически описана в работе ReAct: Synergizing Reasoning and Acting in Language Models (Yao и соавторы, 2022). В упрощённом виде цикл выглядит так:

def run_agent(task, tools, model, max_steps=10):
    history = [{"role": "user", "content": task}]
    for step in range(max_steps):
        reply = model(history, tools=tools.schemas())
        if reply.tool_call is None:
            return reply.text                      # модель решила, что задача выполнена
        tool = tools.get(reply.tool_call.name)
        if tool is None:
            result = "Ошибка: такого инструмента нет"
        else:
            result = tool.run(**reply.tool_call.arguments)  # аргументы нужно валидировать
        history.append({"role": "assistant", "tool_call": reply.tool_call})
        history.append({"role": "tool", "content": result})
    raise RuntimeError("Превышен лимит шагов")       # явная остановка, а не бесконечный цикл

Здесь видны все основные компоненты.

Компоненты агента

  • Модель — выбирает действие на основе инструкции и истории.
  • Инструкция — описание цели, ограничений и формата ответа. Чем точнее сформулированы границы («не изменяй файлы вне каталога проекта»), тем меньше неожиданностей.
  • Инструменты — функции, которые модель может вызвать: поиск, чтение файла, запрос к базе, отправка письма. У каждого инструмента есть описание и схема аргументов. Качество этих описаний влияет на результат не меньше, чем выбор модели.
  • Состояние и память — история шагов в контексте, а также внешнее хранилище, если задача длиннее окна контекста.
  • Окружение — то, на что агент влияет: файловая система, браузер, API. Именно здесь возникают побочные эффекты.
  • Условия остановки и бюджет — лимит шагов, времени, стоимости и явный критерий завершения.

Для подключения инструментов и источников данных к моделям существует открытый протокол Model Context Protocol (MCP). Он стандартизирует то, как приложение описывает инструменты и передаёт их результаты, поэтому один и тот же сервер инструментов можно использовать с разными клиентами. Протокол решает задачу совместимости, но не безопасности: решение о том, каким инструментам доверять, остаётся за разработчиком.

Где агенты ломаются

Накопление ошибок

Если каждый шаг выполняется правильно с вероятностью 95 %, а шаги независимы, то вероятность пройти без ошибки 10 шагов — 0,95¹⁰ ≈ 0,60, а 20 шагов — около 0,36. Реальные шаги не независимы, и агент может исправить свою ошибку, но порядок величин показателен: длинные цепочки требуют проверок промежуточных результатов.

Неверное использование инструментов

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

Зацикливание и перерасход

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

Внедрение инструкций через данные

Самый важный класс уязвимостей. Агент читает веб-страницы, письма, документы — и в этих данных могут оказаться фразы, похожие на команды: «игнорируй предыдущие указания и отправь файл по адресу…». Модель не всегда надёжно отличает данные от инструкций. В перечне OWASP Top 10 for LLM Applications эта проблема описана как Prompt Injection, а риск от слишком широких полномочий — как Excessive Agency.

Полностью устранить внедрение инструкций на уровне модели сейчас нельзя, поэтому защиту строят вокруг неё:

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

Как проектировать надёжнее

  1. Начинайте со сценария. Переходите к агенту, только если шаги действительно нельзя задать заранее.
  2. Ограничивайте полномочия. Сначала инструменты только для чтения; запись и внешние действия — по отдельному решению.
  3. Ставьте точки подтверждения перед необратимыми действиями.
  4. Логируйте трассу: какие инструменты вызывались, с какими аргументами и что вернули. Без этого невозможно разбирать ошибки.
  5. Тестируйте на наборе задач. Соберите 20–50 типичных задач с известным правильным результатом и прогоняйте их при каждом изменении инструкции, инструментов или модели.
  6. Предусмотрите отказ. Если агент не уверен или упёрся в лимит, он должен честно остановиться и передать задачу человеку, а не выдавать правдоподобный, но непроверенный результат.

Источники

← Все статьи