feat(ops): замер качества детекции — первые честные цифры
All checks were successful
Deploy / deploy (push) Successful in 4s
Deploy / test (push) Successful in 2m53s

О качестве проверки мы до сих пор знали только «механизм жив»: находит
подброшенный фрагмент. Продукт при этом продаёт процент заимствований, за
который никто не ручался — неизвестно было ни сколько списываний система
пропускает, ни как часто обвиняет невиновных.

Бенчмарк делает из документов корпуса «студенческие работы» четырёх видов и
гоняет их через настоящий путь L1. Первый замер на проде:

  дословно        100% найдено
  лёгкий рерайт   100% найдено
  сильный рерайт    0% — это работа L3/L4, не L1
  оригинал          0% ложных обвинений

То есть основа работает как задумано. Показательно другое: из 20 взятых
документов в замер попали 8 — у остальных нет полного текста нужной длины.
Узкое место не алгоритм, а глубина корпуса.

Запускать после изменения порогов и параметров winnowing — иначе непонятно,
улучшение сделано или ухудшение.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
jze9
2026-09-05 20:45:59 +05:00
parent fed4b54cfc
commit a76e46c561
2 changed files with 198 additions and 0 deletions

View File

@@ -214,6 +214,24 @@ Identity (Universal Auth) и генерирует `.env` заново (`infisica
## 11. Качество и тесты
**Замер качества детекции** — [`scripts/ops/detection_benchmark.py`](../scripts/ops/detection_benchmark.py).
Делает из документов корпуса «студенческие работы» (дословная копия, лёгкий и
сильный рерайт, плюс заведомо оригинальный текст) и прогоняет через настоящий
путь L1. Первый замер, 05.09.2026:
| Случай | Доля найденных |
|--------|---------------:|
| дословно | 100% |
| лёгкий рерайт (выброшено каждое 10-е слово) | 100% |
| сильный рерайт (каждое 3-е слово) | 0% — задача L3/L4, не L1 |
| оригинальный текст | 0% ложных обвинений |
Запускать после изменения порогов (`EXACT_FRAGMENT_THRESHOLD`), параметров
winnowing и плотности отпечатков: без этих чисел непонятно, улучшение сделано
или ухудшение. Ограничение замера: в выборку попадают только документы с
реальной глубиной (>800 отпечатков) — по документам с одной аннотацией мерить
нечего, и это само по себе показатель состояния корпуса.
- **113 юнит-тестов** (pytest, per-service) на чистую логику L1-L4/скоринг/фрагменты/
ГОСТ/библиография; инфра замокана или не нужна. Запуск: `make test`.
- **Гейты CI**: ruff (весь Python) + mypy (доменная логика) + тесты — блокируют деплой.