AtesiT commited on
Commit
5b889a8
·
verified ·
1 Parent(s): fc76d62

Upload README.md with huggingface_hub

Browse files
Files changed (1) hide show
  1. README.md +346 -14
README.md CHANGED
@@ -1,21 +1,353 @@
1
  ---
2
- base_model: AtesiT/qwen2.5-1.5b-ru-hallucination-detector
3
- tags:
4
- - text-generation-inference
5
- - transformers
6
- - unsloth
7
- - qwen2
8
  license: apache-2.0
9
- language:
10
- - en
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
11
  ---
12
 
13
- # Uploaded finetuned model
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
14
 
15
- - **Developed by:** AtesiT
16
- - **License:** apache-2.0
17
- - **Finetuned from model :** AtesiT/qwen2.5-1.5b-ru-hallucination-detector
 
 
 
 
 
 
 
 
 
 
 
 
18
 
19
- This qwen2 model was trained 2x faster with [Unsloth](https://github.com/unslothai/unsloth) and Huggingface's TRL library.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
20
 
21
- [<img src="https://raw.githubusercontent.com/unslothai/unsloth/main/images/unsloth%20made%20with%20love.png" width="200"/>](https://github.com/unslothai/unsloth)
 
 
1
  ---
2
+ language: ru
 
 
 
 
 
3
  license: apache-2.0
4
+ base_model: Qwen/Qwen2.5-1.5B-Instruct
5
+ tags:
6
+ - hallucination-detection
7
+ - fact-checking
8
+ - qwen2.5
9
+ - lora
10
+ - unsloth
11
+ - russian
12
+ - nlp
13
+ - classification
14
+ pipeline_tag: text-generation
15
+ datasets:
16
+ - kuznetsoffandrey/sberquad
17
+ metrics:
18
+ - accuracy
19
+ - f1
20
+ ---
21
+
22
+ # 🔍 Детектор галлюцинаций LLM — русский язык
23
+
24
+ > **Текущая версия:** v5 · Последнее обновление: 2026-08-14 08:11:28
25
+
26
+ Эта модель определяет, является ли ответ языковой модели **галлюцинацией** —
27
+ то есть содержит ли он информацию, которая противоречит предоставленному контексту
28
+ или не подтверждается им.
29
+
30
+ Модель дообучена на основе **[Qwen2.5-1.5B-Instruct](https://huggingface.co/Qwen/Qwen2.5-1.5B-Instruct)**
31
+ методом **QLoRA (4-bit quantization + LoRA адаптеры)** с использованием
32
+ библиотеки **[Unsloth](https://github.com/unslothai/unsloth)** для ускоренного
33
+ обучения на GPU.
34
+
35
  ---
36
 
37
+ ## 📋 Описание задачи
38
+
39
+ **Галлюцинации LLM** — это когда языковая модель генерирует ответ, который звучит
40
+ правдоподобно, но не соответствует реальным фактам или противоречит предоставленному
41
+ источнику (контексту). Это одна из ключевых проблем при использовании LLM в
42
+ production-системах, особенно в задачах RAG (Retrieval-Augmented Generation).
43
+
44
+ ### Постановка задачи
45
+
46
+ Модель принимает три входных текста:
47
+ - **Вопрос** — то, что пользователь спросил у LLM
48
+ - **Контекст** — документ/фрагмент, который был предоставлен LLM как источник фактов
49
+ - **Ответ** — то, что LLM сгенерировала в ответ на вопрос
50
+
51
+ И возвращает бинарную метку:
52
+ - **0** — ответ соответствует контексту (не галлюцинация)
53
+ - **1** — ответ противоречит контексту или содержит неподтверждённые факты (галлюцинация)
54
+
55
+ ### Где это применяется
56
+
57
+ - ✅ RAG-пайплайны — проверка ответов перед показом пользователю
58
+ - ✅ Автоматическое тестирование LLM-агентов
59
+ - ✅ Мониторинг качества ответов в продакшн-системах
60
+ - ✅ Датасеты для обучения других моделей (серебряная разметка)
61
+
62
+ ---
63
+
64
+ ## 📊 Метрики качества
65
+
66
+ ### Текущая версия (v5, 2026-08-14 08:11:28)
67
+
68
+ | Метрика | Значение |
69
+ |---------|----------|
70
+ | **Accuracy** | **0.9835** |
71
+ | **F1-score** | **0.9833** |
72
+ | Precision | 0.9793 |
73
+ | Recall | 0.9874 |
74
+ | Размер теста | 485 примеров |
75
+
76
+ ### Кривая обучения (Train / Eval Loss)
77
+
78
+ ![Loss curve](loss_curve.png)
79
+
80
+ *График показывает динамику функции потерь на обучающей и валидационной выборках
81
+ по шагам обучения. Снижение eval loss без роста train loss означает, что модель
82
+ обобщает, а не запоминает данные.*
83
+
84
+ ### Confusion Matrix
85
+
86
+ ![Confusion Matrix](confusion_matrix.png)
87
+
88
+ *По оси X — предсказанный класс, по оси Y — истинный класс.
89
+ Диагональ показывает правильные предсказания.*
90
+
91
+ ---
92
+
93
+ ## 🗂️ Данные для обучения
94
+
95
+ ### Источник
96
+
97
+ Датасет собран **полностью автоматически** на основе русского QA-корпуса
98
+ **[SberQuAD](https://huggingface.co/datasets/kuznetsoffandrey/sberquad)** —
99
+ русскоязычного аналога Stanford SQuAD (~45 000 пар вопрос-параграф-ответ).
100
+
101
+ ### Стратегия генерации примеров
102
+
103
+ **Положительные примеры (label=0, не галлюцинация):**
104
+ Берутся напрямую из SberQuAD — оригинальная тройка (вопрос, контекст,
105
+ правильный ответ), где ответ гарантированно содержится в контексте.
106
+
107
+ **Отрицательные примеры (label=1, галлюцинация)** генерируются тремя способами:
108
+
109
+ | Стратегия | Описание | Сложность для детектора |
110
+ |-----------|----------|------------------------|
111
+ | **Mismatch** | Ответ от другого вопроса/контекста | Лёгкая — ответ явно не связан с контекстом |
112
+ | **Perturbation** | Искажение чисел или слов в правильном ответе | Средняя — ответ похож на правду, но неверен |
113
+ | **LLM-generated** | Qwen2.5 генерирует правдоподобный, но неверный ответ (zero-shot) | Сложная — похоже на настоящую галлюцинацию |
114
+
115
+ Такой микс позволяет модели научиться выявлять галлюцинации разной степени
116
+ "правдоподобности" — от очевидных несоответствий до тонких фактических ошибок.
117
+
118
+ ### Размер датасета (v5)
119
+
120
+ | Сплит | Размер |
121
+ |-------|--------|
122
+ | Train | 3877 |
123
+ | Val | 485 |
124
+ | Test | 485 |
125
+ | **Итого** | **4847** |
126
+
127
+ ---
128
+
129
+ ## 🛠️ Технические детали обучения
130
+
131
+ ### Архитектура
132
+
133
+ | Параметр | Значение |
134
+ |----------|----------|
135
+ | Базовая модель | `Qwen/Qwen2.5-1.5B-Instruct` |
136
+ | Квантизация | 4-bit (QLoRA) |
137
+ | LoRA rank (r) | 16 |
138
+ | LoRA alpha | 16 |
139
+ | LoRA dropout | 0.1 |
140
+ | Target modules | q_proj, k_proj, v_proj, o_proj, gate_proj, up_proj, down_proj |
141
+ | Обучаемых параметров | ~20M из ~1.5B (≈1.3%) |
142
+
143
+ ### Гиперпараметры обучения
144
+
145
+ | Параметр | Значение |
146
+ |----------|----------|
147
+ | Эпохи | 2 |
148
+ | Learning rate | 2e-4 |
149
+ | Warmup ratio | 0.05 |
150
+ | Batch size (эффективный) | 16 (2 × grad_accum 8) |
151
+ | Optimizer | AdamW 8-bit |
152
+ | Max sequence length | 512 |
153
+ | Планировщик LR | cosine |
154
+
155
+ ### Формат промпта
156
 
157
+ ```
158
+ <|im_start|>system
159
+ Ты — эксперт по проверке фактов. Тебе дан вопрос, контекст (источник фактов) и ответ ассистента.
160
+ Определи, является ли ответ галлюцинацией — то есть противоречит контексту или не подтверждён им.
161
+ Ответь только цифрой: 1 — если это галлюцинация, 0 — если ответ соответствует контексту.
162
+ <|im_end|>
163
+ <|im_start|>user
164
+ Вопрос: {question}
165
+ Контекст: {context}
166
+ Ответ: {answer}
167
+ <|im_end|>
168
+ <|im_start|>assistant
169
+ {0 или 1}
170
+ <|im_end|>
171
+ ```
172
 
173
+ ### Инфраструктура
174
+
175
+ | Параметр | Значение |
176
+ |----------|----------|
177
+ | GPU | NVIDIA T4 (16 GB VRAM) |
178
+ | Платформа | Google Colab |
179
+ | Фреймворк | PyTorch + Hugging Face Transformers |
180
+ | Ускорение | Unsloth (2-4x быстрее стандартного обучения) |
181
+ | Время обучения | ~30-60 минут на T4 |
182
+
183
+ ---
184
+
185
+ ## 💻 Как использовать
186
+
187
+ ### Установка
188
+
189
+ ```bash
190
+ pip install transformers torch accelerate
191
+ ```
192
+
193
+ ### Код
194
+
195
+ ```python
196
+
197
+ from transformers import AutoModelForCausalLM, AutoTokenizer
198
+ import torch, re
199
+
200
+ # Загружаем модель с Hugging Face Hub
201
+ REPO_ID = "AtesiT/qwen2.5-1.5b-ru-hallucination-detector"
202
+ tokenizer = AutoTokenizer.from_pretrained(REPO_ID)
203
+ model = AutoModelForCausalLM.from_pretrained(
204
+ REPO_ID,
205
+ torch_dtype=torch.float16,
206
+ device_map="auto"
207
+ )
208
+ model.eval()
209
+
210
+ SYSTEM_PROMPT = (
211
+ "Ты — эксперт по проверке фактов. Тебе дан вопрос, контекст (источник фактов) и ответ ассистента. "
212
+ "Определи, является ли ответ галлюцинацией — то есть противоречит контексту или не подтверждён им. "
213
+ "Ответь только цифрой: 1 — если это галлюцинация, 0 — если ответ соответствует контексту."
214
+ )
215
+
216
+ def predict(question: str, context: str, answer: str) -> dict:
217
+ """
218
+ Определяет, является ли ответ галлюцинацией.
219
+
220
+ Args:
221
+ question: Вопрос, на который отвечала LLM
222
+ context: Контекст (источник фактов, справочный текст)
223
+ answer: Ответ LLM, который нужно проверить
224
+
225
+ Returns:
226
+ dict с ключами: label (0/1), verdict (str), raw_output (str)
227
+ """
228
+ prompt = (
229
+ f"<|im_start|>system\n{SYSTEM_PROMPT}<|im_end|>\n"
230
+ f"<|im_start|>user\n"
231
+ f"Вопрос: {question}\n"
232
+ f"Контекст: {context}\n"
233
+ f"Ответ: {answer}"
234
+ f"<|im_end|>\n"
235
+ f"<|im_start|>assistant\n"
236
+ )
237
+ inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
238
+ with torch.no_grad():
239
+ out = model.generate(
240
+ **inputs,
241
+ max_new_tokens=3,
242
+ do_sample=False,
243
+ pad_token_id=tokenizer.eos_token_id,
244
+ )
245
+ gen = tokenizer.decode(out[0][inputs["input_ids"].shape[1]:], skip_special_tokens=True)
246
+ m = re.search(r"[01]", gen)
247
+ label = int(m.group()) if m else 0
248
+ return {
249
+ "label": label,
250
+ "verdict": "Галлюцинация" if label == 1 else "Не галлюцинация",
251
+ "raw_output": gen.strip(),
252
+ }
253
+
254
+ # ── Пример 1: очевидная галлюцинация ──────────────────────────────────
255
+ result = predict(
256
+ question="Столица Франции?",
257
+ context="Франция — государство в Западной Европе. Столица страны — Париж.",
258
+ answer="Столица Франции — Лондон.",
259
+ )
260
+ print(result)
261
+ # {'label': 1, 'verdict': 'Галлюцинация', 'raw_output': '1'}
262
+
263
+ # ── Пример 2: правильный ответ ─────────────────────────────────────────
264
+ result = predict(
265
+ question="Столица Франции?",
266
+ context="Франция — государство в Западной Европе. Столица страны — Париж.",
267
+ answer="Столица Франции — Париж.",
268
+ )
269
+ print(result)
270
+ # {'label': 0, 'verdict': 'Не галлюцинация', 'raw_output': '0'}
271
+
272
+ # ── Пример 3: тонкая галлюцинация (неверное число) ────────────────────
273
+ result = predict(
274
+ question="В каком году основана компания Apple?",
275
+ context="Apple Inc. была основана 1 апреля 1976 года Стивом Джобсом, "
276
+ "Стивом Возняком и Рональдом Уэйном.",
277
+ answer="Apple была основана в 1985 году.",
278
+ )
279
+ print(result)
280
+ # {'label': 1, 'verdict': 'Галлюцинация', 'raw_output': '1'}
281
+
282
+ ```
283
+
284
+ ### Использование с Unsloth (быстрее, если нужна генерация)
285
+
286
+ ```python
287
+ from unsloth import FastLanguageModel
288
+
289
+ model, tokenizer = FastLanguageModel.from_pretrained(
290
+ model_name = "AtesiT/qwen2.5-1.5b-ru-hallucination-detector",
291
+ max_seq_length = 512,
292
+ load_in_4bit = True,
293
+ )
294
+ model.eval()
295
+ # Далее используйте predict() из примера выше
296
+ ```
297
+
298
+ ---
299
+
300
+ ## ⚠️ Ограничения и известные проблемы
301
+
302
+ 1. **Домен данных** — модель обучена на энциклопедических текстах (Wikipedia-style,
303
+ SberQuAD). Качество может быть ниже на специализированных доменах (медицина,
304
+ право, технические тексты).
305
+
306
+ 2. **Длина контекста** — максимальная длина входной последовательности 512 токенов.
307
+ Длинные контексты нужно обрезать перед подачей в модель.
308
+
309
+ 3. **Автоматическая разметка** — обучающие данные сгенерированы автоматически
310
+ без ручной проверки. Часть негативных примеров (особенно perturbation)
311
+ может содержать "шумные" метки.
312
+
313
+ 4. **Бинарная классификация** — модель не объясняет, *почему* ответ является
314
+ галлюцинацией, только детектирует сам факт.
315
+
316
+ 5. **Только русский язык** — модель дообучалась исключительно на русскоязычных
317
+ данных, для других языков результаты непредсказуемы.
318
+
319
+ ---
320
+
321
+ ## 📈 История версий
322
+
323
+ | Версия | Дата и время | Accuracy | F1 | Precision | Recall | Train size |
324
+ |--------|-------------|----------|----|-----------|--------|------------|
325
+ | v1 | 2026-08-11 11:27:28 | 0.9587 | 0.9573 | 0.9739 | 0.9412 | 3865 |
326
+ | v2 | 2026-08-12 12:05:19 | 0.9628 | 0.9615 | 0.9783 | 0.9454 | 3867 |
327
+ | v3 | 2026-08-13 08:18:03 | 0.9794 | 0.9792 | 0.9751 | 0.9833 | 3876 |
328
+ | v4 | 2026-08-13 09:16:07 | 0.9794 | 0.9792 | 0.9751 | 0.9833 | 3874 |
329
+ | v5 | 2026-08-14 08:11:28 | 0.9835 | 0.9833 | 0.9793 | 0.9874 | 3877 |
330
+
331
+ *Каждая версия — результат отдельной сессии дообучения.
332
+ Модель загружается с предыдущей версии и дообучается на новых данных.*
333
+
334
+ ---
335
+
336
+ ## 📚 Связанные работы и датасеты
337
+
338
+ - [SberQuAD](https://huggingface.co/datasets/kuznetsoffandrey/sberquad) — базовый датасет
339
+ - [HaluEval](https://github.com/RUCAIBox/HaluEval) — бенчмарк галлюцинаций (английский)
340
+ - [Qwen2.5](https://huggingface.co/Qwen/Qwen2.5-1.5B-Instruct) — базовая модель
341
+ - [Unsloth](https://github.com/unslothai/unsloth) — библиотека для ускорения обучения
342
+
343
+ ---
344
+
345
+ ## 📄 Лицензия
346
+
347
+ Apache 2.0 — можно использовать в коммерческих проектах.
348
+ Базовая модель Qwen2.5 также распространяется под Apache 2.0.
349
+
350
+ ---
351
 
352
+ *Модель создана в образовательных целях.
353
+ При использовании в продакшн рекомендуется дополнительная валидация на ваших данных.*