Инструменты и MCP: от LLM к агентам
Ключевые тезисы:
Инструменты (Tools) — это функции, предоставляемые LLM для выполнения конкретных действий и преодоления её ограничений (нет доступа к свежим данным, сложности с арифметикой, неспособность действовать самостоятельно).
Model Context Protocol (MCP) — открытый стандарт, решающий проблемы масштабируемости, переиспользования инструментов и хрупкости пайплайнов в AI-агентах.
Использование инструментов — переломный момент, превращающий простые чат-боты в автономных агентов.
Что такое инструменты (Tools)?
Инструмент — это функция, предоставляемая LLM, которая должна решать чётко определённую задачу. Он включает:
Описание своих возможностей.
Вызываемую сущность (исполняемый код).
Аргументы с их типами.
Выходные данные с их типами.
Как работает вызов инструмента (Tool Calling):
- Пользователь задаёт вопрос (например, "Какие аэропорты есть в Лондоне?").
- LLM анализирует запрос и решает, что уместно вызвать инструмент (например,
list_all_airports). - Модель генерирует структурированный вызов (например, в формате JSON) с названием функции и аргументами.
- Агент (код) распознает этот вызов, исполняет функцию и возвращает результат модели.
- LLM использует результат для формирования финального ответа пользователю.
Как "обучить" модель использовать инструменты:
Сообщить о доступных инструментах через системный промт.
Научить модель генерировать корректные вызовы (через предобучение, fine-tuning и использование специальных токенов).
Чётко описать, что инструмент ожидает на входе и что возвращает на выходе.
Принципы проектирования инструментов
Поддержка распределённых транзакций: Инструмент должен уметь работать в цепочках действий, где часть операций может завершиться неудачно, и обеспечивать откат (rollback) при необходимости.
Идемпотентность: Повторный вызов инструмента (например, после таймаута или сбоя агента) не должен приводить к побочным эффектам (например, отправке письма дважды).
Информативные и структурированные сообщения об ошибках: Ошибки должны быть понятны не только человеку, но и модели, чтобы она могла скорректировать свои действия (например, сообщить об отсутствии обязательного параметра).
Гайды по взаимодействию с пользователем: Инструмент должен подсказывать модели, как действовать в случае нехватки данных (дозапросить у пользователя) или при невозможности выполнить действие.
Structured Outputs: Инструменты должны возвращать данные в структурированном формате, удобном для последующей обработки моделью.
Ключевой вывод: Хороший инструмент — это надёжный контракт между LLM и реальной системой, устойчивый к сбоям, повторным вызовам и изменениям среды.
Зачем нужен Model Context Protocol (MCP)?
С ростом сложности AI-приложений возникли проблемы:
Жёсткая привязка инструментов к агентам: Каждый агент реализовывал свои версии одних и тех же инструментов (калькулятор, поиск в интернете).
Апдейты описаний (specs): Изменения в API инструментов требовали правок во всех агентах, которые их используют.
Хрупкие пайплайны: Зависимость от конкретных моделей и форматов вызовов делала систему сложной для поддержки и масштабирования.
MCP решает эти проблемы, предоставляя стандартизированный протокол для подключения AI-моделей к внешнему миру.
Архитектура MCP: роли и взаимодействие
Это клиент-серверная архитектура с тремя главными ролями:
1.
MCP Host (Хост)
Это AI-приложение, основной интерфейс для пользователя (например, Cursor, пользовательские агенты).
Задачи:
- Оркестрация AI-моделей.
- Управление клиентскими подключениями (создаёт по одному клиенту на каждый сервер).
- Контроль пользовательского интерфейса и потока диалога.
- Обеспечение безопасности (разрешения, аутентификация).
- Обработка согласия пользователя (например, подтверждение критичных действий).
2.
MCP Client (Клиент)
Соединитель между хостом и сервером, обеспечивающий двустороннюю связь.
Задачи:
- Коммуникация по протоколу JSON-RPC 2.0.
- Согласование возможностей с сервером при инициализации.
- Запуск выполнения инструментов и обработка ответов.
- Обработка обновлений в реальном времени.
3.
MCP Server (Сервер)
Легковесная программа, предоставляющая конкретные возможности (инструменты, данные).
Задачи:
- Регистрация доступных инструментов при запуске.
- Обработка запросов на вызов инструментов и возврат результатов.
- Предоставление контекста (данных) по запросу модели.
- Управление соединением с клиентом и отправка уведомлений.
Как это работает вместе:
- Discovery: Хост через отдельных клиентов параллельно опрашивает серверы, чтобы получить список их инструментов.
- Вызов: При запросе пользователя LLM решает вызвать инструмент → хост определяет нужный сервер → клиент отправляет запрос → сервер выполняет и возвращает результат → результат передаётся обратно LLM для формирования ответа.
Предостережение: избегайте over-engineering
Не стоит внедрять MCP на ранних этапах разработки простого агента. Начинайте с минимальных кусочков и добавляйте сложные абстракции (вроде MCP) только тогда, когда столкнётесь с описанными проблемами масштабирования и поддержки.
Практика: добавление инструментов агенту
Этапы реализации:
Базовая реализация "вручную":- Создание функции-инструмента (например,
multiply). - Формирование промта для модели с описанием инструмента и строгим форматом вызова (JSON).
- Обработка ответа модели: парсинг JSON, вызов функции, передача результата обратно в LLM.
- Создание функции-инструмента (например,
Решение проблем поддержки:- Проблема 1: Единообразие описаний. Решение — создание класса
Toolс методомto_string(). - Проблема 2: Расхождение кода и описания. Решение — использование декораторов, которые автоматически генерируют описание инструмента на основе сигнатуры функции и её docstring.
- Проблема 1: Единообразие описаний. Решение — создание класса
Использование готовых библиотек (на примере LangChain/LangGraph):- Инструменты оборачиваются с помощью встроенных средств библиотеки.
- Создаётся граф агента с узлами:
LLM,Tools,Router. Routerопределяет, что делать после ответа LLM: вызвать инструмент или вернуть финальный ответ пользователю.
Пример: Агент для бронирования авиабилетов- Было: Агент мог только генерировать текст на основе системного промта.
- Стало: Добавлены инструменты для работы с "БД" (словарём):
get_booking_details— информация о бронировании.search_flights— поиск рейсов.cancel_booking— отмена бронирования (с запросом подтверждения у пользователя).
- Агент теперь может выполнять конкретные действия, запрашивать недостающие данные и вести многошаговый диалог.
Вывод: Инструменты кардинально расширяют возможности LLM, превращая их из генераторов текста в действующих агентов, способных взаимодействовать с внешними системами.