Tool use / function calling
| Суть | модель генерирует структурированный вызов, приложение его исполняет |
|---|---|
| Описание инструментов | имя, описание, JSON Schema параметров |
| Появление в API | 2023 (OpenAI), 2024 (Anthropic, общий доступ) |
| Типы | клиентские (выполняет приложение), серверные (выполняет провайдер) |
| Стандарт подключения | Model Context Protocol (MCP) |
| Применение | агенты, доступ к данным, действия во внешних системах, структурированный вывод |
Tool use («использование инструментов»), или function calling («вызов функций»), — возможность языковой модели обращаться к внешним функциям: искать в интернете, читать базу данных, вызывать API, выполнять код. Модель сама ничего не выполняет: она получает список доступных инструментов с описаниями, решает, какой из них нужен, и генерирует структурированный вызов с аргументами. Приложение выполняет вызов и возвращает результат модели, которая использует его для ответа или следующего шага.[1]
Tool use превращает модель из собеседника в исполнителя: на нём построены ИИ-агенты, ассистенты с доступом к корпоративным данным и интеграции через MCP.
Как это работает
- Приложение передаёт модели запрос пользователя и определения инструментов: имя, описание на естественном языке и схему параметров в формате JSON Schema.[3]
- Модель отвечает либо текстом, либо блоком вызова: имя инструмента и аргументы в JSON.
- Приложение проверяет и выполняет вызов — обращается к API, базе, файловой системе.
- Результат отправляется модели как сообщение специального типа.
- Модель формирует ответ или запрашивает следующий вызов. Несколько независимых вызовов можно сделать параллельно.
Пример
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).