Как fine-tune модель для Function Calling (tool use)? Какую структуру данных (JSON schema) использовать?
Краткий тезис
Fine-tuning для Function Calling (tool use) требует специальной структуры обучающих данных, где в системном сообщении передается JSON schema доступных инструментов, а в ответе модели ожидается строгий JSON с полями name и arguments. Ключевая особенность — поддержка multi-turn сценариев, где модель может вызывать несколько функций последовательно или параллельно. Оценка качества фокусируется на точности выбора функции, корректности типов аргументов и соблюдении схемы.
2. Fine-tuning процесс
2.1 Формат обучающих примеров
Используем формат OpenAI compatible для передачи данных:
training_examples = [
{
"messages": [
{
"role": "system",
"content": "Функции: get_weather(location: string, unit: string), send_email(to: string, subject: string)"
},
{
"role": "user",
"content": "Отправь письмо с темой 'Встреча' на адрес ivan@example.com"
},
{
"role": "assistant",
"content": None,
"tool_calls": [
{
"id": "call_1",
"type": "function",
"function": {
"name": "send_email",
"arguments": "{\"to\": \"ivan@example.com\", \"subject\": \"Встреча\"}"
}
}
]
}
]
}
]
2.2 Multi-turn сценарии
Модель должна уметь вызывать несколько функций:
# Пример параллельного вызова
assistant_message = {
"role": "assistant",
"content": None,
"tool_calls": [
{
"id": "call_1",
"type": "function",
"function": {
"name": "get_weather",
"arguments": "{\"location\": \"Москва\"}"
}
},
{
"id": "call_2",
"type": "function",
"function": {
"name": "send_email",
"arguments": "{\"to\": \"user@example.com\", \"subject\": \"Погода в Москве\"}"
}
}
]
}
3. Практические рекомендации
3.1 Баланс данных
| Тип данных | Процент | Пример |
|---|---|---|
| Только текст (без вызовов) | 30% | Обычные диалоги |
| Один вызов функции | 40% | Простые запросы |
| Множественные вызовы | 20% | Сложные сценарии |
| Ошибки и исправления | 10% | Неправильный выбор функции |
3.2 Аугментация данных
Для улучшения робастности:
- Ошибочные вызовы: модель вызывает функцию, но возвращается ошибка выполнения
- Неоднозначные запросы: пользователь просит то, что не описано в функциях
- Частичные параметры: модель должна запрашивать недостающие аргументы
4. Оценка качества
4.1 Метрики
| Метрика | Описание | Целевое значение |
|---|---|---|
| Exact Match Name | Точное совпадение имени функции | >95% |
| Argument Accuracy | Корректность типов и значений аргументов | >90% |
| Multi-turn Success | Процент полных chain вызовов | >85% |
| Schema Compliance | Соответствие JSON schema | >98% |
4.2 Тестовый набор
test_cases = [
{
"query": "Какая погода?",
"expected": {
"name": "get_weather",
"args": {"location": "Требуется уточнение"}
}
},
{
"query": "Отправь письмо Ивану",
"expected": {
"name": "send_email",
"args": {"to": "ivan@example.com", "subject": None}
}
}
]
5. Инструментарий
5.1 Фреймворки для fine-tuning
- OpenAI Fine-tuning API
- LoRA и QLoRA для эффективного обучения
- Hugging Face Transformers с модулями для tool use
- Unsloth для оптимизации
5.2 Датасеты
- Glaive Functions Dataset — готовые примеры
- ToolBench — бенчмарк для function calling
6. Пет-проект для закрепления
Задача: Создать dataset из 200 примеров для fine-tuning модели на вызов API погоды (3 функции) с поддержкой multi-turn.
Инструменты:
- Python
- JSON Schema генератор
- OpenAI API для тестирования
- LoRA + Hugging Face
Шаги:
- Определить 3 функции:
get_weather,get_forecast,get_air_quality - Сгенерировать 100 одношаговых примеров и 100 multi-turn цепочек
- Добавить 30 примеров с ошибками (неправильные параметры)
- Проверить schema compliance всех примеров
Ожидаемый результат:
- Датасет в формате JSONL с корректными
tool_calls - Тестовый скрипт для проверки exact match accuracy
- Отчет по метрикам (accuracy >90%)
Связь с другими вопросами
| Вопрос | Тема |
|---|---|
| 38 | JSON Schema для валидации аргументов |
| 150 | Agentic RAG — интеграция tool use |
Навигация
- Предыдущий: 961
- Следующий: 963
- Индекс: 00. Индекс разборов