Модуль 3 из 4

Инструменты, функции и MCP

Как LLM выходит за пределы текста и начинает взаимодействовать с внешним миром

Что внутри этого модуля

  1. Зачем LLM инструменты: проблема «текстового пузыря»
  2. Function Calling: LLM вызывает ваш код
  3. MCP (Model Context Protocol): единый стандарт интеграции
  4. MCP vs Function Calling: что выбрать
  5. Архитектура: как всё соединяется
  6. Best practices интеграции инструментов
  7. Итоги модуля 3

1. Зачем LLM инструменты: проблема «текстового пузыря»

LLM — мощная технология, но у неё есть фундаментальное ограничение: модель живёт внутри «текстового пузыря». Она может рассуждать и генерировать текст, но не может выполнить ни одного действия в реальном мире: проверить почту, отправить сообщение, записать файл, сделать запрос к API, найти актуальную информацию в интернете.

Инструменты (tools) — это механизм, который ломает этот пузырь. LLM получает возможность «попросить» программу-хост выполнить действие, получить результат и продолжить рассуждение уже с реальными данными.

Tool (инструмент)
Функция или сервис, доступный LLM через программный интерфейс. Модель не вызывает инструмент напрямую — она генерирует специальный структурированный запрос, который перехватывается хост-приложением, выполняет действие и возвращает результат обратно в контекст модели.

Без инструментов vs с инструментами

ЗадачаБез инструментовС инструментами
Какая погода в Москве? Придумает правдоподобный, но возможно неверный ответ (галлюцинация) Вызовет weather API, получит реальные данные, ответит точно
Отправь письмо клиенту Сгенерирует текст письма, но не отправит Сгенерирует письмо и вызовет send_email(), который реально отправит
Сколько у нас заказов за сегодня? Не знает (это приватные данные) Сделает SQL-запрос к базе данных и вернёт точную цифру
Найди последние новости о Tesla Расскажет то, что знало на момент обучения Вызовет поисковый API и прочитает свежие новости
Ключевая идея: Инструменты превращают LLM из «говорящей головы» в «исполнителя». Модель становится не просто генератором текста, а оркестратором действий.

2. Function Calling: LLM вызывает ваш код

Function Calling (вызов функций) — это встроенная возможность большинства современных LLM API (OpenAI, Anthropic, Google). Вы описываете функции в специальном формате (JSON Schema), а модель, когда понимает, что ей нужна функция для ответа, возвращает структурированный запрос вместо обычного текста.

Function Calling (вызов функций)
Механизм LLM API, при котором модель получает описание доступных функций (название, параметры, описание) и может вернуть структурированный запрос на вызов конкретной функции с конкретными параметрами. Хост-приложение выполняет функцию и возвращает результат модели.

Как это работает: пошагово

  1. Вы описываете функции. Например: get_weather(city: string, date?: string) — «Получить погоду в городе на дату».
  2. Отправляете описание вместе с запросом. Модель получает и вопрос пользователя, и список доступных инструментов.
  3. Модель решает, нужна ли функция. Если для ответа нужны внешние данные — модель возвращает не текст, а запрос на вызов: { "function": "get_weather", "arguments": { "city": "Москва" } }.
  4. Ваш код выполняет функцию. Вы получаете реальные данные от API погоды.
  5. Результат возвращается модели. Модель получает данные и генерирует финальный человеческий ответ.
Цикл Function Calling

Пример описания функции для OpenAI API

Вот как выглядит описание функции в коде:

{
  "name": "get_weather",
  "description": "Получить текущую погоду в указанном городе",
  "parameters": {
    "type": "object",
    "properties": {
      "city": {
        "type": "string",
        "description": "Название города, например 'Москва'"
      },
      "units": {
        "type": "string",
        "enum": ["celsius", "fahrenheit"],
        "description": "Единицы измерения температуры"
      }
    },
    "required": ["city"]
  }
}
Важно: Модель НЕ выполняет функцию сама. Она только говорит «вызови такую-то функцию с такими-то параметрами». Выполнение — всегда на стороне вашего приложения. Это ключевой момент безопасности.

3. MCP (Model Context Protocol): единый стандарт интеграции

MCP — это открытый протокол, предложенный компанией Anthropic в конце 2024 года. Его задача — решить проблему «зоопарка интеграций». Без MCP каждый разработчик пишет свой велосипед для подключения LLM к каждому сервису. MCP предлагает универсальный стандарт.

MCP (Model Context Protocol)
Открытый протокол для стандартизированного подключения LLM к внешним источникам данных и инструментам. Работает по принципу клиент-сервер: MCP-сервер предоставляет ресурсы, инструменты и промпты, а MCP-клиент (приложение с LLM) подключается к ним. Аналог USB-C, но для AI-интеграций.

