Текущая версия: v5 · Последнее обновление: 2026-08-14 08:11:28
Эта модель определяет, является ли ответ языковой модели галлюцинацией —
то есть содержит ли он информацию, которая противоречит предоставленному контексту
или не подтверждается им.
Модель дообучена на основе Qwen2.5-1.5B-Instruct
методом QLoRA (4-bit quantization + LoRA адаптеры) с использованием
библиотеки Unsloth для ускоренного
обучения на GPU.
📋 Описание задачи
Галлюцинации LLM — это когда языковая модель генерирует ответ, который звучит
правдоподобно, но не соответствует реальным фактам или противоречит предоставленному
источнику (контексту). Это одна из ключевых проблем при использовании LLM в
production-системах, особенно в задачах RAG (Retrieval-Augmented Generation).
Постановка задачи
Модель принимает три входных текста:
Вопрос — то, что пользователь спросил у LLM
Контекст — документ/фрагмент, который был предоставлен LLM как источник фактов
Ответ — то, что LLM сгенерировала в ответ на вопрос
И возвращает бинарную метку:
0 — ответ соответствует контексту (не галлюцинация)
1 — ответ противоречит контексту или содержит неподтверждённые факты (галлюцинация)
Где это применяется
✅ RAG-пайплайны — проверка ответов перед показом пользователю
✅ Автоматическое тестирование LLM-агентов
✅ Мониторинг качества ответов в продакшн-системах
✅ Датасеты для обучения других моделей (серебряная разметка)
📊 Метрики качества
Текущая версия (v5, 2026-08-14 08:11:28)
Метрика
Значение
Accuracy
0.9835
F1-score
0.9833
Precision
0.9793
Recall
0.9874
Размер теста
485 примеров
Кривая обучения (Train / Eval Loss)
Loss curve
График показывает динамику функции потерь на обучающей и валидационной выборках
по шагам обучения. Снижение eval loss без роста train loss означает, что модель
обобщает, а не запоминает данные.
Confusion Matrix
Confusion Matrix
По оси X — предсказанный класс, по оси Y — истинный класс.
Диагональ показывает правильные предсказания.
🗂️ Данные для обучения
Источник
Датасет собран полностью автоматически на основе русского QA-корпуса
SberQuAD —
русскоязычного аналога Stanford SQuAD (~45 000 пар вопрос-параграф-ответ).
Стратегия генерации примеров
Положительные примеры (label=0, не галлюцинация):
Берутся напрямую из SberQuAD — оригинальная тройка (вопрос, контекст,
правильный ответ), где ответ гарантированно содержится в контексте.
Отрицательные примеры (label=1, галлюцинация) генерируются тремя способами:
Стратегия
Описание
Сложность для детектора
Mismatch
Ответ от другого вопроса/контекста
Лёгкая — ответ явно не связан с контекстом
Perturbation
Искажение чисел или слов в правильном ответе
Средняя — ответ похож на правду, но неверен
LLM-generated
Qwen2.5 генерирует правдоподобный, но неверный ответ (zero-shot)
Сложная — похоже на настоящую галлюцинацию
Такой микс позволяет модели научиться выявлять галлюцинации разной степени
"правдоподобности" — от очевидных несоответствий до тонких фактических ошибок.
<|im_start|>system
Ты — эксперт по проверке фактов. Тебе дан вопрос, контекст (источник фактов) и ответ ассистента.
Определи, является ли ответ галлюцинацией — то есть противоречит контексту или не подтверждён им.
Ответь только цифрой: 1 — если это галлюцинация, 0 — если ответ соответствует контексту.
<|im_end|>
<|im_start|>user
Вопрос: {question}
Контекст: {context}
Ответ: {answer}
<|im_end|>
<|im_start|>assistant
{0 или 1}
<|im_end|>
Инфраструктура
Параметр
Значение
GPU
NVIDIA T4 (16 GB VRAM)
Платформа
Google Colab
Фреймворк
PyTorch + Hugging Face Transformers
Ускорение
Unsloth (2-4x быстрее стандартного обучения)
Время обучения
~30-60 минут на T4
💻 Как использовать
Установка
pip install transformers torch accelerate
Код
python
12from transformers import AutoModelForCausalLM, AutoTokenizer
3import torch, re
45# Загружаем модель с Hugging Face Hub6REPO_ID ="AtesiT/qwen2.5-1.5b-ru-hallucination-detector"7tokenizer = AutoTokenizer.from_pretrained(REPO_ID)8model = AutoModelForCausalLM.from_pretrained(9 REPO_ID,10 torch_dtype=torch.float16,11 device_map="auto"12)13model.eval()1415SYSTEM_PROMPT =(16"Ты — эксперт по проверке фактов. Тебе дан вопрос, контекст (источник фактов) и ответ ассистента. "17"Определи, является ли ответ галлюцинацией — то есть противоречит контексту или не подтверждён им. "18"Ответь только цифрой: 1 — если это галлюцинация, 0 — если ответ соответствует контексту."19)2021defpredict(question:str, context:str, answer:str)->dict:22"""
23 Определяет, является ли ответ галлюцинацией.
2425 Args:
26 question: Вопрос, на который отвечала LLM
27 context: Контекст (источник фактов, справочный текст)
28 answer: Ответ LLM, который нужно проверить
2930 Returns:
31 dict с ключами: label (0/1), verdict (str), raw_output (str)
32 """33 prompt =(34f"<|im_start|>system\n{SYSTEM_PROMPT}<|im_end|>\n"35f"<|im_start|>user\n"36f"Вопрос: {question}\n"37f"Контекст: {context}\n"38f"Ответ: {answer}"39f"<|im_end|>\n"40f"<|im_start|>assistant\n"41)42 inputs = tokenizer(prompt, return_tensors="pt").to(model.device)43with torch.no_grad():44 out = model.generate(45**inputs,46 max_new_tokens=3,47 do_sample=False,48 pad_token_id=tokenizer.eos_token_id,49)50 gen = tokenizer.decode(out[0][inputs["input_ids"].shape[1]:], skip_special_tokens=True)51 m = re.search(r"[01]", gen)52 label =int(m.group())if m else053return{54"label": label,55"verdict":"Галлюцинация"if label ==1else"Не галлюцинация",56"raw_output": gen.strip(),57}5859# ── Пример 1: очевидная галлюцинация ──────────────────────────────────60result = predict(61 question="Столица Франции?",62 context="Франция — государство в Западной Европе. Столица страны — Париж.",63 answer="Столица Франции — Лондон.",64)65print(result)66# {'label': 1, 'verdict': 'Галлюцинация', 'raw_output': '1'}6768# ── Пример 2: правильный ответ ─────────────────────────────────────────69result = predict(70 question="Столица Франции?",71 context="Франция — государство в Западной Европе. Столица страны — Париж.",72 answer="Столица Франции — Париж.",73)74print(result)75# {'label': 0, 'verdict': 'Не галлюцинация', 'raw_output': '0'}7677# ── Пример 3: тонкая галлюцинация (неверное число) ────────────────────78result = predict(79 question="В каком году основана компания Apple?",80 context="Apple Inc. была основана 1 апреля 1976 года Стивом Джобсом, "81"Стивом Возняком и Рональдом Уэйном.",82 answer="Apple была основана в 1985 году.",83)84print(result)85# {'label': 1, 'verdict': 'Галлюцинация', 'raw_output': '1'}86
Использование с Unsloth (быстрее, если нужна генерация)
python
1from unsloth import FastLanguageModel
23model, tokenizer = FastLanguageModel.from_pretrained(4 model_name ="AtesiT/qwen2.5-1.5b-ru-hallucination-detector",5 max_seq_length =512,6 load_in_4bit =True,7)8model.eval()9# Далее используйте predict() из примера выше
⚠️ Ограничения и известные проблемы
Домен данных — модель обучена на энциклопедических текстах (Wikipedia-style,
SberQuAD). Качество может быть ниже на специализированных доменах (медицина,
право, технические тексты).
Длина контекста — максимальная длина входной последовательности 512 токенов.
Длинные контексты нужно обрезать перед подачей в модель.
Автоматическая разметка — обучающие данные сгенерированы автоматически
без ручной проверки. Часть негативных примеров (особенно perturbation)
может содержать "шумные" метки.
Бинарная классификация — модель не объясняет, почему ответ является
галлюцинацией, только детектирует сам факт.
Только русский язык — модель дообучалась исключительно на русскоязычных
данных, для других языков результаты непредсказуемы.
📈 История версий
Версия
Дата и время
Accuracy
F1
Precision
Recall
Train size
v1
2026-08-11 11:27:28
0.9587
0.9573
0.9739
0.9412
3865
v2
2026-08-12 12:05:19
0.9628
0.9615
0.9783
0.9454
3867
v3
2026-08-13 08:18:03
0.9794
0.9792
0.9751
0.9833
3876
v4
2026-08-13 09:16:07
0.9794
0.9792
0.9751
0.9833
3874
v5
2026-08-14 08:11:28
0.9835
0.9833
0.9793
0.9874
3877
Каждая версия — результат отдельной сессии дообучения.
Модель загружается с предыдущей версии и дообучается на новых данных.