Tool use / function calling

Материал из llmdocs — справочник разработчика
Tool use / function calling
Сутьмодель генерирует структурированный вызов, приложение его исполняет
Описание инструментовимя, описание, JSON Schema параметров
Появление в API2023 (OpenAI), 2024 (Anthropic, общий доступ)
Типыклиентские (выполняет приложение), серверные (выполняет провайдер)
Стандарт подключенияModel Context Protocol (MCP)
Применениеагенты, доступ к данным, действия во внешних системах, структурированный вывод

Tool use («использование инструментов»), или function calling («вызов функций»), — возможность языковой модели обращаться к внешним функциям: искать в интернете, читать базу данных, вызывать API, выполнять код. Модель сама ничего не выполняет: она получает список доступных инструментов с описаниями, решает, какой из них нужен, и генерирует структурированный вызов с аргументами. Приложение выполняет вызов и возвращает результат модели, которая использует его для ответа или следующего шага.[1]

Tool use превращает модель из собеседника в исполнителя: на нём построены ИИ-агенты, ассистенты с доступом к корпоративным данным и интеграции через MCP.

Как это работает

  1. Приложение передаёт модели запрос пользователя и определения инструментов: имя, описание на естественном языке и схему параметров в формате JSON Schema.[3]
  2. Модель отвечает либо текстом, либо блоком вызова: имя инструмента и аргументы в JSON.
  3. Приложение проверяет и выполняет вызов — обращается к API, базе, файловой системе.
  4. Результат отправляется модели как сообщение специального типа.
  5. Модель формирует ответ или запрашивает следующий вызов. Несколько независимых вызовов можно сделать параллельно.

Пример

import anthropic

client = anthropic.Anthropic()
tools = [{
    "name": "get_weather",
    "description": "Текущая погода в городе. Использовать, когда пользователь спрашивает о погоде сейчас.",
    "input_schema": {
        "type": "object",
        "properties": {
            "city": {"type": "string", "description": "Город, например «Москва»"},
            "units": {"type": "string", "enum": ["celsius", "fahrenheit"]},
        },
        "required": ["city"],
    },
}]

resp = client.messages.create(
    model="claude-sonnet-5-5", max_tokens=1024, tools=tools,
    messages=[{"role": "user", "content": "Нужен ли зонт в Казани?"}],
)
call = next(b for b in resp.content if b.type == "tool_use")
print(call.name, call.input)          # get_weather {'city': 'Казань', 'units': 'celsius'}

Дальше приложение вызывает настоящий сервис погоды и возвращает результат блоком tool_result с тем же идентификатором вызова; модель отвечает пользователю уже с опорой на данные. У OpenAI и других провайдеров механизм устроен аналогично, отличаются названия полей.[2]

История

Первые эксперименты строились на промптах: модели предлагали выводить вызовы в условном текстовом формате, который разбирала программа. Работа Toolformer (2023) показала, что модель можно обучить самостоятельно вставлять вызовы API в текст.[6] В июне 2023 года OpenAI добавила в API нативный вызов функций, в 2024 году общий доступ к tool use открыла Anthropic, затем Google и другие. Сейчас модели специально обучают выбирать инструменты и формировать корректные аргументы; качество сравнивают, например, на Berkeley Function Calling Leaderboard.[4]

Типы инструментов

  • Клиентские — определяет и выполняет ваше приложение: доступ к вашей базе, CRM, файлам.
  • Серверные — выполняются на стороне провайдера: веб-поиск, выполнение кода в песочнице, получение веб-страниц.
  • Инструменты через MCP — внешние серверы по открытому протоколу предоставляют наборы инструментов любому совместимому клиенту, будь то IDE, чат или агент.[5]

Как писать хорошие инструменты

Описание инструмента — часть промпта, и от него зависит, правильно ли модель его использует (см. Промпт-инжиниринг):

  • Подробное описание. Что делает инструмент, когда его использовать и когда нет, что он возвращает, какие у него ограничения. Несколько предложений лучше одного слова.
  • Понятные параметры. Говорящие имена, описания с примерами, enum для фиксированных значений, минимум обязательных полей.
  • Немного инструментов с ясными границами лучше десятков пересекающихся: модель путается, если два инструмента делают почти одно и то же.
  • Полезные результаты. Возвращайте то, что нужно модели для следующего шага, компактно и без лишних полей — результаты занимают контекстное окно.
  • Понятные ошибки. Сообщение «город не найден, уточните написание» позволяет модели исправиться; трассировка стека — нет.

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

Аргументы, сгенерированные моделью, — это непроверенный ввод. Их нужно валидировать так же, как данные от пользователя: параметризовать запросы к базе, ограничивать пути к файлам, не передавать в оболочку без экранирования. Инструментам дают минимально необходимые права (Принцип наименьших привилегий), а действия с последствиями — отправку денег, удаление, публикацию — подтверждает человек. Результаты инструментов, содержащие внешний текст, могут нести внедрённые инструкции (см. Безопасность LLM: prompt injection).

Tool use и структурированный вывод

Тот же механизм используют, чтобы получить от модели данные строго по схеме: определяют «инструмент» с нужной схемой и требуют его вызвать. Многие провайдеры теперь предлагают для этого отдельный режим — см. Структурированный вывод (JSON mode).

См. также

Источники

  1. Anthropic — Tool use with Claude
  2. OpenAI — Function calling
  3. JSON Schema
  4. Berkeley Function Calling Leaderboard
  5. Model Context Protocol — Specification
  6. T. Schick et al. — Toolformer (2023)