Дообучение (Fine-Tuning) открытой LLM под задачи заказчика
Дообучение открытой языковой модели — наиболее гибкий путь получить специализированный AI-инструмент с полным контролем над данными и инфраструктурой. В отличие от API-моделей (GPT-4o, Claude), вы владеете весами, можете развернуть модель on-premise, масштабировать инференс без платы за токены и адаптировать архитектуру под конкретные требования.
Выбор базовой модели под задачу
Выбор базовой модели — критическое решение. Неправильный выбор приводит к переработке на этапе итераций.
| Класс задачи | Рекомендуемые модели | Обоснование |
|---|---|---|
| Классификация, NER, структурированный вывод | Llama 3.1 8B, Mistral 7B, Phi-4-mini | Достаточно качества, быстрый инференс |
| Генерация текста на русском | Qwen2.5-7B/14B, Llama 3.1 8B | Сильная многоязычность |
| Программирование, SQL, code review | Qwen2.5-Coder-32B, DeepSeek-Coder-V2, Phi-4 | Специализированные code модели |
| Сложный reasoning, анализ | DeepSeek-R1-Distill-32B, Llama 3.1 70B | Высокий reasoning, инструкции |
| Edge/offline/мобильные | Phi-4-mini, Qwen2.5-3B, Llama 3.2 3B | Малый размер, квантизация |
| Мультимодальные задачи | Llama 3.2-Vision, Qwen2-VL, InternVL | Нативная поддержка изображений |
Архитектура типового проекта fine-tuning
Фаза 1: Аудит задачи и данных (1–2 недели)
├── Формализация задачи (классификация/генерация/извлечение)
├── Инвентаризация имеющихся данных
├── Оценка необходимого объёма и качества
└── Выбор базовой модели и метода обучения
Фаза 2: Подготовка данных (2–6 недель)
├── Сбор и агрегация источников
├── Очистка (дубликаты, шум, PII)
├── Разметка (ручная/синтетическая/комбинированная)
├── Форматирование под chat template
└── Train/val/test split (80/10/10)
Фаза 3: Обучение (1–4 недели)
├── Baseline оценка базовой модели
├── Первый запуск LoRA/QLoRA с дефолтными параметрами
├── Анализ training/val loss кривых
├── Подбор гиперпараметров
└── Full Fine-Tuning при необходимости
Фаза 4: Оценка и итерации (1–3 недели)
├── Автоматические метрики (F1, BLEU, ROUGE, accuracy)
├── LLM-as-judge (GPT-4o или другая сильная модель как судья)
├── Человеческая оценка выборки
└── Анализ failure cases → доработка данных
Фаза 5: Деплой и мониторинг (1–2 недели)
├── Квантизация (опционально)
├── Деплой через vLLM/TGI
├── Настройка мониторинга
└── A/B тест vs baseline
Синтетическая генерация данных через сильную модель
Распространённый кейс: у заказчика нет размеченных данных, но есть неструктурированные источники (документы, регламенты, FAQ). Используем GPT-4o или Claude для автоматической генерации обучающих пар:
from openai import OpenAI
import json
client = OpenAI()
def generate_training_example(document_chunk: str, num_examples: int = 5) -> list:
"""Генерирует обучающие пары из фрагмента документа"""
prompt = f"""Ты — эксперт по созданию датасетов для обучения языковых моделей.
На основе фрагмента документа ниже создай {num_examples} пар "вопрос-ответ" в формате JSON.
Вопросы должны быть разнообразными: фактические, аналитические, практические.
Ответы — точными, основанными только на тексте документа.
Документ:
{document_chunk}
Верни JSON-массив: [{{"question": "...", "answer": "..."}}]"""
response = client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": prompt}],
response_format={"type": "json_object"},
temperature=0.7
)
return json.loads(response.choices[0].message.content)["pairs"]
Важно: синтетические данные требуют ручной верификации выборки (минимум 10–15%) для контроля качества. Галлюцинации GPT-4o в синтетических данных попадут в обучение и снизят качество.
Практический кейс: специализация под телемедицину
Задача: ассистент для врачей первичного звена — дифференциальная диагностика по жалобам пациента, предложение списка обследований, выбор МКБ-10 кода.
Исходные данные:
- 450 клинических случаев с заключениями (из медицинской системы, обезличенные)
- Клинические рекомендации МЗ РФ по 12 нозологиям (PDF, 3200 страниц)
- Справочник МКБ-10
Стратегия:
- Конвертация клинических рекомендаций в chunks
- Синтетическая генерация 3200 примеров через GPT-4o (жалобы → диагностика)
- Верификация 15% выборки практикующими терапевтами
- Fine-tuning Qwen2.5-14B (лучший русский язык для медтерминологии)
Результаты (после 4 эпох QLoRA, r=32):
- Top-3 accuracy МКБ-10: 71% → 89%
- Полнота списка рекомендованных обследований (recall vs эксперт): 0.62 → 0.84
- Hallucination rate (выдуманные препараты/процедуры): 24% → 6%
- Latency (vLLM, A100): 1.8с на запрос
Мониторинг качества в продакшне
После деплоя настраиваем систему непрерывного мониторинга:
import mlflow
# Логирование предсказаний для анализа дрейфа
with mlflow.start_run():
mlflow.log_metrics({
"avg_response_length": avg_len,
"refusal_rate": refusal_rate,
"latency_p95": latency_p95,
"user_rating_avg": rating_avg,
})
Признаки деградации модели: рост refusal rate, снижение пользовательских оценок, увеличение доли escalation в downstream системах.
Инфраструктурные требования
| Метод | Модель | GPU | VRAM | Время обучения |
|---|---|---|---|---|
| QLoRA | 7B | 1×A100 40GB | 18 GB | 2–6ч |
| QLoRA | 14B | 1×A100 80GB | 35 GB | 4–12ч |
| QLoRA | 70B | 2×A100 80GB | 90 GB | 12–36ч |
| Full FT | 7B | 4×A100 40GB | 120 GB | 8–24ч |
| Full FT | 70B | 8×H100 80GB | 560 GB | 48–120ч |
Сроки полного цикла
Минимальный проект (готовые данные, несложная задача): 3–5 недель. Типичный проект (подготовка данных с нуля): 8–14 недель. Сложный проект (специализированный домен, итеративная разметка): 16–24 недели.







