🎯 Инструменты и MCP для AI-агентов

Ключевые тезисы

  • Инструменты (tools) расширяют возможности LLM, превращая их из простых генераторов текста в агентов, способных выполнять действия.
  • Инструмент — это функция, предоставленная LLM, с четким описанием, вызываемой сущностью, аргументами и выходными данными.
  • Model Context Protocol (MCP) — открытый стандарт для создания безопасных двусторонних соединений между AI-моделями и внешним миром, решающий проблемы масштабирования и переиспользования инструментов.

🔧 Что такое инструменты и зачем они нужны

LLM без инструментов имеют ограниченные возможности:

  • ❌ Нет доступа к современным данным.
  • ❌ Плохо справляются с арифметическими задачами.
  • ❌ Не могут выполнять действия самостоятельно.

Инструменты нивелируют эти проблемы. Их использование стало переломным моментом в переходе от чат-ботов к агентам.

Как работает вызов инструмента (tool calling)

  1. Модель получает описание доступных инструментов (обычно через системный промт).
  2. При анализе пользовательского запроса модель определяет, какой инструмент нужно вызвать.
  3. Модель генерирует структурированный вызов (например, JSON с названием функции и аргументами).
  4. Агент (код) распознает этот вызов, выполняет функцию и возвращает результат модели.
  5. Модель использует результат для формирования окончательного ответа пользователю.

📋 Ключевые принципы проектирования инструментов

  1. ✅ Работа в рамках распределённых транзакций — инструмент должен корректно обрабатывать цепочки действий в нескольких системах и уметь откатывать частично выполненные операции (например, при оформлении заказа).
  2. ✅ Идемпотентность и обработка повторных вызовов — повторный вызов инструмента (например, после таймаута агента) не должен приводить к дублированию действий (например, отправке нескольких одинаковых письм).
  3. ✅ Информативные и структурированные сообщения об ошибках — ошибки должны быть понятны не только человеку, но и модели, чтобы она могла корректно перевызвать инструмент или сообщить о проблеме (например, отсутствии обязательного параметра или токена авторизации).
  4. ✅ Гайды по взаимодействию с пользователем — инструмент должен передавать модели инструкции, например, дозапрашивать недостающие данные у пользователя или сообщать о невозможности выполнения операции.
  5. ✅ Structured outputs — инструменты должны возвращать данные в структурированном формате, удобном для дальнейшего использования моделью.

💡 Ключевой вывод: Хороший инструмент для агента — это надежный контракт между LLM и реальной системой, устойчивый к сбоям, повторным вызовам и изменениям среды.


🚀 Model Context Protocol (MCP)

Проблемы, которые решает MCP

  • 🔗 Инструменты жестко связаны с конкретным агентом, их сложно переиспользовать.
  • 📝 При изменении описаний (specs) инструментов приходится переписывать их в каждом агете.
  • 🧩 Пайплайны становятся хрупкими и сложно масштабируемыми из-за зависимости от конкретных моделей и форматов вызовов.

Архитектура MCP (клиент-серверная)

  • MCP Host — AI-приложение, основной интерфейс для пользователя (например, Cursor). Координирует модели, управляет подключениями к серверам, обеспечивает безопасность и обработку согласия пользователя.
  • MCP Client — компонент-соединитель, создаваемый хостом для каждого сервера. Обеспечивает двустороннее соединение (JSON-RPC 2.0), согласование возможностей и запуск инструментов.
  • MCP Server — легковесная программа, предоставляющая конкретные возможности (инструменты, данные) через стандартизированный протокол. Может работать с локальными источниками (файлы, базы данных) или внешними API.

Как это работает вместе

  1. Discovery: Хост через клиентов параллельно узнает от всех серверов, какие инструменты и протоколы они поддерживают.
  2. Вызов: При запросе пользователя модель выбирает инструмент. Хост создает клиент для нужного сервера, отправляет запрос, получает результат и передает его модели для дальнейшей обработки или формирования ответа.

⚠️ Важно не заниматься overengineering: MCP следует использовать только при реальной необходимости, когда возникают проблемы масштабирования и переиспользования. Для простых задач можно использовать готовые библиотеки и инструменты.


💻 Практика: Добавление инструментов к агентам

Создание инструмента вручную

  1. Определяем функцию (например, умножение двух чисел).
  2. Создаем её описание для модели: название, описание, входные/выходные аргументы с типами.
  3. Инструмент передается модели в промте. Модель генерирует JSON-вызов (tool_call).
  4. Код агента парсит вызов, выполняет функцию и возвращает результат модели как tool_result.

Проблемы ручного создания

  • 👎 Описание инструмента оторвано от функции, сложно поддерживать при множестве инструментов.
  • 👎 Риск забыть обновить описание при изменении функции (например, типов аргументов).

Решение через декораторы и классы

  • Создается класс Tool или декоратор, который автоматически генерирует описание инструмента из сигнатуры функции и её докстринга.
  • Это обеспечивает единообразие и автоматическое обновление описаний.

Использование готовых библиотек (например, LangChain/LangGraph)

  • Библиотеки предоставляют готовые обёртки для создания инструментов и их интеграции с моделями.
  • В графе агента добавляются узлы: LLM (с привязкой инструментов) и Tools.
  • Роутер после узла LLM определяет, был ли вызов инструмента или можно дать финальный ответ.

Пример: Агент для бронирования с инструментами

  • Добавляются инструменты: поиск перелетов, информация о бронировании, отмена бронирования.
  • Системный промт обновляется: указывается наличие инструментов и правила их использования.
  • Состояние агента теперь поддерживает диалог (добавляет сообщения, не перезаписывает).
  • Агент может выполнять действия (например, найти рейс, проверить бронь) и взаимодействовать с пользователем (например, запрашивать подтверждение отмены).

✅ Выводы

  • Инструменты — ключевой компонент для превращения LLM в функциональных агентов.
  • Правильное проектирование инструментов (идемпотентность, обработка ошибок, structured outputs) критически важно для надежности.
  • MCP решает проблемы масштабирования, переиспользования и хрупкости пайплайнов через стандартизированную клиент-серверную архитектуру.
  • На практике инструменты можно создавать вручную, автоматизировать через декораторы или использовать готовые решения из библиотек.