Function Calling

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

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

Function Calling — механизм, при котором LLM решает, какую внешнюю функцию вызвать и с какими аргументами. Модель сама не выполняет функцию: она возвращает имя функции + JSON-аргументы, а ваш код выполняет и возвращает результат. Главный путь дать модели «руки»: проверить погоду, отправить email, найти товар в базе. Появилось в OpenAI в июне 2023, к 2026-му — стандарт всех больших LLM.

Коротко

Коротко. Function Calling — это способ дать LLM возможность вызывать ваши Python/JS-функции по необходимости. Вы описываете функции с их параметрами, модель сама решает: «для ответа надо вызвать get_weather(city='Москва')». Модель функцию не выполняет — возвращает запрос, ваш код запускает реальный API погоды и шлёт результат обратно. Это базовый механизм для AI-агентов и ассистентов с внешними возможностями.

Что это такое

Пользователь спрашивает ChatGPT: «Что лучше надеть в Москве сегодня?». Чтобы ответить, нужна актуальная погода. У модели её нет — knowledge cutoff давно закончился.

Без Function Calling: модель отвечает что-то общее: «обычно в Москве в это время года…». Бесполезно для конкретного дня.

С Function Calling:

  1. Программист описал модели функцию get_current_weather(city) с её сигнатурой.
  2. Модель видит вопрос → понимает: нужна погода → отправляет в ответ: get_current_weather("Moscow").
  3. Код приложения выполняет функцию (зовёт OpenWeather API), получает: +12°C, дождь, ветер 8 м/с.
  4. Этот результат отправляется обратно модели.
  5. Модель отвечает: «В Москве сейчас +12°C и дождь, ветер 8 м/с. Рекомендую куртку с капюшоном и непромокаемую обувь».

Модель сама не вызывала API погоды. Она только запросила вызов, ваш код выполнил, она использовала результат для финального ответа.

Это и есть Function Calling — мост между LLM и реальным миром через ваш код.

К 2026-му это базовый механизм:

  • AI-агентов (Cursor, Claude Code, Auto-GPT).
  • Чат-ботов с подключённой базой данных.
  • Голосовых ассистентов (Alexa Plus, Siri 2, Google Assistant).
  • Корпоративных Copilot'ов (поиск по документам, action items).
  • Calendar / email automation.

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

Двусторонний процесс:

  1. Описание функций в схеме (JSON Schema). Имя, параметры, типы.
  2. Запрос к модели с обычным prompt + список доступных функций.
  3. Модель решает. Может ответить текстом ИЛИ запросить вызов функции.
  4. Если запрошен вызов: код выполняет функцию, отправляет результат обратно.
  5. Модель использует результат для финального ответа.

Пример полного цикла OpenAI:

tools = [{
    "type": "function",
    "function": {
        "name": "get_current_weather",
        "description": "Получить текущую погоду в городе",
        "parameters": {
            "type": "object",
            "properties": {
                "city": {"type": "string", "description": "Название города"},
                "unit": {"type": "string", "enum": ["celsius", "fahrenheit"]}
            },
            "required": ["city"]
        }
    }
}]

# Шаг 1: спрашиваем модель
resp1 = client.chat.completions.create(
    model="gpt-4o",
    messages=[{"role": "user", "content": "Что надеть в Москве?"}],
    tools=tools
)

# Модель решила вызвать функцию
tool_call = resp1.choices[0].message.tool_calls[0]
args = json.loads(tool_call.function.arguments)
# args = {"city": "Москва", "unit": "celsius"}

# Шаг 2: наш код вызывает реальный API
weather = call_real_weather_api(args["city"])
# weather = "+12°C, дождь"

# Шаг 3: возвращаем результат модели
resp2 = client.chat.completions.create(
    model="gpt-4o",
    messages=[
        {"role": "user", "content": "Что надеть в Москве?"},
        resp1.choices[0].message,
        {"role": "tool", "tool_call_id": tool_call.id, "content": weather}
    ],
    tools=tools
)

print(resp2.choices[0].message.content)
# "В Москве +12°C и дождь. Лучше надеть куртку с капюшоном..."

К 2026-му в OpenAI, Anthropic, Gemini, Mistral, Llama-моделях — везде есть Function Calling. Реализация чуть отличается, идея одна.

Пример на практике

Команда строит AI-ассистента для интернет-магазина. Доступные функции:

  • search_products(query, category) — поиск товаров.
  • get_product_details(id) — детали товара.
  • add_to_cart(product_id, quantity) — добавить в корзину.
  • get_order_status(order_id) — статус заказа.

