7.5 KiB
7.5 KiB
Django Management Commands
В этом документе описаны кастомные консольные команды (manage.py), реализованные в проекте Hypn0 для автоматизации периодических фоновых задач, скоринга и обслуживания хранилища.
1. rescore_hypn0_items — Пакетный пересчет рейтинга и детекция аномалий
- Путь:
hypn0/hypn0_site/management/commands/rescore_hypn0_items.py - Назначение: Пакетный фоновый пересчет рейтинга популярности (
f_score) для всех активных картин и выявление аномалий (накрутка лайков / скоординированный шейминг).
Базовый запуск:
# Рабочий запуск
poetry run python hypn0/manage.py rescore_hypn0_items
# Тестовый прогон (без записи изменений в базу)
poetry run python hypn0/manage.py rescore_hypn0_items --dry-run
Архитектурные принципы и алгоритм:
-
Метрики платформы («Средняя температура по больнице»):
- Анализирует активность за скользящее окно
WINDOW_HOURS = 24.0часов. - Считает среднее число голосов на одну активную картину (моложе 30 дней).
- Защита «холодного старта» (Cold Start): при пустой базе или отсутствии голосов отключаются относительные детекторы, предотвращая ложные срабатывания и деление на 0.
- Анализирует активность за скользящее окно
-
Экспоненциальное затухание голосов (Time-Decay):
- Сила каждого голоса из
TbVoteплавно затухает по закону:\text{Weight}(t) = \text{BaseWeight} \times 2^{-\Delta t / \text{HalfLife}} - По умолчанию период полураспада силы голоса составляет 14 дней (
--half-life-days=14.0). - Истинные веса голосов:
LIKE=+1AUTHOR=+2CLAIM=-2
- Сила каждого голоса из
-
Детекция аномалий и автоматический перевод уровней (
Level):- Шейминг (
Level.SHAMED = -20): если за последние 24ч доля жалоб среди свежих голосов\ge 35\%(--shame-claim-ratio=0.35). - Накрутка / Спайк (
Level.SUSPICIOUS = -10): если приток лайков за окно в 4+ раза превышает средний по платформе (--spike-multiplier=4.0) и составляет\ge 20лайков (или\ge 50лайков при холодном старте). - Прогрев (
Level.LEVEL_1 = 10): если картина со статусомCANDIDATEнабрала достаточный взвешенный вес (\ge 10по умолчанию), она автоматически повышается доLEVEL_1(«Плеск бессознательного»), привлекая внимание модератора для витрины.
- Шейминг (
-
Гравитационная модель скоринга (с логарифмом):
\text{Score} = \frac{\ln(1 + \max(0, \text{WeightedLikes})) + \text{Bonus}_{\text{level}}}{(\text{Age in hours} + 2.0)^\gamma}LEVEL_1_BONUS=+1.5LEVEL_2_BONUS=+4.0(Одобрено Мозговым Слизнем)
-
Инерционное сглаживание (EMA — Exponential Moving Average):
- Чтобы исключить резкие скачки рейтинга от разовых всплесков, итоговый
f_scoreсглаживается с предыдущим значением:\text{Score}_{\text{final}} = 0.7 \times \text{Score}_{\text{new}} + 0.3 \times \text{Score}_{\text{old}}
- Чтобы исключить резкие скачки рейтинга от разовых всплесков, итоговый
Параметры командной строки (CLI):
| Флаг | Тип | По умолчанию | Описание |
|---|---|---|---|
--gamma |
float |
1.5 |
Коэффициент гравитации старения картины |
--half-life-days |
float |
14.0 |
Период полураспада веса голоса (в днях) |
--spike-multiplier |
float |
4.0 |
Множитель спайка лайков для детекции накрутки |
--shame-claim-ratio |
float |
0.35 |
Доля жалоб для признания скоординированного шейминга |
--warmup-votes-threshold |
int |
10 |
Порог взвешенных голосов для автопрогрева CANDIDATE -> LEVEL_1 |
--dry-run |
flag |
False |
Пробный запуск без изменения записей в БД |
2. rehash — Проверка целостности и перегенерация s_hash_id
- Путь:
hypn0/hypn0_site/management/commands/rehash.py - Назначение: Синхронизация публичных коротких хэшей
s_hash_idв базе данных с текущим значениемHASHIDS_SALTиHASHIDS_MIN_LENGTH.
Когда требуется запуск:
- При смене или ротации
HASHIDS_SALTв.env/settings.py. - При переносе/миграции базы данных между разными окружениями (Dev
\rightarrowProd). - При обнаружении записей с пустыми или устаревшими
s_hash_id.
Базовый запуск:
# Тестовая проверка нестыковок (без записи в БД)
poetry run python hypn0/manage.py rehash --dry-run
# Боевая перегенерация
poetry run python hypn0/manage.py rehash
Параметры командной строки (CLI):
| Флаг | Тип | По умолчанию | Описание |
|---|---|---|---|
--dry-run |
flag |
False |
Только проверить нестыковки без изменения базы данных |
--batch-size |
int |
500 |
Размер пачки для bulk_update (оптимизация памяти и скорости) |
3. Планируемые команды (Roadmap)
cleanup_storage— Удаление старых и низкорейтинговых картин (Smart Retention) при превышении квоты хранилища (использует рассчитанныйf_score).cleanup_reports— Автоматическая изоляция или удаление картин со статусомSHAMEDпосле истечения тайм-аута модерации.