Архитектура MCP

MCP построен на трёх примитивах:

ПримитивНазначениеПример
Resources (Ресурсы) Данные, к которым LLM нужен доступ Файлы, записи БД, содержимое веб-страниц, логи приложения
Tools (Инструменты) Действия, которые LLM может инициировать Отправить email, создать задачу в Jira, выполнить SQL-запрос, вызвать API
Prompts (Промпты) Готовые шаблоны для стандартных сценариев «Проведи code review», «Составь отчёт за неделю»

Почему MCP важен

MCP-архитектура

Примеры существующих MCP-серверов

СерверЧто даёт
@anthropic/mcp-server-filesystemЧтение/запись файлов, навигация по директориям
@anthropic/mcp-server-githubУправление репозиториями, issues, PR, поиск кода
@anthropic/mcp-server-postgresSQL-запросы к базе данных
@anthropic/mcp-server-slackОтправка/чтение сообщений, управление каналами
@anthropic/mcp-server-puppeteerБраузерная автоматизация: навигация, скриншоты, клики
@anthropic/mcp-server-google-driveДоступ к документам Google Drive

4. MCP vs Function Calling: что выбрать

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

КритерийFunction CallingMCP
УровеньВозможность API конкретной LLMПротокол/стандарт интеграции
Где работаетOpenAI, Anthropic, Google и другие — у каждого свой форматЛюбой MCP-клиент, независимо от модели
Что нужно писатьОписание функции в JSON Schema + код для её выполненияMCP-сервер (или использовать готовый)
СложностьНизкая для 1-3 функций; высокая при масштабированииСредняя для одного сервера; низкая для подключения готовых
Когда использоватьПрототипы, простые проекты, кастомная логикаПродакшен, много инструментов, работа с разными сервисами
Правило большого пальца: Если вам нужно 1-3 простых функции в рамках одного проекта — используйте Function Calling. Если вы строите систему с десятком разных интеграций, работаете с несколькими LLM-провайдерами или хотите переиспользовать инструменты между проектами — смотрите в сторону MCP.

5. Архитектура: как всё соединяется

Давайте соберём полную картину: как LLM, инструменты, MCP и RAG (из модуля 2) работают вместе в реальном приложении.

Типичная архитектура AI-приложения

  1. Пользователь пишет запрос в интерфейсе (чат, веб, мобильное приложение).
  2. Оркестратор (ваш код) получает запрос и решает, что с ним делать. Это может быть фреймворк вроде LangChain, LlamaIndex или самописный код.
  3. RAG-слой (если нужен) ищет релевантные документы через векторную базу и добавляет их в контекст.
  4. MCP-клиент общается с MCP-серверами, предоставляя модели список доступных инструментов, ресурсов и промптов.
  5. LLM получает: запрос пользователя + найденные документы (RAG) + описание инструментов (MCP/Function Calling).
  6. Модель либо сразу отвечает, либо запрашивает вызов инструмента.
  7. Оркестратор выполняет инструмент (через MCP или напрямую) и возвращает результат модели.
  8. Цикл повторяется, пока модель не сгенерирует финальный ответ.
Полная архитектура AI-приложения
Внимание: Каждый вызов LLM стоит денег и занимает время. Если ваше приложение делает 5-10 вызовов на один запрос пользователя, задержка может стать заметной. Проектируйте с учётом этого.

6. Best practices интеграции инструментов

Правила дизайна инструментов

  1. Одна функция — одна задача. Не делайте функцию do_everything(). Модели лучше работают с узкими, специализированными инструментами.
  2. Понятные названия и описания. Модель «читает» описание функции так же, как промпт. Пишите описания понятным языком, с примерами входных данных.
  3. Валидация на входе. Никогда не доверяйте параметрам, которые модель передала в функцию. Модель может ошибиться в формате числа или строки — всегда проверяйте.
  4. Тайм-ауты. Внешние API могут тормозить или падать. Всегда ставьте разумный тайм-аут (10-30 секунд в зависимости от типа операции) и возвращайте понятную ошибку.
  5. Ограничение прав. Инструмент должен иметь минимум необходимых прав. Функция поиска не должна иметь доступ на удаление записей в базе данных.

Чего избегать

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

7. Итоги модуля 3

Что дальше? В последнем модуле мы соберём всё вместе и разберём агентов, мультиагентные системы, архитектурные паттерны loop и chunky — как строить системы, которые не просто отвечают, а автономно решают сложные задачи.