Пользователь пишет: «Найди беспроводные наушники до 5000 рублей».

  1. Модель: вызывает search_products(query="беспроводные наушники", price_max=5000).
  2. Код выполняет SQL-запрос, возвращает 5 товаров.
  3. Модель отвечает: «Нашёл 5 моделей, лучшие три: Sony WH-CH520 (3990 руб), Marshall Major IV (4500 руб), JBL Tune 510BT (2790 руб). Какие интересны?».

Пользователь: «Расскажи про Sony».

  1. Модель вызывает get_product_details(id=12345).
  2. Получает характеристики, отзывы.
  3. Отвечает с описанием.

Пользователь: «Добавь в корзину».

  1. Модель вызывает add_to_cart(product_id=12345, quantity=1).
  2. Подтверждает: «Добавил Sony WH-CH520 в корзину».

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

В ComfyUI есть отдельные ноды для Function Calling с локальными LLM (Ollama, LM Studio) — можно строить пайплайны, где LLM управляет workflow генерации картинок.

С чем часто путают

  • Function Calling и Tool Calling — это синонимы. OpenAI начал с «functions», в 2024 переименовали в «tools». Anthropic с самого начала использовал «tools».
  • Function Calling и Plugin — Plugin (старый ChatGPT Plugins) был интеграцией с внешними API через ChatGPT-интерфейс. Function Calling — чистый API-механизм для разработчиков.
  • Function Calling и MCP — MCP это протокол для подключения tools (включая function calling) от разных провайдеров. Function Calling — конкретная фича внутри одного API.
  • Function Calling и Code Interpreter — Code Interpreter выполняет код в песочнице. Function Calling — модель просит выполнить ваш существующий код.
  • Function Calling и Structured Output — Function Calling построен на Structured Output (аргументы с фиксированной схемой). SO без вызова — ответ в схеме без действий.

Частые ошибки и заблуждения

  • «Модель сама выполняет функции». Не выполняет. Только просит. Ваш код решает, выполнять или нет.
  • «Function Calling гарантированно безопасен». Зависит от вас. Если функция execute_sql(query) доступна — модель может попросить опасный запрос. Валидируйте.
  • «Чем больше функций, тем лучше». До 10–15 норма. Дальше модель путается. Для большего — иерархические агенты (одна функция «выбирает контекст»).
  • «Function Calling работает только в OpenAI». Работает у всех больших — OpenAI, Claude, Gemini, Llama 3.1+. Различается синтаксис.
  • «Модель всегда вызывает функцию». Не всегда. Модель сама решает, нужна ли функция. Если не нужна — отвечает текстом.

Связанные термины

  • Tool Calling — современное название Function Calling.
  • AI Agent — построен на цикле function calling.
  • Structured Output — основа для типизации аргументов.
  • MCP — протокол стандартизации tools между провайдерами.
  • Code Interpreter — другая фича, выполнение кода в песочнице.
  • JSON Schema — формат описания параметров функций.
  • API — главное место применения.

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

Какую модель выбрать для Function Calling? GPT-4o, Claude 3.5 Sonnet+, Gemini 2 — отлично. GPT-3.5 — слабее, путается на сложных функциях. Для production нужна большая модель.

Сколько функций можно описать? Технически — до контекстного окна. Практически — 10–15 для надёжной работы. Дальше начинаются ошибки выбора.

Что делать, если модель вызывает не ту функцию? Улучшить description у функций (более чёткое объяснение, когда какая нужна). Добавить few-shot примеры. Использовать tool_choice для принудительного вызова конкретной функции.

Можно ли вызвать несколько функций одновременно? Да, parallel function calling — модель возвращает несколько вызовов в одном ответе. Полезно для независимых запросов (например, погода в 3 городах сразу).

Function Calling работает в локальных моделях? Да: Llama 3.1+, Qwen 2.5, Mistral поддерживают. Но качество ниже фронтиров (GPT-4, Claude 3.5).

Что такое tool_choice? Параметр, заставляющий модель вызвать конкретную функцию или любую функцию (но не текст). Полезно для гарантированных действий.

Главное

Function Calling — мост между LLM и реальным миром через ваш код. Модель решает, какую функцию нужно вызвать (get_weather, search_products, send_email), возвращает её имя + аргументы; ваш код выполняет реальную работу; модель использует результат в финальном ответе. Это базовый механизм для AI-агентов, чат-ботов с действиями, корпоративных Copilot'ов. Главное правило — не больше 10–15 функций за раз, всегда валидировать аргументы перед выполнением (модель не сделает «плохое» намеренно, но и хорошо отфильтровать неправильное не сможет). К 2026-му это стандарт всех больших LLM, синтаксис чуть отличается между OpenAI, Anthropic и Gemini, но идея одна.