Scene 01 — The Label That Lied
Валидный JSON ≠ правильное решение

Этикетка 0.931

Модель отвечала красиво, структурированно и, по её собственным меркам, правильно. Проблема была в том, что её мерками мы не могли измерить matching.

VALID JSON 100% MATCH — но не тот кандидат
Prompt Engineer Python · LLM · n8n от 150 000 ₽ MATCH ДОСЬЕ MATCH
Scene 02 — The Victim
Что именно сломалось?

В очереди из 9 человек правильно прошли только 4

Валидный JSON — 100%. Decision accuracy Exp 001 — 44%. Базовая модель принимала явно неподходящие пары.

HR MODEL valid JSON 100% decision accuracy 44% MAE score 29.8
Scene 03 — The Suspect
Архитектурный выбор

Адаптер дал контроль. Скорость — позже.

Cloud API уходит с данми наружу. Базовая модель не даёт контроля. LoRA — локальный адаптер с рычагами: данные, контроль, итерации, воспроизводимость.

Qwen2.5-1.5B-Instruct + LoRA
r=16, α=32, dropout=0.05
latency — отдельная история
Cloud API ? Base Model LoRA DATA · CONTROL · ITER скорость — позже
Scene 04 — Experiment 001
Первый поворот

Loss упал. Решения — нет.

Лучший validation loss во всей серии — 0.235 — пришёлся на худший по решениям эксперимент. Низкий loss не предсказал качество matching.

Best eval loss
0.235
Decision accuracy
44%
LOSS QUALITY Exp 001 loss curve ↓ 0.235 Doctor проходит — Engineer ждёт
Scene 05 — Experiment 002
Ложный след

Accuracy выросла. Дым не рассеялся.

Offline-тест показал 78% — впечатляющий скачок. Но production-style negative smoke, те самые примеры-ловушки, всё ещё проходили.

hard negative Exp 002 decision accuracy 78% MAE score 21.9 Runtime negative smoke FAILED Best eval loss 0.444
Scene 06 — Experiment 003
Расследование датасета

Hard negatives убили false positives, но recall упал.

Teacher Dataset добавил 33 тёмные папки: hard negatives, edge cases, invalid inputs. Датасет вырос с 90 до 123 записей. Smoke стал зелёным, но positive recall просел.

Dataset size
90 → 123
Runtime smoke
7/7 PASS
Test accuracy
67%
9 базовых +33 hard negatives NO MATCH ✓ отсеян ✗ тоже отсеян
Scene 07 — Experiment 004
Кульминация обучающей дуги

Positives и borderlines вернули recall, сохранив hard-negative gains.

Датасет вырос до 162 записей. Teacher Dataset добавил 39 светлых папок: positives и borderlines. Очередь стала правильной, а стрелка MAE прилетела ближе к центру.

Exp 001 Exp 002 Exp 003 Exp 004 Dataset records 162 Decision accuracy 80% MAE score 15.1 Runtime smoke 7/7 Hard negatives из Exp 003 сохранены; +39 positives / borderlines
Scene 08 — External Validation
Независимая проверка

Алиби частично подтверждено. Но у него есть трещины.

На внешней выборке 102 записей LoRA показала 93.1% accuracy против 94.1% у GPT-4o-mini. Большинство точек кластеризуется вокруг диагонали — но не все.

LoRA accuracy
93.1%
GPT-4o-mini
94.1%
MAE LoRA vs GPT
19.6 vs 6.2
GPT-4o-mini reference score LoRA score 93.1% LoRA 94.1% GPT-4o-mini
Scene 09 — Production Telegram Smoke
Production reality check

Production нашёл truncation-баг, который не видела offline-метрика.

Telegram-дымовой тест вскрыл HTTP 422 и обрезанный JSON на hard-negative анкетах. Фикс: max_tokens 300 → 512 + graceful JSON extraction.

До фикса Doctor... match: tr 422 HTTP 422 / truncation max_tokens=512 fallback После фикса Doctor... no_match Smoke PASS Категории smoke: positive ✅ · obvious_negative ✅ · hard_negative ✅ · edge_case ✅ · invalid_input ✅ · stability_repeat ✅
Scene 10 — Latency
Deployment

Пока мы искали качество, latency могла убить развёртывание.

Generation занимала >99% времени ответа. Стандартный transformers fp16 давал ~9–15 с. vLLM + persistent warm process сократили среднюю latency до ~1.6 с.

transformers fp16
~9.1 s
transformers 4-bit
~15.5 s
vLLM
~1.6 s
До 2 чашки кофе спустя После vLLM кофе ещё горячий Три движка transformers fp16 transformers 4-bit vLLM
Scene 11 — The Final Investigation
Кульминация

93.1% accuracy не соврала. Она просто не рассказала всё.

Когда LoRA запустили в реальном Telegram и подали 23 hard-negative анкеты, результат рухнул до 35%. Расследование показало: модель не лгала. Она точно воспроизводила teacher labels.

93.1% accuracy 35% 25% меток неточны Я просто повторяю
Scene 12 — The Confession
Переосмысление

Модель не обманывала. Она воспроизводила teacher labels.

Teacher Dataset признал: часть hard-negative меток была размечена как match. Следующий шаг — чинить датасет, а не модель. И переходить к stratified метрикам.

Teacher → LoRA agreement
высокая
Новая оценка
stratified
Teacher labels ≈ LoRA predictions Старая шкала accuracy 93.1% Новая шкала POSITIVE BORDERLINE HARD NEG OBVIOUS NM
Scene 13 — Verdict
Вердикт

Вердикт присяжных: датасет виноват, модель — нет.

Dataset engineering — доказано. Production hard-negative качество — частично. Calibration и субсекундная latency — следующее дело.

PROVEN dataset engineering PARTIAL production hard negatives NEXT calibration · augmentation · server
Scene 14 — Next Cycle
Открытый финал

Расследование продолжается.

Команда идёт вперёд. Каждый несёт свою задачу: re-label hard negatives, расширить teacher dataset, calibration loss, persistent quantized server, stratified production smoke set.

Re-label hard negatives Dataset → 300–500 пар Calibration loss Quantized server
Scene 15 — Evidence Room
Engineering appendix

Улики открыты. Проверяйте.

Все исходные артефакты: loss-кривые, метрики, параметры, ссылки на JSON-файлы. Каждый ящик можно раскрыть и посмотреть полные данные.