70 lines
5.5 KiB
Markdown
70 lines
5.5 KiB
Markdown
# Авто-раскладка только при подтверждённом матче в метабазе
|
||
|
||
- Дата: 2026-06-13
|
||
|
||
## Контекст
|
||
|
||
jellybit распознаёт содержимое релиза через LLM по **недоверенным**
|
||
сигналам: имя торрента, текстовый контекст человека, распарсенное
|
||
сообщение бота — всё управляется извне и может содержать инъекции. По
|
||
результату распознавания нужно решить: разложить файлы хардлинками
|
||
автоматически или отправить на ревью человеку. Цена ошибки авто-раскладки
|
||
реальна — мусор в библиотеке Jellyfin под неверным названием/папкой,
|
||
возможно поверх чужого. Хочется максимум авто, но не ценой тихих ошибок.
|
||
|
||
Силы и ограничения:
|
||
|
||
- LLM хорошо разбирает русские и релиз-имена, но галлюцинирует, а его
|
||
самооценка (`confidence`) плохо откалибрована и тривиально поддаётся
|
||
инъекции из тех же недоверенных сигналов.
|
||
- Внешние базы (TMDB/TVDB/TVMaze) дают **независимый** авторитетный сигнал:
|
||
каноническое имя + `provider_id`. Но русские релизы и аниме часто в них
|
||
отсутствуют.
|
||
- Безопасность раскладки уже держится на валидации пути, не на промпте
|
||
(см. [recognition.md](../specs/recognition.md)); решение «авто vs review» —
|
||
второй слой защиты, на уровне доверия результату.
|
||
|
||
## Рассмотренные варианты
|
||
|
||
- **Гейт по самооценке LLM (`confidence ≥ порог`).** Просто и даёт
|
||
максимум авто. Но `confidence` не откалибрована и инъектируема —
|
||
«уверенный» неверный ответ прошёл бы молча. Небезопасно.
|
||
- **LLM + структурная валидация, без обязательной базы.** Ловит часть
|
||
ошибок (число файлов у фильма, дыры/дубли в нумерации S·E), но не ловит
|
||
«правильную структуру под неверным названием». Недостаточно как
|
||
единственный гейт авто.
|
||
- **Авто только при подтверждённом матче в базе + валидация +
|
||
согласованность сигналов.** Независимый авторитет снимает риск «LLM
|
||
придумал». Цена — рус/аниме (нет в базах) всегда идут в review, но это и
|
||
так нужный кейс.
|
||
|
||
## Решение
|
||
|
||
Авто-раскладку делаем, только если выполнено **всё**: (1) единственный
|
||
сильный матч в метабазе по названию+году, давший `provider_id`;
|
||
(2) структурная валидация без предупреждений; (3) пред-парс (`go-ptn`) и
|
||
LLM не противоречат по типу/названию/году. Нет матча или база выключена →
|
||
**всегда review**. Самооценку LLM учитываем лишь как вспомогательный
|
||
сигнал, не как гейт.
|
||
|
||
Почему так: безопасность держится на **независимой** проверке (база), а не
|
||
на доверии к выходу LLM, построенному из недоверенных данных. Это разом
|
||
закрывает основной кейс (рус/аниме отсутствуют в базах → человек
|
||
подтверждает) и убирает целый класс тихих ошибок «модель уверенно
|
||
ошиблась». Review здесь — не наказание, а штатный режим для всего, что
|
||
база не подтвердила (петля «догадка → подсказка → перераспознавание», см.
|
||
[review-ux.md](../specs/review-ux.md)). Полная модель уверенности — в
|
||
[recognition.md](../specs/recognition.md).
|
||
|
||
## Последствия
|
||
|
||
- `+` Нет тихих авто-ошибок раскладки: всё неподтверждённое видит человек.
|
||
- `+` `provider_id` из базы заодно даёт каноническое имя папки
|
||
(`[tmdbid-…]`) — Jellyfin не путает русские названия.
|
||
- `−` Рус/аниме и всё, чего нет в базах, всегда требует ручного
|
||
подтверждения — авто там недоступно by design.
|
||
- `−` Без включённых TMDB/TVDB/TVMaze авто-раскладки нет вовсе: сервис
|
||
работает в режиме «распознал → review».
|
||
- Делает цикл ревью критичным: если он неудобен, ручное подтверждение
|
||
станет узким местом — поэтому review-ux вынесен в отдельную спеку.
|