Function calling и structured output в LLM-приложении
Как работает function calling и как добиться корректного structured output?
Ответить самому
Сначала сформулируйте ответ как на собеседовании, затем откройте разбор и оцените себя.
Короткий ответ
Модель генерирует tool call с именем функции и аргументами, приложение исполняет реальный код и возвращает результат в контекст. Structured output надежнее делать через JSON schema или constrained decoding.
Полный разбор
Function calling - это договор между моделью и runtime. Runtime сообщает модели список инструментов: название, описание, JSON schema аргументов. Модель не вызывает API сама; она генерирует структурированный вызов. Приложение валидирует аргументы, выполняет функцию, добавляет tool result в контекст и просит модель сформулировать финальный ответ.
Structured output можно получать prompt-инструкциями, но надежнее использовать provider-native JSON mode, schema validation или constrained decoding. В constrained decoding на каждом шаге запрещаются токены, которые нарушили бы грамматику или JSON schema. Это снижает риск невалидного JSON, но не гарантирует бизнес-смысл аргументов.
В production нужны retry на parse/validation errors, лимиты на tools, allowlist действий, логирование tool calls и защита от prompt injection через результаты инструментов.
Теория
LLM выбирает и форматирует действие, а приложение исполняет его и отвечает за безопасность, валидацию и side effects.
Типичные ошибки
- Думать, что LLM сама ходит в базу или API.
- Не валидировать аргументы tool call.
- Полагаться только на текстовый prompt для строгого JSON.