Дистилляция и квантование LLM для локального RAG: полный гайд с кодом | AiManual
AiManual Logo Ai / Manual.
09 Янв 2026 Гайд

Дистилляция и квантование LLM для локального RAG: пошаговый туториал с кодом

Пошаговый туториал по созданию специализированного RAG-ассистента: дистилляция Teacher-Student, синтетический датасет, квантование в GGUF. Работает на обычном н

Зачем мучить 70-миллиардную модель, если можно вырастить свою?

Представьте: у вас есть идеальный RAG-ассистент по вашей документации. Он знает все нюансы, отвечает точно, работает локально. Но Llama 3.1 70B требует 140 ГБ памяти и видеокарту стоимостью с автомобиль. А Mistral 7B хоть и помещается в ноутбук, но постоянно галлюцинирует и забывает контекст.

Дистилляция - это не просто "сжать модель". Это передать знания от большой, умной модели (Teacher) маленькой, быстрой (Student). Создать специалиста, а не универсального солдата. И запустить его на обычном ноутбуке.

Если думаете, что дистилляция - это просто fine-tuning на ответах Teacher, вы ошибаетесь. Так вы получите модель, которая умеет только повторять. Настоящая дистилляция учит Student думать как Teacher.

Архитектура нашего гиперспециализированного ассистента

Собираем систему из трех компонентов:

  • Teacher: Большая модель (Llama 3.1 70B, Claude 3.5 Sonnet). Её задача - генерировать качественные ответы и, что важнее, логику рассуждений.
  • Student: Маленькая модель (Phi-3 Mini, TinyLlama). Её мы будем тренировать думать как Teacher.
  • Квантователь: Инструмент для сжатия обученной модели в GGUF формат, чтобы она работала на CPU.
💡
Не используйте для Teacher ту же архитектуру, что и для Student. Если Student - Mistral, Teacher должен быть другой архитектуры. Это заставляет Student учиться логике, а не копировать внутренние представления.

Шаг 1: Генерация синтетического датасета - где взять данные для обучения

Вот где большинство спотыкаются. Берут 100 вопросов-ответов из документации и удивляются, почему модель не обобщает.

1 Создаем разнообразные вопросы

Не просто "Что такое API?". Нужны:

  • Вопросы с контекстом ("Имея вот этот код, почему он не работает?")
  • Многошаговые вопросы ("Сначала сделай A, потом B, какой будет результат?")
  • Вопросы с недостающей информацией (чтобы модель научилась говорить "мне нужно больше данных")
  • Провокационные вопросы ("Почему ваш продукт хуже, чем у конкурентов?")

Используйте для этого другую LLM. Да, получается цепочка: одна LLM генерирует вопросы, другая (Teacher) на них отвечает. В моем проекте я использовал Claude 3.5 Haiku через API для генерации вопросов - он дешевый и быстрый.

2 Получаем ответы Teacher с reasoning

Вот ключевой момент. Не просите Teacher просто дать ответ. Просите:

  • Сначала подумать вслух (chain-of-thought)
  • Разбить сложный вопрос на части
  • Ссылаться на конкретные места в документации
  • Приводить примеры кода

Не экономьте на качестве ответов Teacher. Если Teacher даст плохой ответ, Student выучит плохой паттерн. Лучше 1000 качественных примеров, чем 10000 мусорных.

Шаг 2: Дистилляция знаний - как заставить маленькую модель думать как большая

Теперь у нас есть датасет: вопросы + развернутые ответы Teacher с reasoning. Пора учить Student.

3 Подготовка к обучению

Для дистилляции нужны специальные фреймворки. Я использую Unsloth - он ускоряет обучение в 2-3 раза и экономит память. Альтернативы: Axolotl, TRL.

Формат данных для обучения:

Поле Пример Зачем нужно
instruction Как настроить аутентификацию в API? Вопрос пользователя
input Контекст из документации... RAG-контекст (если есть)
output [REASONING] Сначала нужно... [ANSWER] Используйте JWT токен... Ответ Teacher с reasoning

4 Настройка loss-функций

Здесь магия дистилляции. Мы используем не одну, а три loss-функции:

  1. Ответная loss: Сравниваем финальный ответ Student с ответом Teacher
  2. Reasoning loss: Сравниваем логику рассуждений (это сложнее, нужно выравнивать скрытые состояния)
  3. Дистилляционная loss: Используем KL-дивергенцию между распределениями вероятностей Teacher и Student

В Unsloth это делается через кастомный тренировочный цикл. Не используйте стандартный SFT - он учит только повторять ответы, а не думать.

💡
Начинайте с низкого learning rate (1e-5) и постепенно увеличивайте. Слишком агрессивное обучение заставит Student забыть базовые знания, которые были в претренированной модели.

