Function Calling

function calling — структурированное предложение вызвать внешнюю функцию

Раздел
Языковые модели
Обновлено
11.08.26

Function Calling позволяет модели выбрать описанную функцию и вернуть её имя с JSON-аргументами. Функцию выполняет приложение, а не сама LLM. Поэтому схема, права, бизнес-правила и подтверждение опасных действий остаются за обычным кодом.

Коротко

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

Зачем это нужно

Обычный текстовый ответ не может получить свежий статус заказа, записать встречу или посчитать выражение в точном калькуляторе. Функция соединяет модель с внешней системой.

Примеры:

  • get_order_status читает заказ;
  • search_documents находит документы;
  • calculate_tax выполняет расчёт;
  • create_email_draft создаёт черновик;
  • schedule_event меняет календарь после подтверждения.

Модель выбирает действие по описанию и контексту, но фактический API-вызов делает приложение.

Схема функции

Описание обычно содержит имя, назначение и JSON Schema аргументов.

{
  "name": "get_weather",
  "description": "Получить прогноз для города и даты",
  "parameters": {
    "type": "object",
    "properties": {
      "city": { "type": "string" },
      "date": { "type": "string", "format": "date" }
    },
    "required": ["city", "date"],
    "additionalProperties": false
  }
}

Синтаксис оболочки различается между API. Смысл остаётся: модель должна сформировать объект, который можно проверить машинно.

Полный цикл

  1. Приложение отправляет модели сообщение и список функций.
  2. Модель отвечает текстом или предложением вызова.
  3. Код разбирает имя и JSON.
  4. Schema validator проверяет типы и обязательные поля.
  5. Сервер проверяет пользователя, права и бизнес-ограничения.
  6. Функция выполняется или отклоняется.
  7. Результат возвращается модели как отдельное сообщение.
  8. Модель формирует ответ пользователю.

Каждый шаг должен обрабатывать ошибку: неизвестную функцию, неверный JSON, тайм-аут и повторный вызов.

Схема проверяет форму, а не смысл

Аргумент amount: 100000 может быть корректным числом и недопустимым переводом. Адрес может соответствовать формату email и принадлежать не тому получателю.

После JSON Schema нужны:

  • аутентификация;
  • авторизация;
  • диапазоны и allowlist;
  • проверка актуального состояния;
  • защита от повторов;
  • подтверждение человеком;
  • аудит результата.

Промпт «не делай опасного» не заменяет эти проверки.

Наглядный пример

Пользователь пишет: «Перенеси встречу с редактором на завтра после обеда».

Помощник сначала вызывает чтение календаря. Если время неоднозначно, задаёт вопрос. Затем предлагает reschedule_event с конкретным ID и временем.

Приложение показывает изменение человеку. Только после подтверждения выполняется запись. При повторе сетевого запроса idempotency key не даёт перенести встречу дважды.

Как описывать функции

Хорошее описание отвечает на четыре вопроса:

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

manage_order слишком широко. Лучше разделить чтение и запись: get_order, create_refund_draft, confirm_refund.

Узкие функции проще выбирать, тестировать и ограничивать.

Несколько вызовов

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

Для агентского цикла задаются пределы:

  • число шагов;
  • время;
  • токены и деньги;
  • разрешённые домены;
  • максимальный объём результата;
  • условия остановки.

Function calling и structured output

Оба механизма используют схемы, но решают разные задачи.

  • Structured output задаёт форму конечного ответа.
  • Function calling описывает промежуточное внешнее действие.

Можно вызвать функцию, затем вернуть пользователю JSON по другой схеме.

Function calling, tool calling и MCP

В некоторых API function calling и tool calling — почти синонимы. Иногда tools — более широкая категория, куда входят поиск, выполнение кода и работа с файлами.

MCP стандартизирует связь между хостом и внешним сервером инструментов. Хост может получить функцию по MCP, а модели представить её через собственный function-calling формат.

Безопасность

Функциональный результат и аргументы считаются недоверенными данными.

  • SQL строится параметризованным запросом, а не строкой модели.
  • Путь нормализуется и остаётся в разрешённой папке.
  • URL проходит allowlist и защиту от SSRF.
  • Секрет не возвращается модели.
  • Вывод веб-страницы не становится инструкцией автоматически.
  • Удаление, отправка и оплата требуют подтверждения.

Логи не должны хранить токены, пароли и лишние персональные данные.

Частые ошибки

  • Исполнять JSON сразу. Нужны schema и авторизация.
  • Давать функции пересекающиеся описания. Модель путает выбор.
  • Скрывать побочный эффект. Название должно честно отражать запись или удаление.
  • Не обрабатывать повтор. Один запрос способен выполнить действие дважды.
  • Передавать слишком много функций. Выбор оценивается на тестах, а каталог можно подгружать по контексту.
  • Доверять тексту результата. Он может содержать prompt injection или ошибку API.

Частые вопросы

Какие модели поддерживают function calling?

Многие облачные и локальные модели умеют формировать структурированные вызовы, но формат и надёжность различаются. Проверяется документация точного model ID и собственный eval.

Можно ли заставить модель выбрать одну функцию?

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

Что вернуть модели после ошибки?

Короткий структурированный результат с типом ошибки и безопасным пояснением. Внутренний stack trace и секреты не передаются.

Нужен ли function calling для жёсткого pipeline?

Не обязательно. Если порядок заранее известен, прямой код проще и предсказуемее. Модель полезна там, где выбор действия зависит от естественного запроса.

Главное

Function calling превращает намерение модели в проверяемое предложение внешнего действия. Модель выбирает имя и аргументы, а приложение сохраняет контроль: проверяет схему, права, повторы и подтверждение. Именно этот внешний контур делает инструмент полезным и безопасным.