Когда SLM начинает врать: почему частные документы - минное поле
Вы загрузили в модель тысячу страниц внутренней документации, настроили ее на Q&A, а она в ответ на вопрос о процедуре отпусков начинает рассказывать про отпуск в Бали. Знакомая ситуация? Галлюцинации в SLM (Small Language Models) при работе с закрытыми доменами - это не баг, а фундаментальная проблема, которую 90% инженеров решают неправильно.
Основная ошибка - считать, что тонкая настройка на частных документах работает так же, как на открытых датасетах. На деле у вас возникает тройной конфликт: между исходными знаниями модели, вашими документами и форматом их представления. Модель, обученная на Википедии и научных статьях, не понимает, что значит "Приказ № 2847 от 15.03.2025 о внедрении СЭД" - она пытается найти аналогии в своей тренировочной выборке и... галлюцинирует.
Галлюцинации в SLM на закрытых доменах - это не случайные ошибки, а систематическое смещение. Модель не "забывает" общеизвестные факты, она пытается применить их там, где они не работают.
Подготовка данных: не просто вытащить текст из PDF
Первая ловушка - качество исходных данных. Если у вас сканы документов с артефактами или нестандартной разметкой, даже лучшие SLM будут работать плохо. Я видел проекты, где команды месяцами пытались улучшить качество ответов, а проблема была в том, что OCR модель неправильно распознавала заголовки.
Для работы с длинными PDF я рекомендую комбинацию инструментов: Docling для чанкинга сложных документов и проверку качества распознавания через специализированные OCR системы. Особенно это критично для технической документации, где потеря одной цифры может стоить дорого.
1 Очистка и структурирование данных
Не загружайте сырой текст в модель. Создайте структурированный датасет в формате Q&A, где каждый вопрос имеет четкий контекст и однозначный ответ. Вот как это выглядит на практике:
| Что НЕ делать | Что делать вместо этого |
|---|---|
| Загрузить 500 страниц PDF как есть | Разбить на смысловые блоки по 2-3 абзаца |
| Использовать автоматическую генерацию вопросов | Ручное составление вопросов экспертами домена |
| Оставлять маркеры форматирования | Очищать от служебных символов и нормализовать |
Для технических документов добавьте метаданные: тип документа (инструкция, спецификация, отчет), дату создания, версию. Это поможет модели понять контекст и снизит вероятность галлюцинаций на 30-40%.
Выбор метода адаптации: LoRA против полного fine-tuning
Здесь большинство идет по пути наименьшего сопротивления: берут LoRA, потому что это быстро и не требует много GPU. Но для закрытых доменов это часто неправильный выбор.
LoRA (Low-Rank Adaptation) отлично работает, когда вам нужно адаптировать модель к новому стилю или формату, но не переписывать ее знания. Если ваши документы содержат терминологию, которой нет в исходной модели, LoRA будет постоянно "соскальзывать" на знакомые паттерны.
2 Настройка параметров обучения
Типичная ошибка - использовать стандартные параметры из туториалов. Они не работают для частных документов. Вот что нужно менять:
- Learning rate: для закрытых доменов нужен в 2-3 раза ниже стандартного (1e-5 вместо 3e-5)
- Batch size: маленькие батчи (4-8) дают лучшее качество, но дольше обучаются
- Epochs: не больше 3-5, иначе переобучение гарантировано
- Weight decay: увеличение до 0.01 помогает бороться с переобучением
Для мониторинга переобучения добавьте валидационный датасет из документов, которых нет в тренировочной выборке. Если accuracy на валидации падает после 2-й эпохи - стоп обучение.
Борьба с галлюцинациями: техники, которые работают
Галлюцинации в SLM на частных документах имеют специфическую природу. Модель не выдумывает факты из воздуха - она подменяет неизвестные термины известными аналогами. "Отдел кадров" становится "HR department", "внутренний регламент" - "company policy".
Эффективная стратегия - создание словаря терминов и их принудительное использование в ответах. Реализуется через:
- Контекстные промпты: добавляем в каждый промпт список ключевых терминов из документа
- Ограничение генерации: настраиваем параметры sampling (temperature=0.3, top_p=0.9)
- Пост-обработку: проверяем ответы на наличие терминов из черного списка
Не используйте temperature выше 0.5 для закрытых доменов. Модель начнет "творчески" интерпретировать инструкции, что приведет к галлюцинациям.
Отдельная проблема - числовые данные. Модели часто ошибаются в датах, суммах, процентах. Решение - извлекать числовые данные отдельно и подставлять их в ответ через шаблоны.
Оценка качества: метрики, которые покажут реальную картину
Accuracy и F1-score бесполезны для оценки SLM на частных документах. Модель может показывать 95% accuracy, но при этом в 40% случаев использовать неправильные термины.
Нужны специализированные метрики:
- Терминологическая точность: процент правильного использования доменных терминов
- Контекстная релевантность: насколько ответ соответствует конкретному документу, а не общим знаниям
- Стабильность ответов: вариативность ответов на один и тот же вопрос
Для автоматической оценки создайте тестовый датасет из 100-200 вопросов с эталонными ответами. Каждый ответ должен проверяться по трем критериям: точность терминов, полнота информации, отсутствие галлюцинаций.
3 Инструменты для оценки
Не изобретайте велосипед. Используйте:
# Пример оценки терминологической точности
from sklearn.metrics import precision_score
# Список ключевых терминов домена
domain_terms = ["СЭД", "ЭЦП", "Внутренний регламент", "Номенклатура дел"]
# Функция проверки использования терминов
def check_terminology(answer, expected_terms):
found_terms = []
for term in expected_terms:
if term in answer:
found_terms.append(term)
return len(found_terms) / len(expected_terms)
Конфликт знаний: что делать, когда модель "забывает" базовые вещи
Самая неприятная проблема - после тонкой настройки модель перестает знать элементарные вещи. Спросите у настроенной на финансовых отчетах SLM, сколько будет 2+2, и с вероятностью 30% получите ответ "согласно статье 284 НК РФ...".
Это происходит потому, что модель пытается применить новый паттерн везде. Решение - смешанное обучение:
- Берем 70% данных из частных документов
- Добавляем 30% общих знаний (Википедия, научные статьи)
- Используем weighted loss, где вес для общих знаний в 2 раза ниже
Еще один прием - создание "защитных промптов". Когда модель получает вопрос общего характера, она должна переключаться в режим базовых знаний. Реализуется через классификатор запросов перед основной моделью.
Производительность: как не сжечь GPU и не ждать неделю
Тонкая настройка SLM на 10k документов не должна занимать больше суток. Если у вас уходит неделя - вы что-то делаете не так.
Оптимизации, которые реально работают:
- Gradient checkpointing: экономит до 60% памяти за счет пересчета градиентов
- Mixed precision (FP16): ускоряет обучение в 2-3 раза
- Gradient accumulation: позволяет использовать большие эффективные батчи при ограниченной памяти
- Оптимизатор 8-bit Adam: снижает потребление памяти на 50% без потери качества
# Конфигурация для эффективного обучения
from transformers import TrainingArguments
training_args = TrainingArguments(
output_dir="./results",
num_train_epochs=3,
per_device_train_batch_size=4,
gradient_accumulation_steps=8, # Эффективный batch size = 32
fp16=True, # Mixed precision
gradient_checkpointing=True, # Экономия памяти
optim="adamw_8bit", # 8-bit оптимизатор
learning_rate=1e-5,
weight_decay=0.01,
save_steps=500,
eval_steps=500,
)
Чеклист перед запуском в продакшн
Прежде чем выкатывать настроенную модель, пройдите по этому списку:
- Тест на галлюцинации: 100 случайных вопросов, проверка на выдуманные факты
- Тест на переобучение: вопросы из документов, которых не было в тренировке
- Тест на базовые знания: простые вопросы вне домена
- Производительность: latency < 500ms на CPU, < 100ms на GPU
- Потребление памяти: модель должна влезать в целевое железо
Если модель проходит все тесты - можно запускать. Но оставьте мониторинг: раз в неделю проверяйте качество ответов на новых документах.
Самая частая ошибка после запуска - забыть про дрейф данных. Документы обновляются, появляются новые термины, старые устаревают. Планируйте регулярную дообучение раз в месяц.
Альтернативы: когда fine-tuning - не лучший выбор
Иногда проще не настраивать модель, а использовать другие подходы. Fine-tuning SLM на частных документах имеет смысл, когда:
- У вас больше 1000 документов одного типа
- Документы содержат уникальную терминологию
- Требуется высокая скорость ответов (RAG может быть медленнее)
- Документы статичны и редко меняются
Если эти условия не выполняются, рассмотрите SMART SLM с памятью для RAG или гибридные подходы.
Главное - не пытайтесь решить все проблемы тонкой настройкой. Иногда достаточно хорошо подготовить данные и использовать правильные промпты.
Что будет дальше: тренды 2026 года
К 2026 году подходы к тонкой настройке SLM изменятся. Уже сейчас появляются модели, которые лучше справляются с закрытыми доменами из коробки. Ожидайте:
- Специализированные SLM: модели, предобученные на корпоративных документах
- Автоматический подбор параметров: системы, которые сами определят оптимальные настройки для ваших данных
- Динамическая адаптация: модели, которые подстраиваются под новые документы без переобучения
- Улучшенная борьба с галлюцинациями: встроенные механизмы проверки фактов
Но пока этих технологий нет, придется делать все вручную. И помните: успешная тонкая настройка - это не про технологии, а про понимание данных. Проведите неделю, изучая свои документы, и сэкономите месяц на борьбе с галлюцинациями.
А если совсем нет времени на подготовку данных, есть инструменты вроде "Fine-tuning из PDF за 5 минут". Но будьте готовы к тому, что качество будет соответствующим.
Тонкая настройка SLM - это ремесло, а не наука. Каждый датасет уникален, каждая модель ведет себя по-своему. Главное - не бояться экспериментировать и не верить слепо статьям с GitHub. Особенно тем, где обещают 99% accuracy на первых же эпохах.