HR Assistant — LoRA Fine-Tuning

Практическая реализация LoRA-дообучения Qwen2.5 для matching-модели HR-ассистента. Четыре эксперимента показали, что инженерия датасета важнее тюнинга адаптера.

4 эксперимента
93.1% decision accuracy
~1.6с latency после vLLM
Конвейер проекта
Teacher Dataset 90→123→162
Split train/val/test
LoRA r=16, α=32
Eval offline + smoke
vLLM inference
FastAPI production API
Telegram channel

Валидный JSON ещё не значит правильный ответ

Базовая модель выдавала корректный JSON, но принимала плохие matching-решения. Формат выучен; смысл — нет.

Base model
Врач подаёт резюме на вакансию Prompt Engineer.
{ "match": true, "score": 72, "reasoning": "Кандидат имеет технический бэкграунд" }
Правильный ответ
Та же пара кандидат–вакансия после дообучения.
{ "match": false, "score": 12, "reasoning": "Роль и опыт не пересекаются" }
44%
Decision accuracy base
100%
Valid JSON rate
38.8
MAE score base
  • Формат ≠ смысл. Модель быстро выучила JSON-шаблон, но не логику matching-решений.
  • Loss — не целевая метрика. Validation loss не предсказывал качество бизнес-решений.
  • Нужен контролируемый датасет. Teacher labels должны отражать реальные критерии matching.

Почему LoRA, а не облачный API

Локальный адаптер даёт контроль над данными и итеративность. Скорость и экономия — не начальные преимущества, а области для последующей работы.

Облачный API
  • Быстрый inference
  • Меньше инфраструктуры
  • Данные уходят на внешний сервис
  • Меньше контроля над поведением
vs
Local LoRA
  • Данные не покидают инфраструктуру
  • Контроль overfitting и гиперпараметров
  • Быстрые итерации датасета (~3 мин)
  • Inference требует оптимизации
Выбор: локальный LoRA-адаптер над Qwen2.5-1.5B с фиксированными гиперпараметрами, чтобы единственной переменной оставался состав teacher dataset.

Четыре эксперимента — цепочка открытий

Каждый эксперимент отвечал на вопрос, оставленный предыдущим. Гиперпараметры LoRA не менялись.

×
Exp 001 — Baseline
Сразу ли LoRA работает?
90 записей. Проверка базовой гипотезы.
Ответ: нет. Valid JSON 100%, accuracy 44% — как у base.
~
Exp 002 — Тюнинг ёмкости
Поможет ли более выразительный адаптер?
90 записей. Увеличение выразительности модели.
Ответ: частично. Accuracy 78%, но hard negatives проходят.
Exp 003 — Hard negatives
Дело в смещении датасета?
123 записи. +33 hard-negative и edge-case примера.
Ответ: да. Smoke 7/7 passed, accuracy падает до 67%.
Exp 004 — Баланс
Как вернуть recall?
162 записи. +39 positive/borderline, hard negatives сохранены.
Ответ: positives восстанавливают recall: accuracy 80%, external validation 93.1%.

Эволюция метрик

Два независимых измерения качества: точность matching-решений и средняя абсолютная ошибка композитного score.

Точность решений

Точность matching-решений росла неравномерно: 44% → 78% → 67% → 80%. Падение на Exp 003 — осознанная жертва recall ради устойчивости к hard negatives.

Эволюция decision accuracy по экспериментам

Рис. 1. Decision accuracy: Base Qwen vs LoRA по четырём экспериментам.

Ошибка оценки

Средняя абсолютная ошибка композитного score снизилась с 38 до 15 баллов. Base model ошибался сильнее всех.

Эволюция MAE score по экспериментам

Рис. 2. MAE score: Base Qwen vs LoRA по четырём экспериментам. Меньше — лучше.

External validation

На 102 независимых парах кандидат–вакансия LoRA достигла 93.1% decision accuracy против 94.1% у GPT-4o-mini. Модель обобщается, но score калибруется не идеально.

External validation: LoRA score vs reference score

Рис. 3. External validation scatter: LoRA score против reference score.

93.1%
LoRA accuracy
94.1%
GPT-4o-mini accuracy
102
Независимых записей

Telegram Production Smoke

Offline-метрики неэквивалентны production-качеству. Runtime smoke на реальном API выявил failure modes, которых не было в тестовой выборке.

Runtime smoke pass/fail matrix

Рис. 4. Production smoke matrix по категориям и экспериментам.

  • Exp 002 провалил negative-кейсы на реальном API.
  • Hard negatives в Exp 003 устранили это: smoke 7/7 passed.
  • Truncation bug: при max_tokens=300 возникал HTTP 422. Фикс — max_tokens=512 + graceful JSON extraction.

Dataset Engineering

Рост качества шёл за счёт инженерии датасета, а не адаптера. На каждом шаге добавлялись примеры, которые устраняли конкретный дефект.

90
Exp 001–002
30 кандидатов × 3 вакансии
общий baseline
+33 hard negatives
+ edge cases
123
Exp 003
41 кандидат
устраняет false positives
+39 positives
+ borderlines
162
Exp 004
54 кандидата
восстанавливает recall
  • Гиперпараметры LoRA оставались неизменными на протяжении всех экспериментов.
  • Единственная систематически меняющаяся переменная — состав и баланс teacher dataset.
  • Hard negatives устранили false positives; positives и borderlines вернули recall.

Итоговые выводы

Четыре эксперимента и финальное Telegram-расследование привели к чёткому пониманию границ: что доказано, что частично доказано и что требует следующего цикла.

Доказано

Инженерия датасета важнее тюнинга адаптера. Hard negatives и positives/borderlines — рабочие рычаги качества. Технический контур и deployment воспроизводимы.

~

Частично доказано

93.1% decision accuracy на external holdout и 100% production smoke pass. Hard-negative качество в реальных сценариях требует дополнительной stratified evaluation.

Next cycle

Калибровка score, уменьшение latency, расширение teacher dataset и добавление hard-negative метрик в валидационный pipeline.

Qwen2.5-1.5B-Instruct
PEFT / LoRA
TRL + PyTorch
vLLM
FastAPI
Telegram Bot API
AI
AI-ассистент
Спросите о кейсах и услугах