feat(generator): добавлена модель связанного визита

- Зачем:
  - генератор должен создавать учебно полезный визит с общим click_id, правдоподобным путём и честным тиковым бюджетом событий.
- Что:
  - добавлена марковская цепочка страниц, запланированные метки времени и потолок GEN_MAX_SESSION_EVENTS.
  - добавлен набор тикового батча из нескольких визитов до рассчитанного бюджета событий.
  - обновлены тесты, README, KNOWN_ISSUES и статусы задач 01/02.
- Проверка:
  - uv run --with pytest --with-requirements generator/requirements.txt pytest generator/tests -q
This commit is contained in:
Dmitry Dementiev
2026-06-11 12:52:48 +03:00
parent d38124263a
commit 32f4fee41c
7 changed files with 354 additions and 47 deletions
+17 -9
View File
@@ -5,6 +5,13 @@
> Витрины и Superset-дашборд строятся на **статическом сиде** (`data/*.jsonl`).
> Причина — ниже. Это не «сырой код по мелочи», а концептуальный дефект
> генеративной модели, который надо осознанно чинить перед использованием.
>
> **Обновление (2026-06-11):** первый срез модели визита реализован в
> `generate_batch()`: один публичный вызов строит один `click_id` с несколькими
> событиями, марковским путём по страницам и запланированными строго растущими
> метками времени. Остальные пункты ниже остаются полезным историческим
> контекстом и списком следующих шагов: популяция возвращающихся пользователей,
> межсессионные паузы и полноценное состояние активных визитов ещё не закрыты.
Заметка написана при дизайне Superset-дашборда (ветка
`docs/advanced-clickstream-course`): разбирались, почему на дашборде
@@ -16,12 +23,13 @@
- **Модель интенсивности потока (сколько событий и когда) — нормальная.**
Poisson по тикам + дневной коэффициент + jitter. Её можно оставить.
- **Генеративная модель сущностей (кто, какая сессия, какое событие) — неверная.**
На каждое событие штампуется свежий `click_id`, а атрибуты копируются из
случайной сид-строки. Это уничтожает понятие визита/сессии.
- **Вывод:** прежде чем использовать генератор как источник, переделать именно
модель сущностей (иерархия пользователь → сессия → событие). Математику
интенсивности трогать не обязательно.
- **Генеративная модель сущностей исправляется по шагам.** Срез одного визита
уже не штампует свежий `click_id` на каждое событие, но полная иерархия
пользователь → несколько визитов → события ещё требует популяции
возвращающихся пользователей.
- **Вывод:** прежде чем использовать генератор как полноценный источник,
доделать оставшиеся уровни модели сущностей. Математику интенсивности
трогать не обязательно.
## Доменная модель (как задумано в DDL)
@@ -50,10 +58,10 @@ user_domain_id (постоянный пользователь, cookie)
Это адекватная модель *интенсивности во времени*. Претензий к ней нет.
## Корневой дефект: модель сущностей в `generate_batch()`
## Исторический корневой дефект: модель сущностей в `generate_batch()`
Файл `generator/generator.py`, `generate_batch()` (стр. ~262–330). На каждое
событие в батче:
До среза от 2026-06-11 файл `generator/generator.py`, `generate_batch()` на
каждое событие в батче делал примерно следующее:
```python
base_browser = self.rng.choice(self.dictionary.browser_events) # случайная сид-строка