5 Валидация и отладка

После каждой эпохи проверяйте не метрики, а реальные ответы. Создайте тестовый набор из 20-30 сложных вопросов и смотрите:

  • Становится ли reasoning более структурированным?
  • Исчезают ли галлюцинации?
  • Сохраняет ли модель знания из претренинга (например, общие программистские знания)?

Шаг 3: Квантование в GGUF - как ужать модель для работы на CPU

Обученная модель все еще требует GPU для inference. Нам нужно преобразовать её в GGUF формат для llama.cpp.

6 Выбор типа квантования

GGUF предлагает десятки типов квантования. Вот мои рекомендации:

Тип Размер Качество Для чего
Q4_K_M ~4.5 бит/вес Отличное Баланс размер/качество
Q5_K_M ~5.1 бит/вес Почти FP16 Когда качество критично
IQ3_XXS 3.06 бит/вес Хорошее Мобильные устройства

Для 7B модели Q4_K_M дает файл ~4 ГБ. Помещается в оперативку любого современного ноутбука.

7 Процесс конвертации

Используйте llama.cpp с флагами:

  • Конвертация из Hugging Face формата в GGUF
  • Выбор типа квантования
  • Добавление метаданных (имя модели, автор, описание)

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

Не квантуйте сразу в самый агрессивный формат. Сначала Q5_K_M, проверьте качество, потом попробуйте Q4_K_M. Если качество падает - вернитесь к менее агрессивному квантованию.

Шаг 4: Интеграция в RAG систему

Теперь у нас есть квантованная модель в GGUF. Подключаем её к RAG.

8 Настройка llama.cpp сервера

Запускаем модель через llama.cpp с параметрами:

  • Количество потоков CPU (обычно физические ядра * 2)
  • Размер контекста (для RAG нужно минимум 4096)
  • Параметры генерации (temperature, top_p)

Для production используйте llama.cpp RPC-server - он стабильнее и поддерживает несколько одновременных запросов.

9 Промпт-инжиниринг для дистиллированной модели

Дистиллированные модели требуют особых промптов. Они привыкли к формату обучения. Используйте:

  • Тот же префикс, что был в датасете ("[REASONING] ... [ANSWER] ...")
  • Явное указание на необходимость reasoning
  • Структурированный вывод (если учили на структурированных ответах)

Типичные ошибки и как их избежать

Ошибка Симптомы Решение
Катастрофическое забывание Модель забыла английский, базовые знания Добавить 10% общих знаний в датасет, lower learning rate
Overfitting на датасет Отлично отвечает на тренировочные вопросы, плохо - на новые Увеличить датасет, добавить аугментации, early stopping
Деградация после квантования Модель "тупеет" после конвертации в GGUF Использовать менее агрессивное квантование, проверить calibration данных
Медленный inference Даже квантованная модель тормозит Оптимизировать промпт, использовать KV-cache, настроить параметры генерации

Результаты: что получаем в итоге

После всей этой работы у вас будет:

  • Модель 3-7B параметров, которая по качеству в вашей domain близка к 70B модели
  • Файл размером 4-8 ГБ вместо 140 ГБ
  • Работает на CPU, не требует видеокарты
  • Скорость ответа 10-30 токенов/сек на обычном процессоре
  • Потребление памяти 6-12 ГБ ОЗУ

Это не теоретический эксперимент. Я запускал такие модели для:

  • Ассистента по внутренней документации компании (2000 страниц)
  • Специализированного код-ассистента для конкретного фреймворка
  • Чат-бота по продукту с точными цитатами из мануалов
💡
Самое интересное начинается после первого запуска. Модель, дистиллированная под конкретную задачу, часто находит паттерны, которые не видит большая универсальная модель. Она становится настоящим экспертом в узкой области.

Что дальше? Continuous distillation

Дистилляция - не разовое мероприятие. Когда появляются новые данные, вопросы пользователей, обновляется документация - нужно обновлять и модель.

Настройте пайплайн:

  1. Сбор реальных вопросов пользователей
  2. Генерация ответов Teacher (можно автоматизировать)
  3. Дообучение Student на новых данных
  4. Автоматическое квантование и деплой

Через 3-4 итерации у вас будет модель, которая знает вашу domain лучше любого человеческого эксперта. И работает на ноутбуке любого сотрудника.

Начните с малого. Возьмите 100 страниц документации, сгенерируйте 500 вопросов-ответов, обучите Phi-3 Mini. Увидите разницу между обычной 3.8B моделью и дистиллированной. Потом масштабируйте.

И помните: лучшая модель - не самая большая. А та, которая точно решает вашу задачу. И помещается в оперативку.