ZenMan67's picture
Add files using upload-large-folder tool
81e8ada verified
|
Raw
History Blame Contribute Delete
4.65 kB
metadata
license: apache-2.0
language:
  - ru
library_name: transformers
pipeline_tag: text-classification
tags:
  - customer-support
  - hierarchical-classification
  - mps
  - minilm
base_model: sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2

Классификаторы тикетов

Базовый encoder: sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2.

Архитектура каждой модели:

MiniLM encoder → masked mean pooling → Dropout(0.2) → Linear(384, N)

Обучены четыре независимые версии:

Папка Классы Назначение
handler 3 human, llm, auto
human 22 Категории обязательной ручной обработки
llm 20 Категории ответа/черновика LLM
auto 18 Категории безопасного автоответа

Данные

Использован encoder_dataset.json:

  • 3000 уникальных запросов;
  • 60 категорий;
  • 50 запросов на категорию;
  • 10 независимых смысловых формулировок на категорию;
  • пять стилевых вариантов каждой формулировки.

Train/validation/test разделены по смысловым формулировкам в пропорции 80/10/10. Стилевые варианты одной исходной фразы всегда находятся в одном split.

Результаты

Модель Test accuracy Test macro-F1
handler 0.817 0.817
human 0.745 0.690
llm 0.800 0.755
auto 0.778 0.713

В test router допустил 2 ошибки human → auto на 110 human-примерах. Поэтому в MVP автоматическую отправку нужно дополнительно ограничивать confidence threshold, allowlist и risk-правилами.

На Apple M1 Pro один уже загруженный handler выполняет batch-1 inference примерно за 7.8 мс median и 8.7 мс p95. Время запуска CLI и загрузки весов в этот замер не входит.

Запуск

Каскадный прогноз:

.venv/bin/python predict.py \
  "С меня два раза сняли деньги за одну покупку"

Прогноз конкретной головой:

.venv/bin/python predict.py \
  "Где выключить рекламные уведомления?" \
  --task auto

Повторное обучение:

.venv/bin/python train_encoder_heads.py

Загрузка с Hugging Face при старте сервиса

Публичный репозиторий не требует токена:

from hub_runtime import HubTicketClassifier

classifier = HubTicketClassifier(
    repo_id="ZenMan67/support-ticket-classifiers-minilm"
)
result = classifier.predict(
    "С меня два раза сняли деньги за одну покупку"
)

При создании HubTicketClassifier вызывается snapshot_download. Router загружается сразу, а соответствующая category-head — при первом обращении к ней. Если нужны все четыре модели в памяти, передайте preload_all=True.

В каждой папке модели:

  • model.safetensors — encoder и линейная голова в FP16;
  • config.json — base model, pooling и порядок labels;
  • metrics.json — split, история обучения и ошибки test.

FP16 используется только для хранения: текущий loader создаёт модель в FP32 и при загрузке приводит checkpoint к dtype модели. Это уменьшает размер репозитория примерно вдвое без изменения API.

Ограничения

Это baseline для MVP на полностью синтетических данных. Confidence не калиброван, реальные опечатки, новые продуктовые термины и изменение входного потока не представлены полноценно. Перед автозакрытием нужны реальные деидентифицированные тикеты, shadow mode и отдельный safety-набор.