Fine-tune Gemma 4 (или Qwen 3.6) на корпоративные данные: пошаговый гайд on-premise (152-ФЗ)
- Gemma 4
- Qwen
- fine-tune
- LoRA
- 152-ФЗ
- on-premise
- LLM
- multimodal
Gemma Oracle — наш внутренний продукт: локальный fine-tune Gemma 4 на корпоративных данных (история заявок, тарифы, политики). Цель — on-premise помощник менеджеру по продажам, который не передаёт ПД клиента во внешние LLM. С 1 июля 2025 это не «удобно», а юридически обязательно.
Контекст
В 2025-2026 году рынок открытых LLM закрыл главное белое пятно — small/medium модели с открытыми весами и multimodal-возможностями.
- Gemma 4 от Google (выпущена апрель 2026) — multimodal (text, audio, images), 256K context, 140+ языков, открытые веса, варианты 4B/12B/27B
- Qwen 3.6 от Alibaba — open-weight, конкурирует с Gemma 4 по multimodal, дешевле fine-tunится на узких задачах
- YandexGPT 5 Lite — 8B параметров, 32K контекст, открытые веса (Apache 2.0)
- GigaChat MoE — Mixture-of-Experts от Сбера, открытая часть весов
Всё это можно крутить локально на одной видеокарте 24GB.
При этом 152-ФЗ запрещает передавать персональные данные в иностранные сервисы (OpenAI, Anthropic, Google AI Cloud). Штрафы для повторных нарушений — до 18 млн ₽. On-premise LLM перестала быть экзотикой — это базовая compliance-инфраструктура.
Какую модель выбрать
| Сценарий | Модель |
|---|---|
| Multimodal (text + image + audio в одном запросе) | Gemma 4 12B/27B |
| Дешёвый fine-tune на узкой задаче | Qwen 3.6 7B (быстрее обучается, меньше VRAM) |
| Строго российский контекст (госсектор, банки) | YandexGPT 5 Lite или GigaChat MoE |
| Англоязычный домен | LLaMA 3.3 или Gemma 4 |
Для нашего Gemma Oracle выбрали Gemma 4 12B — multimodal помог распознавать сканы документов и фотографии теплоходов, а 256K context позволил влезть всю историю заявок одного клиента в один запрос.
Зачем нам своя LLM
Менеджер по продажам в круизном бизнесе ежедневно отвечает на повторяющиеся вопросы: «когда отправление в Кострому в августе», «какая цена на двухместку с балконом», «есть ли скидка для пенсионеров».
Внешний ChatGPT не знает наших тарифов и не должен знать ФИО клиентов. Свой помощник на Gemma 4 знает обе вещи и не «утекает» наружу. Окупается за 2-3 месяца только на сэкономленном времени менеджеров.
Подготовка датасета
Источник — CSV-выгрузки из старой PHP-системы (5+ лет истории). Структура:
# 5 типов записей:
# 1. tariffs.csv — тарифы по сезонам
# 2. ships.csv — теплоходы и каюты
# 3. orders.csv — анонимизированная история заявок (без ФИО, только профили)
# 4. policies.md — корпоративные политики (отмены, переносы)
# 5. faq.md — собранные за годы вопросы менеджерам
import pandas as pd
df = pd.read_csv('orders.csv', encoding='utf-8')
# Анонимизация: ФИО → «Турист N», телефон → «+7 (XXX) XXX-XX-XX»
df = anonymize(df, columns=['fio', 'phone', 'email'])
Из этого формируется JSONL в формате instruction-tuning:
{"instruction": "Сколько стоит двухместная каюта с балконом в августе 2026?", "output": "Двухместная каюта с балконом в августе — от 89 400 ₽ за пассажира на 7-дневный рейс. Конкретная цена зависит от палубы и даты отправления."}
{"instruction": "Какая политика отмены за 14 дней до круиза?", "output": "При отмене за 14-7 дней удерживается 50% стоимости. За 7-3 дня — 80%. Менее 3 дней — без возврата (кроме медицинских случаев с документами)."}
Размер датасета — 8-12 тысяч примеров. Меньше — модель плохо обобщает, больше — не помещается в одну эпоху на 24GB.
LoRA + 4-bit quantization на одной карте
Полный fine-tune Gemma 4 12B требует ~80GB VRAM и недостижим на потребительских картах. LoRA (Low-Rank Adaptation) обучает только небольшой набор параметров поверх замороженной базы — помещается в 24GB при 4-bit квантовании базы.
Ключевые параметры (Hugging Face PEFT + bitsandbytes):
from transformers import AutoModelForCausalLM, BitsAndBytesConfig
from peft import LoraConfig, get_peft_model
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_compute_dtype="bfloat16",
)
model = AutoModelForCausalLM.from_pretrained(
"google/gemma-4-12b-it",
quantization_config=bnb_config,
device_map="auto",
)
lora_config = LoraConfig(
r=16,
lora_alpha=32,
target_modules=["q_proj", "k_proj", "v_proj", "o_proj"],
lora_dropout=0.05,
task_type="CAUSAL_LM",
)
model = get_peft_model(model, lora_config)
На RTX 4090 24GB обучение 12K примеров за 3 эпохи — около 5-7 часов для Gemma 4 12B (для Qwen 3.6 7B — 3-4 часа). Чекпоинт LoRA-адаптера весит 60-100 МБ (vs 24 ГБ полной модели).
Eval-loop через small validation set
Без обратной связи fine-tune легко уходит в галлюцинации или забывание базовых знаний. Мы держим отдельный validation set из 200 примеров с эталонными ответами и считаем три метрики:
- Exact-match на цифрах (цены, даты, сроки) — допустимо ±5%, иначе считается ошибкой
- BLEU/ROUGE на текстовых ответах — отслеживаем общий drift
- Human eval на 30 примерах — раз в неделю руками проверяем «звучит ли как наш менеджер»
Если exact-match просел ниже 85% — катим назад на предыдущий чекпоинт.
Что мы из этого вынесли
- Анонимизация — отдельный pipeline. ФИО, телефоны, паспорта должны вылетать ДО того, как датасет видит Hugging Face. Иначе случайная утечка чекпоинта в публичный репо = инцидент 152-ФЗ.
- LoRA-адаптеры — лучший формат хранения версий. 60-100 МБ против 24 ГБ позволяет держать десятки версий и быстро откатываться.
- Eval-loop важнее количества данных. 12K примеров с честным validation бьют 50K без него: модель учится на «как звучит правильный ответ», а не на «что чаще встречается».
- Multimodal — игра-changer для документооборота. Gemma 4 умеет читать сканы паспортов и фотки теплоходов в том же запросе — это убирает отдельный OCR-pipeline.
Ссылки
- Gemma — официальная документация Google — Gemma 4 multimodal, 256K context, 140+ языков
- Qwen 3.6 — open-weight конкурент — multimodal, дешёвый fine-tune
- YandexGPT 5 Lite — обзор fichi.ai — открытые веса, 32K контекст
- PEFT documentation — LoRA для Hugging Face — официальное руководство