# Tool use / function calling

> Возможность языковой модели вызывать внешние функции и API — модель выбирает инструмент и формирует аргументы по JSON-схеме, а приложение выполняет вызов и возвращает результат.

Источник: https://llmdocs.ru/wiki/tool-use/ · обновлено 2026-11-09 · лицензия CC BY-SA 4.0

- **Суть**: модель генерирует структурированный вызов, приложение его исполняет
- **Описание инструментов**: имя, описание, JSON Schema параметров
- **Появление в API**: 2023 (OpenAI), 2024 (Anthropic, общий доступ)
- **Типы**: клиентские (выполняет приложение), серверные (выполняет провайдер)
- **Стандарт подключения**: Model Context Protocol (MCP)
- **Применение**: агенты, доступ к данным, действия во внешних системах, структурированный вывод
**Tool use** («использование инструментов»), или **function calling** («вызов функций»), — возможность [языковой модели](https://llmdocs.ru/wiki/llm.md) обращаться к внешним функциям: искать в интернете, читать базу данных, вызывать API, выполнять код. Модель сама ничего не выполняет: она получает список доступных инструментов с описаниями, решает, какой из них нужен, и генерирует структурированный вызов с аргументами. Приложение выполняет вызов и возвращает результат модели, которая использует его для ответа или следующего шага.[1]

Tool use превращает модель из собеседника в исполнителя: на нём построены [ИИ-агенты](https://llmdocs.ru/wiki/ai-agent.md), ассистенты с доступом к корпоративным данным и интеграции через [MCP](https://llmdocs.ru/wiki/mcp.md).

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

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

## Пример

```python
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]

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

Описание инструмента — часть промпта, и от него зависит, правильно ли модель его использует (см. [Промпт-инжиниринг](https://llmdocs.ru/wiki/prompt-engineering.md)):

- **Подробное описание.** Что делает инструмент, когда его использовать и когда нет, что он возвращает, какие у него ограничения. Несколько предложений лучше одного слова.
- **Понятные параметры.** Говорящие имена, описания с примерами, `enum` для фиксированных значений, минимум обязательных полей.
- **Немного инструментов с ясными границами** лучше десятков пересекающихся: модель путается, если два инструмента делают почти одно и то же.
- **Полезные результаты.** Возвращайте то, что нужно модели для следующего шага, компактно и без лишних полей — результаты занимают [контекстное окно](https://llmdocs.ru/wiki/context-window.md).
- **Понятные ошибки.** Сообщение «город не найден, уточните написание» позволяет модели исправиться; трассировка стека — нет.

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

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

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

Тот же механизм используют, чтобы получить от модели данные строго по схеме: определяют «инструмент» с нужной схемой и требуют его вызвать. Многие провайдеры теперь предлагают для этого отдельный режим — см. [Структурированный вывод (JSON mode)](https://llmdocs.ru/wiki/structured-output.md).

## См. также

- [ИИ-агент](https://llmdocs.ru/wiki/ai-agent.md)
- [Model Context Protocol (MCP)](https://llmdocs.ru/wiki/mcp.md)
- [Структурированный вывод (JSON mode)](https://llmdocs.ru/wiki/structured-output.md)
- [JSON](https://llmdocs.ru/wiki/json.md)
- [Промпт-инжиниринг](https://llmdocs.ru/wiki/prompt-engineering.md)

## Источники

1. [Anthropic — Tool use with Claude](https://docs.anthropic.com/en/docs/agents-and-tools/tool-use/overview)
2. [OpenAI — Function calling](https://platform.openai.com/docs/guides/function-calling)
3. [JSON Schema](https://json-schema.org/)
4. [Berkeley Function Calling Leaderboard](https://gorilla.cs.berkeley.edu/leaderboard.html)
5. [Model Context Protocol — Specification](https://modelcontextprotocol.io/specification)
6. [T. Schick et al. — Toolformer (2023)](https://arxiv.org/abs/2302.04761)
