- html_extract: строки дорожек под пустым «Перевод:» берутся и через пустые строки (в HTML после <br> стоит \n исходника — прежняя правка на реальной странице rutracker t=6919056 отдавала 1 дорожку из 4); шаблон начала строки требует полные слова типа озвучки. - release: complete_block достраивает список, из которого модель выбрала не все строки; segmenter_warning (+ лог) — модель и правила (без кодек-строк) разошлись; поле segmenter_warning в ответе. - docs: retrain-segmenter.md — как дообучить сегментатор, поле в api-reference. - tests: 275 ok. Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
6.0 KiB
Дообучение сегментатора страниц
Сегментатор решает, какие строки страницы описывают дорожки озвучки
(src/segmenter.py, rubert-tiny2). Дообучать его нужно, когда /predict теряет
дорожки или в ответе появилось segmenter_warning (модель и правила
разошлись). Делается на машине, где лежат data/raw, data/pages и models/segmenter
(в git их нет; в репозитории на машине разработки их не оказалось, пути ниже — относительно каталога проекта, где они есть): без них обучение выдаст более слабые веса, чем рабочие.
0. Понять причину (по желанию, 1 минута)
Какие оценки модель ставит строкам страницы (docker compose exec — на
сервере, либо то же в .venv локально):
docker compose exec grabber-ai python -c "from src.fetch import fetch_html; from src.html_extract import html_to_text; from src.segmenter import LineSegmenter, page_lines; h,_=fetch_html('https://rutracker.org/forum/viewtopic.php?t=6919056', timeout=60); L=page_lines(html_to_text(h)); s=LineSegmenter('/app/models/segmenter'); [print(round(float(p),3), l[:90]) for l,p in zip(L, s.score(L)) if p>0.01]"
- оценки 0.3–0.49 у строк-дорожек — упёрлись в порог (
THRESHOLD = 0.5); - оценки около 0 — модель не знает такую вёрстку, нужны примеры (шаги ниже).
1. Добавить проблемные раздачи
cd <каталог проекта, где лежат data\raw и models>
.venv\Scripts\python tools\collect.py
Главное меню → 6 («Обучение по ссылкам»): вставьте ссылки на раздачи, у
которых дорожки определились неверно (например,
https://rutracker.org/forum/viewtopic.php?t=6919056). Страницы скачиваются
вашим Chrome (вход на трекер делаете сами), парсер строит метки. Проверьте
таблицу: строк-дорожек должно быть столько же, сколько на странице (для
6919056 — четыре, у двух HDRezka разные типы). Правки: «2 18» — переключить
18+, «3 d» — удалить строку, «1 t <тип>» — тип, «1 s <студия>» — студия.
Сохраните: id попадёт в data/manual_ids.txt, такие релизы всегда в train и
повторяются при обучении ×5.
Чем больше похожих раздач (3–10 штук с разными студиями и той же вёрсткой), тем надёжнее; одна страница редко меняет поведение модели.
2. Переобучить
Главное меню → 2 («Переобучить и протестировать»). Шаги идут сами:
prepare_data, обучение сегментатора в models/segmenter_v2
(≈ минуты на RTX 5070 Ti), tests/run_tests.py, таблица «правила / старые веса /
новые веса» по трекерам.
Без меню:
.venv\Scripts\python -m src.prepare_data
.venv\Scripts\python -m src.segmenter --train --out models/segmenter_v2
.venv\Scripts\python tests\run_tests.py
.venv\Scripts\python tests\e2e_segmenter.py models/segmenter_v2
3. Принять новые веса
Меню покажет, лучше ли новые веса. На «y» они заменят models/segmenter, старые
уйдут в models/segmenter_old_<время>. Если хуже — не принимайте: добавьте
больше примеров вёрстки и повторите шаг 2.
Исправленная раздача проверяется на сервере после пересборки образа (шаг 5).
4. Упаковать модели и пересобрать образ
.venv\Scripts\python tools\pack_models.py --stage docker-models
docker compose up -d --build
(в CI — workflow .gitea/workflows/docker.yml, см. docs/docker.md).
5. Проверить на сервере
irm http://192.168.100.67:7654/health # "segmenter": "model"
irm http://192.168.100.67:7654/predict -Method Post -ContentType "application/json; charset=utf-8" -Headers @{Authorization="Bearer <токен>"} -Body ([Text.Encoding]::UTF8.GetBytes('{"url":"https://rutracker.org/forum/viewtopic.php?t=6919056"}')) | ConvertTo-Json -Depth 10
Должно быть "segmenter": "model", четыре дорожки, без segmenter_warning.
Что делает сервис, пока модель не дообучена
- Достройка блока (
release.complete_block): модель выбрала часть строк списка под «Перевод:» — соседние строки с типом озвучки (Проф…, Любит…, …голос…) добавляются в тот же список. - Запасные правила: модель не нашла ни одной строки — дорожки берут правила
html_extract.extract_segments; в ответе"segmenter": "rules". segmenter_warningв ответе и строкаsegmenter: …в логе сервиса — модель и правила разошлись. На глоссариях типов озвучки правила дают ложные срабатывания, поэтому предупреждение — повод посмотреть страницу, а не всегда ошибка.