Function Calling
function calling — структурированное предложение вызвать внешнюю функцию
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. Смысл остаётся: модель должна сформировать объект, который можно проверить машинно.
Полный цикл
- Приложение отправляет модели сообщение и список функций.
- Модель отвечает текстом или предложением вызова.
- Код разбирает имя и JSON.
- Schema validator проверяет типы и обязательные поля.
- Сервер проверяет пользователя, права и бизнес-ограничения.
- Функция выполняется или отклоняется.
- Результат возвращается модели как отдельное сообщение.
- Модель формирует ответ пользователю.
Каждый шаг должен обрабатывать ошибку: неизвестную функцию, неверный 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 превращает намерение модели в проверяемое предложение внешнего действия. Модель выбирает имя и аргументы, а приложение сохраняет контроль: проверяет схему, права, повторы и подтверждение. Именно этот внешний контур делает инструмент полезным и безопасным.