217 lines
38 KiB
Markdown
217 lines
38 KiB
Markdown
# Журнал прогресса
|
||
|
||
## 2026-07-04 — Старт проекта (MVP-сессия)
|
||
|
||
- Прочитан стартовый бриф `START_PROMT.MD` (37 пунктов идей).
|
||
- Осмотрена кодовая база `/home/ubuntu/projects/vojo/apps/ai-bot`: Go-сервис с адаптерами LLM-провайдеров (gemini, xai, local), роутером, каскадом, фейловером, прайсингом и телеметрией — кандидат на переиспользование.
|
||
- Запущен мультиагентный исследовательский воркфлоу (10 направлений параллельно + критик полноты + добор пробелов):
|
||
1. Рынок и спрос → `research/01-market.md`
|
||
2. Конкуренты и существующие решения → `research/02-competitors.md`
|
||
3. Научные работы по agentic/document-level MT → `research/03-academic-agentic-mt.md`
|
||
4. LLM API: цены/качество/цензура → `research/04-api-providers.md`
|
||
5. Память и глоссарий (банк памяти книги) → `research/05-memory-glossary.md`
|
||
6. Локальные модели на 8GB VRAM → `research/06-local-models.md`
|
||
7. Методология профессионального худ. перевода → `research/07-translation-methodology.md`
|
||
8. Юридические аспекты → `research/08-legal.md`
|
||
9. Модель стоимости перевода книги → `research/09-cost-model.md`
|
||
10. Ревью vojo/ai-bot на переиспользование → `research/10-vojo-ai-bot-review.md`
|
||
- Добор пробелов от критика → `research/11-gap-*.md`
|
||
|
||
### Исследования завершены (04.07, ~2 млн токенов, 16 агентов)
|
||
Все 15 документов в `research/`. Ключевые развязки:
|
||
- Статья «про судью-селектора, март 2026» найдена: arXiv:2603.20324 «When Agents Disagree» — но перевода среди её задач нет; на zh→ru/ja→ru нужен собственный пилот (см. `research/11-gap-3.md`).
|
||
- MemPalace существует, но форкать нельзя (метрики не подтверждаются) — банк памяти пишем сами: SQLite + спека SillyTavern World Info + память DelTA.
|
||
- «Ru-нишу никто не обслуживает» — опровергнуто: Rulate AI-раздел 14,4 тыс. работ, MLate, VseGPT «Нейропереводчик» 999 ₽/мес. Дифференциация — издательское качество, память серии, 18+.
|
||
- Экономика сходится: COGS тома ранобэ ~$2–4 при марже 70–96%; главные рычаги — prompt caching (до −98% input) и Batch API (−50%).
|
||
- OpenAI adult mode заморожен бессрочно — NSFW-канал: Grok / open-weights / DeepSeek / локальная abliterated. Anthropic — только «стерильные» роли.
|
||
- RU-сегмент: BYOK-модель (агрегаторы ProxyAPI/VseGPT/AITunnel или прямой DeepSeek), не перепродавать западные токены.
|
||
|
||
### Синтез (04.07)
|
||
- `architecture/01-decisions.md` — 10 решений (Р1 Go-бэкенд на базе vojo/ai-bot; Р2 конфигурируемое ядро пайплайна + пилот 4 рук; Р3 банк памяти на SQLite; Р4 модельный стек и NSFW-роутинг; Р5 экономика вызовов; Р6 durable jobs; Р7 телеметрия/качество; Р8 юр-позиция «инструмент, не платформа»; Р9 прайсинг-гипотеза; Р10 риски).
|
||
- `architecture/02-mvp-plan.md` — фазы 0–3 с критериями приёмки.
|
||
- `architecture/components.puml` + `pipeline.puml` (+ отрендеренные .svg) — провалидированы PlantUML.
|
||
- `PARALLEL_SESSION_PROMPT.md` — промт для второй сессии («Полигон»: токен-замеры, refusal-бенчмарк, локальный стенд, пилотный корпус, эмбеддинги).
|
||
- Проведено адверсариальное ревью синтеза тремя критиками (техархитектура, экономика, red-team): 2 critical + ~15 major находок, все внесены в v2 документов. Главные исправления:
|
||
- экономика разделена на контуры «чей ключ» (прямые ключи / ru-агрегаторы ×2–6 на флагманы / BYOK) — премиум-микс с Sonnet в ru-контуре недоступен;
|
||
- разрешён конфликт «кэшируемый префикс vs селективный глоссарий» (зафиксирована раскладка промпта) и «modernc.org/sqlite vs sqlite-vec» (в MVP — brute-force KNN, без C-расширений);
|
||
- Фаза 1 получила интерим-правило 18+ (SFW-приёмка, исключение Anthropic при 18+ в brief) — до этого 18+ книги шли бы через Anthropic до появления NSFW-роутера;
|
||
- resume пересобран на чанк-чекпоинты (kill -9 теряет максимум один вызов);
|
||
- пилот вынесен в отдельную Фазу 2.5, горизонт MVP честно сдвинут до 10–11 недель;
|
||
- baseline метрики качества заменён с «сырой DeepSeek» на «DeepSeek+глоссарий» (уровень VseGPT), порог — статистический;
|
||
- в план добавлены режим онгоинга и series-bible-lite (сегмент «ИИ-фабрик» и проверка рода/ты-вы).
|
||
|
||
### Следующие шаги
|
||
- [ ] Фаза 0–1 бэкенда — **передана отдельной сессии «Бэкенд»** (промт: `BACKEND_SESSION_PROMPT.md`; шаг 0 — перевалидация решений, финал фаз — агентное селфревью). Оркестратор делает внешнее ревью её кода.
|
||
- [x] Параллельная сессия «Полигон» запущена (эксперименты 01–03 идут).
|
||
- [ ] Сессия «Редакция» (промпты ролей) — после фиксации формата конфига в Фазе 0.
|
||
- [ ] Пилот 4 рук для выбора ядра пайплайна (Фаза 2.5).
|
||
- Роли сессий: «Бэкенд» → `backend/`; «Полигон» → `eval/` + `docs/experiments/`; оркестратор → доки, ревью, синхронизация, дозаправки ресёрча.
|
||
- [x] **Дозаправка ресёрча выполнена (04.07, оркестратор)**: 5 документов `research/12-*.md` (~70 режимов отказа: ja, zh, ru-сторона; отзывы потребителей по продуктам; академические таксономии DITING/BlonDe/LitEval/LAIT) + верификация (3 minor: неточная ссылка поправлена; 2 пробела — числительные/меры CJK и западные имена через катакану — включены в карту как дыры с действиями). Итоговая карта «проблема → механизм бэкенда» → `architecture/04-unhappy-paths.md`; в ней раздел «Следствия для плана» — 7 изменений (пре-пасс Annotator в Фазе 2, расширение схемы глоссария, 4 новых дешёвых гейта Фазы 1, судья-анкета с MQM-весами, alignment-защита рефренов, эскалация по цене правки, регрессионный сьют из примеров).
|
||
|
||
## Бэкенд
|
||
|
||
### 2026-07-04 — Сессия 1: шаг 0 (перевалидация) завершён
|
||
|
||
- Донорский код vojo сверен построчно + воркфлоу из 4 критиков (консистентность, Go-исполнимость, донор, онлайн-фактчек цен). Вердикт: **архитектура v2 исполнима, кодить можно**; блокеров нет. Полный вердикт и контракты Фазы 0 → [architecture/03-implementation-notes.md](architecture/03-implementation-notes.md).
|
||
- Главные находки валидации (упущения передачи): в `Usage` донора нет cache-write Anthropic (×1.25/×2 — тот же класс ошибки, что недоучёт reasoning 30–44%); в транспорте донора скрытый захардкоженный per-attempt таймаут 60 с (полигон видел только 45 с ноги failover); `http.Client{}` донора уйдёт в webshare-прокси на не-loopback локальных адресах (172.x); **Grok 4.1 Fast retired 15.05.2026** — слаги молча редиректят на grok-4.3 с ценой ×9, таблица Р4 устарела; store.go на SQLite — переписывание по семантике, не «адаптация <20%».
|
||
- Окружение: git-репо инициализирован, Go 1.26.4 установлен (~/sdk/go, PATH в .bashrc).
|
||
|
||
**[НУЖНО РЕШЕНИЕ]** (детали в 03-implementation-notes §5):
|
||
1. Формула премиум-бюджета Р5 «≤2×» после токен-калибровки неоднозначна — реализую конфигурируемый $-потолок, формулу уточнить.
|
||
2. Политика инвалидации TM сверх brief_hash (prompt_version в ключе? модель? перечанкование?) — реализую консервативный вариант, нужно подтверждение.
|
||
3. Канал B остался без дешёвого Grok (4.1 Fast retired, grok-4.3 дороже ×9) — перевыбрать модель канала B к Фазе 2.
|
||
4. Стриминг: эмпирика полигона требует его как keep-alive транспорта (не SSE-фронт) — предлагаю перенести из Фазы 3 в Фазу 1–2; в Фазе 0 закрываю длинными таймаутами.
|
||
5. Оркестратору, не блокирует: цифры Р5 устарели ~2× против эксп. 01; задача «cache-hit агрегаторов» задвоена (Фаза 0 бэкенда ↔ бэклог полигона — предлагаю отдать полигону); мелкие фазовые пометки в диаграммах.
|
||
|
||
Вопросы владельцу: ключи провайдеров для `backend/.env` (DeepSeek минимум — на нём приёмка Фазы 0 с реальным вызовом; Anthropic — для проверки cache_control). Не блокируюсь: тесты на httptest-моках.
|
||
|
||
> **Ответ оркестратора на [НУЖНО РЕШЕНИЕ] (04.07).** Отличный шаг 0 — фактчек Grok и cache-write Anthropic особенно ценны. Решения:
|
||
> 1. **Премиум-бюджет**: подтверждаю $-потолок; формула зафиксирована в Р5 (`clamp(price_target × (1 − target_margin) − est_base_cogs, 0, hard_cap)`, дефолты $5/том, $30/вебновелла-500). «≤2×» — только прикидочная эвристика доков.
|
||
> 2. **TM-инвалидация**: консервативный ключ подтверждён и зафиксирован в Р6: `(chunk_src_hash, lang_pair, model_id, prompt_version, brief_hash, context_snapshot_hash)`; перечанкование инвалидирует by design.
|
||
> 3. **Канал B**: Р4 обновлён — интерим до Фазы 2: DeepSeek офиц. + локальная abliterated; Grok 4.3 только как дорогая эскалация; перевыбор дешёвого пермиссивного тира — по результатам refusal-бенчмарка полигона.
|
||
> 4. **Стриминг**: перенос одобрен — транспортный keep-alive-стриминг в Фазу 1–2 (без SSE-фронта), зафиксировано в плане; в Фазе 0 — длинные per-роль таймауты.
|
||
> 5. **Р5 обновлён** сноской на токен-калибровку (×1.4–1.75 для zh→ru); задача «cache-hit агрегаторов» снята с Фазы 0 — она в бэклоге полигона.
|
||
> **Новая вводная**: готова карта режимов отказа [architecture/04-unhappy-paths.md](architecture/04-unhappy-paths.md) (~70 режимов → механизмы). Перед фиксацией схемы store/глоссария Фазы 1 прочитай раздел «Следствия для плана»: расширение полей глоссария (alias-граф, ranked-set, gender=hidden, first_person, translit_policy), ruby-парсер в спеку импорта, дешёвые детерминированные гейты Фазы 1 (линтер прямой речи, блок-лист транслит-междометий, ёфикатор, число-гейт 万/億), словарь тегов ошибок с MQM-весами в request_log с первого дня. Пороги coverage-гейта уже сняты полигоном (см. его секцию, эксперимент 02).
|
||
|
||
### 2026-07-04 — Сессия 2: Фаза 0 (каркас) ЗАВЕРШЕНА
|
||
|
||
Каркас `backend/` собран, приёмка Фазы 0 продемонстрирована **исполняемо**: `tmctl translate --config book.yaml`
|
||
гоняет чанк draft→edit с полным учётом $ по стадиям в request_log; повторный запуск обслуживается из
|
||
чекпоинтов за $0 (ledger неизменен); `kill -9`-тест настоящим SIGKILL подтверждает инвариант
|
||
`committed == SUM(checkpoints)` (деньги ≡ чекпоинты). `go test ./...`, `go vet`, `-race` — зелёные.
|
||
|
||
- **Порт vojo → internal/llm|ledger|obs**: нейтральные типы (+`CacheCreationTokens`, `CacheBoundary`,
|
||
`FinishReason`); общий OpenAI-совместимый транспорт (таймауты-параметры per-провайдер, Retry-After с капом,
|
||
overflow-safe backoff, LimitReader, оба варианта cache-полей DeepSeek); **нативный Anthropic-адаптер**
|
||
(Messages API, `cache_control`, суммирование usage-инварианта, sampling не шлётся); local-адаптер с no-proxy
|
||
транспортом (грабли стенда 172.x); failover с анти-flapping брейкером; ledger с cache-write и `PriceForResponse`.
|
||
- **internal/store (SQLite, modernc, CGO-free)**: идемпотентные миграции; reserve/settle с потолками книга/день;
|
||
**settle+checkpoint одной транзакцией** (закрыта дыра двойной оплаты); flock-владение проектным файлом;
|
||
recovery зависших резервов; request_log.
|
||
- **internal/config (fail-fast)**: models.yaml (цены с датой проверки, `CheckKeys` preflight), pipeline C1+C2
|
||
(граница «конфиг vs код» Р2, `CheckRunnable` guard на механику Фазы 2), book.yaml + brief_hash.
|
||
- **internal/pipeline**: детерминированный однопроходный рендер (инвариант §3.1), request-hash (length-prefix,
|
||
attempt-измерение), snapshot-pinning с `--resnapshot`, нормализация источника (BOM/CRLF/NFC), мини-раннер
|
||
draft→edit с resume; cmd/tmctl (translate/report); черновики промптов ролей.
|
||
- **Финал — агентное селфревью**: `/code-review` (8 линз) + воркфлоу-критики (4 линзы задания) с адверсариальной
|
||
верификацией; подтверждённые находки исправлены двумя волнами (детали и остаточный техдолг —
|
||
[03-implementation-notes §6](architecture/03-implementation-notes.md)). Коммиты: `dc6ea8e` каркас →
|
||
`a32ec2e` волна 1 → волна 2.
|
||
|
||
Учтено из ответа оркестратора: ключ TM `(chunk_src_hash, lang_pair, model_id, prompt_version, brief_hash,
|
||
context_snapshot_hash)` — совпадает с составом моего snapshot-payload (prompt_version+model+PromptSHA256 per-role,
|
||
brief_hash, chunker/estimator version); перечанкование инвалидирует by design (chunkerVersion в snapshot).
|
||
Карту 04-unhappy-paths заберу в схему store/глоссария при старте Фазы 1.
|
||
|
||
**Остаток техдолга Фазы 0** (осознанные ограничения, не блокеры; детали §6): дневной потолок пер-книжный;
|
||
timeout-путь «оплачено-но-потеряно» (≤1 вызов, укладывается в Р6); cache_ttl↔cache_write под один TTL (5m);
|
||
гонка `Runner.clients` (безопасна при последовательном проходе, мьютекс — к fan-out Фазы 1–2).
|
||
|
||
**Ключи: бэкенд заводится на ДВУХ ключах** (`DEEPSEEK_API_KEY` + `ZAI_API_KEY`) — по замечанию владельца сузил
|
||
`CheckKeys`: модели стадий проверяются всегда, модели эскалационных цепочек — только если включён хоть один гейт
|
||
(эскалация запускается по провалу гейта; в Фазе 0 гейты off → цепочки недостижимы → ключи Anthropic/Kimi не
|
||
нужны). Проверено на боевых конфигах: с 2 ключами прогон доходит до сетевого вызова DeepSeek. `.env.example`
|
||
размечен «нужны сейчас / Фаза 1+ опционально». Anthropic/Kimi для Фазы 0 не требуются.
|
||
|
||
### Вопросы от бэкенда — сессии «Полигон» и оркестратору (04.07)
|
||
|
||
Владелец резонно заметил: бэкенд не должен коммититься в модели, которых полигон не гонял. Прежде чем в Фазе 1
|
||
включать эскалацию и фиксировать редактора-дефолт, нужны замеры:
|
||
|
||
1. **Полигону — Anthropic на «стерильном» канале (SFW).** Sonnet 5 как SFW-эскалация/судья **не валидирован**:
|
||
в refusal-бенчмарке Anthropic исключён намеренно (гигиена NSFW-аккаунта, gap-2 §3), но сам эксп. 02 отметил
|
||
«уровень L0–L1 можно добавить отдельным конфигом для проверки стерильного канала». Можно ли прогнать
|
||
Sonnet-5 (промо $2/$10) на чистых SFW-фрагментах — качество ru-редактуры/суждения — чтобы знать, окупает ли
|
||
он цену как эскалация? Если не приоритет — бэкенд держит Anthropic **вне** дефолтной цепочки и берёт
|
||
валидированную дешёвую модель.
|
||
2. **Полигону — качество редактора ru-стиля.** Эксп. 02 мерил роль ЧЕРНОВИКА (отказы/вырезания), но не роль
|
||
РЕДАКТОРА. Дефолт C1 — GLM-5 на редактуре — стоит на утверждении Р4, без замера. Планируется ли маленькое
|
||
сравнение GLM-5 vs Kimi-K2.6 (vs Sonnet-5, если будет ключ) по ru-редактуре на нескольких SFW-фрагментах?
|
||
От этого зависит дефолт редактора Фазы 1.
|
||
3. **Оркестратору — эскалационный дефолт в RU-контуре.** Оставить Anthropic Sonnet дефолтом эскалации или в
|
||
RU-контуре взять GLM-5.1/Gemini (Sonnet — только прямой контур, где per-book-премиум оправдан)? Это правка
|
||
Р4/экономики; бэкенд — только исполнитель конфига.
|
||
4. **Оркестратору — per-role provider-fallback?** Для batch-джобы (не live-бот) провайдер-недоступность
|
||
естественно закрывается durable jobs + чекпоинтами (лёг → пауза → resume без переоплаты), поэтому
|
||
мгновенный fallback на другого провайдера — nice-to-have, не блокер. Добавлять ли простой список фоллбеков
|
||
на роль (`draft: [deepseek, glm]`) для длинных ночных прогонов, или полагаться на pause/resume? Решение — за
|
||
оркестратором (владеет Р4/экономикой).
|
||
|
||
Не блокирует Фазу 0 (принята на DeepSeek+Z.ai); ответы нужны к старту Фазы 1 (эскалация, дефолты ролей).
|
||
|
||
### Внешнее ревью Фазы 0 — принято (04.07)
|
||
|
||
Независимая сессия провела построчное ревью `backend/` + исполняемую приёмку + адверсариальный воркфлоу.
|
||
**Вердикт: Фаза 0 принята, блокеров ноль.** Детали и диспозиция находок — [03-implementation-notes §6](architecture/03-implementation-notes.md).
|
||
Кратко: F1 (CheckKeys) уже был закрыт до ревью; F2/F5/F7/F8 исправлены этой волной (local-оверрайды в snapshot;
|
||
fail-loud на включённый гейт в Фазе 0; поправка §3.4 под подтверждённый ключ TM; `*.db.lock` в .gitignore);
|
||
F3/F4/F6 — в техдолг (F3: граница timeout-недоучёта уточнена — до `MaxAttempts−1`, не «≤1»; честный фикс —
|
||
idempotency-ключ, отложено). Дизайн-вопросы к владельцу/оркестратору D1–D3 (монолингвальный редактор Фазы 1;
|
||
per-chunk skip+flag вместо падения; структурный запрет Anthropic в канале B при подключении failover) —
|
||
зафиксированы в §6, все Фаза 1–2.
|
||
|
||
Следующее: Фаза 1 (перевод книги целиком) — чанкер, банк памяти v1, гейты (пороги полигона готовы), режим онгоинга.
|
||
|
||
### Реальная приёмка на живых ключах — PASS (04.07, ревьюер)
|
||
|
||
Первый реальный прогон провайдеров (раньше всё было на моках — главный незакрытый пробел ревью). `tmctl translate`
|
||
на `example/book.yaml` (draft=deepseek-v4-flash → edit=glm-5, один чанк 264 симв., потолок $1.00):
|
||
- **Деньги сходятся до цента**: draft $0.000219 (453·0.14+556·0.28/1e6 ✓), edit $0.001277 (672·1.0+189·3.2/1e6 ✓);
|
||
`committed == Σстадий == $0.001496`, `reserved=0`. Порядок величин совпал с прайсингом DeepSeek/z.ai.
|
||
- **Цена по ответившей**: z.ai вернул `model=glm-5` → edit книжится по цене GLM, НЕ по дешёвому deepseek-якорю
|
||
(fallback дал бы $0.000147 — в 8.7× меньше); `PriceForResponse` подтверждён на реале.
|
||
- **Usage реальный**, не мок: `prompt/completion_tokens` ненулевые в request_log; GLM латентность штатная (5–8 с,
|
||
без ×3) → `extra_body thinking:{type:disabled}` фактически применён.
|
||
- **Resume**: второй прогон — обе стадии из чекпоинтов за **$0**, ledger неизменен (нет двойной оплаты).
|
||
- **DeepSeek автокэш на реале**: повторный прогон того же префикса в окне кэша → `cached_tokens=384/453`
|
||
(поле `prompt_cache_hit_tokens` парсится в `request_log.cached_tokens`), billed по $0.0028/M; `CostUSD`
|
||
сошёлся до 7 знаков (`(453−384)·0.14 + 384·0.0028 + 1074·0.28 = $0.0003115`). Кэш-путь подтверждён живым провайдером.
|
||
- **Пост-ревью правки провалидированы**: F1 (CheckKeys — заводится на 2 ключах), F2 (provider temp/maxtok в
|
||
snapshot), F5 (fail-loud на включённый гейт), F7 (сноска §3.4) — все на месте; Anthropic вычищен из конфигов,
|
||
висячих ссылок нет (в `BuildClient` ветка `case "anthropic"` осталась, но `kind: anthropic` в models.yaml нет).
|
||
|
||
**Новая находка реальной приёмки (исправлена):** `tmctl report` рвался с `context canceled` и печатал таблицу
|
||
частично/пусто без строки Ledger (exit 1). Причина — `Store.RequestLogRows` отдавал `*sql.Rows` с `defer cancel()`:
|
||
контекст отменялся посреди ленивой итерации у вызывающего. Данные и деньги в БД были корректны — баг только на
|
||
read-пути `report`. Фикс: строки материализуются под таймаутом и возвращаются срезом `[]RequestLogView`;
|
||
регрессионный тест `TestRequestLogRowsMaterializes`. `go test ./... -race` зелёные.
|
||
|
||
**Не покрыто реальным прогоном (честно):** (б) kill-9 посреди реального провайдерского вызова — инвариант
|
||
`committed==SUM(checkpoints)` доказан unit-тестом `kill9_test.go` (настоящий SIGKILL на SQLite), на реале не
|
||
воспроизводил (деньги/один-чанк дисциплина). (в) Anthropic cache_control/usage-сумма — Anthropic из стека убран,
|
||
проверять больше нечего на этом контуре.
|
||
|
||
## Полигон
|
||
(секция параллельной сессии — записи добавлять сюда)
|
||
|
||
> **Сообщение от основной сессии (04.07, после ревью твоих экспериментов 01–02).** Работа принята, качество высокое. Важные вводные:
|
||
> 1. **Архитектурные доки обновлены до v2** (~05:08, после адверсариального ревью) — если читал их до этого, перечитай `architecture/01-decisions.md`: экономика теперь разделена по контурам «чей ключ» (Р5), премиум-микс с Sonnet в ru-контуре недоступен, batch — только для батчуемых стадий. Твой пересчёт COGS из эксперимента 01 отлично ложится в контур «прямые ключи»; при случае добавь строку-оговорку про ru-агрегаторский контур (×2–6 на флагманы).
|
||
> 2. Твои **коридоры len_ratio из эксперимента 01 — прямой вход в coverage-гейт v1** бэкенда (Р7/план Фазы 1). Когда сузишь их по факту прогонов — зафиксируй в experiments-доке итоговые пороги отдельной таблицей, я заберу их в конфиг гейта.
|
||
> 3. **GTX 1070 ≠ допущения research/06** (там RTX 3060/4060, 40–53 tok/s; по vojo-референсу у 1070 ~28 tok/s на 8B). В эксперименте про локальный стенд явно проверь: (а) реальные tok/s качественного кандидата 30b-a3b MoE при лимите WSL RAM ~19GB (модель 18GB — впритык, возможен свопинг; вариант — llama.cpp `--n-cpu-moe` вместо ollama), (б) достаточность 8B-abliterated для ролей «скрининг + 18+ перевод». Если 30b не влезает — это меняет рекомендацию Р4 по локальному стеку, пометь как «Расхождение».
|
||
> 4. Опциональная задача в бэклог (из Р5/Р10 риск №6, понадобятся ключи владельца): **эмпирическая проверка, пробрасывают ли ru-агрегаторы (ProxyAPI/VseGPT/AITunnel) cache-hit тарифы DeepSeek** — два одинаковых запроса подряд, сравнить usage/стоимость. Это разблокирует экономику ru-контура.
|
||
> 5. Договорённость по журналу: фиксируй здесь краткие итоги каждого эксперимента (1–2 строки + ссылка на док) — основная сессия читает эту секцию, а не всю папку experiments.
|
||
|
||
### 2026-07-04 — Сессия 1 полигона (ответ на вводные выше — приняты)
|
||
|
||
Инфраструктура: `eval/` (venv, токенизаторы DeepSeek V3.2/Qwen3/Qwen2.5/GLM-4.6 + tiktoken), PD-корпус 16 текстов zh/ja/en/ru с 3 параллельными парами. Ключи — `eval/.env` (gitignored, закрыт deny-правилом; скрипты читают сами; шаблон на 7 провайдеров создан, ждёт заполнения владельцем).
|
||
|
||
- **Эксперимент 01 (задача 1) — завершён** → [experiments/01-token-calibration.md](experiments/01-token-calibration.md). Два расхождения с research/09 >15%: иероглиф = 0.86–0.93 ток. (in-family) против 0.65–0.75; «выход≈вход±20%» сломано — zh→ru **1.88×B** (en→ru 1.53, ja→ru 1.29). COGS (контур прямых ключей): стандарт-вебновелла DeepSeek $1.85→$2.57, премиум-микс ≈$28→**≈$49** ($26 batch); ранобэ ja→ru подешевел ($3.9→$3.1). Оговорка про ru-агрегаторский контур добавлена (п.1 вводных учтён).
|
||
- **Эксперимент 02 (задача 2) — первый прогон выполнен** (ключи получены ~06:10) → [experiments/02-refusal-benchmark.md](experiments/02-refusal-benchmark.md). 6 провайдеров × 11 фрагментов (SFW/L1/L2-violence): **66/66 ok — ноль отказов и вырезаний**, контроль ложных срабатываний пройден; содержательная 18+ часть ждёт explicit-фрагментов владельца. **Пороги len_ratio для coverage-гейта готовы** (п.2 вводных): zh→ru <2.2, ja→ru <1.4, en→ru <0.70, sent_cov <0.75 — таблица в 02, забирайте в конфиг v1. Побочные находки для продакшн-конфига провайдеров: thinking GLM-4.6 (таймауты ×3) и Gemini (молча обрезал перевод — детектор поймал) отключать для роли переводчика; gpt-5-mini — reasoning minimal; safety_settings Gemini через OpenAI-слой не передаются (судье нужен нативный API).
|
||
- **Эксперимент 03 (задача 3) — первый замер + эталон** → [experiments/03-local-stand.md](experiments/03-local-stand.md). По п.3 вводных: (а) 30b-a3b в WSL **влезает** (mmap, без OOM), но на ollama даёт лишь **10 tok/s** — «Расхождение» с research/06 (25–30 обещаны через llama.cpp `--n-cpu-moe`; ставится в фоне — перемерить; Р4 менять пока не надо: рекомендация там и так llama-server); частично виноват и лимит WSL RAM 20GB — поднят до 26GB (`.wslconfig`, вступит после рестарта WSL); (б) 8b @ 27 tok/s (6.6GB VRAM) — на роли скрининга/экстракции годен. **Эталон DeepSeek снят: разрыв качественный** — API даёт корректные реалии («ворота Расёмон на улице Судзаку», «Новогоднее жертвоприношение») за ~$0.0005/фрагмент там, где обе локалки галлюцинируют («Рождественская дверь», «петухи»); NSFW-фрагменты ещё не гонялись. Для бэкенда: лег-таймаут vojo 45 с несовместим с чанками (63–278 с) — нужен свой профиль + стриминг. План расширения пула: ваниль qwen3:8b (цена абляции) → Qwen3.5-9B → RuadaptQwen3 (докачиваются в фоне).
|
||
- Бэклог принят: проверка проброса cache-hit агрегаторами (п.4, нужны ключи) — в шагах ниже. Задачи 4–5 не начаты (bge-m3 уже на стенде).
|
||
|
||
### 2026-07-04 — Сессия 2 полигона (после рестарта WSL с RAM 26GB)
|
||
|
||
- **llama.cpp `--n-cpu-moe` для 30b-a3b — перемерено, «Расхождение» с research/06 подтверждено**: потолок генерации на GTX 1070 **~13.5 tok/s** (не 25–30). Таблица конфигов в [03](experiments/03-local-stand.md): ollama 10 → llama.cpp `--cpu-moe` 11.2 → `--n-cpu-moe 33` 13.5 (VRAM 2.9→7.8GB, prefill 105→208). Узкое место — пропускная способность CPU-RAM (DDR4/Pascal), не рантайм; llama.cpp честно лучше ollama (+35% ген., ×2–3 prefill), но 30b-a3b на этом железе — только фоновые роли (~2.5 мин/главу). Скрипт: `eval/llama_moe_bench.sh`.
|
||
- **Замер 4 новых dense-моделей** (ваниль qwen3:8b / qwen3.5:9b / +abliterated / ruadapt) — готово, таблица в [03](experiments/03-local-stand.md). Три вывода: (1) **абляция бесплатна** — qwen3.5 vanilla vs abliterated идентичны по скорости и SFW-качеству → 18+-роль можно на abliterated без штрафа; (2) поколение 3.5>3 умеренно (лучше понимание, −25% токенов, −10% скорости); (3) **RuAdapt: токен-выигрыш подтверждён (−40% ru-токенов), но перевод развалился** (羅生門→«дерево с колокольчиками») → редактор ru-стиля, не переводчик (как и предупреждал research/06). Разрыв с API держится у всех. **Побочная находка для бэкенда:** thinking у Qwen3.5+/GLM/Gemini для роли переводчика обязателен к отключению (иначе пустой/обрезанный вывод — ловилось дважды: эксп. 02 и здесь).
|
||
- **Think-режим (проверка гипотезы владельца «reasoning поднимет качество в разы»)** — [03](experiments/03-local-stand.md), раздел «Влияние thinking». Итог: (а) прежняя «пустота» — артефакт тесного контекста (рассуждения не влезали с ответом), не зависание; (б) с ctx 16k think **завершается и реально чинит реалии** (羅生門: «Радзёмон»→«Рашо-мон»; 朱雀 с китайского чтения на японское) — гипотеза частично подтвердилась; (в) но локально нежизнеспособен: 8,6 мин и ~11k токенов рассуждений на 1400 знаков (вебновелла ≈ 200 ч). **Новый пункт бэклога → оркестратору/бэкенду: проверить think-ON vs OFF по КАЧЕСТВУ на быстром облачном черновике/редакторе (DeepSeek/GLM)** — потенциальный дешёвый рычаг качества, раз reasoning вытаскивает реалии.
|
||
|
||
### Следующие шаги полигона
|
||
- [x] Прогон refusal-бенчмарка (SFW/L1/L2-violence часть) — 66/66 ok, пороги в 02; explicit-часть ждёт фрагментов владельца.
|
||
- [x] Эталон DeepSeek для сравнения черновиков — в 03.
|
||
- [x] llama.cpp `--n-cpu-moe` для 30b-a3b — перемерено (потолок 13.5 tok/s, см. выше).
|
||
- [ ] Прогон Qwen Model Studio (`data_inspection_failed`) и OpenRouter — при появлении ключей.
|
||
- [ ] Проверка ru-агрегаторов: проброс cache-hit DeepSeek (два одинаковых запроса, сравнить usage) — разблокирует экономику ru-контура.
|
||
- [ ] Довалидация калибровки на 3–5 главах реальных вебновелл (файлы владельца → `eval/data/samples/` + manifest).
|
||
- [ ] Задача 4: протокол BWS + панель LLM-судей (LAIT/JP-TL-Bench), харнесс `eval/pilot/`.
|
||
- [ ] Задача 5: bge-m3 vs Qwen3-Embedding-0.6B vs LaBSE на retrieval глоссария (bge-m3 скачан).
|