Как работает Function Calling

Function calling — это протокол взаимодействия между LLM и внешними системами. Модель получает описание доступных инструментов и в процессе генерации ответа решает, нужно ли вызвать один из них:

1. Разработчик описывает функции:
   search_products(query: string, category?: string) → Product[]
   check_inventory(product_id: string) → {in_stock: boolean, qty: int}
   add_to_cart(product_id: string, qty: int) → CartItem

2. Пользователь: «Найди мне красные кроссовки Nike до 10 000 рублей»

3. Модель → возвращает вызов:
   {"function": "search_products", "args": {"query": "красные кроссовки Nike", "max_price": 10000}}

4. Клиент вызывает API → получает список товаров → передаёт модели

5. Модель генерирует ответ пользователю с реальными данными

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

Function Calling в e-commerce

В торговом контексте function calling открывает принципиально новые сценарии взаимодействия. Примеры инструментов AI-ассистента для магазина:

Функция Что делает Тип действия
search_products Семантический поиск по каталогу Read
get_product_details Полная информация о товаре Read
check_inventory Наличие и количество Read
get_recommendations Персонализированные рекомендации Read
add_to_cart Добавление товара в корзину Write
apply_promo Применение промокода Write
initiate_checkout Запуск оформления заказа Write

Read-функции безопасны. Write-функции (особенно initiate_checkout) требуют явного подтверждения пользователем или human-in-the-loop контроля.

Structured Output и JSON Schema

Надёжный function calling требует строгой типизации. Описание функции в JSON Schema:

{
  "name": "search_products",
  "description": "Поиск товаров по запросу и фильтрам",
  "parameters": {
    "type": "object",
    "properties": {
      "query": {"type": "string", "description": "Поисковый запрос"},
      "category": {"type": "string", "description": "Категория товара"},
      "max_price": {"type": "number", "description": "Максимальная цена в рублях"}
    },
    "required": ["query"]
  }
}

Важно: Модели галлюцинируют аргументы функций, особенно для несуществующих параметров. Всегда валидируйте вывод модели перед реальным вызовом API.

Параллельный и последовательный вызов

Современные модели поддерживают вызов нескольких функций за один «ход». Это важно для составных запросов:

  • Параллельно: наличие + цена + отзывы по одному товару
  • Последовательно: сначала поиск товара, затем (по product_id) проверка наличия

Параллельный вызов снижает latency ответа, но требует управления зависимостями между вызовами.