Compare commits
10 commits
47996f4c71
...
174192b1eb
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
174192b1eb | ||
|
|
dc5cf3bb9d | ||
|
|
353bb52676 | ||
|
|
ee259bd4d0 | ||
|
|
bf24d64e53 | ||
|
|
38736b27b5 | ||
|
|
2606714eb0 | ||
|
|
c14e11dd9d | ||
|
|
3c113d72ce | ||
|
|
b49ce2b36a |
22 changed files with 2222 additions and 25 deletions
|
|
@ -14,7 +14,7 @@ Go-бэкенд издательского художественного пер
|
|||
|
||||
## Источники истины (по убыванию)
|
||||
|
||||
1. **`docs/architecture/05-decisions-log.md` (D1–D31)** — ратифицированный контракт; при конфликте с любым другим доком побеждает он; сверху файла — карта актуальности (что чем superseded).
|
||||
1. **`docs/architecture/05-decisions-log.md` (D1–D35)** — ратифицированный контракт; при конфликте с любым другим доком побеждает он; сверху файла — карта актуальности (что чем superseded).
|
||||
2. `docs/architecture/07-strategic-review.md` — стратегический аудит 09.07 (вердикт, риски, курс-коррекции).
|
||||
3. `docs/experiments/00-provider-quirks.md` — wire-квирки провайдеров (читать ПЕРЕД правкой адаптеров/вызовами провайдеров).
|
||||
4. `docs/architecture/01-decisions.md` (Р1–Р10), `02-mvp-plan.md` (фазы v3), `04-unhappy-paths.md`, `06-memory-risk-registry.md`.
|
||||
|
|
@ -37,6 +37,6 @@ Go-бэкенд издательского художественного пер
|
|||
2. `docs/architecture/05-decisions-log.md` целиком (контракт).
|
||||
3. По роли: Бэкенд — `backend/README.md` + `03-implementation-notes.md`; Полигон — `eval/README.md` + `experiments/00` + `09-pilot-protocol.md`; всем — `07-strategic-review.md` §6–9 (вердикт/риски/курс).
|
||||
|
||||
## Текущее состояние (2026-07-12, пост-ревизия D31)
|
||||
## Текущее состояние (2026-07-12, пост-пивот D35)
|
||||
|
||||
Фаза 0 ✅; **Ф1-машинерия ✅** (пакеты №1–5, D20–D28; golden-гард = инвариант №8); **приёмка этап A ✅ (D24), этап B заморожен (D26)**. **Качество-первым:** exp12-диагностика принята (D30) — «нечитаемо» = пассивный МОНО-редактор + кривой сид + построчная вёрстка от промптов + нет санитайзера; дефекты смысла — в черновике. **Ратифицировано D30: редактор БИЛИНГВ (флип D1, supersede D17), reflow-вёрстка, output-санитайзер, глоссарий v2 (спорные термины — под подпись владельца), exp13 бейк-офф переводчиков.** **Очередь: бэкенд-пакет D15.2 (`BACKEND_D152_SESSION_PROMPT.md`) ∥ полигон exp13 (`POLYGON_EXP13_SESSION_PROMPT.md`) → единый resnapshot → пере-прогон 25 глав кандидатом (re-gate верности обязателен) → чтение владельца → этап B.** Трек: дешёвые модели сейчас, фронтир потом (конфиг-первая архитектура — D30.7). Ключ xAI: единый, с data-sharing, off перед продом (D27). Решающая точка — пилот Ф2.5 (блокеры: билингв-якорь/аннотаторы ≥3 — D25.9-Q1, корпус, проба судьи-дублёра — D22.6). Книга на стенде `/home/ubuntu/books/gu-zhenren/` (GB18030; текст и ВСЕ производные ВНЕ git). Ключи: DEEPSEEK, ZAI, KIMI, OPENAI, GEMINI, XAI, MISTRAL. Стенд: WSL2, GTX 1070 8GB (прокси-грабли: localhost из-под прокси даёт 403 — no-proxy транспорт для local).
|
||||
Фаза 0 ✅; **Ф1-инфра ✅** (D20–D28; golden = инвариант №8); приёмка этап A ✅ (D24). **Путь D26→D35 «качество-первым»:** флип D1 моно→БИЛИНГВ (D30, supersede D17), reflow + output-санитайзер (D30/D33), сид v2 подписан владельцем (D34), переводчик flash сохранён (exp13/D32 — pro отклонён). **Пере-прогон 25 глав связкой ВЫПОЛНЕН; вердикт владельца: «лучше (из-за сида), но крайне слабо художественно» (2 претензии: абзацы/конвенции + понимание связей).** **ПИВОТ D35:** цикл приёмочных прогонов ЗАКРЫТ (инфра ✅ / читаемость ❌ = блок на непостроенной Ф2 — НЕ провал; диагноз «Ф2-недострой + near-term промпт/нарезка-рычаги, не баг» верифицирован). Планка впредь = 2 претензии (ИНТЕРИМ пре-скрин, не пилот). **Очередь «мерить→строить»: ресёрч рычагов качества (`RESEARCHER_QUALITY_SESSION_PROMPT.md` — ГОТОВ; ждёт ревью+лендинга оркестратором: `research/18-quality-levers.md` Claude + `18-quality-levers-chatgpt.md` ChatGPT — UNCOMMITTED) → полигон-эмпирика (нарезка×промпт + диагностик-фронтир-арм + fidelity re-gate) → бэкенд под доказанный ROI.** Стратегический вопрос эмпирики: потолок в дешёвых МОДЕЛЯХ или в нашей НАРЕЗКЕ/ПРОМПТЕ. Трек: дешёвые модели сейчас, фронтир потом (D30.7). Ключ xAI: единый, data-sharing, off перед продом (D27). Решающая точка — пилот Ф2.5 (блокеры: билингв-якорь/аннотаторы ≥3 — D25.9-Q1, корпус, судья-дублёр — D22.6). Книга на стенде `/home/ubuntu/books/gu-zhenren/` (GB18030; текст и ВСЕ производные ВНЕ git). Ключи: DEEPSEEK, ZAI, KIMI, OPENAI, GEMINI, XAI, MISTRAL. Стенд: WSL2, GTX 1070 8GB (localhost из-под прокси = 403 — no-proxy транспорт для local).
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
# Промт: сессия-ОРКЕСТРАТОР TextMachine (передача роли №3, 2026-07-12, пост-D31)
|
||||
# Промт: сессия-ОРКЕСТРАТОР TextMachine (передача роли №4, 2026-07-12, пост-D35 — пивот «качество-первым»)
|
||||
|
||||
---
|
||||
|
||||
|
|
@ -8,7 +8,7 @@
|
|||
|
||||
**Зона записи:** `docs/` + корневые онбординг-доки. Чужие зоны — читать и ревьюить; коммитишь их работу ты после приёмки (сессии не коммитят). **Функции:** (1) внешнее ревью каждого пакета ДО коммита; (2) ратификация решений D-блоками; (3) хендофф-промты; (4) синхронизация доков; (5) ответы владельцу с честной калибровкой.
|
||||
|
||||
**Твоя миссия — качество-первым (D26/D30).** Машинерия Ф1 построена и приёмка этапа A пройдена, но первое чтение владельцем 25 глав дало «нечитаемо». Диагноз поставлен (exp12/D30): пассивный моно-редактор + кривой сид + построчная вёрстка от промптов + отсутствие санитайзера; дефекты смысла — в черновике. Твоя работа — довести дорожку D30.9 до читаемых 25 глав, затем этап B, затем пилот Ф2.5; переваривать входящую эмпирику, ратифицировать корректировки, выдавать задания.
|
||||
**Твоя миссия — качество-первым (D26→D35).** Ф1-инфра доказана и приёмочный цикл прогонов ЗАКРЫТ (D35: инфра ✅ / читаемость ❌ = не провал). Связка (билингв-редактор D30.1 + reflow + санитайзер + сид v2) построена и пере-прогнана; вердикт владельца — **«лучше (из-за сида), но крайне слабо художественно»** (2 претензии: абзацы/конвенции + понимание связей). Диагноз верифицирован исполнением: **НЕ баг — недострой машинерии качества Ф2 + невыжатые near-term рычаги (промпт/нарезка/глоссарий)**. Твоя работа — вести очередь **«мерить→строить»** (ресёрч рычагов → полигон-эмпирика → бэкенд только под доказанный ROI), НЕ строить Ф2 вслепую. Стратегический вопрос, который решает эмпирика: **потолок в дешёвых МОДЕЛЯХ или в нашей НАРЕЗКЕ/ПРОМПТЕ** — до ответа не объявлять дешёвый трек мёртвым и не коммититься в полный Ф2. Планка приёмки впредь = 2 претензии владельца (ИНТЕРИМ пре-скрин, НЕ вердикт пилота Ф2.5).
|
||||
|
||||
## Столпы проекта (не демонтировать без владельца)
|
||||
|
||||
|
|
@ -16,27 +16,36 @@
|
|||
2. **Детерминированный банк памяти — главная ставка.** НЕ вектора/НЕ RAG: Aho-Corasick матч → disposition → спойлер-окна → селективная инъекция → детерминированный post-check (D24.4-union; D28.1: precision/recall-трейдофф, hard-gate требует пере-замера; D24.2: alias-слепое пятно ≈99.5%). Уникальность сужена D21.7 (формула целиком, скрининг ≠ FTO).
|
||||
3. **Конфигурируемое ядро C0–C3 одного раннера; всё спорное решает человеческий пилот Ф2.5** (BWS, ≥3 аннотаторов; правила панели D13 + D25.3 prefix-анализ). exp12 — пре-скрин (N=1), не подмена пилота; арм D13.1 (моно vs билингв) — теперь подтверждающий (D30.1).
|
||||
4. **Деньги/durability первый класс:** reserve→call→settle+checkpoint одной транзакцией; `committed==SUM(checkpoints)` переживает kill -9 (доказано приёмкой D24); snapshot-дисциплина: правка wire/вердиктов = `--resnapshot` = переоплата — лечится реализацией D15.2 (идёт, пакет D30.9); **golden-гард = инвариант №8** (D23): обновление capture.golden — только при ратифицированной ТОБОЙ смене поведения.
|
||||
5. **Детерминированные гейты вместо доверия модели:** echo-гейт (НАВСЕГДА, вкл. reasoning-ON — D19.2/D22.5), excision/coverage, refusal-blacklist, стиль-флаггеры, floor `min_max_tokens` (D24.3), **output-санитайзер (D30.3 — строится)**. Философия отказов D2/D12: flagged≠failed, всегда reason, skip+flag+continue, три класса отказов.
|
||||
6. **Стек (пост-D30):** черновик — интерим deepseek-v4-flash (thinking ВСЕГДА ON — эхо-мина), **переводчика выбирает exp13** (deepseek качеством не мерен — D30.6) → **редактор БИЛИНГВАЛЬНЫЙ (D30.1, supersede D17), кандидат glm-5-билингв** (gemini — премиум-эскалация только за санитайзером: течёт преамбулой 6/6; grok reasoning-off из редакторов СНЯТ — no-op) → судья/апекс gemini-3.1-pro-preview (слаг ТОЛЬКО с `-preview`; mandatory thinking; биллинг `additive_total` — D22.3). **Канал B (18+):** Mistral-переводчик + grok-ON эскалация (⚠ НЕ на архаичном Хане — D22.5) + судьи: эротика — только Grok (Gemini fail-closed — D22.6, дублёр гейтится пробой). 7 ключей; **ключ xAI един, С data-sharing, off перед продом (D27)**.
|
||||
5. **Детерминированные гейты вместо доверия модели:** echo-гейт (НАВСЕГДА, вкл. reasoning-ON — D19.2/D22.5), excision/coverage, refusal-blacklist, стиль-флаггеры, floor `min_max_tokens` (D24.3 — валидирован в проде D35.1), **output-санитайзер (D30.3/D33.1 — залендён; ⚠ экспорт-баг D35.4a: флагнутый чанк экспортится ПУСТЫМ)**. Философия отказов D2/D12: flagged≠failed, всегда reason, skip+flag+continue, три класса отказов.
|
||||
6. **Стек (пост-D35):** черновик — **deepseek-v4-flash СОХРАНЁН** (exp13/D32 — pro отклонён по данным: сфабрикованная сходимость + катастрофа 蛊→«гусеницы» + верность у flash не хуже; переводчик — припаркованный рычаг D32.4, если виновата верность черновика); thinking ВСЕГДА ON (эхо-мина); escalate_to=deepseek-v4-pro → **редактор БИЛИНГВ glm-5 (D30.1/D33, залендён)** (gemini — премиум-эскалация только за санитайзером: течёт преамбулой 6/6; grok reasoning-off из редакторов СНЯТ — no-op) → судья/апекс gemini-3.1-pro-preview (слаг ТОЛЬКО `-preview`; mandatory thinking; `additive_total` — D22.3). **Канал B (18+):** Mistral + grok-ON эскалация (⚠ НЕ на архаичном Хане — D22.5) + судьи: эротика — только Grok (Gemini fail-closed — D22.6). 7 ключей; **ключ xAI един, С data-sharing, off перед продом (D27)**.
|
||||
7. **Эхо — центральный технический враг:** механистический аттрактор; стохастично per-fragment; на этапе A: 3.5% (концентрация в архаичном зачине гл.1), прайор книги ~25% — этап B обязан пере-мерить; флор D24.3 починил эскалационные хопы; промпт-митигации гейтятся fidelity-хвостом P4 (висит); ⚠ языковой констрейнт в system может ИНВЕРТИРОВАТЬ эхо (D21.6). Калибровка echo-гейта — задача полигона (D25.7).
|
||||
8. **18+:** уровень 3 — жёсткая линия без исключений; в ревью explicit читаешь только метаданные/счётчики; `eval/data/*corpus*` и `/home/ubuntu/books/` не открывать без прямой задачи. **L3-скрин** (D22.7 + расширения D25.4) обязателен до первой erotica-книги в проде; методика валидации без нарушения гардрейла — вопрос владельцу.
|
||||
9. **Методология:** D-лог (D1–D31, с картой актуальности сверху) = контракт; PROGRESS = журнал (закрытая хроника 04–10.07 — в `archive/PROGRESS-2026-07-04-10.md`, при онбординге НЕ читать); зоны записи жёсткие; правило двух направлений (клейм → живая проба; аномалия провайдера → вендор-дока); git-дисциплина мультисессий (стейджинг ТОЛЬКО пофайловый — `add -A` уже один раз подметал чужой WIP); коммиты en, ≤30 слов, без Co-Authored-By; эмпирика на претрейн-текстах предварительна (蛊真人 тоже в претрейне — гейт «современный вебновелл-срез ВНЕ претрейна»).
|
||||
9. **Методология:** D-лог (D1–D35, с картой актуальности сверху) = контракт; PROGRESS = журнал (закрытая хроника 04–10.07 — в `archive/PROGRESS-2026-07-04-10.md`, при онбординге НЕ читать); зоны записи жёсткие; правило двух направлений (клейм → живая проба; аномалия провайдера → вендор-дока); git-дисциплина мультисессий (стейджинг ТОЛЬКО пофайловый — `add -A` уже подметал чужой WIP; в дереве часто 2 живые сессии); коммиты en, ≤30 слов, без Co-Authored-By; эмпирика на претрейн-текстах предварительна (蛊真人 тоже в претрейне — гейт «современный вебновелл-срез ВНЕ претрейна»).
|
||||
|
||||
## Онбординг (порядок чтения, ~40 мин)
|
||||
|
||||
1. `CLAUDE.md` → `docs/README.md` → CURRENT-STATE в `docs/PROGRESS.md` (теперь короткий — читай целиком).
|
||||
2. **`docs/architecture/05-decisions-log.md`**: сначала карту актуальности в шапке, затем D24–D31 подробно, D1–D23 — по карте.
|
||||
2. **`docs/architecture/05-decisions-log.md`**: сначала карту актуальности в шапке, затем D24–D35 подробно, D1–D23 — по карте. Ключевые головы: D30 (флип D1+reflow+санитайзер+exp13), D32 (переводчик flash, pro отклонён), D33 (стейдж-А+санитайзер-фикс), D34 (сид подписан+repoint-гейт), **D35 (пивот — цикл закрыт, планка=2 претензии, мерить→строить)**.
|
||||
3. `docs/architecture/07-strategic-review.md` §6–9 с баннером (часть вердиктов развязана — баннер говорит какие).
|
||||
4. По надобности: `backend/README.md`, `eval/README.md`, `docs/archive/prompts/` (образцы жанра).
|
||||
5. Авто-память проекта — point-in-time: сверяй с доками прежде чем утверждать.
|
||||
|
||||
## Состояние на передачу (12.07, всё закоммичено)
|
||||
## Состояние на передачу (12.07 вечер, пост-D35; всё закоммичено ДО research/18)
|
||||
|
||||
**Дорожка D30.9 (текущая):** бэкенд-пакет D15.2 (`BACKEND_D152_SESSION_PROMPT.md`; этап А = билингв-промпт + reflow + санитайзер — гейтит пере-прогон, лендится отдельно и раньше; Б = v3.1 + реализация content-addressed resume; В = `tmctl export`/annotations/override — D29.1) ∥ полигон exp13 (`POLYGON_EXP13_SESSION_PROMPT.md`; бейк-офф переводчиков + финализация сида v2) → **единый resnapshot** → **пере-прогон 25 глав кандидат-конфигом** (обязателен re-gate верности: span-цитирующий судья reasoning-ON + охота на инверсии правки — D30.1) → чтение владельца → этап B (заморожен D26) → пилот Ф2.5.
|
||||
**Что уже сделано (D30→D35, залендено):** флип D1→билингв-редактор, reflow, output-санитайзер (+фикс D33.1), сид v2 подписан владельцем (D34.1); пере-прогон 25 глав связкой выполнен (инфра держится, флор D24.3 валидирован в проде); **пивот D35 ратифицирован** (цикл прогонов закрыт, планка=2 претензии, мерить→строить). exp13 закрыт (переводчик=flash, pro отклонён — D32). Этап B отменён как инструмент качества (инфра-масштаб); итерация качества — на ≤10 главах.
|
||||
|
||||
**Очередь ревью на тебе:** пакеты D15.2 (по этапам!) и exp13 — мультиагентный адверсариальный воркфлоу, всё исполнением, в scratchpad-копиях (в дереве живут чужие незакоммиченные правки). Полигон №4 (D22.8-остаток) — второй приоритет. Fix-листы бэкенду влиты в D15.2-промт; полигону — в exp13-промт + read-me правки их зон (backend/README «D1–D23»→D1–D31 и «D15.2 после правок»; eval/README exp04/exp08 каветки) — передай в их следующие пакеты.
|
||||
> **СТАТУС D36 (оркестратор №4, 12.07):** задачи **1–2 ВЫПОЛНЕНЫ** — research/18 отревьюирован и залендён (D36; оба отчёта: Claude ACCEPT_WITH_FIXES / ChatGPT ACCEPT; независимо: 57/57 источников реальны, Ван Цуй подтверждён по телу статьи, §A-хеш сверен побайтно MATCH) + промт полигон-эмпирики выдан (`POLYGON_QUALITY_EMPIRICS_SESSION_PROMPT.md`, D36). Бюджеты ключей подтверждены владельцем (OpenAI ~$9, Gemini ~€2.6, DeepSeek/ZAI/Kimi/xAI/Mistral ~$9; других нет — D36.1). Спент-промты заархивированы (D36.1). **Остаётся:** 3 (fidelity re-gate — полигон параллельно), 4 (бэкенд-фикс-лист D35.4 — в следующий бэкенд-пакет), 5 (readme чужих зон). Контракт D24→**D36**. Ниже — исходный список задач хендоффа (1–2 закрыты).
|
||||
|
||||
**Ждём от владельца:** подпись спорных терминов сида v2 (таблицу даст exp13) · флагман-сверка exp13 · DashScope-ключ (опц.) · **планка запуска** (лучше-фана/гибрид/издательский + COGS опции Б — интерим: «лучше фана» на дешёвом миксе) · билингв-якорь пилота (D25.9-Q1) · «да/нет» митигации контаминации пилотного корпуса (D27.4) · publishable/waiver при экспорте (D25.1) · FN-bound L3 при спеке (D25.4) · провенанс 12-*-доков · юр-пакет (+rights manifest).
|
||||
**⚠ ТВОИ НЕПОСРЕДСТВЕННЫЕ ЗАДАЧИ (по приоритету):**
|
||||
1. **Отревьюить + залендить research/18 — ДВА независимых отчёта, оба UNCOMMITTED, ждут тебя:** `docs/research/18-quality-levers.md` (ресёрчер Claude, анти-анкоринг протокол, §A заморожена sha256) + `docs/research/18-quality-levers-chatgpt.md` (параллельный ChatGPT, запущен владельцем). Дисциплина research/15/16/17: адверсариальная верификация несущих клеймов по ПЕРВОИСТОЧНИКАМ своим воркфлоу (его CONFIRMED ≠ твой), ревью-шапка, лендинг. ⚠ Ресёрчер заявляет «тройную сходимость» (§A ⟂ ChatGPT-§A ⟂ эмпирика команды) — **проверь оговорку D25.10: общая внешне-литературная нога у Claude и ChatGPT ≠ 3 независимых голоса** (оба тянут из той же литературы). Ключевой содержательный вклад для верификации: reflow zh→ru как ОБЯЗАТЕЛЬНАЯ дискурсная переводческая норма (Розенталь/Ван Цуй) — апгрейд research/16 «слияние дискреционно».
|
||||
2. **Написать промт полигон-эмпирики (D35.6) из §C research/18:** оси — **нарезка×промпт** (глава|чанк × сильный-дискурс|текущий — на ≤5 главах прямыми вызовами, чанк-арм воспроизводит прод-инъекцию как якорь; это ось, которую exp04/12/13 НЕ крутили) + **диагностик-фронтир-арм** (владелец согласовал: Gemini/GPT переводчик+редактор+мета-ревьюер → потолок в моделях vs в машинерии; гарды: эхо-скрин/исключить grok на архаичной ch1 — D22.5, self-family exclusion мета-ревьюера, per-call кап + пре-регистрация) + кривая размер-чанка↔качество↔биллинг↔ретраи. Методика-guard D32.4 (fidelity-first агрегация, leave-one-out, катастроф-скрин — полигон дважды собирал ложную «сходимость», лови третий раз).
|
||||
3. **Fidelity re-gate (D34.3, `rerun/FIDELITY_REGATE_HANDOFF.md`) — полигон может гнать ПАРАЛЛЕЛЬНО** (независим от ресёрча): квантифицирует претензию 2 + ловит инверсии активного редактора (ch11/0-класс). Пере-прогон без него формально не засчитан.
|
||||
4. **Бэкенд-фикс-лист (D35.4, в следующий бэкенд-пакет):** экспорт-баг (флагнутый чанк экспортится ПУСТЫМ — ch5/ch20 зачины выпали; фикс: стрип ведущего `###` ИЛИ фолбэк на draft, не дроп); ведущий `###` рождается в ЧЕРНОВИКЕ deepseek (фикс в translator.md/экспорт, не editor); засидить разряды 甲乙丙丁/资质 (raw-китайский в выходе). **Бэкенд-стейдж Б/В D15.2** (`BACKEND_D152_SESSION_PROMPT.md`: content-addressed resume + `tmctl export`/annotations/override) — промт после того, как качественная развязка (research→полигон) уточнит требования к экспорту.
|
||||
5. Read-me чужих зон устарели (backend/README «D1–D23»; eval/README exp04/exp08-каветки) — в fix-листы их сессий, сам не правь.
|
||||
|
||||
**Порядок:** research/18 (ты ревьюишь) → полигон-эмпирика (нарезка×промпт + фронтир + re-gate) → **владелец читает результат** → решение «дешёвый трек дотягивает / нужен фронтир / нужен Ф2» → бэкенд под доказанный ROI. Не перепрыгивай в бэкенд-стройку до полигон-доказательства.
|
||||
|
||||
**Ждём от владельца:** запуск полигон-эмпирики (после твоего промта) · **стратегическая планка запуска** (лучше-фана/гибрид/издательский — всё ещё открыта; влияет на «дешёвый vs фронтир vs Ф2») · билингв-якорь пилота Ф2.5 (D25.9-Q1) · publishable/waiver при экспорте (D25.1) · FN-bound L3 при спеке (D25.4) · юр-пакет (+rights manifest) · провенанс 12-*-доков. *(Закрыто владельцем: сид v2 подписан, фронтир-арм согласован, этап B отменён.)*
|
||||
|
||||
## Методология (продолжай как предшественники)
|
||||
|
||||
|
|
|
|||
|
|
@ -1,5 +1,13 @@
|
|||
# Промт: полигон-сессия, пакет №4 — сид этапа B + fix-лист D22.8 + задачи D25 (2026-07-11)
|
||||
|
||||
> **⚠ СТАТУС (оркестратор №4, D36.1, 12.07) — НЕ архивирован, ЧАСТИЧНО отработан, residual ЖИВ.**
|
||||
> Как отдельная сессия пакет №4 **НЕ запускался**. Отработана только **Задача 1 (сид-мн.ч.)** — влита в сид v2 внутри exp13 (D32, `guzhenren-seed-v2.yaml`). **Открыто (пилот/18+/echo-трек — ОРТОГОНАЛЬНО текущему exp14, НЕ вносить в него):**
|
||||
> - **Задача 2 (fix-лист D22.8):** (а) content-filter матчер подстрокой + самотест; (б) параметризация языка/жанра `explicit_judges.py`; (в) **миграция судьи `memory_eval.py` с gemini-2.5-flash** (EOL 16.10.2026 — `00-provider-quirks.md:72`); **(ж) проба судьи-дублёра 18+ (D22.6) — НАЗВАННЫЙ БЛОКЕР ПИЛОТА** (`09-pilot-protocol.md`, CURRENT-STATE).
|
||||
> - **Задача 3 (D25):** echo-калибровка (D25.7); дополнения пре-регистрации пилота (D25.2/25.6/25.8 → `09-pilot-protocol.md`); minimal-pairs shadow fidelity (совместить с корпусом пилота).
|
||||
> - **Задача 4 (D21.9):** P4 fidelity-хвост (35 пар); wire-аудит темп-свипа; D22.8-минорки (U+FF70 kana, append-only провенанс, judge-raw).
|
||||
>
|
||||
> **Порядок:** это ПИЛОТ-трек, downstream от текущей качественной развязки (exp14). При активации пилота — переупакую residual в свежий пилот-преп-промт (или гони отсюда, слаги судей — live-фактчеком `/models`). **exp14 (`POLYGON_QUALITY_EMPIRICS_SESSION_PROMPT.md`) — приоритетнее.** 18+: только существующие артефакты `eval/data`, счётчики/метаданные в отчёт.
|
||||
|
||||
---
|
||||
|
||||
## Кто ты и что делаешь
|
||||
|
|
|
|||
98
docs/POLYGON_QUALITY_EMPIRICS_SESSION_PROMPT.md
Normal file
98
docs/POLYGON_QUALITY_EMPIRICS_SESSION_PROMPT.md
Normal file
|
|
@ -0,0 +1,98 @@
|
|||
# Промт: полигон-сессия exp14 — эмпирика рычагов качества (нарезка×промпт + фронтир-диагностика + кривая нарезки) (2026-07-12, D36, приоритет №1)
|
||||
|
||||
---
|
||||
|
||||
## Кто ты и зачем
|
||||
|
||||
Ты — **полигон-сессия** TextMachine, exp14. Пере-прогон 25 глав дал вердикт владельца **«лучше, но крайне слабо художественно»** — 2 претензии: (1) нет логической редактуры абзацев / конвенций русского; (2) места, где модель не понимает связей/смысла. Диагноз (D35) верифицирован исполнением: **не баг — недострой Ф2 + невыжатые near-term рычаги (промпт/нарезка/глоссарий)**. Ресёрч research/18 (ДВА отчёта, D36, оба залендены оркестратором после верификации первоисточников — Claude ACCEPT_WITH_FIXES / ChatGPT ACCEPT) дал карту рычагов и §C-таблицы. **Твоя задача — ЭМПИРИЧЕСКИ измерить, а не утверждать:** снимает ли near-term (нарезка×промпт) бо́льшую часть претензий на дешёвом миксе, и где потолок — в дешёвых МОДЕЛЯХ или в нашей НАРЕЗКЕ/ПРОМПТЕ (фронтир-арм = диагностика этого).
|
||||
|
||||
**Ключевая ось, которую exp04/12/13 НЕ крутили:** они варьировали только МОДЕЛЬ в фикс-нарезке с уже-вшитым reflow-промптом. Ты крутишь **нарезку × ПРОМПТ**.
|
||||
|
||||
Зона: `eval/` + `docs/experiments/14-quality-empirics.md` + секция «Полигон» в `PROGRESS.md` + курация глоссария (вне git). **Бэкенд не трогать** (там могут быть живые правки; `git status` перед любым касанием дерева — часто 2 живые сессии; стейджинг тебе НЕ нужен, ты не коммитишь). Прямые API-вызовы из `eval/`-харнеса (НЕ через прод-пайплайн бэкенда — прод трогаем только чтобы воспроизвести инъекцию глоссария как якорь).
|
||||
|
||||
## Онбординг (порядок)
|
||||
|
||||
1. `CLAUDE.md` → CURRENT-STATE в `PROGRESS.md` → **D35 и D36 целиком** (мандат; D36 = приёмка research/18 + этот промт).
|
||||
2. **`docs/research/18-quality-levers.md` (ревью-шапка оркестратора СНАЧАЛА — там поправки к цитатам/рамке) + `docs/research/18-quality-levers-chatgpt.md` (ревью-шапка).** Твой рабочий вход — §C обоих. Скелет протокола бери из ChatGPT-§C (P0-baseline → армы с фаза-тегами → пре-рег гейты C4 → дерево решений C5 → ядро reflow-промпта C3); СОДЕРЖАНИЕ дискурс-reflow-промпта (5 техник Ван Цуй) и COGS-модель — из Claude-§C.
|
||||
3. `docs/experiments/00-provider-quirks.md`: deepseek thinking ON всегда (эхо-мина); gemini слаг ТОЛЬКО `-preview`, `additive_total`, mandatory thinking, `PROHIBITED_CONTENT` неконфигурируем; grok reasoning-ON = аддитивный биллинг; **grok на архаичном хане ch1 — эхо-риск D22.5** (исключить grok из ch1-армов).
|
||||
4. `rerun/FIDELITY_REGATE_HANDOFF.md` — пакет re-gate верности (гонишь ПАРАЛЛЕЛЬНО, независимо от этого эксперимента).
|
||||
5. Уроки судейского слоя: шапки `docs/experiments/12-quality-diagnosis.md` + `13-translator-bakeoff.md` (ложная «сходимость» ловилась дважды — мемо `eval-aggregation-no-manufactured-convergence`).
|
||||
|
||||
## Пре-регистрация (закоммить §1 exp14-дока ДО первого платного вызова — D30.10; path-scoped только exp14-док)
|
||||
|
||||
### 0. Материал (исключить сломанное)
|
||||
- Срез: те же 25 глав пере-прогона (`rerun/records.json` несёт source/draft/final по 57 чанкам). **ИСКЛЮЧИТЬ ch5.0 и ch20.0** (экспорт-баг D35.4a — финалы пусты; спутают оценку) до бэкенд-фикса; если нужен их текст — бери edit-выход из checkpoints (тело цело, дефект = ведущий `###`).
|
||||
- **Trap-набор (Ступень I — ЛОВУШКИ, не «средние главы»):** разметь 6–8 мест ДО генерации, поле `supporting_span` + `допустимый_смысл`. Типы (ChatGPT §C1): (a) нарратив-строки, которые ДОЛЖНЫ стать одним русским абзацем; (b) диалог 1:N; (c) связь, разрешимая ВНУТРИ текущего чанка; (d) связь, опора которой — ЗА границей чанка. **Обязательно включить места владельца, воспроизведённые оркестратором фактически:** gl.7 `古月族人没有一个不知道的` (двойное отрицание = «все знали» → финал инвертировал в «никто не знал»); gl.8 `物是人非` (заглавие-ключ → сплющено в «всё изменилось»). Эти два — тип (c)/verность, вход и в fidelity re-gate.
|
||||
- Главы для Ступени II — 3 чистые главы разной диалого-плотности формулой (как exp12 high/mid/low), **исключая ch1 (архаика), ch5, ch20.**
|
||||
|
||||
### 1. Армы — ось НАРЕЗКА × ПРОМПТ (полный 2×2 — мандат D36) + аблации
|
||||
Прямые вызовы, ручная упаковка; дешёвый прод-микс (draft `deepseek-v4-flash` thinking-ON → editor `glm-5` билингв) как якорь; глоссарий-инъекцию воспроизвести из `retrieval_state.injected_ids` (боевой блок, rig-фиделити как exp12 A1′).
|
||||
|
||||
| Арм | Нарезка | Промпт | Смысл |
|
||||
|---|---|---|---|
|
||||
| **P0 baseline** | чанк 1.5k | ТЕКУЩИЙ прод (`v1-reflow`/`v2-bilingual-reflow`) | Нулевая точка обеих претензий (= пере-прогон, но на trap-наборе) |
|
||||
| **P1a** | чанк 1.5k | **сильный дискурс-reflow** | Промпт-рычаг при фикс-нарезке |
|
||||
| **P1b** | **глава целиком** | ТЕКУЩИЙ прод | ⚠ **ячейка, которую НИ ОДИН отчёт не крутил** — изолирует «бо́льшая единица САМА помогает без нового промпта?» |
|
||||
| **P1c** | глава целиком | сильный дискурс-reflow | Верхняя near-term точка нарезка+промпт |
|
||||
|
||||
Плюс аблации (ChatGPT §C2, на базе P1a):
|
||||
- **Draft-layout ablation:** перед editor заменить пустые строки/построчную разбивку draft на нейтральные сепараторы ИЛИ пронумерованные смысловые атомы (финал удаляет ID) → изолирует ЯКОРЕНИЕ редактора на форме черновика (если резко улучшает абзацы при той же модели/промпте — менять нарезку преждевременно; **это дешёвый ПРОД-МИНОР при победе**).
|
||||
- **Semantic-first vs combined:** один combined-editor против двух узких пассов (билингв семантика-репэйр → target-only литературный reflow) под ОДНИМ coverage-гейтом → снимает конкуренцию мандатов у слабой модели; замерить реальный output-множитель (≤~2× editor-output).
|
||||
- **±1 reference-контекст:** дать пред-source+пред-target хвост и след-source-абзац до границы сцены, явно `REFERENCE — НЕ ПЕРЕВОДИТЬ`; **три РАЗДЕЛЬНЫЕ абляции prev / next / both** (не сливать в один «context arm»). Цель — кросс-граница (тип d), нулевые подлежащие, катафора.
|
||||
|
||||
### 2. Фронтир-арм — ДИАГНОСТИКА потолка (бюджеты владельцем ПОДТВЕРЖДЕНЫ D36.1 — трата разрешена в рамках ключей)
|
||||
- **Capability-vs-activation 2×2:** {дешёвая прод-модель | фронтир} × {baseline-промпт | дискурс-промпт} на trap-наборе + 1 главе. Разводит: фронтир верстает, дешёвая нет → **gap способности**; ни та ни другая → недоспецифицированный промпт; краткое правило/пример чинит дешёвую → это была **активация**.
|
||||
- Фронтир: **GPT-5 — основной** (OpenAI ~$9); **Gemini 3.1 Pro (`-preview`) — ЭКОНОМНО** (остаток ~€2.6, thinking = аддитив-биллинг → быстро сгорит; лучше как кросс-семейный мета-ревьюер, НЕ прогонять им всё); grok (~$9) — доп, но **НЕ на архаичной ch1** (D22.5, эхо-риск); **НЕ Claude/Opus** (нет ключа). Мета-ревьюер — **self-family exclusion** (не ревьюит свой выход).
|
||||
- **Фронтир кросс-семейный мета-ревьюер** (span-цитаты: где ломается смысл + какой механизм чинит): **self-family exclusion** (модель НЕ ревьюит свой выход — если Gemini переводил, мета-ревьюер GPT, и наоборот).
|
||||
- Гарды: эхо/refusal-скрин на всех выходах; **per-call predicted-cost кап ДО вызова** (НЕ group-level — урок exp13 +10%); пре-регистрация армов заморожена коммитом.
|
||||
|
||||
### 3. Кривая размер-чанка ↔ качество ↔ биллинг ↔ ретраи
|
||||
- Размеры **0.75k / 1.5k / 3k / глава** × **две политики границ** (жадная упаковка | сцен/дискурс-граница) при сопоставимом бюджете — иначе размер спутается с качеством границ.
|
||||
- Снимать (пре-рег): in/out/**reasoning**-токены, латентность, **retry-rate ПО ПРИЧИНАМ** (timeout/refusal/length/echo/sanitizer/decode — раздельно), **доля ПОВТОРНО ОПЛАЧЕННЫХ токенов** (не только retry-rate — урон одного крупного сбоя), coverage, слепое предпочтение, KPI-абзацы, trap-теги.
|
||||
- **Бюджет чанка — в ВЫХОДНЫХ токенах на реальном токенизаторе** (кириллица-фертильность ~2–2.5× — Petrov NeurIPS 2023, проверено); оптимизировать на **retry-adjusted output-cost**; связность давать кэшированным carryover, НЕ размером единицы. **Cache-ordering:** статику (system+glossary) ПЕРВОЙ, volatile (running summary/reference) ПОСЛЕ — иначе кэш бьётся.
|
||||
|
||||
### 4. Сильный дискурс-reflow промпт — ЭТО АРМ ДЛЯ ЗАМЕРА (не «оптимальный промпт»), ядро (Claude §C1#1 + ChatGPT §C3)
|
||||
СОДЕРЖАНИЕ (zh→ru, из Ван Цуй, Вестник МГУ Сер.22 — прескрипция ТЕХНИКИ, подтверждена оркестратором по телу статьи; НЕ «норма языка» — норму держат Розенталь/Правила-1956):
|
||||
1. Молча определи смысловые ходы: единый фокал/наблюдатель; действие+непосредственная реакция; одна тема рассуждения; смена говорящего/времени/места/фокала.
|
||||
2. Один повествовательный ход — обычно один русский абзац, ДАЖЕ если китайский разбит на однофразовые строки (паратаксис→гипотаксис). Инструмент слияния — **причастные/деепричастные обороты + подчинительные союзы/связки** (5 техник Ван Цуй: иерархия → сегментация по смыслу → маркировка вида/времени предиката → варьирование лексики → добавление связок). Не сливать ТОЛЬКО ради длины.
|
||||
3. Каждая реплика — с нового абзаца через тире; слова автора при той же реплике — в её абзаце (Розенталь).
|
||||
4. Разрешено объединять/делить русские предложения; ЗАПРЕЩЕНО терять смысловые атомы (число предложений/абзацев совпадать не обязано).
|
||||
5. `REFERENCE`-блоки — только для разрешения связей; не переводить/не пересказывать в выходе.
|
||||
|
||||
Few-shot — минимальные, ортогональные: narrative N:1, dialogue 1:N, focal-shift boundary (target-side русский якорь). **Для DeepSeek-thinking сначала zero-shot против few-shot** (модель-специфика research/15; не переносить результат между моделями); ручной verbose CoT reasoning-модели НЕ добавлять.
|
||||
|
||||
### 5. Метрики и гейты — ПРЕ-РЕГИСТРИРОВАТЬ (C4 ChatGPT + §C10 Claude)
|
||||
| Ось | Первичный показатель | Аварийный гейт |
|
||||
|---|---|---|
|
||||
| Претензия 1 (абзацы) | **детерминированный структурный KPI БЕЗ судьи** (распределение предложений/нарратив-абзац vs русский референс) + слепое чтение | нельзя «побеждать» только МЕНЬШИМ числом абзацев |
|
||||
| Претензия 2 внутри-чанк | билингв span-цитирующая trap-accuracy (обязательный `supporting_span`) | любая инверсия действия/участника = КАТАСТРОФА независимо от среднего ранга |
|
||||
| Претензия 2 кросс-граница | accuracy РАЗДЕЛЬНО prev-/next-/chapter-supported | **perturbation:** correct-context vs random/shuffled НЕ должен дать тот же результат (иначе контекст не используется — Mohammed&Niculae, проверено) |
|
||||
| Полнота | покрытие смысловых АТОМОВ (не совпадение числа предложений) | пропуск заголовка/события дисквалифицирует арм на фрагменте |
|
||||
| Операционность | `$`, in/out/reasoning-токены, латентность, retry-по-причинам, **повторно-оплаченные токены** | per-call predicted-cost кап; НЕ group-level |
|
||||
| Робастность | leave-one-judge-out + отдельный катастроф-скрин | коррелированные колонки одного судьи ≠ независимые сигналы |
|
||||
|
||||
**НИКОГДА не гейтить художественность/связность на BLEU/COMET** — для zh→ru доказана инверсия (WMT24: NMT>LLM по d-BLEU без human-eval). Судьи: span-цитирующие, reasoning-ON, верность/стиль РАЗДЕЛЬНО, кросс-семейно, self-family exclusion, ≥3 повтора со свапом, parse-чек полноты ранжирования.
|
||||
|
||||
### 6. Ступень II — слепое чтение владельцем ТОЛЬКО 3 финалистов
|
||||
После trap-гейта оставить: **baseline + лучший near-term арм + фронтир-диагностик** (НЕ 8 почти-одинаковых, как exp12). Monitor-паттерн (слепые метки, ключ отдельно, вне хостинга — копирайт). Главный исход — бинарное закрытие 2 претензий + ранжирование; вторичный — размеченные ошибки.
|
||||
|
||||
### 7. Дерево решений (пре-рег, ChatGPT §C5)
|
||||
- P1a закрывает абзацы БЕЗ падения fidelity → катить промпт, размер НЕ менять.
|
||||
- Помогает только draft-layout ablation → строить deformat/atom-rendering, не chapter-editor.
|
||||
- ±1 reference закрывает большинство смысловых traps → строить малое context-window до Ф2-памяти.
|
||||
- Нужна chapter-card, но whole-chapter НЕ лучше → Ф2 state-extraction.
|
||||
- Whole-chapter выигрывает по fidelity И абзацам И retry-adjusted COGS → тогда проектировать per-stage гранулярность (повторить на длинной главе).
|
||||
- Фронтир выигрывает обе колонки 2×2, организация почти не помогает → **model floor** (не строить сложную память ради слабой модели).
|
||||
- Организация помогает ОБЕИМ, фронтир+организация даёт доп-лифт → развести near-term context-fix и премиум-тир.
|
||||
|
||||
## Fidelity re-gate (ПАРАЛЛЕЛЬНО, D34.3 — `rerun/FIDELITY_REGATE_HANDOFF.md`)
|
||||
Независим от exp14. Span-цитирующий, reasoning-ON, раздельно стиль/верность, охота на КЛАСС ИНВЕРСИЙ редактуры (ch11/0 аутлайер: editor расширил 3009→4631, sim 0.064), катастроф-скрин терминов у победителя, author≠reviewer (не glm-5/deepseek), leave-one-out. **Пере-прогон НЕ засчитан до пройденного re-gate.**
|
||||
|
||||
## Deliverable
|
||||
`docs/experiments/14-quality-empirics.md`: пре-регистрация (§1, заморожена коммитом) → таблицы армов (KPI-абзацы / trap-accuracy со спанами / perturbation / retry-по-причинам / цена) → кривые размер↔качество↔биллинг↔ретраи → capability-vs-activation вывод (потолок: модели vs организация) → рекомендация near-term конфига + что строить под ROI → 3 финалиста для слепого чтения владельца. Смена дефолта — ратификация оркестратора. **Ничего не коммитить, КРОМЕ пре-рег-раздела** (D30.10-гейт).
|
||||
|
||||
## Дисциплина / бюджет
|
||||
- **Бюджеты ключей (подтверждены владельцем, D36.1 — «делай что нужно в этих рамках»):** OpenAI ~$9, Gemini ~€2.6 (крошечный — беречь), DeepSeek/ZAI(glm)/Kimi/xAI(grok)/Mistral ~$9 каждый; ДРУГИХ ключей нет. Отдельный owner-`ceiling`-запрос НЕ нужен — работай внутри остатков. **Per-call predicted-cost кап ОБЯЗАТЕЛЕН до каждого платного вызова** (НЕ group-level — exp13 переоврал на +10%); в пре-регистрации разложи ожидаемую трату по ключам и держи запас (near-term дешёвые армы — первыми; фронтир GPT-5 — основная фронтир-статья; Gemini — точечно). Заканчивается ключ → останавливайся на нём, не блокируй остальные армы.
|
||||
- Каждый платный вызов персистит usage/cost; финальная сумма в отчёте (D30.10). Полигонное Python-зеркало ↔ Go: при расхождении верить Go.
|
||||
- Слепота свята; пре-рег заморожен после коммита; аномалии провайдеров → вендор-дока + `/models` (не гадать); `.env` не читать; тексты книги в git-доки не тащить (≤15 слов); 18+ регистров в раннем срезе нет — перенос на 18+ требует отдельной пробы (D22/exp10-11).
|
||||
- **Методика-guard (мемо eval-aggregation — ловил ДВАЖДЫ):** fidelity-first агрегация, leave-one-out по судьям, катастроф-скрин к ПОБЕДИТЕЛЮ тоже, независимость сигналов до агрегации, ось решения (near-term-достаточность vs потолок-моделей). Не собирай ложную «сходимость».
|
||||
105
docs/PROGRESS.md
105
docs/PROGRESS.md
|
|
@ -1,12 +1,113 @@
|
|||
# Журнал прогресса
|
||||
|
||||
> **⟶ ТЕКУЩЕЕ СОСТОЯНИЕ** (обновляемый блок; на 2026-07-12). **Источник истины по РЕШЕНИЯМ — `architecture/05-decisions-log.md` (D1–D31); этот файл — ЖУРНАЛ, не спека.**
|
||||
> - **Фаза:** 0 ✅; Ф1-машинерия ✅ (D21–D28); **приёмка этап A ✅ с оговорками (D24); этап B заморожен (D26) до читаемых 25 глав.** **exp12-диагностика ПРИНЯТА (D30): «нечитаемо» = пассивный моно-редактор + кривой сид + построчная вёрстка от промптов + нет санитайзера; дефекты смысла — в черновике.** Ратифицировано D30: **флип D1 моно→билингв** (supersede D17.в; re-gate верности на пере-прогоне обязателен), reflow-вёрстка (промпты чинятся), output-санитайзер (новый гейт-класс), глоссарий v2 условно (спорные → draft до подписи владельца), **exp13 бейк-офф ПЕРЕВОДЧИКОВ** (deepseek качеством не мерен — главный невыжатый рычаг), COGS флипа +15–25% (~$0.85/ранобэ; «$1.5–2» = отдельная опция Б). **exp13 ПРИНЯТ (D32): черновик flash СОХРАНЁН (pro отклонён), сид v2 под подпись владельца. Бэкенд-пакет D15.2 ЭТАП А ПРИНЯТ и залендён (D33, 00f8e36): билингв-редактор+reflow+санитайзер+golden — golden байт-в-байт, конфиг-флип D32 соблюдён; НО 2 обязательных фикса санитайзера до пере-прогона (D33.1: хвостовая утечка + false-positive «около колонны»). Этап Б/В D15.2 осознанно не начаты (Б трогает денежный resume-путь). Очередь: ~~фикс санитайзера~~ ЗАЛЕНДЁН (D33.1, ACCEPT) ∥ сид v2-финализация (полигон проставляет статусы по подписи владельца) → единый resnapshot (промпты+editor+санитайзер+сид v2) → пере-прогон 25 глав (flash+свзяка, budget_usd>0) с re-gate верности → чтение владельца → этап B.** Трек владельца: дешёвые модели сейчас, фронтир потом (архитектура конфиг-первая — D30.7). Решающая точка — пилот Ф2.5 (блокеры: билингв-якорь/аннотаторы ≥3 — D25.9-Q1, корпус, проба судьи-дублёра — D22.6).
|
||||
> - **Фаза:** 0 ✅; Ф1-машинерия ✅ (D21–D28); приёмка этап A ✅ (D24). **Путь D26→D35: качество-первым.** Флип D1 моно→билингв (D30, supersede D17), reflow+output-санитайзер (D30/D33), сид v2 подписан владельцем (D34.1), переводчик flash сохранён (exp13/D32 — pro отклонён). **Пере-прогон 25 глав связкой ВЫПОЛНЕН; вердикт владельца: «лучше (из-за сида), но крайне слабо художественно» (2 претензии: абзацы/конвенции + понимание связей). ПИВОТ D35:** цикл приёмочных прогонов ЗАКРЫТ (инфра ✅ подтверждена исполнением / читаемость ❌ = блок на непостроенной Ф2 — НЕ провал; диагноз «Ф2-недострой + near-term промпт/нарезка-рычаги, не баг» верифицирован; флор D24.3 валидирован в проде). Планка впредь = 2 претензии владельца (ИНТЕРИМ пре-скрин, НЕ пилот Ф2.5). **Очередь «мерить→строить»: ресёрч research/18 ЗАЛЕНДЕН (D36, оба отчёта: Claude ACCEPT_WITH_FIXES / ChatGPT ACCEPT; 57/57 источников реальны, Ван Цуй подтверждён по телу) → полигон-эмпирика ВЫДАНА (`POLYGON_QUALITY_EMPIRICS_SESSION_PROMPT.md`, D36: нарезка×промпт + фронтир-арм + кривая-нарезки + fidelity re-gate) → бэкенд (только под доказанный ROI).** Fidelity re-gate (D34.3, `rerun/FIDELITY_REGATE_HANDOFF.md`) — полигон гонит параллельно. Бэкенд-фиксы (D35.4): экспорт-баг (ch5/ch20 пустые), ведущий `###` из draft, глоссарий разрядов 甲乙丙丁. Трек: дешёвые модели сейчас, фронтир потом (D30.7). Решающая точка — пилот Ф2.5 (блокеры: билингв-якорь/аннотаторы ≥3 — D25.9-Q1, корпус, судья-дублёр — D22.6). *(Детальная хроника D30–D34 — в записях ниже + D-лог.)*
|
||||
> - **Стек (пост-D32):** черновик — **deepseek-v4-flash СОХРАНЁН** (exp13/D32: смена на pro отклонена по данным — сфабрикованная сходимость + катастрофа 蛊→«гусеницы» + верность у flash не хуже; thinking ON; escalate_to=pro без изменений) · редактор — **БИЛИНГВ (D30.1), кандидат glm-5-билингв** (gemini — премиум-эскалация за санитайзером; grok reasoning-off из редакторов СНЯТ — no-op) · судья/апекс Gemini 3.1 Pro (**слаг `-preview`**; mandatory thinking; `additive_total` — D22.3) · эскалация A: DeepSeek V4 Pro → GLM-5.1 → Gemini-preview · **канал B (18+): Mistral · эскалация grok-4.3 reasoning-ON (⚠ не на архаичных zh — D22.5) · abliterated-скрининг · судьи: эротика — Grok (дублёр гейтится пробой D22.6), violence/SFW — Grok+Gemini** (DeepSeek в explicit запрещён ToS — D14.1). 7 ключей.
|
||||
> - **Экономика:** `experiments/08-cost-model-v2.md` — до-флиповый ~$0.69 ранобэ / ~$10.94 вебновелла-500; **после флипа D1 → ~$0.85/ранобэ (+15–25%, D30.4)**; «$1.5–2» = опция Б (селективный апекс+память, НЕ подписана); пере-съём = exp08 v3 (D21.8/D25.8). ⚠ Resume: любой `--resnapshot` = переоплата книги — онгоинг гейтится реализацией D15.2 (идёт, D30.9). Gemini-недоучёт 146×/вызов закрыт additive_total (D22.3).
|
||||
> - **Ждём от владельца:** **подпись спорных терминов сида v2** (修炼/культивация · 人祖/Первопредок · род «гу» · 花酒行者 — таблицу даст exp13) · **флагман-сверка exp13** (переводчики, monitor-паттерн) · DashScope-ключ для qwen-арма exp13 (опционально) · **планка запуска** (лучше-фана/гибрид/издательский + готовность к COGS опции Б ~$1.5–2 — мемо-эскалация exp12; интерим D30.7: «лучше фана» на дешёвом миксе) · решение по билингв-якорю пилота (D25.9-Q1) · «да/нет» митигации контаминации пилотного корпуса (D27.4) · publishable/waiver — при экспорте (D25.1) · FN-bound L3 — при спеке (D25.4) · провенанс 12-*-доков · юр-пакет (+rights manifest, D25.8).
|
||||
> - **Ждём от владельца:** ~~подпись спорных терминов сида v2~~ ✅ ПОДПИСАНО (D34.1; владелец переопределил: Жэнь Цзу, Монах Цветочного Вина, гу Жизни, деревня Гуюэ, первобытный камень; род «гу» муж) · **чтение 25 глав пере-прогона** (арбитр читаемости — после связки+re-gate) · **флагман-сверка exp13** (переводчики, monitor-паттерн) · DashScope-ключ для qwen-арма exp13 (опционально) · **планка запуска** (лучше-фана/гибрид/издательский + готовность к COGS опции Б ~$1.5–2 — мемо-эскалация exp12; интерим D30.7: «лучше фана» на дешёвом миксе) · решение по билингв-якорю пилота (D25.9-Q1) · «да/нет» митигации контаминации пилотного корпуса (D27.4) · publishable/waiver — при экспорте (D25.1) · FN-bound L3 — при спеке (D25.4) · провенанс 12-*-доков · юр-пакет (+rights manifest, D25.8).
|
||||
> - Записи ниже — хронология; РАННИЕ (день-0, 04.07) содержат устаревшие цифры/решения (COGS $2–4, BYOK, Anthropic-Sonnet), переопределённые позже — см. блок выше и 05-decisions-log.
|
||||
|
||||
## Полигон — exp14 эмпирика рычагов качества (нарезка×промпт + фронтир 2×2), ПАРТИЯ 1, 2026-07-12 (D36)
|
||||
|
||||
Сессия по `POLYGON_QUALITY_EMPIRICS_SESSION_PROMPT.md`. **Пре-регистрация ЗАМОРОЖЕНА коммитом ДО первого платного вызова** (D30.10; `docs/experiments/14-quality-empirics.md` §1 — trap-набор 6 трапов вкл. gl.7/gl.8 владельца, армы нарезка×промпт, метрики/гейты, бюджет-по-ключам). Харнес `eval/exp14_*.py` (call+3-режима-cost+per-call-кап+токенайзер+реконструкция инъекции из `retrieval_state.injected_ids`). Все выходы ВНЕ git (`/home/ubuntu/books/gu-zhenren/exp14/`). **Бэкенд не трогал (0 правок).**
|
||||
|
||||
**ПАРТИЯ 1 (trap-набор, 9 чанков): 0 ошибок на 64 арм-вызовах; трата ARM $1.77 (ZAI $0.43 + OpenAI $1.34) + trap-судьи $0.50 (gpt-5-mini+kimi, кросс-семейно) ≈ $2.27 (глубоко в остатках).** T1-катастрофа корроборирована независимой панелью (2/2 судьи флагают КАТАСТРОФУ на всех дешёвых армах, чистят фронтир). Фронтир = **gpt-5.4** ($2.5/$15, live-фактчек 2026-07-11; GPT-5-линейка до 5.4/5.5/5.6, взят 5.4 standard).
|
||||
|
||||
**ГЛАВНЫЙ ВЫВОД — потолок РАСЩЕПЛЁН по двум претензиям владельца (прямой ответ на «модели vs нарезка/промпт»):**
|
||||
- **Претензия 1 (абзацы/конвенции) = наш ПРОМПТ/ПАЙПЛАЙН (активация), НЕ модель.** Детерм. KPI предл./нарратив-абзац: P0 1.91 → P1a (дискурс-промпт) 2.61 → **A-2pass (семантика→target-only reflow-пасс) 3.33** (лучший, доля-1-предл. 0.187, БЕЗ коллапса длины/CJK). **Фронтир+СТАРЫЙ промпт (F-base 1.58) ХУЖЕ дешёвого P0** — «сильнее модель» абзацы НЕ чинит. A-layout (deformat черновика) улучшает абзацы (3.13), НО **CJK-утечка ×20** (регресс-гард поймал) — deformat требует CJK-пост-гарда.
|
||||
- **Претензия 2 внутри-чанк (смысл) = дешёвая МОДЕЛЬ (capability floor).** T1 (gl.7 двойное отрицание «все знали»): glm-5 **инвертирует** в «никто не знал» НЕЗАВИСИМО от промпта (P0 и P1a); **gpt-5.4 чинит** НЕЗАВИСИМО от промпта (F-base и F-disc). T2 (物是人非) — тот же знак. Промпт претензию 2 НЕ закрывает.
|
||||
- **Претензия 2 кросс-граница = НЕ доминирует в срезе.** T5/T6 локально самодостаточны; ±1-reference (A-ref) дал байт-идентичный выход (чинить нечего); whole-chapter (P1c) единственный явно связал антецедент (1 датапоинт).
|
||||
|
||||
**Near-term рекомендация (на ратификацию оркестратора, НЕ смена дефолта):** (1) дискурс-reflow-контент Ван Цуй→editor-промпт + рассмотреть отдельный target-only reflow-пасс (A-2pass) под COGS; (2) претензию 2 — **селективная фронтир-эскалация редактора по смысл-риску** (не тотальный фронтир — он абзацы портит); (3) CJK-гард при deformat; (4) НЕ строить Ф2-кросс-чанк-память под слабый сигнал. **ПАРТИЯ 2 (осталось):** кривая нарезки, слепые пакеты Ступени II (гл.19/17/18, D=0.061/0.246/0.440), полная ранжирующая панель +leave-one-out, fidelity re-gate (D34.3), 3 финалиста, хендофф. Планка = 2 претензии владельца (ИНТЕРИМ пре-скрин, НЕ пилот Ф2.5). Смену дефолта ратифицирует оркестратор.
|
||||
|
||||
## Ресёрчер — рычаги качества (`research/18-quality-levers.md`), 2026-07-12 (D35.5, вход полигону)
|
||||
|
||||
Сессия по `RESEARCHER_QUALITY_SESSION_PROMPT.md` (нейтральный/анти-анкоринг). **Ничего не коммичено** (лендит оркестратор после верификации первоисточников — как research/15/16/17). Отчёт: `docs/research/18-quality-levers.md` — §A (заморожена, sha256 `44f90364…`, построена ДО чтения стека/ChatGPT-отчёта; хеш байтов между маркерами BEGIN/END §A) · §B дифф · §C таблица-рекомендации полигону · §D вопросы.
|
||||
|
||||
- **Протокол соблюдён:** §A из ТОЛЬКО (2 претензии + сырьё rerun/ + механизм chunker.go/translator.md/editor.md + собств. внешний веб-ресёрч 52-агентным фан-аутом с адверсариальной верификацией). НЕ читал в фазе 1: D-лог/хендоффы/rootcause/приёмку. §A заморожена хешем ДО фазы 2.
|
||||
- **Главный результат — ТРОЙНАЯ независимая сходимость** (моя §A ⟂ ChatGPT-§A ⟂ эмпирика D26→D35) на диагнозе и большинстве рычагов ⇒ высокое доверие карте «строить». Оговорка D25.10/D32.4: общая нога «внешняя MT-лит» у меня и ChatGPT — не 3 независимых голоса там.
|
||||
- **Замеры на сырье (независимо воспроизвёл):** рубленость 41/51 нарратив-чанков ~1:1 абзац-на-строку; редактор структуро-СОХРАНЯЮЩ (слил 1/49) — reflow-инструкция инертна; **ch5.0 черновик 5425 симв.→финал ПУСТ (`sanitizer_defect`) = экспорт-баг D35.4a**; CJK-глифы в 13 финалах.
|
||||
- **Несущий вклад СВЕРХ команды И ChatGPT (§B2):** (1) **zh→ru дискурс-транформ как теория** — паратаксис→гипотаксис (意合/形合), 流水句, **прямая zh→ru peer-reviewed прескрипция Ван Цуй (Вестник МГУ Сер.22): 5 техник + причастные/деепричастные обороты** ⇒ апгрейд research/16 «слияние дискреционно» → «обязательная дискурс-операция, и КАК»; прямой ответ владельцу «конвенция языка, не стиль автора»; (2) слой **«пакет конвенций пары»** версионируемый (идея владельца; research/07 держит контент как разбросанные brief-политики — отдельного слоя нет); (3) DocRepair EN→RU числа (монолингв. repair-пасс); (4) фертильность-налог кириллицы + cache-ordering + перевёрнутая-U; (5) метрика-инверсия zh→ru (WMT24 NMT>LLM d-BLEU) — не гейтить художественность на авто-метрике.
|
||||
- **Само-поправки §A (§B3, честно):** ch5-void = экспорт-баг (не санитайзер); research/16 УЖЕ заземлила русские нормы (Розенталь §52-53/Лопатин/Правила-1956); source-line-strip не нов (exp12:174).
|
||||
- **§C = армы для D35.6:** СЕЙЧАС (дискурс-reflow-промпт с zh→ru-контентом · discourse-move few-shot target-anchor · source-strip · детерм. reflow-постпроцессор ops b/c/d · guard пост-черновой регрессии · ±1 reference-контекст · кривая нарезки на retry-adjusted-output-cost · **capability-vs-activation 2×2 + фронтир-арм** · **авто-Claude-судья: KPI-структура без судьи для претензии 1, span+comprehension-QA+perturbation для 2, владелец кросс-чек ChatGPT/вручную**) vs Ф2 (running summary+entity-ledger DelTA · chapter-card · ZP-аннотация · монолингв. RU reflow-пасс). Архитектура: слой пары (зона оркестратора/бэкенда).
|
||||
- **Запросы владельца этой сессии учтены:** (а) конвенция-vs-стиль отвечена источниками (§A/§B2.1); (б) «модель недоактивирована» → capability-vs-activation арм (§C #9); (в) авто-оценка качества → §C #10 + §D; (г) языковые карты в архитектуру → слой пары §C #15.
|
||||
|
||||
**12.07 (№4): research/18 (ОБА отчёта) отревьюирован и залендён с ревью-шапками, ратификация D36.** Мультиагентный воркфлоу 26 агентов ($0, refute-by-default, первоисточники + реплика сырья): **§A-заморозка Claude sha256 44f90364… воспроизведена побайтно (MATCH) → не редактировалась; 57/57 несущих цитат СУЩЕСТВУЮТ (0 сфабрикованных — проверены ВСЕ «2026»-препринты)**; эмпирика воспроизведена (ch5.0/ch20.0-void ТОЧНО, CJK 13 финалов, 41/51 в допуске, gl.7-инверсия/gl.8-сплющивание фактически есть → на fidelity re-gate); **Ван Цуй ПОДТВЕРЖДЁН по ТЕЛУ статьи** (скептик декодировал CID/Identity-H шрифт: 5 техник + причастные/деепричастные + подчинение + прескриптивная необходимость — Вестник МГУ Сер.22 2024№3, рецензирован). **Вердикты: Claude — ACCEPT_WITH_FIXES** (5 поправок в ревью-шапке: DocRepair-числа принадлежат D19-1081 не P19-1116 — числа верны; TransAgents двойная-метка; Z5 автор Dingxu Shi не Li&Thompson; Ван Цуй = прескрипция ТЕХНИКИ, не «норма языка»; «пост-черновая регрессия > 2 претензий» пере-возвышена — ch5-void = экспорт-баг); **ChatGPT — ACCEPT** (цитатно-чист, §C — самый исполнимый скелет; оговорки: §A-заморозка НЕ воспроизводима из документа = дисконт на вес сходимости, §C4-гейт не ссылается на D34.3). **Калибровка «тройной сходимости»:** оговорка честна (D25.10 взята), но (а) вторая необъявленная общая нога — оба §A читали одно сырьё/код; (б) цитатные базы почти НЕ пересекаются (~3 общие) → где литература расходится, совпадение сильнее; (в) ChatGPT-заморозку — с дисконтом. **Несущий вклад для «строить» держится:** Ван Цуй-контент → в reflow-промпт полигона; экспорт-баг ch5/ch20 подтверждён двумя репликами (бэкенд-fix D35.4a). Выдан `POLYGON_QUALITY_EMPIRICS_SESSION_PROMPT.md` (D36: скелет §C ChatGPT + графт Ван Цуй/COGS/D34.3 из Claude; добавлены недостающая ячейка current-промпт×глава и явный P0-baseline; ch5/ch20 исключены из слепых пакетов).
|
||||
|
||||
**12.07 (№4): D36.1 — гигиена доков + бюджеты (по запросу владельца).** Заархивированы **5** спент-промтов (`archive/prompts/`, git mv, история не переписана — D23.3): ресёрчер/exp13/санитайзер-фикс/приёмка-v2/D152-этап-А. **`POLYGON_PACKAGE4` НЕ архивирован** (проверка по запросу владельца): как сессия не запускался, отработана лишь task-1 сид-мн.ч. (в exp13/D32); **residual жив** (D22.6 судья-дублёр — блокер пилота, D25.7 echo-кал, миграция memory_eval с 2.5-flash, пилот-пре-рег, P4-хвост) — **пилот/18+/echo-трек, ОРТОГОНАЛЬНО exp14** (не вносить); оставлен активным со статус-баннером как residual-трекер до активации пилота. Активны `ORCHESTRATOR_*` + `POLYGON_QUALITY_EMPIRICS_*` (exp14) + `POLYGON_PACKAGE4_*` (отложен); README-карта + титул D-лога D35→D36 актуализированы. **Бюджеты подтверждены владельцем:** OpenAI ~$9, Gemini ~€2.6, DeepSeek/ZAI/Kimi/xAI/Mistral ~$9; других нет; «полигон делает что нужно в рамках» → блокер фронтир-ceiling снят (exp14: GPT-5 основной фронтир, Gemini точечно/мета-ревьюер, grok не на ch1; per-call кап + пре-рег). D36.1 — в D-логе.
|
||||
|
||||
## Приёмка Ф1 — ПЕРЕ-ПРОГОН 25 глав кандидат-конфигом (билингв glm-5 + reflow + сид v2 + санитайзер), 2026-07-12 (D30.9/D34.2)
|
||||
|
||||
Пере-прогон по `ACCEPTANCE_SESSION_PROMPT.md`. **Ничего не закоммичено** (лендинг — оркестратору). Все производные — ВНЕ git в `/home/ubuntu/books/gu-zhenren/rerun/` (свежий store `guzhenren-rerun.db`, конфиги, выходы, отчёты, скрипты замеров). **Дерево backend/ чистое — мои правки кода = 0** (throwaway-хелпер `cmd/_dumpsrc` для дампа исходных чанков — `_`-игнор Go-тулчейном, не коммичен, удалён после использования). Предусловия запуска (все 5) сверены: D15.2 этап A+D33.1 залендены; draft=flash сохранён (exp13/D32); сид v2 подписан владельцем (D34.1 — Жэнь Цзу/Монах Цветочного Вина/гу Жизни/деревня Гуюэ/первобытный камень/род «гу» муж — сверено в `guzhenren-seed-v2.yaml`); budget_usd>0; единый resnapshot.
|
||||
|
||||
### ШАГ 0 (repoint, D34.2) — ВЫПОЛНЕН и ВЕРИФИЦИРОВАН исполнением
|
||||
Приёмочный конфиг собран из БОЕВОГО `pipeline-c1.yaml` (HEAD, post-D33) + book-дельты, **СВЕЖИЙ store** (не store этапа A). Снапшот `e754d3a7b321`, сверен из store (`snapshots.payload`):
|
||||
- draft `deepseek-v4-flash` **`prompt_version:v1-reflow`**, escalate_to `deepseek-v4-pro`, floor max_tokens **8000** (D24.3 — стадия A имела 2048/3291).
|
||||
- edit `glm-5` **`prompt_version:v2-bilingual-reflow`**, prompt_sha256 байт-в-байт совпал с `backend/prompts/editor.md`.
|
||||
- `sanitizer.enabled:true` (`sanitizer-v2`, post-D33.1), coverage off, postcheck_gate false (флаггер), glossary_injection selective, **memory_version `002716c2…`** (сид v2, 57 терминов ≠ сид v1).
|
||||
- `status --json`: **config_drift=false, snapshot_drift=false** — текущий конфиг рендерит ТОТ ЖЕ снапшот, что в store (нет стейл-моно-конфига; repoint airtight).
|
||||
|
||||
### A. Инфраструктура держится на НОВОМ снапшоте — таблица (каждое исполнением)
|
||||
|
||||
| # | Пункт | Как проверено | Результат |
|
||||
|---|---|---|---|
|
||||
| A1 | committed==SUM(checkpoints) | SQL на 4 срезах живого store | ✅ ТОЧНО: honest-stop $0.02163351==$0.02163351 (n=9); kill-9 $0.03187751==$0.03187751 (n=11); финал **$0.47462791==$0.47462791==chunk_status-sum** (n=116) |
|
||||
| A1 | честный стоп потолка (committed+reserved) | book_usd=0.03 → отказ ch1/4 edit | ✅ committed=$0.021634 reserved=$0 denied estimate=$0.014533, «raise ceilings.book_usd or stop», **exit 1** (стадия A этот код не фиксировала — теперь подтверждён) |
|
||||
| A1 | **настоящий kill -9** посреди in-flight glm-5 edit (ch1/5) | SIGKILL, инспекция store до resume | ✅ orphan reserved=$0.013373 виден до resume; на resume «recovered 1 stale reservation»; committed==SUM пережил краш; resume ре-атаковал РОВНО ch1/5 edit (≤1 вызов) |
|
||||
| A1 | resume не переоплачивает | replay после kill-9/honest-stop | ✅ «stage resolved from chunk_status» ($0), первый платный = убитая/отклонённая стадия |
|
||||
| A2 | **echo-эскалация стреляет и ре-гейтится (LIVE)** | ch16/0 flash draft | ✅ flash → **flagged cjk_artifact** → эскалация **deepseek-v4-pro @ max_tokens=8000** → **ре-гейт ok** → edit прошёл. **Валидирует фикс D24.3 живьём** (стадия A: хоп наследовал 2048 → finish=length, эскалация-пустышка; теперь флор 8000 → rescue) |
|
||||
| A2 | flag+skip+continue, мусор не в TM | 2 sanitizer-флага (ch5/0, ch20/0) | ✅ чанк flagged, edit НЕ закоммичен (final пуст), прогон продолжился; FinalText не течёт в TM/экспорт |
|
||||
| A2 | `tmctl redrive` на реальном флаге | ch5/0 sanitizer_defect: dry-run + real | ✅ dry-run план 1 (ничего не тронул); real сбросил+ре-атаковал+**ре-гейтил** → **re-flagged** (glm-5 детерминированно повторил «### Глава 5»); committed=$0.483486 **≥ SUM=$0.474670** (diff $0.008816 = сброшенная стадия; D15.3) |
|
||||
| A2 | `tmctl status` живой (OpenReadOnly) | status/--json ПРИ активном translate | ✅ работают без flock; snapshot/деньги/паспорта/config-drift корректны; --json exit 2 при флагах |
|
||||
| A3 | санитайзер ловит классы exp12 | unit-тесты (исполнением, зелёные) + LIVE | ✅ LIVE 2 TP (markdown «### Глава 5», «# Глава 20»); unit: gemini-преамбула / «Основные правки для справки» / ### / латиница / гомоглиф — firing+non-firing, вкл. D33.1-FP-гварды («около колонны»/«стало талой») |
|
||||
| A3 | НЕ даёт ложных на чистом тексте | 55 чистых glm-5-чанков | ✅ **0 false-positive** (2 флага — оба реальные markdown-заголовки) |
|
||||
|
||||
### B. Качество
|
||||
|
||||
- **B4 re-gate ВЕРНОСТИ — НЕ ЗАПУСКАЛА (по контракту author≠reviewer): отдано полигону.** Пакет `rerun/FIDELITY_REGATE_HANDOFF.md` + `rerun-parallel.txt` (выровнено ОРИГ|ПЕРЕВОД, 57 чанков) + `records.json` + store. **⚠ Пере-прогон НЕ ЗАСЧИТАН до пройденного независимого span-цитирующего re-gate** (раздельно стиль/верность, охота на класс инверсий редактуры exp12, катастроф-скрин). Билингв-редактор мог купить гладкость ценой смысла — это ровно то, что не видно на поверхностном чтении.
|
||||
- **B5 D10 консистентность** (НЕЗАВИСИМЫЙ скрипт `rerun/d10_consistency.py`, приложен — воспроизводимо, author≠native-matcher): presence **91.0%** (647/711), occurrence **95.8%** (3072/3207). По типам (presence): имена 98.6%, клички 100%, места 96.0%, термины 94.9%, **титулы 78.7%** (слабейший класс — как термины на этапе A). Классификация промахов: **decl_gap 0** (фикс D24.4 «базовый dst всегда» держит), **inflection_gap 54** (dst присутствует в НЕперечисленной в сиде форме — читатель видит верный термин; эффективная консистентность = (647+54)/711 = **98.6%**), **genuine_absent 10** (кандидаты дрейфа для span-сверки, НЕ подтверждённый дрейф). Alias-слепое пятно D24.2 **обойдено** (per-term substring, не longest-match): поймал **古月→Гуюэ ×2** (гл.18/0,20/1) — ровно класс, слепой для нативного матчера. Прочие кандидаты: 转→ранг ×6, 南疆→Наньцзян ×1 — отданы полигону (не подтверждаю дрейф сам). Порог 98% достижим на эффективной; строгий presence занижен местоимённой заменой/инфлексией, НЕ терминодрейфом (как на этапе A).
|
||||
- **B6 вёрстка/reflow** (скрипт `rerun/reflow.py`): диалог→«—» в **49/55 чанков** (404 dash-строки); нарратив местами слит (dst_paras/src_lines mean 0.96). Груборазмерная метрика «скопирована структура 38/55» — **артефакт** (эта вебновелла в ИСХОДНИКЕ ~одно-предложение-на-абзац + диалог легитимно 1:1); **качественное чтение story-глав (гл.6, гл.8) показывает естественные многопредложные русские абзацы, НЕ построчную рубку exp12**. Reflow работает.
|
||||
|
||||
### C. Прочее
|
||||
- **C8 echo-rate**: 1/57 flash-draft (**1.75%**, gl.16/0) — RESCUED эскалацией; финальный cjk_artifact=0. vs прайор книги ~25% (exp10/D18) и 3.5% этапа A. **Резко ниже — v1-reflow-промпт + flash почти не эхают на этом срезе** (front-matter гл.1, эхавшая на этапе A, тут переведена).
|
||||
- **C8 spine**: 25/25 глав, 57/57 чанков, **0 молчаливых потерь**. 55 чанков с закоммиченным переводом; 2 (гл.5/0, гл.20/0) flagged (см. находку 1).
|
||||
- **C9 деньги vs D30.4**: committed=**$0.474628**; доля стадий: editor glm-5 **87.1%** ($0.4132), draft flash 11.6% ($0.0550), эскалация pro 1.4% ($0.0065). vs этап A $0.4081 (моно) = **+16.2%** — В КОРИДОРЕ D30.4 (+15–25% от флипа билингв; билингв +ток. редактора → editor-доля 83.3%→87.1%). Проекция полной книги (2283 гл.) ~$43 (этап A ~$37); НЕ подгоняю под до-флиповый $0.69.
|
||||
|
||||
### Находки для оркестратора (НЕ чинил — вне зоны багфикса / зона пакета/промптов)
|
||||
1. **[quality, НЕ инфра-баг] glm-5 детерминированно лепит `### Глава N: <title>` на ~2/25 зачинах глав** (гл.5/0, гл.20/0), ХОТЯ editor.md прямо запрещает markdown-заголовки. Санитайзер ловит (flag+skip), но **redrive НЕ спасает** (повторяется). Тело перевода этих чанков КОРРЕКТНО — дефект = только ведущая «### ». **Рекомендация: export-нормализация ведущего `#{1,6} ` с строки-заголовка** (D29 уже отметил 8/54 финалов этапа A с ###; экспорт-контракт должен снимать) ИЛИ усиление промпта. Инфра отработала правильно — это находка о поведении модели.
|
||||
2. **[glossary, для владельца] B2 dst-коллизия: 修炼/修行 → «культивация»** (сид v2, подписано владельцем) — читатель не различит два разных src. Раннер варнит на materialize. Подтвердить, что намеренно.
|
||||
3. **[D10] 10 genuine-absent кандидатов дрейфа** отданы полигону на span-сверку (转→ранг, 古月→Гуюэ, 南疆→Наньцзян) — НЕ подтверждаю дрейф сам (author≠reviewer).
|
||||
|
||||
### ВЕРДИКТ
|
||||
- **Инфра-инварианты на новом снапшоте: ДЕРЖАТСЯ** — деньги (committed==SUM/honest-stop-exit1/kill-9-orphan-recovery/resume$0/redrive-D15.3), диспозиции (echo-эскалация+ре-гейт LIVE, flag+skip, live OpenReadOnly-status), санитайзер (2 TP / 0 FP), spine (0 потерь), телеметрия/деньги (+16% в коридоре D30.4). **Плюс: фикс эскалации-флора D24.3 валидирован ЖИВЬЁМ** (то, что на этапе A возвращало эскалацию-пустышку, теперь rescue-ит эхо).
|
||||
- **Читаемо / не читаемо: АРБИТР — ВЛАДЕЛЕЦ** (сэмплы `rerun/owner-sample.md`). Приёмка даёт честный замер, НЕ приговор. **Честно: на чистых story-главах (гл.8) этап A читался УЖЕ прилично — дельта инкрементальная (термины сида v2, нет эха, нет markdown, чуть плотнее), НЕ «нечитаемо→читаемо».** Крупный рычаг билингва — ВЕРНОСТЬ смысла (сверка с исходником), не видна на поверхностном чтении → **решает span-re-gate полигона.** Не преувеличиваю сходимость сигналов (урок eval-aggregation).
|
||||
- **Верность: PENDING** (полигон re-gate; без него пере-прогон не засчитан — D1.1/D34.3).
|
||||
|
||||
### Вопросы владельцу (отдельный блок — после чтения)
|
||||
1. **Читаемо ли?** Прочти `rerun/owner-sample.md` (гл.6, гл.8 + контраст этап A↔пере-прогон) и/или полный `rerun/rerun-ru.txt` (25 глав) холистически, как читал этап A. Перешло планку «лучше фана» (D30.7)? Да/нет.
|
||||
2. **Этап B (срез ~300 глав, ~$5–6): да / нет / потолок?** При «да» — явный `ceilings.book_usd`/`day_usd` (согласие на трату, Р6). Проекция: ~$0.019/гл × 300 ≈ $5.7; рекомендую book_usd≈8, day_usd по темпу.
|
||||
3. **markdown-заголовки (находка 1):** ок ли план «export-нормализация ведущего ###» (не трогая промпт/модель), или усилить промпт glm-5? Гейтит чистоту зачинов глав.
|
||||
4. **B2-коллизия 修炼/修行→«культивация»** (находка 2): оставить (намеренно) или развести (напр. 修行→«совершенствование»)?
|
||||
|
||||
### Вердикт владельца (прочитал выхлоп пере-прогона) — СТРАТЕГИЧЕСКАЯ РАЗВИЛКА
|
||||
**«Лучше, чем было (скорее из-за сида), но всё ещё крайне слабо художественно.»** Две конкретные претензии: **(1)** нет логической редактуры по абзацам, не соблюдаются конвенции русского; **(2)** остаются места, где модель не понимает связей/смысла. Владелец ставит вопрос о жизнеспособности сетапа и о смысле дальнейших тестов/масштаба.
|
||||
|
||||
**Диагноз приёмки (сверено с кодом/контрактом — НЕ баг, а недореализация):** обе претензии = машинерия качества, которая ДИЗАЙНЕРСКИ есть, но НЕ ПОСТРОЕНА (Фаза 2): judge (`role=judge` не исполним — `pipeline.go:170`; C2/C3/fanout не реализованы — `pipeline.go:159`), annotator-пре-пасс (speaker-ID/регистр/чэнъюй — 04-unhappy §124), чтение-вперёд, конвенц-гейты (морфо-род/ты-вы/канцелярит-Галь). Текущий пайплайн = голый линейный черновик→редактор + детерминированные гейты, **ноль оценки качества в контуре, ноль per-segment сигнала «где смысл поехал».** Черновик flash как ПЕРЕВОДЧИК на художественность не мерен НИКОГДА (D30.6). Владелец сам назвал обе проблемы в `START_PROMT.MD` (п.4-конвенции, п.33-чтение-вперёд) и предложил «судью над пайплайном» (п.3 разд.2) — реализован лишь разово как флагман (exp12/13).
|
||||
|
||||
**Решения к ратификации оркестратором (запрошены владельцем):**
|
||||
1. **Этап B (~300 глав) ОТМЕНИТЬ** как инструмент оценки качества — это инфра-масштаб-тест, к художественности отношения не имеет, жжёт токены/40-мин ожидания. Итерация качества — на **≤10 главах**, быстро. 25 глав уже переведены (`rerun-ru.txt`), читаемы как есть.
|
||||
2. **Развилка:** (A) пауза/стоп на дешёвом сетапе; (B) дешёвая фронтир-проба ~5 глав (~$5): фронтир-переводчик+редактор + фронтир-мета-ревьюер → разводит «потолок в моделях vs в архитектуре» ДО решения; (C) строить машинерию Ф2 (annotator+judge+чтение-вперёд+конвенц-гейты) → пилот Ф2.5. Приёмка рекомендует (B) как самый дешёвый вход в (A/C).
|
||||
3. **Планка приёмки впредь = 2 претензии владельца** (абзац-логика/конвенции + понимание смысла), не только инфра. Инфра-веха Ф1 закрыта; вакуум качества — открыт.
|
||||
|
||||
**Guard:** любой фронтир-ревью/проба — на СЫРЬЕ (src+выходы+код), без наших выводов (урок research/17 — анкоринг = сфабрикованная сходимость); пре-регистрация до платных вызовов. **Промт-хендофф оркестратору:** `rerun/ORCHESTRATOR_HANDOFF.md`.
|
||||
|
||||
**Архитектурные пробелы — верифицированы независимо (6 адверсариальных агентов по коду, с калибровкой МОИХ интерпретаций):** факты подтверждены, но часть «дефектов» оказалась осознанными компромиссами → в хендофф поданы откалиброванно. **Реальные пробелы:** кросс-чанк дискурс на стыках (~1–2/глава; редактор не видит главу целиком — гипотеза `draft=чанк/edit=глава`), reference-тома прошлых частей (не построены, Ф2/3), **отсутствие LLM-оценки качества/аннотатора в контуре (главный, Ф2)**. **Откалибровано (НЕ дефекты, требуют эмпирики, не утверждения):** фикс-чанкер 1500/без-ёмкости-модели = quality-first компромисс; промпты lean НО ресёрч промтинга ЕСТЬ (research/15 §Промптинг, exp12/13/10); кэш 20% — присущ по-чанковому переводу, не из-за глоссария. **План владельца (на ратификацию оркестратором):** закрыть цикл приёмочных прогонов (инфра ✅/читаемость ❌ — НЕ «провал»), → ресёрч-сессия по репо → полигон-эмпирика (чанк/биллинг/промт/ретраи/переверстка — последняя тестируется БЕЗ пайплайна) → если подтверждается, доработка бэкенда. Планка впредь = 2 претензии владельца, не только инфра.
|
||||
|
||||
**12.07 (ночь): пере-прогон отревьюирован, ПИВОТ ратифицирован — D35.** 3 оси исполнением по копии re-run store/логам/выходам. **Конфиг-корректность подтверждена** (снапшот несёт v1-reflow/v2-bilingual-reflow/сид-v2 — НЕ старая моно-мина D34.2 → вердикт валиден). **Диагноз «Ф2-недострой, не баг» ПОДТВЕРЖДЁН** (все баг-гипотезы опровергнуты: reflow применён но зеркалит рубленость исходника = промпт-рычаг; билингв-редактор активен sim 0.643; сид инъектится 628 хитов; внутри-чанк-фиксимо/кросс-чанк-~1.28-Ф2 эмпирически верно; флор D24.3 валидирован в проде — эхо-эскалация ch16/0→pro@8000→реальный результат). Ратифицированы 3 пункта пивота (закрытие цикла / планка=2 претензии ИНТЕРИМ-пре-скрин-не-пилот / мерить→строить). Найден 1 реальный баг (major): санитайзер-флагнутые ch5/ch20 экспортятся ПУСТЫМИ (~44% зачина глав выпали; текст правки цел) → бэкенд-фикс + полигон исключает ch5/ch20 из слепых пакетов. Промт ресёрчера выдан НЕЙТРАЛЬНЫЙ (ревью поймало анти-анкоринг-дефект §3 хендоффа — урок D25.10). Fidelity re-gate (D34.3) остаётся жёстким гейтом. Дешёвые фиксы: ведущий `###` из draft (не glm-5), глоссарий разрядов 甲乙丙丁. Очередь: ресёрчер (`RESEARCHER_QUALITY_SESSION_PROMPT.md`) → полигон (нарезка×промпт + фронтир-диагностик + re-gate) → бэкенд под ROI.
|
||||
|
||||
---
|
||||
*(Замеры и скрипты — в `/home/ubuntu/books/gu-zhenren/rerun/`: `audit.sh`, `d10_consistency.py`, `reflow.py`, `extract.py`, `records.json`, `rerun-parallel.txt`, `rerun-ru.txt`, `owner-sample.md`, `FIDELITY_REGATE_HANDOFF.md`, `ORCHESTRATOR_HANDOFF.md`. Всё ВНЕ git.)*
|
||||
|
||||
## Приёмка Ф1 — 蛊真人 zh→ru, этап A (25 глав), 2026-07-10
|
||||
|
||||
Приёмочная сессия по `ACCEPTANCE_SESSION_PROMPT.md`. Прогон реальной книги end-to-end, вердикт по критериям `02-mvp-plan §Приёмка Фазы 1`. **Ничего не закоммичено** (лендинг — оркестратору). Все производные (store.db, срез, выходы, отчёты) — ВНЕ git (`/home/ubuntu/books/gu-zhenren/acceptance/`). Дерево backend/ чистое (мои правки = 0; `docs/research/17-*` — чужая GPT-сессия, не трогал).
|
||||
|
|
|
|||
|
|
@ -11,17 +11,17 @@
|
|||
|
||||
## Структура
|
||||
|
||||
- `architecture/` — синтез. **Источник истины по решениям — [`05-decisions-log.md`](architecture/05-decisions-log.md) (D1–D31); при конфликте с любым доком он выше.**
|
||||
- `architecture/` — синтез. **Источник истины по решениям — [`05-decisions-log.md`](architecture/05-decisions-log.md) (D1–D35); при конфликте с любым доком он выше.**
|
||||
- `01-decisions.md` — принципы Р1–Р10; `02-mvp-plan.md` — фазы и приёмка (v3, 09.07); `03-implementation-notes.md` — контракты Фазы 0; `04-unhappy-paths.md` — ~70 режимов отказа → механизм; `06-memory-risk-registry.md` — реестр рисков банка памяти; **[`07-strategic-review.md`](architecture/07-strategic-review.md) — стратегический аудит (09.07): вердикт end-to-end, топ-риски, курс-коррекции**; `components.puml`/`pipeline.puml` — диаграммы v3 (владелец смотрит PlantUML-расширением VS Code; вручную НЕ рендерить).
|
||||
- `experiments/` — эмпирика «Полигона»: `00-provider-quirks` (читать перед любым вызовом провайдера), `01-token-calibration`, `02-refusal-benchmark`, `03-local-stand`, `04-editor-quality`, `06-local-extraction`, `07-coverage-precision`, `08-cost-model-v2` (актуальная денежная модель), `09-pilot-protocol` (пилот Ф2.5 + поправки D13), `10-explicit-benchmark` (18+ violence-рука канала B), `11-erotica-benchmark` (erotica по трём парам/регистрам — закрытие D14.4, D22).
|
||||
- `research/` — фактура исследований 04–05.07: `01–10` базовые, `11-gap-*` добор критиком, `12-*` режимы отказа/отзывы/таксономии (+ два внешних материала с провенанс-шапками), `13` валидация памяти, `14` адаптивная память, `15` голос и состояние (принят, D21), **`16` ридер-IDE (принят с ревью-шапкой, D29)**, **`17` внешняя критика GPT-5.6 (принят с ревью-шапкой, D25)** — у 16/17 читать шапку прежде тела. ⚠ Часть под superseded-баннерами (01/02/03/04/05/09 и gap-1/2/5) — **читай баннер прежде содержимого**.
|
||||
- `PROGRESS.md` — **журнал** (CURRENT-STATE сверху, ниже хронология; НЕ источник решений).
|
||||
- **Активные хендофф-промты**: [`ORCHESTRATOR_SESSION_PROMPT.md`](ORCHESTRATOR_SESSION_PROMPT.md) (роль оркестратора) · [`BACKEND_SANITIZER_FIX_SESSION_PROMPT.md`](BACKEND_SANITIZER_FIX_SESSION_PROMPT.md) (**2 обязательных фикса санитайзера D33.1 — гейтит пере-прогон**) · [`BACKEND_D152_SESSION_PROMPT.md`](BACKEND_D152_SESSION_PROMPT.md) (пакет D15.2: **этап А ✅ D33; Б реализация v3.1 + В экспорт/override — промт после пере-прогона**) · [`ACCEPTANCE_SESSION_PROMPT.md`](ACCEPTANCE_SESSION_PROMPT.md) (приёмка Ф1: **этап A ✅ D24; этап B заморожен D26**; следующий шаг — пере-прогон 25 глав flash+свзякой D33.6, предусловие из 5 пунктов) · [`POLYGON_PACKAGE4_SESSION_PROMPT.md`](POLYGON_PACKAGE4_SESSION_PROMPT.md) (⚠ до-D30 хвост: сид-часть закрыта exp13, живо только D22.8-остаток — освежить/не запускать как есть). Закрытые (пакеты №3–5, erotica, «Голос», GPT-восхождение → r/17, ридер-IDE → r/16, exp12 → D30, **exp13 → D32**) — в `archive/prompts/`.
|
||||
- **Активные хендофф-промты** (пивот D35→D36, очередь «мерить→строить»): [`ORCHESTRATOR_SESSION_PROMPT.md`](ORCHESTRATOR_SESSION_PROMPT.md) (роль оркестратора) · [`POLYGON_QUALITY_EMPIRICS_SESSION_PROMPT.md`](POLYGON_QUALITY_EMPIRICS_SESSION_PROMPT.md) (**СЛЕДУЮЩИЙ: эмпирика рычагов качества exp14 — нарезка×промпт + фронтир-диагностик + кривая нарезки, D36**) · fidelity re-gate `rerun/FIDELITY_REGATE_HANDOFF.md` (полигон, параллельно, D34.3) · [`POLYGON_PACKAGE4_SESSION_PROMPT.md`](POLYGON_PACKAGE4_SESSION_PROMPT.md) (**ОТЛОЖЕН, пилот-residual:** task-1 закрыт exp13/D32; открыты D22.6 судья-дублёр + D25.7 echo-кал + пилот-пре-рег + P4-хвост — НЕ для exp14, для пилота) · далее — бэкенд под доказанный ROI (стейдж Б/В D15.2 — СВЕЖИЙ промт после развязки; дизайн = спека v3.1). Закрытые в `archive/prompts/` (D36.1): research/18-ресёрчер→D36, exp13→D32, санитайзер-фикс→D33.1, приёмка v2-пере-прогон (цикл ЗАКРЫТ D35), D152-этап-А→D33, пакеты №3–5, erotica, «Голос», r/17, r/16, exp12→D30.
|
||||
- `archive/` — закрытые сессионные промты (только история, инструкции оттуда не исполнять).
|
||||
|
||||
## Статус (2026-07-12)
|
||||
## Статус (2026-07-12, пост-пивот D35)
|
||||
|
||||
Фаза 0 ✅; Ф1-машинерия ✅ (пакеты №1–5 — D20–D28); приёмка этап A ✅ (D24), этап B заморожен (D26). **exp12-диагностика принята (D30): «нечитаемо» = пассивный моно-редактор + сид + построчная вёрстка от промптов + нет санитайзера; дефекты смысла — в черновике. Ратифицированы: флип D1 (редактор БИЛИНГВ, supersede D17.в), reflow, output-санитайзер, глоссарий v2 (спорные — под подпись владельца), exp13 бейк-офф переводчиков.** Очередь: **бэкенд D15.2 (этап А гейтит пере-прогон) ∥ полигон exp13 → единый resnapshot → пере-прогон 25 глав кандидатом (re-gate верности обязателен) → чтение владельца → этап B.** Трек: дешёвые модели сейчас, фронтир потом (конфиг-первая архитектура — D30.7). Решающая точка — пилот Ф2.5; блокеры — билингв-якорь/аннотаторы ≥3 (D25.9-Q1), корпус, проба судьи-дублёра 18+ (D22.6). Ключ xAI: единый, data-sharing, off перед продом (D27).
|
||||
Фаза 0 ✅; Ф1-инфра ✅ (D20–D28); приёмка этап A ✅ (D24). **Путь D26→D35 «качество-первым»:** флип D1 моно→БИЛИНГВ (D30), reflow + output-санитайзер (D30/D33), сид v2 подписан (D34), переводчик flash сохранён (exp13/D32). **Пере-прогон 25 глав связкой выполнен; вердикт владельца: «лучше, но крайне слабо художественно» (2 претензии: абзацы/конвенции + понимание связей).** **ПИВОТ D35:** цикл прогонов ЗАКРЫТ (инфра ✅/читаемость ❌ = не провал; диагноз «Ф2-недострой + near-term промпт/нарезка-рычаги, не баг» верифицирован). Планка = 2 претензии (интерим). Очередь «мерить→строить»: **ресёрч рычагов качества (research/18 Claude + ChatGPT — ждут ревью оркестратором) → полигон-эмпирика (нарезка×промпт + диагностик-фронтир-арм + fidelity re-gate) → бэкенд под доказанный ROI.** Вопрос эмпирики: потолок в дешёвых моделях или в нашей нарезке/промпте. Трек: дешёвые сейчас, фронтир потом (D30.7). Решающая точка — пилот Ф2.5; блокеры — билингв-якорь/аннотаторы ≥3 (D25.9-Q1), корпус, судья-дублёр 18+ (D22.6). Ключ xAI: единый, data-sharing, off перед продом (D27).
|
||||
|
||||
## Доступные ключи от моделей
|
||||
DEEPSEEK_API_KEY, ZAI_API_KEY, KIMI_API_KEY, OPENAI_API_KEY, GEMINI_API_KEY, XAI_API_KEY, MISTRAL_API_KEY
|
||||
|
|
|
|||
|
|
@ -1,9 +1,9 @@
|
|||
# Журнал решений оркестратора — контракт D1–D31 (развязки 04.07 · пост-ревью и пакеты 09–10.07 · приёмка и качество-первым 11–12.07)
|
||||
# Журнал решений оркестратора — контракт D1–D36 (развязки 04.07 · пакеты 09–10.07 · приёмка/качество-первым/пивот 11–12.07)
|
||||
|
||||
> **⟶ КАРТА АКТУАЛЬНОСТИ (ревизия D31, 12.07; исторические записи ниже НЕ переписываются — дисциплина D23.3).** Читая контракт целиком, держи под рукой, что чем перекрыто:
|
||||
> - **Полностью superseded:** **D1 (моно-редактор) → D17 → D30.1 (редактор БИЛИНГВ)** · D9 (ja-приёмка) → D18 (蛊真人 zh→ru; ja — второй прогон) · D17 → D30.1 · скобка D19.4 «ключ без data-sharing» и D20.3 «чистый ключ = блокер пилота» → **D27** (единый ключ С data-sharing, отключение перед продом) · exp04-дефолт «editor grok-4.3» (D3) → D30.1 (grok reasoning-off из редакторских ролей СНЯТ — no-op; кандидат glm-5-билингв; gemini — премиум-эскалация только за санитайзером D30.3).
|
||||
> - **Частично амендировано:** D3 (канал B → D14.1/D19.1 + оговорки D22.5/D22.6; апекс-слаг `-preview` — D22.4; draft под вопросом exp13 — D30.6) · D6 («off/minimal для draft/edit» эродирован: draft thinking-ON принудительно, editor-off снят D30.1; живы per-роль принцип и D6.2-буфер) · D10 (+D24.2 alias-слепое пятно, истинная консистентность ≈99.5%) · D11-числа → exp08 → **D30.4** (флип D1 = +15–25%, ~$0.85/ранобэ; «$1.5–2» = неподписанная опция Б) · D12 (+D24.3 флоры max_tokens; +D29.1в rollup — амендмент вердикт-правила) · D13.1-арм из решающего → ПОДТВЕРЖДАЮЩИЙ (D30.1); +D25.3 prefix-анализ судьи · D14.2 закрыт D19.1/D22.4; D14.4 закрыт D22.1 · D15.3 исполнен; спека D15.2: v2→v3→v3.1 (D22.2), реализация = текущий пакет (D30.9) · D24.4 +D28.1 (precision/recall-трейдофф; hard-gate требует пере-замера) · порядок D24.5 отложен D26.1 (этап B — после читаемых 25 глав).
|
||||
> - **Живое ядро без изменений:** D2 (+новый гейт-класс D30.3), D4, D5, D7, D8, D10-механизм, D12-таксономия отказов, D16, D18, D19.1–19.2, D21 (Ф2-механизмы voice/address/reveal), D22.5–22.7, D23 (golden = инвариант №8), D24–D31 — действующая голова контракта.
|
||||
> - **Живое ядро без изменений:** D2 (+новый гейт-класс D30.3), D4, D5, D7, D8, D10-механизм, D12-таксономия отказов, D16, D18, D19.1–19.2, D21 (Ф2-механизмы voice/address/reveal), D22.5–22.7, D23 (golden = инвариант №8), D24–D36 — действующая голова контракта (D35 = пивот качество-первым; D36 = приёмка research/18 + промт полигон-эмпирики).
|
||||
|
||||
Ответ на вопросы бэкенд-сессии (PROGRESS §«Вопросы от бэкенда», §«[НУЖНО РЕШЕНИЕ] перед Фазой 1» — с ревизии D31 в `archive/PROGRESS-2026-07-04-10.md`) и полигона (think-режим). Каждое решение прошло адверсариальную панель из 3 критиков (research / экономика / исполнимость в коде Фазы 0); ни одно не отклонено, все уточнены. Это **контракт Фазы 1** — бэкенд исполняет отсюда; при конфликте с буквой 01-decisions/02-mvp-plan — источник истины здесь (потом сольём в основные доки).
|
||||
|
||||
|
|
@ -422,6 +422,59 @@ D1 остаётся дефолтом Фазы 1 (менять конфигура
|
|||
|
||||
Мини-сессия по `BACKEND_SANITIZER_FIX_SESSION_PROMPT.md`. Верификация исполнением (сфокусированный агент в scratchpad-копии, все 6 осей): **ACCEPT, залендено.** (а) хвостовой класс теперь ловит «Основные правки для справки:» (gemini-утечка A5/5_1) + colon-вариант, НЕ фаерит нарратив «Основные правки внёс редактор» — 2 fire + 1 clean-пин; (б) класс «битые словоформы» СНЯТ целиком (backend-разбор: порог не отделяет «около колонны» от «Первок предок», у реального доля перекрытия даже ниже; канонический дефект и так не ловился → умнее убрать шумный класс, чем подкручивать), оставлены 2 zero-FP сигнатуры (невалид ь/ъ, кир+лат гомоглиф) — 3 clean-пина «около колонны/колодца», «стало талой»; мелочи D33.2 (# # #-разделители, латиница-бренды) сужены. Golden re-capture — дифф-класс РОВНО version-fold (sanitizer-v1→v2; маскированный дифф пуст, 0 дрейфа disposition/flag/final_text/cost/postcheck/injected_ids/term-order, 206=206, регенерация байт-в-байт). build/vet/test-race зелёные, скоуп 3 файла + журнал, stdlib-only, контрабанды нет. **Принятая граница (документируется рядом с recall-gap «Первок предок»):** строка-ОПЕНЕР абзаца «Основные правки … для справки предоставил …» ещё фаерит — редакторский регистр, не проза; неизбежная поверхность «для справки»-гейтящей сигнатуры (снять = потерять целевую gemini-утечку); precision-over-recall → редкий FP деградирует один чанк, не портит выход. **Санитайзер как блокер пере-прогона снят** (D33.6-предусловие №1 закрыто); остаётся сид v2-финализация (полигон) + единый resnapshot.
|
||||
|
||||
## D34. Сид v2 ПОДПИСАН владельцем + гейт repoint приёмочного конфига перед пере-прогоном (12.07, оркестратор). ✅
|
||||
|
||||
Полигон сдал сид v2 под подписью владельца (закрытие D32.2/D30.5). Сверено прямой проверкой файла (`guzhenren-seed-v2.yaml`): все спорные → approved с ФАКТИЧЕСКИМИ формами владельца (часть переопределена против sign-off-таблицы — решения владельца, в протокол):
|
||||
|
||||
1. **Владельческие формы (инвариант — в D-лог как факт):**
|
||||
- 人祖 → **Жэнь Цзу** (НЕ «Первопредок»; транслит).
|
||||
- 花酒行者 → **Монах Цветочного Вина** (НЕ «Странник Цветов и Вина»/«Винный Странник»).
|
||||
- 本命蛊 → **гу Жизни** (возврат к v1; НЕ «жизненный гу»).
|
||||
- 古月山寨 → **деревня Гуюэ** (+ выровнены 白家寨/熊家寨 → «деревня Бай/Сюн» ради консистентности 寨).
|
||||
- 元石 → **первобытный камень** (+мн.ч.; НЕ «изначальный»/«первокамень»).
|
||||
- Подтверждены без изменений: 蛊虫 гу-червь · 修炼/修行 культивация · 空窍 апертура · 元海 море истинной ци.
|
||||
- Род свободного «гу» (蛊) → **мужской** (владелец принял; документарно — 蛊 инвариантен, НЕ на hot-path A3 → не hard-constraint, согласование мягкое).
|
||||
Провенанс: `eval/exp13_seed_signoff.py` (воспроизводимый трансформ) + лог `diag/glossary_v2_signoff_applied.md`. 10 оставшихся draft — не-спорные v1-остатки (甲乙丙丁 разряд А–Г, 南疆 Наньцзян, 沈嬷嬷, пара гу-имён) — инъектятся ⟨проверить⟩ (soft), resnapshot не держат; смести отдельным проходом при желании владельца (не блокер).
|
||||
|
||||
2. **⚠ ГЕЙТ: приёмочный конфиг РАССИНХРОНЕН — repoint ОБЯЗАТЕЛЕН до пере-прогона** (поймал полигон, подтверждено прямой сверкой). `acceptance/book.yaml` → `glossary_seed: guzhenren-seed.yaml` (сид **V1**); `pipeline-acceptance.yaml` → `prompt_version: v0-draft/v1-monolingual` (**моно-редактор, БЕЗ reflow** — до-D30 состояние). Наивный `--resnapshot` на нём тихо заснапшотит СТАРЫЙ сломанный конфиг → весь пере-прогон впустую (класс «тихо неправильный снапшот», F1/D15). **Требование к пере-прогону (в ACCEPTANCE-промт, усилено):** первый шаг сессии — ПЕРЕСОБРАТЬ приёмочный конфиг из БОЕВОГО `pipeline-c1.yaml` @HEAD (post-D33: draft=deepseek-v4-flash `v1-reflow`, editor=glm-5 `v2-bilingual-reflow`, escalate_to=deepseek-v4-pro, sanitizer.enabled=true) + book-side дельты: `book.yaml glossary_seed → guzhenren-seed-v2.yaml`, `escalation.budget_usd>0` (D22.11). **Свежий store** (новая БД — избежать stale-чекпоинтов старого прогона; «единый resnapshot» = все правки в одном новом снапшоте, НЕ --resnapshot старого). Промпты/пороги НЕ трогать — брать из pipeline-c1.
|
||||
|
||||
3. **Fidelity re-gate (D30.1, закрытие вакуума D1.1) — НЕЗАВИСИМЫМ судьёй.** Пере-прогон переводит; **fidelity re-gate гонит ПОЛИГОН** (не сессия-переводчик — author≠reviewer): span-цитирующий судья верности reasoning-ON + охота на класс инверсий правки (exp12: билингв-редактор внёс «пожертвуй мной»). Без него пере-прогон НЕ засчитан.
|
||||
|
||||
4. **Гейт пере-прогона СНЯТ по всем блокерам:** санитайзер-фикс (D33.1) ✅, сид v2 подписан (D34.1) ✅, переводчик flash (D32) ✅, эскалация не тронута ✅. Осталось: repoint конфига (D34.2, делает сессия пере-прогона первым шагом) → пере-прогон 25 глав связкой с re-gate → **чтение владельца** (арбитр читаемости).
|
||||
|
||||
## D35. Пивот после пере-прогона: цикл прогонов закрыт (инфра ✅/читаемость ❌ = не провал), планка = 2 претензии владельца, «мерить→строить» (12.07, оркестратор). ✅
|
||||
|
||||
Владелец прочитал пере-прогон 25 глав связкой (flash `v1-reflow` → glm-5 `v2-bilingual-reflow` + сид v2 + reflow + санитайзер): **«лучше (из-за сида), но крайне слабо художественно»** — 2 претензии: (1) нет логической редактуры абзацев / конвенций русского; (2) места, где модель не понимает связей/смысла. Внешнее ревью (3 оси исполнением по копии re-run store + логам/выходам; одна ось упала на форматировании, факты закрыты соседними). **Конфиг-корректность подтверждена (снапшот несёт v1-reflow/v2-bilingual-reflow/сид-v2 — НЕ старая моно-мина D34.2 → вердикт валиден).** Решения:
|
||||
|
||||
1. **Диагноз ПОДТВЕРЖДЁН исполнением: «слабо» — настоящий недострой машинерии качества (Ф2) + near-term промпт/нарезка/глоссарий-рычаги, НЕ тихий баг.** Все баг-гипотезы опровергнуты: reflow ПРИМЕНЁН (блочные абзацы 1.6 предл./строка, не построчно этапа A — но ЗЕРКАЛИТ рубленость исходника, не сливает в русские абзацы = промпт-рычаг, фиксимо сейчас); билингв-редактор АКТИВЕН (draft→final sim 0.643, 34/55 сильно правлены — не пассивен как моно exp12); сид v2 инъектится (628 хитов; Монах Цветочного Вина/гу Жизни/первобытный камень в выходе). Различие полигона **внутри-чанк (промпт-фиксимо: чанк пакует ~34 абзаца) / кросс-чанк (~1.28 стыка/глава = Ф2)** — эмпирически верно. **Флор D24.3 валидирован в проде** (эхо-эскалация ch16/0 → pro@max_tokens=8000 → реальный результат 5966 симв., не пустышка/length — прод-подтверждение фикса пакета №5).
|
||||
2. **РАТИФИЦИРОВАНО (а) закрытие цикла приёмочных прогонов** — инфра ✅ (деньги D15.3-направление, kill-9, echo-эскалация, санитайзер 2TP/0FP, spine 25/25) / читаемость ❌ (блок на непостроенной Ф2) = **НЕ провал** (инфра — переиспользуемая ценность); идентичный пере-прогон = 0 decision-relevant информации (потолок структурный, стохастичный ре-дро не двигает). **(б) планка приёмки впредь = 2 претензии владельца** — но **ЯВНО ИНТЕРИМ пре-скрин** («лучше фана», D30.7), НЕ вердикт пилота Ф2.5 (D25.2-гейт: диагностики не подменяют/не разбавляют пилот; ≥3 аннотатора + билингв-якорь по-прежнему гейтят настоящий вердикт). **(в) последовательность «ты→ресёрчер→полигон→бэкенд» (мерить→строить)** — Р2/эмпирика-первой; бэкенд строит только под доказанный полигоном ROI.
|
||||
3. **Ключевой невыжатый рычаг подтверждён: ось «нарезка × промпт»** — (глава целиком | чанк) × (сильный дискурс-промпт | текущий) — exp04/12/13 её НЕ крутили (варьировали только МОДЕЛЬ в фикс-нарезке; reflow-промпт уже вшит). Дешёвая высокоценная проба. **Фронтир-арм (владелец согласовал трату)** — ДИАГНОСТИКА потолка (модели vs наша нарезка/промпт), D30.7-совместимо (не прод-обязательство).
|
||||
4. **РЕАЛЬНЫЕ фиксы до качественной работы:** (а) **[major] экспорт-баг:** санитайзер-флагнутые чанки экспортятся ПУСТЫМИ (ch5/0, ch20/0 — ~44% зачина глав 5/20 молча выпали; текст правки цел, дефектен только ведущий `###`). Фикс: экспорт стрипает ведущий заголовок ИЛИ фолбэк на draft, НЕ дропает (бэкенд-fix-лист; связано с D29.1а export-нормализация). **Полигон ОБЯЗАН исключить/починить ch5/ch20 до слепых пакетов** (дыры спутают художественную оценку). (б) заголовок `###` рождается в ЧЕРНОВИКЕ deepseek (не glm-5 — атрибуция минор-бэклога исправлена) → фикс целить в translator.md/экспорт. (в) дешёвый глоссарий: засидить разряд 甲乙丙丁/资质 (raw-китайский в ch4/1 = видимый худ-дефект; часть претензии 2 глоссарий-адресуема, не Ф2). (г) **fidelity re-gate (D34.3) остаётся ЖЁСТКИМ гейтом** — не waived под «цикл закрыт»; квантифицирует претензию 2 + ловит инверсии активного редактора (ch11/0 аутлайер: редактор расширил 3009→4631 при draft finish=stop, sim 0.064 — вопрос верности).
|
||||
5. **Промт ресёрчера — НЕЙТРАЛЬНЫЙ (анти-анкоринг D25.10):** ревью поймало, что §3 хендоффа встраивает наши выводы (лестница Ур.3 draft=чанк/edit=глава, рамка «без Ф2») при декларации анти-анкоринга — ровно D25.10-ловушка. Промт (`RESEARCHER_QUALITY_SESSION_PROMPT.md`) даёт только 2 претензии + сырьё/код, спрашивает ОТКРЫТО (на какой гранулярности/промпте работает дискурс-литперевод zh→ru, где потолок, что рекомендует фронтир/академия/MTL-прайор-арт для кросс-чанк переверстки + понимания связей); наши гипотезы (лестница, draft=чанк) — НЕ выдавать, ресёрчер фиксирует свою рамку ПЕРВЫМ.
|
||||
6. **Промт полигона (после отчёта ресёрчера) — эмпирика:** ось нарезка×промпт (прямыми вызовами, чанк-арм воспроизводит прод-инъекцию как якорь), фронтир-арм (гарды: эхо-скрин/исключить grok на архаичной ch1 — D22.5; self-family exclusion для фронтир-мета-ревьюера; per-call кап + пре-регистрация — exp13 перерасход +10%), кривая размер-чанка↔качество↔биллинг↔ретраи, fidelity re-gate, слепые пакеты владельцу; методика-guard D32.4 (fidelity-first, leave-one-out, катастроф-скрин, per-call кап, независимость сигналов). Fidelity re-gate (`rerun/FIDELITY_REGATE_HANDOFF.md`) — независим от ресёрчера, полигон может гнать параллельно.
|
||||
7. **Бэкенд (§5 хендоффа) — не сейчас, только под доказанный ROI.** Кандидаты: развязка `draft=чанк/edit=глава` (Ур.3 — **runner-уровень**: per-stage гранулярность + TM/resume-ключ, Р2/Р6), сильный дискурс-промпт, адаптив-к-главе размер, затем Ф2 (аннотатор/судья/reference-тома). Минор-бэклог: экспорт-`###`-нормализация (D29.1а), 修炼/修行→«культивация» (владелец подписал D34.1 — намеренно).
|
||||
|
||||
## Сопутствующие правки доков (оркестратор, 09.07)
|
||||
|
||||
`02-mvp-plan.md` → v3 (мёртвые пороги/интерим-18+/фазовые списки синхронизированы с D-логом); обе `*.puml` → v3 (убраны Opus/BYOK/«≤2×», дорисованы ре-гейт эскалации, три класса отказов D12, человек в петле, фазовые пометки); superseded-баннеры на `research/01, 02, 03, 04, 09`; провенанс-шапки на `research/12-architecture-as-antipattern.md` и `12-common-failures.md` (происхождение не зафиксировано — до уточнения владельцем числа оттуда не абсорбировать как факты); закрытые промты → `docs/archive/prompts/`; онбординг: корневой `CLAUDE.md` + `backend/README.md` + `eval/README.md`.
|
||||
|
||||
## D36. Приёмка research/18 (два независимых отчёта рычагов качества) + выдача промта полигон-эмпирики (12.07, оркестратор №4). ✅
|
||||
|
||||
Оба отчёта (`research/18-quality-levers.md` — сессия-ресёрчер Claude, анти-анкоринг; `research/18-quality-levers-chatgpt.md` — параллельный ChatGPT, запущен владельцем) отревьюированы и залендены с ревью-шапками. Внешнее ревью — мультиагентный воркфлоу 26 агентов ($0, refute-by-default, author≠reviewer; первоисточники через web + реплика сырья `rerun/records.json`+`rerun-ru.txt`; заморозка §A сверена крипто).
|
||||
|
||||
1. **ВЕРИФИКАЦИЯ (исполнением/первоисточники):** (а) **§A-заморозка Claude sha256 `44f90364…` воспроизведена побайтно из закоммиченных байтов BEGIN..END → MATCH** → §A доказуемо не редактировалась после заморозки (мой самый сильный анти-ретро-подгон контроль). (б) **57/57 несущих цитат СУЩЕСТВУЮТ — 0 сфабрикованных**, включая ВСЕ «2026»-препринты (2601.08070/2605.31056/2605.29800/2605.13596/2605.13368/2511.09796 — резолвятся к заявленным заголовкам; главный риск галлюцинации фан-аута снят). 50/57 claim-fidelity полная, 7 «частично» (источник реален, атрибуция переисчерпана). (в) **Эмпирика воспроизведена:** ch5.0 (5425→ПУСТ `sanitizer_defect`)+ch20.0 ТОЧНО; CJK-утечка 13 финалов точно (draft-«21» включает U+3000-отступ → настоящих 9); 41/51 ~1:1 в допуске; ChatGPT-«95.3% строк-абзацев» точно (но частично артефакт формата — метрика Claude «медиана 1 предл./абзац» проб́ивнее); gl.7-инверсия/gl.8-сплющивание фактически ЕСТЬ (тяжесть — на fidelity re-gate). (г) **Ван Цуй (несущий вклад) ПОДТВЕРЖДЁН по ТЕЛУ статьи** (скептик-агент декодировал CID/Identity-H шрифт PDF ~42к симв.: 5 техник + причастные/деепричастные обороты + подчинение + прескриптивная необходимость; Вестник МГУ Сер.22 2024№3 с.86–105, рецензирован).
|
||||
|
||||
2. **ВЕРДИКТЫ. Claude — ACCEPT_WITH_FIXES** (5 поправок в ревью-шапке, §A заморожена → правки в шапке+§E: [цитата] DocRepair-числа принадлежат D19-1081/1909.01383 не P19-1116 — числа ВСЕ верны; TransAgents двойная-метка PP/TACL; Z5 автор Dingxu Shi не Li&Thompson; [рамка] Ван Цуй = прескрипция ТЕХНИКИ zh→ru, не «связующая норма языка» — норму держат Розенталь/Правила-1956; «пост-черновая регрессия > 2 претензий» пере-возвышена — ярчайший кейс ch5-void = экспорт-баг, не порча смысла). **ChatGPT — ACCEPT** (цитатно-чист на всех спот-чеках, хеджирование дисциплинировано, §C — самый прямо-исполнимый скелет полигона; оговорки: §A-заморозка НЕ воспроизводима из документа (плейсхолдер вместо байт-маркеров) = дисконт на вес сходимости; §C4-гейт не ссылается на мандатный re-gate D34.3).
|
||||
|
||||
3. **«Тройная сходимость» — калибрована (не разворот, D25.10 взята честно).** Оговорка про общую внешне-лит-ногу присутствует; уточнения оркестратора: (а) вторая необъявленная общая нога — оба §A читали одно сырьё/код (совпадение по «изоляция чанков/инертный reflow» тоже не независимо); (б) цитатные базы двух отчётов почти НЕ пересекаются (~3 общие статьи) → где литература расходится, совпадение вывода сильнее; (в) ChatGPT-заморозку класть с дисконтом. Итог: карта «строить» держится, но не как «3 независимых голоса» — как «2 внешние карты (с общими ногами) ⟂ эмпирика команды».
|
||||
|
||||
4. **АБСОРБЦИЯ.** (а) **Ван Цуй-контент (5 техник + причастно-деепричастный инструмент) → в дискурс-reflow-промпт полигона** — прямой zh→ru ответ на вопрос владельца «конвенция языка, не стиль автора» (апгрейд research/16 «слияние дискреционно» → «слияние — требуемая переводческая операция, и КАК»). (б) **Экспорт-баг ch5/ch20 подтверждён двумя независимыми репликами** → усиливает бэкенд-fix D35.4a (не новый). (в) **CJK-утечка в ФИНАЛ (13 строк, вкл. 特产 ch8, 资质乙等-разряды ch4.1)** — часть внесена редактурой → цель детерм. reflow-постпроцессора (§C#4 «CJK-глиф=0») + глоссарий-засид 甲乙丙丁 (D35.4в). (г) слой «пакет конвенций пары» — идея в бэклог архитектуры (зона оркестратора/бэкенда), стройка под ROI.
|
||||
|
||||
5. **ВЫДАН промт полигон-эмпирики `POLYGON_QUALITY_EMPIRICS_SESSION_PROMPT.md`** (D36; ратифицирует §C обоих отчётов в исполнимый дизайн): скелет §C ChatGPT (P0-baseline → армы с фаза-тегами → пре-рег метрики/гейты → дерево решений) + графт из Claude (Ван Цуй-контент reflow-промпта, COGS-модель кириллица-фертильность/cache-ordering, привязка мандатного re-gate D34.3); **добавлены** недостающая ячейка `текущий-промпт × глава` (полный 2×2 нарезка×промпт — оба отчёта её не крутили) и явный чистый baseline; **ch5/ch20 исключены/чинятся до слепых пакетов** (дыры спутают худ-оценку). Гарды: fidelity-first, leave-one-out, катастроф-скрин, per-call кап (exp13 +10%), эхо-скрин/grok-off на архаичной ch1 (D22.5), self-family exclusion фронтир-мета-ревьюера, пре-регистрация до платных вызовов. Fidelity re-gate (D34.3) — параллельно, независимо.
|
||||
|
||||
6. **Курс не разворачивается.** research/18 — вход эмпирики, НЕ приговор; планка = 2 претензии владельца (ИНТЕРИМ пре-скрин, D35); пилот Ф2.5 остаётся решающей точкой и не разбавляется. Порядок: полигон-эмпирика → владелец читает результат → решение «дешёвый трек дотягивает / нужен фронтир / нужна Ф2» → бэкенд под доказанный ROI.
|
||||
|
||||
## D36.1 — Документационная гигиена + подтверждённые бюджеты ключей (12.07, оркестратор №4, по запросу владельца). ✅
|
||||
|
||||
1. **Заархивированы 5 спент/superseded промтов** в `docs/archive/prompts/` (git mv, история журнала/D-лога НЕ переписана — D23.3, только карта актуальности): ресёрчер research/18 (→D36), exp13 (→D32), санитайзер-фикс (→D33.1), **приёмка v2-пере-прогон** (цикл прогонов ЗАКРЫТ D35 — идентичный ре-прогон = 0 инфо), **D152-этап-А** (→D33; этап Б/В — СВЕЖИЙ промт после качественной развязки, дизайн-оф-рекорд = спека D15.2 v3.1). **НЕ архивирован `POLYGON_PACKAGE4_SESSION_PROMPT.md`** (проверка по запросу владельца): как сессия НЕ запускался; отработана только task-1 сид-мн.ч. (влита в exp13/D32); **residual ЖИВ и НЕ пуст — пилот/18+/echo-трек, ОРТОГОНАЛЬНО exp14:** D22.6 судья-дублёр (НАЗВАННЫЙ блокер пилота), D25.7 echo-калибровка, миграция `memory_eval` с gemini-2.5-flash (EOL 16.10), пилот-пре-рег (`09-pilot-protocol.md`), D21.9 P4 fidelity-хвост, D22.8-минорки. Оставлен активным как residual-трекер со статус-баннером; НЕ вносить в exp14 (разбавит SFW-пре-рег); переупакуется в пилот-преп-промт при активации пилота. **Активны:** `ORCHESTRATOR_*` + `POLYGON_QUALITY_EMPIRICS_*` (exp14) + `POLYGON_PACKAGE4_*` (пилот-residual, отложен). README-карта актуализирована; титул контракта D35→D36.
|
||||
2. **Бюджеты ключей подтверждены владельцем (12.07):** OpenAI ~$9, Gemini ~€2.6, DeepSeek/ZAI(glm)/Kimi/xAI(grok)/Mistral ~$9 каждый; ДРУГИХ ключей нет; «полигон делает что нужно в этих рамках» → снимает блокер фронтир-`ceiling` из D36. **Импликация exp14:** Gemini-бюджет крошечный (€2.6, thinking = аддитив-биллинг) → фронтир-переводчик/редактор преим. **GPT-5** ($9); Gemini — экономно, лучше кросс-семейным мета-ревьюером (self-family exclusion); grok ($9) доступен, НЕ на архаичной ch1 (D22.5); Claude/Opus нет. Per-call predicted-cost кап + пре-рег остаются (exp13 +10% урок). Записано в промт полигона.
|
||||
|
|
|
|||
|
|
@ -17,11 +17,18 @@
|
|||
3. `backend/README.md` (инварианты, golden-гард, как гонять) + `00-provider-quirks.md` (шапка + строки редактора БИЛИНГВ/санитайзер) + `08-cost-model-v2.md` (читать через D30.4: ~$0.85/ранобэ).
|
||||
4. Материал: книга `/home/ubuntu/books/gu-zhenren/guzhenren-gb18030.txt`; **сид v2** (финализирован exp13); кандидат-конфиг пере-прогона (собран из пакета D15.2 + переводчик exp13).
|
||||
|
||||
## ⚠ ШАГ 0 (ОБЯЗАТЕЛЕН — repoint конфига до любого прогона; D34.2)
|
||||
|
||||
Приёмочный конфиг этапа A **РАССИНХРОНЕН** с боевым (после D15.2): `acceptance/book.yaml` смотрит на сид **V1**, `pipeline-acceptance.yaml` несёт `v0-draft/v1-monolingual` (**моно-редактор, БЕЗ reflow**). Наивный `--resnapshot` тихо заснапшотит СТАРЫЙ сломанный конфиг → весь пере-прогон впустую. **Пересобери приёмочный конфиг из БОЕВОГО `backend/configs/pipeline-c1.yaml` (HEAD, post-D33) + book-side дельты, СВЕЖИЙ store (новая БД — не переиспользуй store этапа A):**
|
||||
- `pipeline-acceptance.yaml` = байт-в-байт из `pipeline-c1.yaml`: draft `deepseek-v4-flash` **`prompt_version: v1-reflow`** `escalate_to: deepseek-v4-pro`; editor `glm-5` **`prompt_version: v2-bilingual-reflow`**; `gates.sanitizer.enabled: true`; `escalation.budget_usd > 0` (D22.11 — иначе echo-эскалация не стреляет). Промпты — из `backend/prompts/` (reflow+билингв, уже залёнжены).
|
||||
- `book.yaml`: `glossary_seed → /home/ubuntu/books/gu-zhenren/guzhenren-seed-v2.yaml`; потолки `book_usd`/`day_usd` из этапности.
|
||||
- Сверь исполнением: `tmctl status`/snapshot до прогона показывает `v1-reflow`/`v2-bilingual-reflow` + сид v2-хеш, НЕ старые. Только потом translate.
|
||||
|
||||
## Конфигурация пере-прогона (по контракту, не по вкусу)
|
||||
|
||||
- **Стадии:** draft = **переводчик-победитель exp13** (интерим deepseek-v4-flash, thinking ON) → editor = **БИЛИНГВ (D30.1), кандидат glm-5-билингв** (gemini — премиум-эскалация ТОЛЬКО за санитайзером, течёт преамбулой; grok reasoning-off НЕ ставить — no-op); output-санитайзер включён; reflow-промпты (без «Сохраняй разбивку на абзацы»); сид v2.
|
||||
- **Деньги:** `escalation.budget_usd > 0` (echo-эскалация); потолок книги/дня из этапности; ledger-числа сверять с D30.4 (~$0.85/ранобэ — не с до-флиповым exp08 $0.69).
|
||||
- Гейты — дефолт конфига; санитайзер в вердикт-оси. Промпты/пороги менять НЕЛЬЗЯ (это уже сделано пакетом D15.2 — ты гонишь готовый снапшот).
|
||||
- **Стадии (= pipeline-c1 post-D33):** draft = **deepseek-v4-flash** (thinking ON; НЕ pro — D32) → editor = **glm-5 БИЛИНГВ** (D30.1; gemini — премиум-эскалация ТОЛЬКО за санитайзером; grok reasoning-off НЕ ставить — no-op); output-санитайзер enabled (вердикт-ось); reflow-промпты; сид v2.
|
||||
- **Деньги:** `escalation.budget_usd > 0`; ledger-числа сверять с D30.4 (~$0.85/ранобэ, билингв-вход +60% токенов редактора — не с до-флиповым exp08 $0.69).
|
||||
- Промпты/пороги/модели менять НЕЛЬЗЯ — брать из `pipeline-c1` (это уже сделано пакетом D15.2/D33; ты собираешь конфиг из боевого, не изобретаешь).
|
||||
|
||||
## Этапность (деньги по нарастающей, с чекпоинтом владельца)
|
||||
|
||||
|
|
@ -36,7 +43,7 @@
|
|||
3. **Санитайзер (новый, D30.3):** проверь, что он ловит классы exp12 (сервис-преамбула gemini, битые словоформы, латиница-врезки, markdown-`###`) и НЕ даёт ложных на чистом тексте; счётчик срабатываний в паспорт.
|
||||
|
||||
**B. Качество стало читаемым (главная цель пере-прогона):**
|
||||
4. **Re-gate верности (ОБЯЗАТЕЛЕН — D30.1):** билингв-редактор мог купить гладкость ценой смысла. Span-цитирующий судья reasoning-ON (раздельно стиль/верность) + ручная охота на **класс инверсий правки** (exp12: A2 внёс «пожертвуй мной», «молва считал» — которых в черновике не было). «Гладко-неверное» не должно пройти молча (D1.1). Скаляр-судьи без спанов НЕ использовать (урок exp12).
|
||||
4. **Re-gate верности (ОБЯЗАТЕЛЕН — D30.1/D34.3): гонит ПОЛИГОН независимым судьёй** (author≠reviewer — не ты-переводчик). Билингв-редактор мог купить гладкость ценой смысла. Span-цитирующий судья reasoning-ON (раздельно стиль/верность) + охота на **класс инверсий правки** (exp12: A2 внёс «пожертвуй мной», «молва считал» — которых в черновике не было). «Гладко-неверное» не должно пройти молча (D1.1). Скаляр-судьи без спанов НЕ использовать (урок exp12). Твоя часть — отдать финальные выходы полигону; **без пройденного re-gate пере-прогон НЕ засчитан**.
|
||||
5. **Консистентность D10 ≥98%** по процедуре Р7/D10 — **методику приложи СКРИПТОМ** в артефакты (числа этапа A третьей стороной не воспроизводились — D24); учти **alias-слепое пятно** (D24.2: вложенный алиас внутри longest-match полного имени невидим флаггеру — гл.18/0 蛊真人); D10-флаггер теперь осмыслен (сид v2 + post-check union D24.4).
|
||||
6. **Вёрстка:** замерь консистентность репараграфизации после reflow (D30.2) — 1:N на диалоге норма (Розенталь), описательное слияние слабее; парность абзацев src↔dst (метод research/16 §0 — пиновать определение абзаца).
|
||||
7. **Сэмплы владельцу:** слепые/удобочитаемые пакеты (тот же monitor-паттерн exp12, вне хостинга — копирайт) — оригинал + новый перевод + опционально старый этап A для контраста.
|
||||
45
docs/archive/prompts/RESEARCHER_QUALITY_SESSION_PROMPT.md
Normal file
45
docs/archive/prompts/RESEARCHER_QUALITY_SESSION_PROMPT.md
Normal file
|
|
@ -0,0 +1,45 @@
|
|||
# Промт: сессия-РЕСЁРЧЕР — как дотянуть текущую фазу до минимально-художественного zh→ru (2026-07-12, D35.5)
|
||||
|
||||
---
|
||||
|
||||
## Кто ты и зачем
|
||||
|
||||
Ты — **независимый ресёрчер** TextMachine (Go-пайплайн издательского перевода вебновелл zh→ru дешёвыми LLM). Пере-прогон 25 глав реальной книги (蛊真人) дал владельцу вердикт: **«лучше, но крайне слабо художественно»**, с двумя претензиями:
|
||||
1. **нет логической редактуры абзацев / конвенций русского** (текст рубленый, не собран в русские литературные абзацы);
|
||||
2. **места, где модель не понимает связей/смысла** (провалы связности/понимания на дистанции).
|
||||
|
||||
Твоя задача — **ресёрч-доклад: как дотянуть ТЕКУЩУЮ фазу до минимально-художественного уровня**. Код не пишешь; отчёт — ВХОД эмпирической сессии полигона. Зона записи: `docs/research/18-quality-levers.md` + секция в `PROGRESS.md`. Ничего не коммитить (лендит оркестратор после ревью первоисточников — как research/15/16/17).
|
||||
|
||||
## ⚠ Анти-анкоринг (нарушение обесценивает работу — урок D25.10)
|
||||
|
||||
Смысл: если ты сначала прочтёшь ГИПОТЕЗЫ команды о фиксе, ты поедешь по нашей колее и пропустишь развилку. Поэтому свою карту решения строишь ДО знакомства с нашими выводами. Трёхфазный протокол:
|
||||
|
||||
### Фаза 1 — «Чистый лист» (§A отчёта, замораживается)
|
||||
Читаешь ТОЛЬКО: (а) две претензии владельца выше; (б) СЫРЬЁ пере-прогона — исходник `guzhenren-gb18030.txt`, выходы `rerun/` (rerun-ru.txt, records.json) — чтобы видеть саму слабость; (в) МЕХАНИЗМ как есть — `backend/internal/pipeline/chunker.go` (как режем), `backend/prompts/translator.md` + `editor.md` (текущие промпты). **НЕ читаешь** наши решения/гипотезы: НЕ `05-decisions-log.md`, НЕ хендоффы, НЕ выводы приёмки о фиксах.
|
||||
|
||||
Построй СВОЮ карту «проблема → механизм» с собственным поиском литературы и индустрии (каждый факт — URL+дата; препринт ≠ peer-review; вендор-клейм ≠ замер). Обязательные оси (реши их СВОИМ путём):
|
||||
- **Дискурс-уровень литперевода zh→ru:** на какой ГРАНУЛЯРНОСТИ (предложение/абзац/сцена/глава/окно) и с каким ПРОМПТОМ дискурсный литперевод реально работает? Где потолок — в моделях или в организации (нарезка/контекст/промпт)? Прайор-арт: как MTL-пайплайны (фан-стек, коммерческие, академические DelTA/TransAgents-класс) режут и переверстывают.
|
||||
- **Претензия 1 (абзацы/конвенции):** что фронтир/академия рекомендуют для переверстки в целевые (русские) абзацные нормы — few-shot / CoT / negative-constraints / отдельный layout-пасс / что ещё?
|
||||
- **Претензия 2 (понимание связей/смысла):** чем лечится провал связности на дистанции — чтение-вперёд / аннотатор / резюме / reference-контекст / более сильная модель? Что даёт максимум при минимуме стройки?
|
||||
- **Кривые «размер чанка ↔ качество ↔ биллинг ↔ ретраи»:** теоретическая рамка (overhead↓ с размером vs retry-cost↑ и деградация literary-качества у слишком мелкой единицы) — для пре-регистрации полигона.
|
||||
|
||||
Плюс оси, которые мы могли не увидеть, — самая ценная часть. **Зафиксируй §A ДО фазы 2 и больше не редактируй** (это сейф от ретро-подгонки; §A хешируется/коммитится оркестратором до фазы 2 — оставь маркер).
|
||||
|
||||
### Фаза 2 — «Наш стек»
|
||||
Теперь читаешь наши доки: `05-decisions-log.md` (карта актуальности + D26/D30–D35), `research/15 §Промптинг литперевода` (уже есть — НЕ дублировать, ДОПОЛНИТЬ), `research/07`, exp04/12/13 (что уже мерили), `research/16` (ридер-IDE, парность абзацев). Реализация `backend/` — не аудируешь.
|
||||
|
||||
### Фаза 3 — «Дифф и рекомендации»
|
||||
- **(а) Дифф:** что в твоей карте §A есть, а у нас нет / сделано иначе.
|
||||
- **(б) Рекомендации таблицей** для полигона: {механизм → как измерить (какой арм/проба) → цена (токены/деньги/стройка) → ожидаемый эффект на какую претензию → фаза (можно-сейчас-без-Ф2 / нужна-Ф2)}. Явно разведи: что промпт/нарезка/глоссарий-адресуемо СЕЙЧАС vs что требует Ф2-машинерии.
|
||||
- **(в) Где твой §A сошёлся/разошёлся с нашими гипотезами** (после чтения фазы 2) — честно, включая «команда угадала» и «команда упустила».
|
||||
- **(г) Вопросы, на которые не хватило данных.**
|
||||
|
||||
## Deliverable
|
||||
|
||||
`docs/research/18-quality-levers.md`: §A (нетронутая карта фазы 1) · §B дифф · §C рекомендации-таблица (вход полигону) · §D вопросы. Каждый несущий клейм — вердикт (CONFIRMED/PLAUSIBLE/REFUTED) + URL/дата. Отчёт пройдёт адверсариальную верификацию оркестратора по первоисточникам.
|
||||
|
||||
## Дисциплина
|
||||
|
||||
- `.env` не читать; книгу/выходы в git-доки не цитировать длинно (≤15 слов, для иллюстрации). `/home/ubuntu/books/` тексты — read-only, не тащить в отчёт.
|
||||
- Внешний веб-ресёрч — обязателен (WebSearch/WebFetch); вендор-клейм ≠ замер; препринт помечать.
|
||||
- Не выдавай инженерную гипотезу за факт; «оптимальны ли промпты» — вопрос к замеру, не приговор.
|
||||
254
docs/experiments/14-quality-empirics.md
Normal file
254
docs/experiments/14-quality-empirics.md
Normal file
|
|
@ -0,0 +1,254 @@
|
|||
# Эксперимент 14. Эмпирика рычагов качества zh→ru (нарезка × ПРОМПТ + фронтир-диагностика + кривая нарезки)
|
||||
|
||||
> **Статус:** полигон-сессия exp14 (D36, приоритет №1). Мандат — `docs/POLYGON_QUALITY_EMPIRICS_SESSION_PROMPT.md` + D35/D36. Пре-скрин планки «2 претензии владельца» (ИНТЕРИМ, D35 — НЕ пилот Ф2.5). Смену дефолта ратифицирует ОРКЕСТРАТОР (D-блоком) — не эта сессия.
|
||||
> **Зона:** `eval/` + этот файл + секция PROGRESS «Полигон» + курация глоссария (вне git). Бэкенд не трогаю (2 живые сессии; `git status` перед касанием дерева; стейджинг не нужен — не коммичу код).
|
||||
> **Артефакты:** сэмплы/выходы/сырьё судей — `/home/ubuntu/books/gu-zhenren/exp14/` (ВНЕ git; в доке — только числа и цитаты ≤15 слов). Каждый платный скрипт персистит usage/cost (D30.10). Полигонное Python-зеркало ↔ Go: при расхождении верить Go.
|
||||
|
||||
---
|
||||
|
||||
## 0. Онбординг-факты (контракт, на которых стоит дизайн)
|
||||
|
||||
- **Триггер (D35):** пере-прогон 25 глав связкой (draft `deepseek-v4-flash` `v1-reflow` → editor `glm-5` `v2-bilingual-reflow` + сид v2 + reflow + санитайзер) → вердикт владельца **«лучше (из-за сида), но крайне слабо художественно»**: (1) нет логической редактуры абзацев / конвенций РЯ; (2) места, где модель не понимает связей/смысла. Диагноз «Ф2-недострой + near-term рычаги, НЕ баг» верифицирован исполнением.
|
||||
- **Ключевая невыжатая ось (D35.3):** exp04/12/13 крутили только МОДЕЛЬ в фикс-нарезке с уже-вшитым reflow-промптом. **exp14 крутит нарезку × ПРОМПТ.**
|
||||
- **Вход-ресёрч (D36):** `research/18-quality-levers.md` (Claude, ACCEPT_WITH_FIXES) + `research/18-quality-levers-chatgpt.md` (ACCEPT). Скелет протокола — из ChatGPT §C; содержание дискурс-reflow-промпта (5 техник Ван Цуй) + COGS-модель — из Claude §C. §A обоих заморожены до чтения стека; вывод «потолок скорее в ОРГАНИЗАЦИИ (нарезка/промпт/контекст), не в сырой дешёвой модели» — гипотеза к ЗАМЕРУ, не факт.
|
||||
- **Механизм-как-есть** (`backend/prompts/{translator,editor}.md`, `chunker.go`): по-чанково draft → по-чанково bilingual edit; каждый чанк в ИЗОЛЯЦИИ; единственная кросс-чанк-память — глоссарий. Обе reflow-инструкции ПРИСУТСТВУЮТ в промптах и практически ИНЕРТНЫ (замер: медиана 1 предл./нарратив-абзац, ниже §1.3).
|
||||
- **Провайдер-квирки (`experiments/00-provider-quirks.md`, обязательно):** deepseek thinking ON ВСЕГДА (эхо-мина; `disabled`→эхо на плотном CJK); gemini слаг ТОЛЬКО `gemini-3.1-pro-preview`, mandatory thinking, `additive_total`-биллинг, `PROHIBITED_CONTENT` неконфигурируем; grok reasoning-ON = аддитивный биллинг, **grok на архаичной ch1 — эхо-риск D22.5 (исключён из ch1-армов)**; glm thinking `{type:disabled}`; gpt-5 — `max_completion_tokens`, без `temperature`, `reasoning_effort`.
|
||||
- **Уроки судейского слоя (exp12/13, мемо `eval-aggregation-no-manufactured-convergence`):** ложная «сходимость» ловилась ДВАЖДЫ. Судьи span-цитирующие, reasoning-ON, стиль/верность РАЗДЕЛЬНО, кросс-семейно (author≠reviewer, self-family exclusion), ≥3 повтора со свапом, leave-one-judge-out, катастроф-скрин к ПОБЕДИТЕЛЮ тоже, per-call кап (НЕ group-level — exp13 переоврал +10%). НИКОГДА не гейтить художественность на BLEU/COMET (zh→ru инверсия WMT24).
|
||||
- **Fidelity re-gate (D34.3, `rerun/FIDELITY_REGATE_HANDOFF.md`) — гоню ПАРАЛЛЕЛЬНО, независимо** (§3 ниже). Пере-прогон НЕ засчитан до пройденного re-gate.
|
||||
- **Харнес-факты (реплика eval/):** call-ядро — `refusal_bench.call_provider` (`eval/refusal_bench.py:151`); usage→$ с тремя reasoning-режимами `subset`/`additive`/`additive_total` (`exp13_translate.py:106`, ветвление по `models.yaml reasoning:`); цены — `backend/configs/models.yaml` (единственный источник, `prices_checked 2026-07-10`); токенайзеры — `tokenizers.Tokenizer.from_file` (`glm-4.6`, `deepseek-v3.2` присутствуют; `deepseek-v4`/`kimi-k2` — БЕЗ `tokenizer.json`, использую `deepseek-v3.2` как прокси BPE-семейства); реконструкция инъекции — `retrieval_state.injected_ids` + `exp12_blocks.py` (боевой блок не персистится, детерминированно пересчитывается); блайнд — seeded-shuffle + отдельный ключ-файл (`exp13_monitor.py`).
|
||||
|
||||
---
|
||||
|
||||
## 1. ПРЕ-РЕГИСТРАЦИЯ (заморожена коммитом ДО первого платного вызова — D30.10)
|
||||
|
||||
Всё в §1 зафиксировано до генерации армов и оценки. Промпты армов ЗАМОРОЖЕНЫ — никакого промпт-инжиниринга по ходу (урок exp04: сломанная слепота однажды уже дала дефолт-редактора). Path-scoped коммит: только этот файл.
|
||||
|
||||
### 1.0. Материал
|
||||
|
||||
**Срез:** те же 25 глав пере-прогона (`rerun/records.json`, 57 чанков; `source`/`draft`/`final`/`disposition`/флаги). Char-длины (замер): `source` min/медиана/max = **8 / 1639 / 1812**; `final` = **0 / 5015 / 6184** (0 = 2 обнулённых чанка).
|
||||
**Исключено (экспорт-баг D35.4a):** **ch5.0 и ch20.0** — единственные `edit_flag='sanitizer_defect'`, `final`-длина = 0 (финалы пусты, спутают оценку). Если нужен их текст — edit-выход из checkpoints store (тело цело, дефект = ведущий `###`). ch16 — единственный `escalated=1` (эхо-эскалация flash→pro, RESCUED).
|
||||
|
||||
**1.0.1. Trap-набор (Ступень I — ЛОВУШКИ, размечены ДО генерации).** Поля `тип`/`chapter.chunk`/`supporting_span`(zh)/`допустимый_смысл`/`P0-наблюдение`/`гейт`. Обязательны 2 места владельца (T1/T2, воспроизведены оркестратором фактически; входят и в fidelity re-gate).
|
||||
|
||||
| ID | Тип | ch.chunk | supporting_span (zh, ≤15 слов) | допустимый_смысл | P0-наблюдение (пере-прогон) | Гейт-класс |
|
||||
|---|---|---|---|---|---|---|
|
||||
| **T1** | (c) внутри-чанк, **КАТАСТРОФА** | 7.0 | `古月族人没有一个不知道的` | все/каждый в роду Гуюэ ЗНАЛИ это предание (двойное отрицание = «нет ни одного, кто не знал») | «не знал в роду Гуюэ **ни один человек**» = НИКТО не знал — **инверсия полярности** (дефект в черновике, редактор НЕ починил) | любая инверсия участника/действия = дисквалиф. независимо от ранга |
|
||||
| **T2** | (c) внутри-чанк + глава, chengyu | 8.0 (заглавие) + 8.1 | `物是人非` | контраст «вещи/места прежние — люди уже не те» (物是 «вещи те же» + 人非 «люди иные») | заглавие гл.8 и тело → «**Всё изменилось**» — сплющено, потерян контраст 物是 | потеря смыслового атома (половина идиомы) |
|
||||
| **T3** | (a) абзацы (нарратив-слияние) | 10.0 | прогон подряд идущих однопредложенческих нарратив-строк (один непрерывный ход) | слить в ≤2 многопредложенческих русских абзаца | ~1:1 строка→абзац (43 строки → 43 абзаца; reflow добавил разделители, НЕ слил) | нельзя «побеждать» только МЕНЬШИМ числом абзацев |
|
||||
| **T4** | (b) диалог-конвенция (**КОНТРОЛЬ/регресс-гард**) | 9.0 | обмен репликами 1:N (слова автора + реплики дядя/тётя/Фан Чжэн) | реплики с «—», слова автора в своём абзаце (Розенталь) | P0 в целом **КОРРЕКТНО** (диалог-тире работает; атрибуция на месте) | арм НЕ должен СЛОМАТЬ то, что P0 сделал верно |
|
||||
| **T5** | (d) кросс-граница, **prev-supported** | 24.0→24.1 | 24.1 откр.: `这当然不是他的肌肤本色,而是一种铜皮蛊的效果` | «это [бронзовый цвет кожи наставника, описан в 24.0] — не природный, а эффект гу медной кожи» | chunk-изолированный редактор 24.1 не видит антецедент «这/他的» (в 24.0) | perturbation: correct-prev vs shuffled-prev не должен совпасть |
|
||||
| **T6** | (d) кросс-граница, **prev-supported #2** | 11.0→11.1 | 11.1 откр.: `那隐藏在暗处的人马,见到沈翠这般出来` | «те, кто прятался в засаде [люди舅父/舅母, введены в 11.0], увидев так вышедшую Шэнь Цуй…» | «那…人马» без введения в изолированном 11.1 | perturbation (как T5); prev-support робастность |
|
||||
|
||||
**Оговорка (честная):** чистого **next-supported / катафора**-трапа в раннем срезе (гл.2–25, ранняя арка деревни) не нашлось дёшево — кросс-граница здесь prev-доминирована (T5/T6). Next/chapter-support факторизуется частично: T2 несёт chapter-supported измерение (полный вес 物是人非 раскрывается сменой отношений братьев по главе), gl.7-легенда (T1) полно рассказана в гл.13. Ограничение логирую; ±1-абляция next-плеча всё равно гонится (может не дать лифта на этих трапах — это валидный результат).
|
||||
|
||||
**1.0.2. Главы для Ступени II (слепое чтение владельца — 3 чистые главы разной диалого-плотности).** Отбор детерминированной формулой (как exp12 §1.1: `D` = доля символов внутри «“…”» от не-пробельных; high/mid/low), из **чистых** глав (все чанки `disposition=ok`, `postcheck_miss=0`, `style_flags=0`, 0 flagged/escalated), исключая **ch1 (архаика), ch5, ch20**. Заморожены:
|
||||
|
||||
| Регистр | Глава | `D` (замер) | реализованный характер | чанков |
|
||||
|---|---|---|---|---|
|
||||
| нарратив/низкий диалог | **гл. 19** | 0.061 | почти без прямой речи | 2 |
|
||||
| смешанный (медиана) | **гл. 17** | 0.246 | нарратив + диалог | 2 |
|
||||
| диалого-плотный (high) | **гл. 18** | 0.440 | самая чистая высоко-диалоговая глава | 3 |
|
||||
|
||||
`D` — детерминированно (`exp14_material.py dialogue_D`, доля символов в «“…”»), $0 до генерации; при равенстве — меньший номер главы. Гл.9/12 плотнее по диалогу, но несут по 1 минорному `postcheck_miss`/`style_flag` → взяты чистые.
|
||||
|
||||
**1.0.3. Trap-чанки (Ступень I — все армы гоняются на этом объединении):** {7.0, 8.0, 8.1, 9.0, 10.0, 11.0, 11.1, 24.0, 24.1} = **9 чанков** (T5/T6 требуют обоих чанков главы для кросс-граничной опоры).
|
||||
|
||||
**1.0.4. Реконструкция глоссарий-инъекции (rig-фиделити, как exp12 A1′).** Боевой блок инъекции НЕ персистится — детерминированная функция (сид v2 + нормализованный чанк). Воспроизвожу из `retrieval_state.injected_ids` (JSON-массив композит-ключей `src\x1fsense\x1fsince\x1funtil`) приёмочного store + `guzhenren-seed-v2.yaml` (57 терминов, 47 approved/10 draft, `status` гейтит):
|
||||
- **Editor-блок** (`renderEditorConstraintBlock`): заголовок «КАНОНИЧЕСКИЕ ПЕРЕВОДЫ имён и терминов (…приводи к ним любые расхождения, склоняя по контексту…):», далее `- «dst»` (dst-only, CONFIRMED/approved-only, dedup по dst).
|
||||
- **Translator-блок** (`renderGlossaryBlock`): заголовок «ГЛОССАРИЙ (…):», далее `src → dst`, ambiguous → суффикс `⟨проверить⟩`.
|
||||
- Layout: `system(стабильный префикс, CacheBoundary) → system(инъекция) → user` (`render.go:174 MessagesWithInjection`). Верификация: реконструированный `injected_ids` побайтно = store per-chunk. Sticky-инерция (n_sticky) — union chunk0∪chunk1 внутри главы (как exp12).
|
||||
|
||||
### 1.1. Армы — ось НАРЕЗКА × ПРОМПТ (полный 2×2 — мандат D36) + аблации
|
||||
|
||||
Прямые вызовы, ручная упаковка (НЕ через прод-пайплайн). Дешёвый прод-микс (draft `deepseek-v4-flash` thinking-ON @temp 0.3 → editor `glm-5` билингв @temp 0.4, thinking-disabled) — якорь. Brief-vars из `rerun/book.yaml`: source_lang=zh, target_lang=ru, genre=вебновелла, audience=взрослые читатели вебновелл, title=蛊真人, honorifics=keep, transcription=palladius, **venuti=0.6**, footnotes=minimal. floor `max_tokens`=8000 (D24.3). Черновик держу общим для editor-армов (варьируем editor-стадию), кроме армов, где нарезка/промпт меняет и черновик.
|
||||
|
||||
| Арм | Нарезка | Промпт (editor) | Черновик | Смысл | Источник/цена |
|
||||
|---|---|---|---|---|---|
|
||||
| **P0 baseline** | чанк (прод 1.5k) | ТЕКУЩИЙ прод `v2-bilingual-reflow` | flash `v1-reflow` | Нулевая точка обеих претензий (= пере-прогон на trap-наборе) | **`records.json` reuse, $0** (rig-фиделити A1′) |
|
||||
| **P1a** | чанк | **сильный дискурс-reflow** (§1.2) | тот же flash-draft | Промпт-рычаг при фикс-нарезке | glm-5 live |
|
||||
| **P1b** | **глава целиком** | ТЕКУЩИЙ прод | flash-draft главы (склеен) | ⚠ ячейка, которую НИ ОДИН отчёт не крутил — «бо́льшая единица САМА помогает без нового промпта?» | glm-5 live |
|
||||
| **P1c** | глава целиком | сильный дискурс-reflow | flash-draft главы | Верхняя near-term точка нарезка+промпт | glm-5 live |
|
||||
|
||||
Аблации (на базе P1a, чанк-нарезка; ChatGPT §C2):
|
||||
- **A-layout — draft-layout ablation:** перед editor заменить пустые строки/построчную разбивку draft на нейтральные сепараторы ИЛИ пронумерованные смысловые атомы (финал удаляет ID) → изолирует ЯКОРЕНИЕ редактора на форме черновика. Победа = дешёвый ПРОД-МИНОР (не менять нарезку).
|
||||
- **A-2pass — semantic-first vs combined:** один combined-editor (=P1a) против двух узких пассов (билингв семантика-репэйр → target-only литературный reflow) под ОДНИМ coverage-гейтом → снимает конкуренцию мандатов; замерить реальный output-множитель (≤~2× editor-output).
|
||||
- **A-ref-prev / A-ref-next / A-ref-both — ±1 reference-контекст:** пред-source+пред-target хвост / след-source-абзац до границы сцены / оба, явно `REFERENCE — НЕ ПЕРЕВОДИТЬ`. **Три РАЗДЕЛЬНЫЕ абляции** (не сливать). Цель — кросс-граница (T5/T6), нулевые подлежащие, катафора. Только на чанках с кросс-граничными трапами (11.*, 24.*).
|
||||
|
||||
### 1.2. Сильный дискурс-reflow промпт — ЭТО АРМ ДЛЯ ЗАМЕРА (не «оптимальный промпт»)
|
||||
|
||||
Ядро (Claude §C1#1 + ChatGPT §C3; содержание zh→ru — из Ван Цуй, Вестник МГУ Сер.22, прескрипция ТЕХНИКИ; норму держат Розенталь/Правила-1956). Добавляется к editor.md-мандату (не заменяет сверку смысла/полноту/глоссарий):
|
||||
1. Молча определи смысловые ходы: единый фокал/наблюдатель; действие + непосредственная реакция; одна тема рассуждения; смена говорящего/времени/места/фокала.
|
||||
2. Один повествовательный ход — обычно один русский абзац, ДАЖЕ если китайский разбит на однофразовые строки (паратаксис→гипотаксис). Инструмент слияния — **причастные/деепричастные обороты + подчинительные союзы/связки** (5 техник Ван Цуй: иерархия → сегментация по смыслу → маркировка вида/времени предиката → варьирование лексики → добавление связок). Не сливать ТОЛЬКО ради длины.
|
||||
3. Каждая реплика — с нового абзаца через тире; слова автора при той же реплике — в её абзаце (Розенталь).
|
||||
4. Разрешено объединять/делить русские предложения; ЗАПРЕЩЕНО терять смысловые атомы (число предложений/абзацев совпадать не обязано).
|
||||
5. `REFERENCE`-блоки — только для разрешения связей; не переводить/не пересказывать в выходе.
|
||||
|
||||
Few-shot — минимальные, ортогональные: narrative N:1, dialogue 1:N, focal-shift boundary (target-side русский якорь, ≤3). **Для DeepSeek-thinking (если гоню его переводчиком/редактором с дискурс-промптом) — сначала zero-shot против few-shot** (модель-специфика research/15; не переносить между моделями); ручной verbose CoT reasoning-модели НЕ добавлять. Точный текст промпта и few-shot — в `eval/exp14_prompts.py`, sha256 фиксируется в §2 при заморозке армов.
|
||||
|
||||
### 1.3. Фронтир-арм — ДИАГНОСТИКА потолка (capability-vs-activation)
|
||||
|
||||
**2×2 (первичный):** держу ЧЕРНОВИК константным (дешёвый flash-draft, общий), варьирую EDITOR × промпт:
|
||||
|
||||
| | baseline-промпт | дискурс-промпт |
|
||||
|---|---|---|
|
||||
| **дешёвая** (glm-5) | = P0 (reuse $0) | = P1a |
|
||||
| **фронтир** (gpt-5.4) | F-base | F-disc |
|
||||
|
||||
Разводит: фронтир верстает/чинит, дешёвая нет → **gap способности**; ни та ни другая → недоспецифицированный промпт; краткое правило/пример чинит дешёвую → **активация**. Плюс **спот-чек фронтир-как-ПЕРЕВОДЧИК** на T1/T2 (2 fidelity-трапа): избегает ли сильный ЧЕРНОВИК инверсии gl.7 в принципе (потолок на translate-стадии vs edit-стадии).
|
||||
|
||||
**Фронтир (слаги live-фактчекнуты 2026-07-11, /models):** **gpt-5.4** — ОСНОВНОЙ (OpenAI ~$9; standard-тир, не pro); **gemini-3.1-pro-preview** — ЭКОНОМНО, преим. кросс-семейный мета-ревьюер (остаток €2.6, output $12/M+thinking = быстро сгорит); **grok-4.3** — доп, но **НЕ на архаичной ch1** (D22.5, эхо-риск) — в exp14 ch1 и так исключена; **НЕ Claude/Opus** (нет ключа). Мета-ревьюер — **self-family exclusion** (если Gemini переводил/редактировал — мета-ревьюер GPT, и наоборот; span-цитаты: где ломается смысл + какой механизм чинит).
|
||||
**Гарды:** эхо/refusal-скрин на ВСЕХ выходах; **per-call predicted-cost кап ДО вызова** (НЕ group-level); пре-регистрация армов заморожена коммитом.
|
||||
|
||||
### 1.4. Кривая размер-чанка ↔ качество ↔ биллинг ↔ ретраи
|
||||
|
||||
- Размеры **0.75k / 1.5k / 3k / глава** × **две политики границ** (жадная упаковка | сцен/дискурс-граница) при сопоставимом бюджете (иначе размер спутается с качеством границ).
|
||||
- **Бюджет чанка — в ВЫХОДНЫХ токенах на реальном токенизаторе** (кириллица-фертильность ~2–2.5×, Petrov NeurIPS 2023; `glm-4.6`/`deepseek-v3.2` токенайзеры). Оптимизировать на **retry-adjusted output-cost**; связность давать кэшированным carryover, НЕ размером единицы.
|
||||
- **Cache-ordering:** статику (system+glossary) ПЕРВОЙ, volatile (running summary/reference) ПОСЛЕ — иначе кэш бьётся.
|
||||
- Снимать (пре-рег): in/out/**reasoning**-токены, латентность, **retry-rate ПО ПРИЧИНАМ** (timeout/refusal/length/echo/sanitizer/decode — РАЗДЕЛЬНО), **доля ПОВТОРНО ОПЛАЧЕННЫХ токенов** (не только retry-rate — урон одного крупного сбоя), coverage, слепое предпочтение, KPI-абзацы, trap-теги.
|
||||
|
||||
### 1.5. Метрики и гейты — ПРЕ-РЕГИСТРИРОВАНЫ (C4 ChatGPT + §C10 Claude)
|
||||
|
||||
| Ось | Первичный показатель | Аварийный гейт |
|
||||
|---|---|---|
|
||||
| Претензия 1 (абзацы) | **детерминированный структурный KPI БЕЗ судьи**: распределение предложений/нарратив-абзац (P0-baseline замер `exp14_material.py`: **медиана 1.0, среднее 1.701, доля 1-предл. абзацев 0.579**, n=1378 нарратив-абзацев/55 чанков) + слепое чтение | нельзя «побеждать» только МЕНЬШИМ числом абзацев (парно с atom-coverage) |
|
||||
| Претензия 2 внутри-чанк | билингв span-цитирующая trap-accuracy (обязательный `supporting_span`) на T1/T2 | любая инверсия действия/участника (T1) = КАТАСТРОФА независимо от среднего ранга |
|
||||
| Претензия 2 кросс-граница | accuracy РАЗДЕЛЬНО prev-/next-/chapter-supported (T5/T6 prev) | **perturbation:** correct-context vs random/shuffled НЕ должен дать тот же результат (иначе контекст не используется — Mohammed&Niculae) |
|
||||
| Полнота | покрытие смысловых АТОМОВ (не совпадение числа предложений) | пропуск заголовка/события дисквалифицирует арм на фрагменте |
|
||||
| Операционность | `$`, in/out/reasoning-токены, латентность, retry-по-причинам, **повторно-оплаченные токены** | per-call predicted-cost кап; НЕ group-level |
|
||||
| Робастность | leave-one-judge-out + отдельный катастроф-скрин | коррелированные колонки одного судьи ≠ независимые сигналы |
|
||||
|
||||
**НИКОГДА не гейтить художественность/связность на BLEU/COMET** (zh→ru инверсия WMT24). Судьи: span-цитирующие, reasoning-ON, верность/стиль РАЗДЕЛЬНО, кросс-семейно (self-family exclusion), ≥3 повтора со свапом, parse-чек полноты ранжирования. Судьи-модели: `gemini-3.1-pro-preview`, `gpt-5-mini`, `kimi-k2.6` (кросс-семейно к переводившим glm-5/deepseek/gpt-5.4/mistral — семья судьи ≠ семья арма для каждого трапа).
|
||||
|
||||
### 1.6. Заморожённая таблица моделей/цен (единый источник `models.yaml`; фронтир — live-фактчек 2026-07-11)
|
||||
|
||||
| модель | in $/1M | out $/1M | cached-in | reasoning-режим | роль в exp14 |
|
||||
|---|---|---|---|---|---|
|
||||
| deepseek-v4-flash | 0.14 | 0.28 | 0.0028 | subset (thinking ON) | черновик (общий) |
|
||||
| deepseek-v4-pro | 0.435 | 0.87 | 0.003625 | subset | эскалация черновика |
|
||||
| glm-5 | 1.0 | 3.2 | 0.2 | subset (thinking disabled) | editor (дешёвый прод-якорь) |
|
||||
| grok-4.3 | 1.25 | 2.50 | 1.25 | additive (reasoning-ON) | доп-фронтир (НЕ ch1) |
|
||||
| gemini-3.1-pro-preview | 2.0 | 12.0 | 0.20 | additive_total (mandatory) | судья / кросс-семейный мета-ревьюер (экономно) |
|
||||
| gpt-5-mini | 0.25 | 2.0 | 0.025 | subset | судья (second-opinion) |
|
||||
| **gpt-5.4** | **2.50** | **15.0** | **0.25** | subset (reasoning⊆completion) | **ОСНОВНОЙ фронтир** (live 2026-07-11: `gpt-5.4-2026-03-05`; pricing developers.openai.com — gpt-5.5/5.6=$5/$30, 5.5-pro=$30/$180 → дорого, взят 5.4) |
|
||||
| kimi-k2.6 | 0.95 | 4.0 | 0.16 | subset (temp=1, floor 16k) | судья |
|
||||
| mistral-large-2512 | 0.5 | 1.5 | 0.5 | subset (не reasoning) | доп-фронтир/канал-B справка |
|
||||
|
||||
usage→$: `(in·pin + (comp + reason)·pout)/1e6`; `reason`= из `completion` (subset), отдельного поля (additive/grok), либо `total−prompt−completion` (additive_total/gemini). Fallback-якорь неизвестной модели — цена `deepseek-v4-flash` (никогда $0).
|
||||
|
||||
### 1.7. Бюджет по ключам + per-call кап (обязателен ДО каждого платного вызова — exp13 +10%)
|
||||
|
||||
Бюджеты владельца (D36.1): OpenAI ~$9, Gemini ~€2.6 (крошечный — беречь), DeepSeek/ZAI/Kimi/xAI/Mistral ~$9 каждый. Отдельный owner-`ceiling` не нужен — работаю в остатках. Заканчивается ключ → останавливаюсь на нём, не блокирую остальные армы. Near-term дешёвые армы — ПЕРВЫМИ; фронтир GPT — основная фронтир-статья; Gemini — точечно.
|
||||
|
||||
**Оценка трат (замерю точно; предельные, не group-cap):**
|
||||
- ZAI (glm-5 editor-армы): P1a/P1b/P1c + 5 аблаций + Stage-II + кривая ≈ ~$0.015–0.02/чанк-edit; ~$1.5–2.5 суммарно (кап на вызов **$0.08**).
|
||||
- DeepSeek (flash re-drafts для нарезки/главы): ~$0.001/чанк; <$0.3 (кап **$0.03**).
|
||||
- OpenAI (gpt-5.4 фронтир 2×2 + translate-спот-чек): ~11 чанков × 2 cells + 4 спот ≈ ~$2 (кап на вызов **$0.40**).
|
||||
- Gemini (судья/мета-ревьюер, output $12/M): держать <$1 экв. (кап **$0.30**); ре-джадж на gpt-5-mini/kimi если жжётся.
|
||||
- Kimi/OpenAI-mini/… (судьи): ~$1–2 суммарно (кап **$0.20**).
|
||||
- xAI (grok доп-фронтир, опц.): ≤$1 (кап **$0.40**), НЕ ch1.
|
||||
- **Итог-цель ≈ $5–8 суммарно, глубоко в остатках.** Финальная сумма по ключам — в §2.
|
||||
|
||||
`predict_cost(model, in_est, max_out)` = `in_est·pin + max_out·pout` (in_est из токенайзера/char-эвристики; max_out = потолок `max_tokens`); отказ ДО вызова, если > кап модели. Каждый вызов персистит usage/cost в append-only JSONL немедленно (не батчить), running `spent` per-key.
|
||||
|
||||
### 1.8. Дерево решений (пре-рег, ChatGPT §C5)
|
||||
|
||||
- **P1a закрывает абзацы БЕЗ падения fidelity** → катить дискурс-промпт, размер НЕ менять.
|
||||
- **Помогает только A-layout** → строить deformat/atom-rendering, не chapter-editor.
|
||||
- **±1 reference (A-ref-*) закрывает большинство кросс-граничных traps** → строить малое context-window до Ф2-памяти.
|
||||
- **Нужна chapter-card, но whole-chapter НЕ лучше** → Ф2 state-extraction.
|
||||
- **Whole-chapter (P1b/c) выигрывает по fidelity И абзацам И retry-adjusted COGS** → проектировать per-stage гранулярность (повторить на длинной главе).
|
||||
- **Фронтир выигрывает ОБЕ ячейки 2×2, организация почти не помогает** → **model floor** (не строить сложную память ради слабой модели).
|
||||
- **Организация помогает ОБЕИМ, фронтир+организация даёт доп-лифт** → развести near-term context-fix и премиум-тир.
|
||||
|
||||
### 1.9. Гарды сессии
|
||||
|
||||
Слепота свята; пре-рег заморожен после коммита (промпты армов — sha256 в §2); аномалии провайдеров → вендор-дока + `/models` (не гадать); `.env` не читать; тексты книги в git-доки не тащить (≤15 слов); 18+ регистров в раннем срезе нет (перенос на 18+ — отдельная проба D22/exp10-11). Методика-guard (мемо `eval-aggregation`): fidelity-first агрегация, leave-one-out по судьям, катастроф-скрин к ПОБЕДИТЕЛЮ тоже, независимость сигналов до агрегации, ось решения (near-term-достаточность vs потолок-моделей). Git-координация: `git status` + опознание чужого перед касанием дерева; чужое не трогать; никаких reset/rebase/checkpoint-перезаписей.
|
||||
|
||||
---
|
||||
|
||||
## 2. Результаты (пост-freeze; ПАРТИЯ 1 — near-term армы + фронтир 2×2, на trap-наборе)
|
||||
|
||||
> **Статус партии 1:** прогнаны P0/P1a/P1b/P1c + аблации (A-layout/A-2pass/A-ref-prev/A-ref-both) + фронтир 2×2 (F-base/F-disc, gpt-5.4) на 9 trap-чанках. **0 ошибок на 64 арм-вызовах.** Трата: ARM ZAI $0.43 + OpenAI $1.34 = **$1.77**; trap-судьи (gpt-5-mini $0.03 + kimi $0.46) = **$0.50**; итого ≈ **$2.27** (глубоко в остатках). Медиана латентности: glm-5 35с, gpt-5.4 37с.
|
||||
> **ПАРТИЯ 2 (не в этой партии):** кривая нарезки, слепые пакеты Ступени II владельцу, полная ранжирующая панель ≥3 повтора + leave-one-out, fidelity re-gate, 3 финалиста, хендофф оркестратору.
|
||||
> **Заморожённые промпты армов (sha256[:16]):** editor_baseline `ca03a921df5db728` · editor_discourse `b3b4f6042e8c5673` · discourse_core `ec86a5623e3c6f02` · fewshot `d8f204cc4550ee99` · translator `a8298f725a3b2844`. **Stage-II `D`:** гл.19=0.061 / гл.17=0.246 / гл.18=0.440.
|
||||
|
||||
### 2.1. Претензия 1 (абзацы) — детерминированный структурный KPI (trap-набор, 9 чанков)
|
||||
|
||||
| Арм | нарезка×промпт | mean предл./нарратив-абзац | доля 1-предл. | CJK-утечка | len/P0 | gloss |
|
||||
|---|---|---|---|---|---|---|
|
||||
| **P0** | чанк × прод-baseline (glm-5) | 1.91 | 0.472 | 2 | 1.00 | 0.94 |
|
||||
| **P1a** | чанк × дискурс (glm-5) | 2.61 | 0.318 | 2 | 0.99 | 0.93 |
|
||||
| **A-2pass** | чанк × семантика→target-reflow (glm-5) | **3.33** | **0.187** | 2 | 0.99 | 0.93 |
|
||||
| **A-layout** | чанк × дискурс + deformat-draft (glm-5) | 3.13 | 0.215 | **39 ⚠** | 1.00 | 0.93 |
|
||||
| **A-ref-prev** | чанк × дискурс + ±1 prev (glm-5, 2 чанка) | 2.75 | 0.196 | 0 | 1.00 | 0.85 |
|
||||
| **F-base** | чанк × прод-baseline (**gpt-5.4**) | **1.58** | **0.584** | 0 | 1.03 | 0.93 |
|
||||
| **F-disc** | чанк × дискурс (**gpt-5.4**) | 2.45 | 0.369 | 0 | 1.02 | 0.93 |
|
||||
|
||||
**Вывод П1 — абзацы = ПРОМПТ/ПАЙПЛАЙН-рычаг, МОДЕЛЬ-агностичный:**
|
||||
- Дискурс-промпт двигает распределение к русской норме на ОБЕИХ моделях (P1a 2.61, F-disc 2.45 vs baseline ~1.6–1.9). **Фронтир с ТЕКУЩИМ промптом (F-base 1.58) — ХУЖЕ дешёвого baseline (P0 1.91):** сильная модель зеркалит построчность черновика ещё вернее — «сильнее модель» само по себе абзацы НЕ чинит.
|
||||
- **Сильнейший near-term рычаг П1 — A-2pass** (билингв семантика → отдельный target-only литературный reflow-пасс): mean 3.33, доля-1-предл. 0.187, БЕЗ коллапса длины (len/P0 0.99) и БЕЗ CJK-утечки. Подтверждает DocRepair-класс (отдельный монолингв. RU reflow-пасс) на дешёвой модели. Цена — ~2× editor-output (замерено: 18 вызовов на 9 чанков).
|
||||
- **A-layout (deformat черновика) — НЕ чистая победа:** улучшает абзацы (3.13), но **CJK-утечка 39 симв. (×20 vs baseline)** — снятие построчной формы у glm-5 провоцирует эхо-осколки исходника. Регресс-гард сработал (детерм. KPI поймал). Deformat на дешёвой модели требует CJK-пост-гарда — не катить as-is.
|
||||
|
||||
### 2.2. Претензия 2 внутри-чанк (T1/T2) — capability floor
|
||||
|
||||
**T1 (gl.7 `古月族人没有一个不知道的`, двойное отрицание = «все знали») — КАТАСТРОФА-класс, детерм. читаемо:**
|
||||
| Арм | рендер | вердикт |
|
||||
|---|---|---|
|
||||
| P0 (glm base) | «не знал в роду Гуюэ ни один человек» | ✗ ИНВЕРСИЯ (никто) |
|
||||
| P1a (glm disc) | «в роду Гуюэ не знал ни один человек» | ✗ ИНВЕРСИЯ (промпт НЕ починил) |
|
||||
| F-base (gpt-5.4 base) | «не знал разве что мёртвый» | ✓ ВЕРНО (все знали) |
|
||||
| F-disc (gpt-5.4 disc) | «не было ни одного, кто бы его не знал» | ✓ ВЕРНО |
|
||||
|
||||
**Дешёвая модель инвертирует полярность НЕЗАВИСИМО от промпта; фронтир чинит НЕЗАВИСИМО от промпта → это МОДЕЛЬ-потолок, не активация.** T2 (`物是人非` chengyu): P0/P1a сплющивают («всё изменилось»); F-base улучшает («стало совсем не тем, что прежде» — восстанавливает 人非-контраст). Тот же знак: фронтир-редактор ловит смысловой дефект черновика, дешёвый — нет.
|
||||
|
||||
### 2.3. Претензия 2 кросс-граница (T5/T6) — слабые трапы в этом срезе
|
||||
|
||||
- **T5 (ch24.1 `这…铜皮蛊`): все армы рендерят локально-когерентно** («это не природный цвет кожи, а эффект гу Медной кожи») — предложение самодостаточно, chunk-изоляция его НЕ ломает. **A-ref-prev дал БАЙТ-идентичный P1a выход** (prev-контекст ничего не изменил — чинить было нечего).
|
||||
- **P1c (глава целиком) на T5 — единственный, кто ЯВНО связал антецедент:** «Как у этого наставника: вся его кожа бронзового цвета» — склеив 24.0+24.1, редактор соединил «этого наставника» ↔ бронзовую кожу (chunk-изолированные оставляют висячее «его»). Один датапоинт: **whole-chapter даёт кросс-граничный лифт связывания**, но на этом срезе кросс-граница — НЕ доминирующий сбой (в отличие от within-chunk T1).
|
||||
- Честно (пре-рег-оговорка): next-supported/катафора-трапа в раннем срезе нет; вывод по кросс-границе — предварительный (2 prev-трапа, локально самодостаточные).
|
||||
|
||||
### 2.4. Capability-vs-activation — прямой ответ на вопрос владельца
|
||||
|
||||
**Потолок РАСЩЕПЛЁН по двум претензиям — не «модели ИЛИ организация», а «каждая претензия — своё»:**
|
||||
|
||||
| Претензия владельца | Где потолок | Доказательство (партия 1) | Near-term ход |
|
||||
|---|---|---|---|
|
||||
| **(1) абзацы / конвенции РЯ** | **наша ПРОМПТ/ПАЙПЛАЙН** (активация) | дискурс-промпт двигает KPI на обеих моделях; F-base (фронтир+старый промпт) ХУЖЕ P0; A-2pass (дешёвый 2-пасс) — лучший (3.33) | катить дискурс-промпт + отдельный target-only reflow-пасс на ДЕШЁВОЙ модели |
|
||||
| **(2) понимание связей внутри-чанк** | **дешёвая МОДЕЛЬ** (capability) | T1 инверсия: glm-5 фейлит обе промпт-версии, gpt-5.4 чинит обе; T2 то же | селективная фронтир-эскалация редактора на смысл-риск ИЛИ фронтир-редактор; промпт НЕ закрывает |
|
||||
| **(2) связи кросс-граница** | не доминирует в срезе; whole-chapter даёт лифт | A-ref null (локально самодостаточно); P1c связал антецедент | НЕ строить сложную Ф2-память под слабый сигнал; whole-chapter/edit=глава — кандидат под ROI |
|
||||
|
||||
### 2.5. Судейская корроборация (trap-accuracy, кросс-семейно) — ЗАВЕРШЕНА
|
||||
|
||||
Панель **gpt-5-mini + kimi-k2.6**, span-цитаты, self-family exclusion (F-* армы OpenAI → судит только kimi; gpt-5-mini исключён). 50 вызовов, ~$0.50 (OpenAI $0.03 + Kimi $0.46). Свод (✓ correct / ~ partial / ✗ wrong):
|
||||
|
||||
| Трап | P0 | P1a | A-2pass | A-layout | F-base | F-disc | Читается |
|
||||
|---|---|---|---|---|---|---|---|
|
||||
| **T1** (двойн. отриц., КАТАСТРОФА) | ✗✗ **кат** | ✗✗ **кат** | ✗✗ **кат** | ✗✗ **кат** | ✓ | ✓ | **ОБА судьи флагают КАТАСТРОФУ на ВСЕХ дешёвых армах; ОБА чистят фронтир** → model floor корроборирован независимо |
|
||||
| **T2** (物是人非 тело) | ~~ | ~~ | — | ~✗ | ~ | ~ | дешёвый = partial, фронтир не хуже; A-layout ✗ у kimi (CJK-порча) |
|
||||
| **T2b** (物是人非 заглавие) | ~~ | ~~ | — | ~~ | ✓ | ✓ | **фронтир чинит заглавие-chengyu, дешёвый — partial** |
|
||||
| **T5** (кросс-гр. prev) | ✓✓ | ✓✓ | — | ✓~ | ✓ | ✓ | ✓ у ВСЕХ → трап локально самодостаточен (не дифференцирует) |
|
||||
| **T6** (кросс-гр. prev #2) | ~✗ | ~~ | — | ~✓ | ✗ | ~ | шумно, без чистого паттерна → кросс-граница неинформативна в срезе |
|
||||
| **T4** (диалог-КОНТРОЛЬ) | ✓✓ | ✓✓ | — | ✓✓ | ✓ | (ERR) | диалог-оформление сохранено ВЕЗДЕ → армы НЕ ломают контроль |
|
||||
|
||||
**Корроборация (методика-guard, НЕ ложная сходимость):** судьи ЕДИНОГЛАСНЫ там, где сигнал резкий (T1-катастрофа на 4 дешёвых армах 2/2 судьи + оба чистят фронтир; T4-контроль сохранён) и ЧЕСТНО РАСХОДЯТСЯ на тонком (T2 partial, T6 шум). Leave-one-judge-out на T1: любой из 2 судей в одиночку держит ✗+катастрофу на дешёвых. **T1-вывод стоит на ДЕТЕРМ. полярности И независимой кросс-семейной панели** — не на среднем ранге. Судейская панель ПОДТВЕРЖДАЕТ §2.4: претензия-2-внутри-чанк = capability floor; кросс-граница (T5/T6) в срезе не дифференцирует.
|
||||
|
||||
### 2.6. Дерево решений — резолюция партии 1
|
||||
|
||||
- **P1a закрывает абзацы БЕЗ падения длины/атомов** ✓ → **катить дискурс-промпт, размер НЕ менять** (ветка 1 подтверждена). **Сильнее — A-2pass** (target-only reflow-пасс) — рекомендация near-term №1 по П1.
|
||||
- **A-layout (deformat) улучшает абзацы, НО CJK-утечка** → deformat/atom-rendering строить ТОЛЬКО с CJK-пост-гардом (иначе регресс).
|
||||
- **±1 reference НЕ дал лифта** (трапы локально самодостаточны) → малое context-window до Ф2 под этот срез НЕ обосновано; пере-проверить, когда/если появятся next-supported/катафора-кейсы.
|
||||
- **Whole-chapter (P1c) дал кросс-граничный лифт связывания (1 датапоинт) но НЕ выиграл абзацы у A-2pass** → chapter state-extraction — кандидат под ROI, НЕ near-term приоритет.
|
||||
- **Фронтир чинит within-chunk смысл, организация — нет (T1)** → **model floor на претензии 2-внутри-чанк**: дешёвый трек её НЕ дотянет промптом; ход — селективная фронтир-эскалация редактора по смысл-риску (не тотальный фронтир — F-base абзацы даже портит).
|
||||
|
||||
### 2.7. Предварительная near-term рекомендация (на ратификацию оркестратора — НЕ смена дефолта этой сессией)
|
||||
|
||||
1. **Претензия 1 (абзацы):** внедрить **дискурс-reflow-контент (Ван Цуй 5 техник + Розенталь) в editor-промпт** — дёшево, модель-агностично, доказанный лифт (P1a); рассмотреть **отдельный target-only reflow-пасс** (A-2pass, лучший KPI) под COGS-замер (~2× editor-output — оценить на полной книге).
|
||||
2. **Претензия 2 (смысл внутри-чанк):** промпт НЕ закрывает на дешёвой модели → **селективная фронтир-эскалация редактора по смысл-риску** (двойное отрицание/chengyu/инверсия черновика) — точечно, не тотально (тотальный фронтир портит абзацы и жжёт COGS). Квантификация — fidelity re-gate (§3) + партия 2.
|
||||
3. **CJK-гард обязателен** при любом deformat-черновике (A-layout урок).
|
||||
4. **НЕ строить** сложную Ф2-кросс-чанк-память под этот срез (сигнал слабый); whole-chapter/edit=глава — держать кандидатом под доказанный ROI.
|
||||
|
||||
**Оговорки (методика-guard):** trap-набор мал (6 трапов, prev-boundary, без катафоры); фронтир = 1 модель (gpt-5.4), Gemini/grok переводчиками не гонялись (бюджет/эхо); T1-вывод — 1 катастроф-датапоинт (но детерм.-чистый); срез — PD-смежная ранняя арка (без 18+); это ИНТЕРИМ пре-скрин (D35), НЕ вердикт пилота Ф2.5.
|
||||
|
||||
## 3. Fidelity re-gate (ПАРАЛЛЕЛЬНО, D34.3 — независим от §1-§2)
|
||||
|
||||
Span-цитирующий, reasoning-ON, раздельно стиль/верность, охота на КЛАСС ИНВЕРСИЙ редактуры (ch11/0 аутлайер: editor расширил 3009→4631, sim 0.064), катастроф-скрин терминов у победителя, author≠reviewer (не glm-5/deepseek), leave-one-out. Вход — `rerun/rerun-parallel.txt` (57 чанков, выровнено ОРИГ|ПЕРЕВОД) + `records.json`. **Пере-прогон НЕ засчитан до пройденного re-gate.** *(результаты — ниже, после прогона.)*
|
||||
288
docs/research/18-quality-levers-chatgpt.md
Normal file
288
docs/research/18-quality-levers-chatgpt.md
Normal file
|
|
@ -0,0 +1,288 @@
|
|||
# Рычаги минимально-художественного zh→ru: независимый доклад ChatGPT
|
||||
|
||||
<!-- ─────────────────────────────────────────────────────────────────────────
|
||||
ОРКЕСТРАТОР — РЕВЬЮ-ШАПКА (лендинг, D36, 12.07 №4). Тело не переписано. Полный разбор —
|
||||
PROGRESS §лендинг D36 + D-лог D36.
|
||||
|
||||
ВЕРДИКТ: **ACCEPT** (одна минорная привязка при графтинге в промт полигона).
|
||||
|
||||
НЕЗАВИСИМАЯ ВЕРИФИКАЦИЯ (тот же 26-агентный воркфлоу, первоисточники, $0):
|
||||
- **Цитатно-чист на всех спот-чеках** — Thai/Par3 (EMNLP 2022, `2022.emnlp-main.672`),
|
||||
Mohammed & Niculae (Findings EACL 2024, `2024.findings-eacl.113` — perturbation
|
||||
correct-vs-random), Herold & Ney, Hu & Wan, Jiang/BWB, Jwalapuram, DelTA, TransAgents
|
||||
(EMNLP-Demo `2024.emnlp-demo.14`) — все существуют, атрибуция аккуратна.
|
||||
- **Хеджирование дисциплинировано** — внешняя эмпирика последовательно помечена «не zh→ru»;
|
||||
инженерные клеймы — PLAUSIBLE; 80%-порог ловушек — «предложение для пре-регистрации, не факт».
|
||||
Ни одного CONFIRMED-который-на-деле-экстраполяция не найдено. Самый скептичный из двух
|
||||
отчётов к системным клеймам (TransAgents прямо назван «vendor-like»).
|
||||
- **§C — наиболее прямо-исполнимый скелет полигон-сессии** из двух: явный P0 чистый baseline
|
||||
→ армы с фаза-тегами P0–P4 → C4 пре-регистрированные метрики/гейты → C5 дерево решений →
|
||||
C3 точное ядро дискурс-reflow-промпта. Покрывает ВСЕ мандатные оси D35.6.
|
||||
|
||||
ДВЕ ОГОВОРКИ ПРИ ГРАФТИНГЕ (учтены в промте полигона D36):
|
||||
1. **§A-заморозка НЕ воспроизводима из документа.** sha256 `b42c6f6e…` заявлен только в прозе
|
||||
§B0; в файле — плейсхолдер `<!-- A_SHA256_PLACEHOLDER -->` без BEGIN/END байт-маркеров →
|
||||
пересчитать нельзя. Прогон внешний (владелец) → заморозка **аттестована, но не крипто-
|
||||
верифицируема** (в отличие от Claude-отчёта, чей хеш сверен MATCH). На вес «двойной заморозки
|
||||
сходимости» — дисконт; содержательное качество/самосогласованность отчёта этим НЕ затронуты.
|
||||
2. **Свежий fidelity-гейт §C4 не ссылается на мандатный re-gate D34.3** (`rerun/FIDELITY_REGATE_HANDOFF.md`
|
||||
+ `rerun-parallel.txt`) — сессия его не читала. При графтинге брать D34.3-пакет как канон
|
||||
верности, §C4-гейт — как совместимую детализацию.
|
||||
|
||||
РЕКОМЕНДАЦИЯ ЛЕНДИНГА (обе стороны сами это предлагают): §C ChatGPT = скелет протокола +
|
||||
графт zh→ru-контента Ван Цуй в reflow-промпт + COGS-модель + привязка D34.3 из Claude-отчёта.
|
||||
Реализовано в `POLYGON_QUALITY_EMPIRICS_SESSION_PROMPT.md`.
|
||||
───────────────────────────────────────────────────────────────────────────── -->
|
||||
|
||||
Дата исследования: 2026-07-11. Роль: независимый ресёрчер; код и общие документы репозитория не изменялись.
|
||||
|
||||
Статусы доказательности:
|
||||
|
||||
- **CONFIRMED** — утверждение прямо поддержано первичным источником или наблюдением над разрешённым сырьём;
|
||||
- **PLAUSIBLE** — инженерная гипотеза, совместимая с данными, но требующая локального A/B-замера;
|
||||
- **REFUTED** — локальные данные или первичный источник противоречат утверждению.
|
||||
|
||||
## §A. Чистый лист: независимая карта «проблема → механизм»
|
||||
|
||||
> **FREEZE MARKER A — 2026-07-11.** Этот раздел составлен до чтения `05-decisions-log.md`, `research/07`, `research/15`, `research/16` и материалов exp04/12/13. После фиксации SHA-256 раздел не редактируется. Все дальнейшие сопоставления находятся только в §B–§D.
|
||||
|
||||
### A1. Что непосредственно видно в текущем прогоне
|
||||
|
||||
**CONFIRMED.** Текущий сегментатор жадно упаковывает целые исходные абзацы примерно до 1 500 оценочных токенов; только сверхдлинный абзац делится по предложениям. Контекст предыдущего/следующего чанка в `Chunk` не переносится. Переводчик получает один `{{text}}`; редактор — тот же исходный чанк и его черновик. Источник: локальные `backend/internal/pipeline/chunker.go`, `backend/prompts/translator.md`, `backend/prompts/editor.md`, прочитаны 2026-07-11.
|
||||
|
||||
**CONFIRMED.** Оба промпта уже требуют русской вёрстки, запрещают копировать построчную разбивку и предписывают начинать прямую речь с нового абзаца. Следовательно, версия «достаточно добавить одну инструкцию про абзацы» опровергается текущей конфигурацией: такая инструкция уже есть, а претензия владельца сохранилась. Источник: локальные промпты выше и вердикт владельца в сессионном задании, 2026-07-11.
|
||||
|
||||
**CONFIRMED (описательная метрика, не оценка качества).** В `rerun-ru.txt` грубое разбиение по пустым строкам даёт 1 754 блока, из которых 1 671, или около 95,3%, состоят из одной непустой строки. Выборочная проверка начала, середины и конца показывает устойчивую дробность повествования наряду с корректным выделением многих реплик. Метрика намеренно не объявляется нормой художественности: короткий абзац может быть стилистически оправдан. Источники: локальные `/home/ubuntu/books/gu-zhenren/rerun/rerun-ru.txt` и `/home/ubuntu/books/gu-zhenren/rerun/records.json`, только чтение, 2026-07-11.
|
||||
|
||||
**PLAUSIBLE.** Основная ошибка организации — не «слишком маленький чанк» как таковой, а смешение трёх разных единиц: (1) единицы покрытия, (2) единицы смыслового контекста, (3) единицы целевой композиции. Нынешний фиксированный бюджет определяет все три сразу. Это объясняет, почему полнота может быть хорошей, а русская макрокомпозиция и дальние связи — слабее. Нужен факторный эксперимент, потому что наблюдение одного прогона причинность не устанавливает.
|
||||
|
||||
### A2. На какой гранулярности переводить
|
||||
|
||||
**CONFIRMED.** Для литературного LLM-перевода перевод целого исходного абзаца за один вызов превосходил перевод предложение-за-предложением по человеческой разметке на 18 языковых парах: было меньше смысловых, грамматических и стилистических ошибок. Это peer-reviewed WMT 2023, но не zh→ru и не тест текущих дешёвых моделей, поэтому переносимость результата ограничена. Источник: Karpinska & Iyyer, [Large Language Models Effectively Leverage Document-level Context for Literary Translation, but Critical Errors Persist](https://aclanthology.org/2023.wmt-1.41/), опубликовано 2023-12, доступ 2026-07-11.
|
||||
|
||||
**CONFIRMED.** В литературном MT абзац является практически значимой единицей данных и оценки: корпус Par3 выровнен по абзацам; эксперты предпочитали человеческие варианты машинным в 84% сравнений, а обученный post-editor — обычному MT в 69%. Автоматические метрики не коррелировали с экспертными предпочтениями. Это аргумент за абзац/микросцену и человеческий blind preference как минимум, но не доказательство конкретной схемы zh→ru. Источник: Thai et al., [Exploring Document-Level Literary Machine Translation with Parallel Paragraphs from World Literature](https://aclanthology.org/2022.emnlp-main.672/), EMNLP 2022, доступ 2026-07-11.
|
||||
|
||||
**CONFIRMED.** Простое увеличение контекста до всего документа не является монотонным улучшением: работа по long-context DocMT указывает и рост памяти, и деградацию качества при расширении контекста; типичный локальный контекст — одно-два предыдущих предложения, чего может не хватать для темы и стиля. Источник: Herold & Ney, [Improving Long Context Document-Level Machine Translation](https://aclanthology.org/2023.codi-1.15/), CODI/ACL 2023, доступ 2026-07-11.
|
||||
|
||||
**CONFIRMED.** Фиксированная длина плохо отражает дискурсную структуру. Paragraph-to-paragraph режим и явная RST-структура дали улучшения над прежними DocMT-подходами в peer-reviewed исследовании, хотя архитектурные результаты NMT нельзя напрямую переносить на prompting закрытой LLM. Источник: Hu & Wan, [Exploring Discourse Structure in Document-level Machine Translation](https://aclanthology.org/2023.emnlp-main.857/), EMNLP 2023, доступ 2026-07-11.
|
||||
|
||||
**Вывод A2 — PLAUSIBLE.** Для текущей фазы минимальная разумная единица генерации — не предложение и не глава, а **дискурсный пакет**: один или несколько смежных исходных абзацев, образующих локальный ход/эпизод, с защищёнными границами сцены. Основной текст пакета переводится целиком; вокруг него подаётся компактный reference-context, который не надо переводить. Глава нужна как область предварительного чтения и извлечения опор, а не обязательно как единый output-вызов. Оптимум размера следует измерять, а не объявлять заранее.
|
||||
|
||||
### A3. Претензия 1: русские абзацы и литературные конвенции
|
||||
|
||||
**CONFIRMED.** Исходная и целевая дискурсные структуры у человеческих и машинных переводов различаются, а предложение-уровневые метрики не покрывают сущности, терминологию, кореференцию и кавычки. Источник — размеченный корпус китайско-английских романов BWB; это близкий по исходному языку, но не русскому, evidence. Jiang et al., [Discourse-Centric Evaluation of Document-level Machine Translation with a New Densely Annotated Parallel Corpus of Novels](https://aclanthology.org/2023.acl-long.435/), ACL 2023, доступ 2026-07-11.
|
||||
|
||||
**PLAUSIBLE.** Нужна не ещё одна абстрактная команда «собери естественные абзацы», а наблюдаемая целевая операция:
|
||||
|
||||
1. сначала определить внутри пакета дискурсные ходы (кто воспринимает/говорит, действие, реакция, смена времени/места/фокала);
|
||||
2. затем сформировать русские абзацы вокруг этих ходов, отдельно соблюдая оформление диалога;
|
||||
3. только потом провести проверку покрытия по исходным атомам.
|
||||
|
||||
Эту операцию можно реализовать одним вызовом через краткий скрытый план и финальный текст либо отдельным layout/polish-проходом. Какой вариант лучше для дешёвой модели — вопрос A/B, а не установленный факт.
|
||||
|
||||
**PLAUSIBLE.** Few-shot должен показывать именно требуемое преобразование структуры: 2–3 коротких zh→ru примера «много однофразовых исходных строк → один естественный повествовательный абзац», «повествование → отдельная реплика → авторская ремарка», «смена фокала → новый абзац». Простой положительный пример проверяется отдельно от длинного списка negative constraints. Причина: текущая словесная инструкция не сработала; демонстрация задаёт форму результата. Прямого peer-reviewed замера именно русской перевёрстки в найденных источниках нет.
|
||||
|
||||
**PLAUSIBLE.** Отдельный target-only layout-пасс потенциально дешевле повторного bilingual editor-пасса: он получает только русский текст и задачу укрупнить/разделить абзацы без перефразирования. Но он не исправляет причинную связность и может закрепить смысловую ошибку; поэтому это узкий рычаг для претензии 1, не универсальное лечение.
|
||||
|
||||
**PLAUSIBLE.** Одновременный мандат редактора «сверить смысл + исправить реалии + выдержать глоссарий + улучшить стиль + реконструировать абзацы + ничего не добавить/удалить» создаёт конкуренцию критериев у слабой модели. Дешёвый тест — разделить semantic revision и target-language paragraph/style polish; дорогой — оставить один сильный editor. Ни «CoT всегда помогает», ни «negative constraints всегда вредят» без локального замера не утверждается.
|
||||
|
||||
### A4. Претензия 2: связи и смысл на дистанции
|
||||
|
||||
**CONFIRMED.** Контекстные ошибки требуют специальных измерений: sentence-level BLEU может почти не замечать анафору, связность и лексическую когезию. Литература предлагает отдельные тесты для местоимений/кореференции и документные метрики когезии. Источники: Jwalapuram et al., [Evaluating Pronominal Anaphora in Machine Translation](https://aclanthology.org/D19-1294/), EMNLP 2019; Libovický et al., [Machine Translation Evaluation beyond the Sentence Level](https://aclanthology.org/2018.eamt-main.18/), EAMT 2018; доступ 2026-07-11.
|
||||
|
||||
**CONFIRMED.** DelTA использует не «всю книгу в промпте», а четыре специализированные памяти: записи имён, двуязычное резюме, long-term retrieval и short-term контекст. В ICLR 2025 заявлены средние улучшения до 3,16 COMET и до 4,58 процентного пункта consistency; система переводит по предложениям ради полноты. Это peer-reviewed DocMT, но не литературная zh→ru оценка и не доказательство необходимости всех четырёх компонентов. Источник: Wang et al., [DelTA: An Online Document-Level Translation Agent Based on Multi-Level Memory](https://proceedings.iclr.cc/paper_files/paper/2025/hash/285149554f6fbed6e2f9ec72d131bd23-Abstract-Conference.html), ICLR 2025, доступ 2026-07-11.
|
||||
|
||||
**CONFIRMED, но vendor-like/системный claim.** TransAgents организует литературный перевод как роли редактора, переводчика, локализатора и корректора с циклом проверки; опубликованный demo-paper сообщает человеческие предпочтения и низкую относительно человека цену. Это prior art организации, но его сильные маркетинговые формулировки нельзя считать независимым доказательством превосходства, а многоагентность сама по себе не изолирована как причина. Источник: Wu et al., [TransAgents: Build Your Translation Company with Language Agents](https://aclanthology.org/2024.emnlp-demo.14/), EMNLP Demo 2024, доступ 2026-07-11.
|
||||
|
||||
**PLAUSIBLE.** Максимум эффекта при минимуме стройки даст не полноценная агентная память, а следующий порядок армов:
|
||||
|
||||
1. **look-behind:** предыдущий русский абзац + соответствующий китайский хвост как read-only reference;
|
||||
2. **look-ahead:** следующий китайский абзац/до границы сцены, помеченный «не переводить», чтобы снять катафору и неоднозначность текущей фразы;
|
||||
3. **chapter card:** краткие сущности, отношения, текущая цель/локация/время и нерешённые референсы, извлечённые одним предварительным чтением главы;
|
||||
4. только затем retrieval/долгая память и отдельный аннотатор связей.
|
||||
|
||||
Порядок — инженерная гипотеза по цене строительства. Look-ahead особенно важен для китайского нулевого подлежащего, но величина эффекта именно zh→ru не подтверждена найденным контролируемым исследованием.
|
||||
|
||||
**PLAUSIBLE.** Глоссарий лечит стабильность именования, но не заменяет модель ситуации: одинаково написанное имя не разрешает, кто что сделал, почему персонаж реагирует и к чему относится опущенное подлежащее. Поэтому в полигоне терминологическая consistency и causal/coreference comprehension должны быть разными исходами.
|
||||
|
||||
**PLAUSIBLE.** Сильная модель может одновременно улучшить локальный русский и рассуждение, но arm «модель сильнее» без одинакового контекста не отвечает, где потолок — в модели или организации. Нужен 2×2: слабая/сильная модель × текущий/дискурсный контекст. Если контекст помогает обеим, проблема частично организационная; если только сильная проходит смысловые ловушки, есть model floor.
|
||||
|
||||
### A5. Кривая «размер чанка ↔ качество ↔ биллинг ↔ ретраи»
|
||||
|
||||
**CONFIRMED как бухгалтерская рамка, не как эмпирическая кривая.** Для главы из `S` исходных токенов, чанка полезной длины `c`, фиксированного prompt/reference overhead `h`, коэффициента выходных токенов `r` и цен `p_in`, `p_out` ожидаемая цена без ретраев грубо равна:
|
||||
|
||||
`C(c) ≈ ceil(S/c) · h · p_in + S · p_in + rS · p_out`.
|
||||
|
||||
Значит, при прочих равных рост `c` уменьшает повторяемый overhead. Это арифметика; она не говорит, что качество растёт.
|
||||
|
||||
**PLAUSIBLE.** С ретраями цена становится нелинейной. Если вероятность неуспеха чанка `q(c)` и весь вызов повторяется до успеха, множитель ожидаемых попыток — `1/(1-q(c))`; ожидаемо повторно оплачивается весь `h+c+rc`. Даже если число вызовов падает, большие чанки дороже терять при timeout/refusal/excision. Реальная `q(c)` должна быть измерена по типам отказа, а не подогнана общей долей retry.
|
||||
|
||||
**PLAUSIBLE.** Качество вероятно имеет внутренний оптимум: слишком малый `c` режет дискурс и размножает prompt overhead; слишком большой `c` размывает релевантный контекст, затрудняет контроль полноты и повышает ущерб одного сбоя. Исследование long-context DocMT подтверждает возможность деградации при расширении контекста, но форму кривой для этого пайплайна надо пререгистрировать и измерить. Источник: Herold & Ney 2023, ссылка в A2, доступ 2026-07-11.
|
||||
|
||||
**Предрегистрация A5 — PLAUSIBLE.** Сравнить не только размеры 0,75k / 1,5k / 3k / «глава», но и две политики границ при сопоставимом бюджете: фиксированная упаковка против scene/discourse-aware упаковки. На каждом арме сохранять: вход/выход токены, latency, долю и причину ретраев, долю повторно оплаченных токенов, полноту, blind reader preference, paragraph score и размеченные coreference/causal traps. Иначе размер будет спутан с качеством границ.
|
||||
|
||||
### A6. Оси, которые легко пропустить
|
||||
|
||||
**PLAUSIBLE — структурная утечка через черновик.** Редактор видит дробный черновик, который становится сильной формальной подсказкой, тогда как абстрактная инструкция просит его форму разрушить. Arm «редактор видит тот же текст без пустых строк/с ID смысловых атомов» отделит якорение на layout черновика от неспособности модели к русской композиции.
|
||||
|
||||
**PLAUSIBLE — конфликт полноты и естественной композиции.** Формула «не выбрасывай и не добавляй предложения» полезна для покрытия, но может восприниматься как требование сохранять предложение-к-предложению и мешать слиянию/членению русских предложений. Следует сохранять **смысловые атомы**, а не число предложений: пронумеровать атомы только для внутренней проверки, разрешив объединять и делить предложения в финале. Это должно пройти отдельный coverage gate.
|
||||
|
||||
**PLAUSIBLE — мусор до романа портит style prior.** Первый чанк содержит метаданные, обзор, интернет-ссылку и предисловие, а не однородную художественную сцену. Общий genre prompt не различает front matter, авторское предисловие и роман. Классификация типа блока до перевода может предотвратить перенос регистров и бессмысленную «литературизацию» служебного текста.
|
||||
|
||||
**PLAUSIBLE — направление контекста важно.** Только прошлое помогает последовательности, но не всегда пониманию текущей китайской эллиптики; только будущее рискует спойлерным перефразированием. Поэтому previous-target, previous-source и next-source надо факторизовать, а не объединять сразу в один «context arm».
|
||||
|
||||
**CONFIRMED.** Правильность контекстного метода нельзя заключать из общего score: perturbation test с корректным против случайного контекста показывает, использует ли система именно опорный контекст. Источник: Mohammed & Niculae, [On Measuring Context Utilization in Document-Level MT Systems](https://aclanthology.org/2024.findings-eacl.113/), Findings of EACL 2024, доступ 2026-07-11.
|
||||
|
||||
**PLAUSIBLE — оценщик должен разделять читателя и билингва.** Русскоязычный читатель способен оценить ритм, абзацы и естественность, но не диагностирует тихое искажение; билингв — смысл и связи, но может терпеть translationese. Минимальный полигон требует двух независимых рубрик и запрета показывать arm/model judge-у.
|
||||
|
||||
**REFUTED как универсальный тезис.** «Больше агентов автоматически означает лучше» не следует из prior art: TransAgents демонстрирует целую систему, DelTA — специализированную память, а paragraph-level LLM уже улучшал результат без агентного оркестра. Сначала следует покупать информацию (границы, соседний контекст, chapter card), затем роли и циклы.
|
||||
|
||||
### A7. Независимая карта причин и минимальных вмешательств
|
||||
|
||||
| Наблюдаемая проблема | Вероятный механизм | Самый дешёвый различающий тест | Что не считать доказательством |
|
||||
|---|---|---|---|
|
||||
| Почти каждый ход остаётся отдельным абзацем | Якорение на layout исходника/черновика; инструкция без демонстрации; перегруженный editor mandate | layout few-shot; draft без пустых строк; отдельный target-only reflow | Снижение числа абзацев само по себе |
|
||||
| Связь ломается внутри чанка | Модель не строит локальную ситуацию; противоречивый/перегруженный мандат | semantic-first editor с явными entity/action/reason checks | Более гладкий русский без сверки смысла |
|
||||
| Связь ломается на границе чанков | Нет previous/next reference; граница не совпадает со сценой | ±1 абзац reference и scene-aware boundary | Увеличение токенов без релевантного контекста |
|
||||
| Теряются дальние сущности/цели | Нет chapter/book state | краткая chapter card против glossary-only | Единообразное имя при неверной кореференции |
|
||||
| Сильный стиль ценой пропуска | Свободный polish без атомарного coverage | atom IDs + post-check, разрешив русское split/merge | Совпадение числа предложений |
|
||||
| Большие чанки нестабильны/дороги | Растёт payload одного сбоя и нерелевантный контекст | size sweep с раздельным учётом retry causes | Средняя цена успешного вызова без ретраев |
|
||||
| Непонятно, виновата модель или пайплайн | Model/context confounding | 2×2 model strength × discourse context | Сравнение разных моделей на разных промптах |
|
||||
|
||||
**Итог §A — PLAUSIBLE.** Наиболее вероятный короткий путь к «минимально художественно» — не перевод всей главы и не многоагентная стройка, а дискурсно ограниченный пакет + небольшой соседний reference-context + few-shot русской перекомпоновки + раздельная смысловая и монолингвальная оценка. Первый полигон должен определить, достаточна ли текущая модель; не предполагать это заранее.
|
||||
|
||||
<!-- A_SHA256_PLACEHOLDER -->
|
||||
|
||||
## §B. Дифф после чтения внутреннего стека
|
||||
|
||||
### B0. Целостность анти-анкоринга
|
||||
|
||||
§A был записан отдельным снимком до чтения командных гипотез. SHA-256 этого A-only снимка: `b42c6f6e6dc06ec48f3472714ac2b9ca5eba0135fba204113e2628a36eacee99`. После этого прочитаны карта актуальности и D26/D30–D35 в `docs/architecture/05-decisions-log.md`, раздел «Промптинг литперевода» в `docs/research/15-voice-and-state.md`, `docs/research/07-translation-methodology.md`, exp04/12/13 и `docs/research/16-reader-ide-alignment.md`. §A после чтения не изменялся.
|
||||
|
||||
### B1. Где независимая карта сошлась с командой
|
||||
|
||||
**CONFIRMED — команда угадала корень первого слоя.** §A независимо установил, что словесная reflow-инструкция уже есть, но результата не гарантирует; D35 независимо подтверждает на боевом снимке, что reflow действительно применялся, редактор был активен, а выход всё равно зеркалил рубленость источника. Значит, это не stale-конфиг и не пассивный mono-editor. Источники: локальный `docs/architecture/05-decisions-log.md`, D35.1, и текущие промпты, прочитаны 2026-07-11.
|
||||
|
||||
**CONFIRMED — команда уже сделала верный флип mono→bilingual.** Exp12 показал механическую пассивность mono-режима и структурную невозможность исправить 磕头/派/时辰 без исходника; D30 ратифицировал bilingual editor. Это полностью совпало с §A4: target-only polish не лечит смысл. Источники: локальные `docs/experiments/12-quality-diagnosis.md` §2.2/§2.5 и `docs/architecture/05-decisions-log.md` D30.1, прочитаны 2026-07-11.
|
||||
|
||||
**CONFIRMED — команда уже развела глоссарий и понимание ситуации.** D30.8/D35.4 различают термины, которые можно засидить сейчас, и «модель не следит за сюжетом», относимое к состоянию/памяти. Это совпадает с §A4. Источники: локальный D-лог, D30.8/D35.4, 2026-07-11.
|
||||
|
||||
**CONFIRMED — команда уже не считает жёсткую 1:1 структуру целью.** Research/16 показывает легитимный N:M, русскую норму тире-абзацев и рекомендует детектировать, а не форсировать парность. Это совместимо с §A3/A6: проверять смысловые атомы, не число предложений/абзацев. Источник: локальный `docs/research/16-reader-ide-alignment.md` §2.1–§2.5, прочитан 2026-07-11; внешний якорь: Karpinska & Iyyer, [WMT 2023](https://aclanthology.org/2023.wmt-1.41/), доступ 2026-07-11.
|
||||
|
||||
**CONFIRMED — команда уже знает, что модель/промпт нельзя оценивать общим скаляром.** Exp12/13 разделили стиль и верность, но ревью D30/D32 вскрыло ложные «единогласия», коррелированные сигналы и катастрофы победителей. Предлагаемый в §A 2×2 и отдельные traps продолжают именно эту исправленную методику. Источники: локальный D-лог D30/D32 и exp12/13, прочитаны 2026-07-11.
|
||||
|
||||
**CONFIRMED — prompt-format prior art уже покрыт research/15.** Формат, позиция, сэндвич, few-shot-раскол по моделям, lost-in-middle и опасность ручного CoT уже исследованы. Поэтому данный доклад не рекомендует универсальный XML/CoT-рецепт и не дублирует этот обзор. Источник: локальный `docs/research/15-voice-and-state.md` §3.1–§3.3, прочитан 2026-07-11.
|
||||
|
||||
### B2. Что в §A есть сверх текущей карты команды
|
||||
|
||||
**PLAUSIBLE — независимое разведение трёх единиц.** В D35 главная ось сформулирована как «нарезка × промпт» и кандидаты `draft=чанк/edit=глава`. §A добавляет обязательное различение: coverage atom ≠ generation unit ≠ reference-context span. Глава может быть областью чтения/извлечения опор, не единым completion. Это предотвращает ложный выбор «1,5k или вся глава».
|
||||
|
||||
**PLAUSIBLE — якорение редактора на форме draft как отдельная причина.** Командные документы обсуждают исходную построчность и ненадёжность reflow, но не изолируют arm, где редактор получает тот же черновик без пустых строк/с нейтральными атомарными ID. Если такой arm резко улучшит абзацы при той же модели и промпте, менять размер чанка преждевременно.
|
||||
|
||||
**PLAUSIBLE — look-ahead как дешёвый самостоятельный arm.** D21/research15 проектируют scene-state/Annotator для Ф2; D35 говорит о cross-chunk. В прочитанных экспериментах не изолирован следующий китайский абзац как read-only reference. Для катафоры, нулевых субъектов и поздно раскрываемого отношения это дешевле полноценной памяти. Доказанного эффекта zh→ru нет — именно поэтому arm нужен.
|
||||
|
||||
**PLAUSIBLE — discourse-move reflow вместо общего «русские абзацы».** Текущий reflow-промпт содержит результатное требование, но не операциональную рубрику «фокал/действие/реакция/смена времени/места/говорящего». Few-shot должен показывать структурное преобразование, а не только красивый стиль. Research/15 покрывает общую форму few-shot, но не этот тип примера.
|
||||
|
||||
**PLAUSIBLE — факторный model-floor тест.** D35 разрешает фронтир-арм, но без 2×2 сильная модель на ином промпте/размере оставит прежний конфаунд. Нужны одна и та же слабая и сильная модели на текущей и дискурсной организации. Это отвечает именно на вопрос владельца «модель не понимает» против «мы не дали ей опоры».
|
||||
|
||||
**PLAUSIBLE — тип блока/front matter.** Сырьё первой главы смешивает метаданные, интернет-обзор, авторское предисловие и роман. Во внутренних качественных экспериментах эта ось не выделена. Она не объясняет все 25 глав, но способна портить локальный style prior и оценку главы 1.
|
||||
|
||||
**PLAUSIBLE — retry-cost надо считать повторно оплаченными токенами, а не только retry-rate.** D35 запросил кривую размера, но формула §A5 делает явным ущерб одного крупного сбоя. Это важно при сравнении главы с чанком: одинаковая доля отказов не означает одинаковую цену.
|
||||
|
||||
### B3. Где §A разошёлся с командными гипотезами
|
||||
|
||||
**Расхождение 1 — глава целиком не должна быть привилегированным кандидатом.** D35 справедливо хочет arm «глава целиком», но prior art поддерживает paragraph/discourse units и предупреждает о деградации длинного контекста. Глава нужна как диагностический потолок и область read-ahead; прод-кандидатом по умолчанию её считать нельзя. Источники: [Hu & Wan 2023](https://aclanthology.org/2023.emnlp-main.857/), [Herold & Ney 2023](https://aclanthology.org/2023.codi-1.15/), доступ 2026-07-11.
|
||||
|
||||
**Расхождение 2 — `draft=чанк/edit=глава` слишком рано превращать в архитектурную лестницу.** Она может победить, но смешивает три изменения: больше source context, больше draft context и иной масштаб reflow. Сначала нужны прямые ручные армы, разделяющие эти факторы. Лишь затем runner-изменение.
|
||||
|
||||
**Расхождение 3 — «cross-chunk = Ф2» слишком жёсткая граница.** Полноценная долговременная память, Annotator и retrieval действительно Ф2. Но ±1 source paragraph, previous target tail и статичная chapter card можно измерить и даже рендерить без обученной памяти. Это near-term context engineering; продовая автоматизация может потребовать небольшую машинерию, но не весь Ф2-стек.
|
||||
|
||||
**Расхождение 4 — отдельный layout-пасс не обязан быть детерминированным.** Exp12 рассматривает «детерминированный reflow-пасс» как вариант, но логическое слияние повествования семантично; чистая пунктуационная эвристика надёжно оформит реплики, но не решит, где кончается мысль. Детерминированным должен быть валидатор/аварийная механика, а сам reflow — LLM или ручная редактура, если нужны смысловые абзацы.
|
||||
|
||||
### B4. Что команда сделала лучше независимой карты
|
||||
|
||||
**CONFIRMED.** Research/16 дал точные русские нормы диалога и сильное различение legit N:M против структурного дефекта; §A был грубее. Источник: локальный research/16 §2.3, 2026-07-11.
|
||||
|
||||
**CONFIRMED.** Exp12/13 и D30/D32 дали локальную причинную эмпирику по конкретным моделям: mono no-op, active bilingual, ошибочные инверсии редактора, flash-vs-pro trade-off и ложная независимость судей. Внешняя литература этого заменить не может. Источники: локальные exp12/13 и D30/D32, 2026-07-11.
|
||||
|
||||
**CONFIRMED.** D35 измерил боевой прогон: reflow применён, draft→final similarity 0,643, 34/55 чанков сильно правлены, около 1,28 стыка чанков на главу. Это сдвигает приоритет к внутри-чанковой организации абзацев: cross-chunk нельзя объявлять главным виновником без trap-разметки. Источник: локальный D35.1, 2026-07-11.
|
||||
|
||||
## §C. Рекомендации — вход полигону
|
||||
|
||||
### C1. Главный дизайн: не один bake-off, а две короткие ступени
|
||||
|
||||
**Ступень I — причинная проба на 6–8 ловушках, а не на «средних главах».** Взять места владельца плюс независимо размеченные случаи четырёх типов: (a) повествовательные предложения, которые должны стать одним русским абзацем; (b) диалог с 1:N; (c) связь, разрешимая внутри текущего чанка; (d) связь, для которой опора находится только за его границей. Разметить до генерации: supporting span и допустимый смысл. Это согласуется с выводом, что общие sentence-level метрики не видят дискурс. Источники: [Jiang et al. 2023](https://aclanthology.org/2023.acl-long.435/), [Mohammed & Niculae 2024](https://aclanthology.org/2024.findings-eacl.113/), доступ 2026-07-11.
|
||||
|
||||
**Ступень II — blind chapter reading только трёх финалистов.** Не давать владельцу 8 почти одинаковых вариантов, как в exp12. После trap-гейта оставить baseline, лучший near-term arm и frontier diagnostic. Главный исход — бинарное закрытие двух претензий + ранжирование, вторичный — размеченные ошибки.
|
||||
|
||||
### C2. Армы и порядок
|
||||
|
||||
Обозначения фазы: **СЕЙЧАС** — прямые вызовы/ручная упаковка, без Ф2; **ПРОД-МИНОР** — после доказанного ROI нужна небольшая правка рендера/сегментации; **Ф2** — долговременное состояние, Annotator, retrieval или новый per-stage runner-контракт.
|
||||
|
||||
| Приоритет / механизм | Как измерить: arm и проба | Цена | Ожидаемый эффект | Фаза |
|
||||
|---|---|---|---|---|
|
||||
| **P0. Чистый baseline** | Точный текущий prod prompt+инъекция+1,5k chunk на тех же traps; исключить экспорт-пустоты ch5/ch20 по D35.4 | Уже известна | Нулевая точка обеих претензий | СЕЙЧАС |
|
||||
| **P1. Discourse-reflow prompt** | Тот же source/draft/chunk/model; добавить 2–3 структурных few-shot и рубрику ходов: фокал/действие/реакция/смена места-времени/говорящего; финал без плана | +кэшируемый префикс; почти $0 относительно generation | Главным образом абзацы; возможно локальная связность | СЕЙЧАС |
|
||||
| **P1. Draft-layout ablation** | Повтор P1, но перед editor заменить пустые строки draft на нейтральные separators или пронумерованные смысловые атомы; финал должен удалить ID | Токены ≈ те же; ручная подготовка | Проверяет якорение на форме черновика | СЕЙЧАС; ПРОД-МИНОР при победе |
|
||||
| **P1. Semantic-first vs combined** | На том же P1 сравнить один combined editor с двумя узкими проходами: bilingual semantic repair → target-only literary reflow; одинаковый coverage gate | Примерно +1 output-пасс; потенциально до ~2× editor-output, измерить | Первый проход — смысл, второй — абзацы/русский; снимает конкуренцию мандатов | СЕЙЧАС; ПРОД-МИНОР |
|
||||
| **P1. Reference ±1** | К P1 дать previous source+target tail и next source paragraph, явно `REFERENCE — НЕ ПЕРЕВОДИТЬ`; три отдельные абляции prev / next / both | +сотни input-токенов, без нового output | Coreference/ellipsis/cataphora около стыков | СЕЙЧАС; ПРОД-МИНОР |
|
||||
| **P2. Chapter card** | Один раз вручную/LLM извлечь для главы сущности, отношения, локацию, время, цель и unresolved refs; подать только релевантную компактную карточку каждому trap | Один pre-pass/глава + ~100–300 input-ток./чанк; точный COGS замерить | Дальние связи без полной главы | СЕЙЧАС как ручной arm; Ф2 для durable auto-state |
|
||||
| **P2. Whole-chapter editor diagnostic** | Склеить lossless source и drafts главы, один bilingual edit; те же prompt/few-shot; строгий atom coverage и sanitizer | Меньше fixed overhead, но большой input/output и дорогой retry | Верхняя диагностическая граница reflow/связности; не prod-фаворит | СЕЙЧАС диагностика; Ф2 runner при победе |
|
||||
| **P2. Discourse packet** | Ручные пакеты по сцене/ходу при сопоставимом 1,5k и 3k бюджете; сравнить с fixed packing | Ручная разметка; API цена близка size-matched | Изолирует качество границ от размера | СЕЙЧАС диагностика; ПРОД-МИНОР/Ф2 для сегментатора |
|
||||
| **P2. Model floor 2×2** | Текущая дешёвая и согласованная frontier-модель × baseline и лучший P1/P2 context. Одинаковые тексты/brief/output cap | 4 клетки; per-call cap; frontier только на traps+1 главе | Отделяет потолок модели от организации | СЕЙЧАС |
|
||||
| **P3. Size/retry curve** | 0,75k / 1,5k / 3k / глава, но отдельно fixed vs discourse boundary; ≥3 repeats только для операционной стохастики, не для «перерисовать качество» | Сохранять input/output/reasoning/retry токены и $ | Находит внутренний оптимум и цену отказа | СЕЙЧАС диагностика |
|
||||
| **P3. Proper-noun/genre gap cleanup** | До blind-пакета закрыть известные 甲乙丙丁/资质 и иные однозначные gaps, но не менять спорные формы между arms | Дешёвая курация; один resnapshot только после решения | Локальные смысл/жанр-дефекты, не дискурс | СЕЙЧАС |
|
||||
| **P4. Auto scene-state / retrieval** | Только если compact manual card даёт лифт: автоматический annotator + long/short memory; отдельная проверка ошибок карточки | Новый pre-pass, хранение, retrieval, versioning | Дальняя связность/последовательность | Ф2 |
|
||||
| **P4. Voice/address/reveal memory** | Не смешивать с текущим полигоном двух претензий; отдельные заранее размеченные случаи | Уже спроектированный дополнительный слой | Голос, отношения, спойлеры; не основная абзацность | Ф2 |
|
||||
|
||||
### C3. Что именно писать в сильном discourse-reflow prompt
|
||||
|
||||
Это не готовый «оптимальный промпт», а **арм для замера**. Не добавлять ручной verbose CoT reasoning-модели. Операционное ядро:
|
||||
|
||||
1. «Сначала молча определи смысловые ходы: единый фокал/наблюдатель; действие и непосредственная реакция; одна тема рассуждения; смена говорящего, времени, места или фокала».
|
||||
2. «Один повествовательный ход обычно оформляй одним русским абзацем, даже если китайский исходник разбит на однофразовые строки. Не объединяй только ради длины».
|
||||
3. «Каждую новую реплику — с нового абзаца через тире; слова автора при той же реплике оставляй в её абзаце».
|
||||
4. «Разрешено объединять и делить русские предложения; запрещено терять смысловые атомы. Число предложений и абзацев не обязано совпадать».
|
||||
5. «REFERENCE-блоки нужны только для разрешения связей; не переводи и не пересказывай их в выходе».
|
||||
|
||||
Few-shot должны быть минимальными и ортогональными: narrative N:1, dialogue 1:N, focal-shift boundary. Для DeepSeek thinking-arm сначала проверить zero-shot против few-shot из-за уже задокументированной модельной специфики research/15; не переносить результат между моделями.
|
||||
|
||||
### C4. Метрики и гейты — пререгистрировать
|
||||
|
||||
| Ось | Первичный показатель | Аварийный гейт |
|
||||
|---|---|---|
|
||||
| Русская абзацность | Blind preference русскоязычного читателя + доля заранее размеченных paragraph traps, решённых правильно | Нельзя побеждать только меньшим числом абзацев |
|
||||
| Смысл внутри чанка | Билингвальная trap accuracy с обязательным supporting span | Любая инверсия действия/участника = catastrophe независимо от среднего ранга |
|
||||
| Смысл через границу | Accuracy отдельно по prev-supported / next-supported / chapter-supported | Random-context perturbation не должен давать тот же результат, иначе context не используется |
|
||||
| Полнота | Покрытие смысловых атомов, не совпадение числа предложений | Любой пропуск заголовка/события дисквалифицирует arm на этом фрагменте |
|
||||
| Операционность | `$`, input/output/reasoning tokens, latency, retries по причинам, **повторно оплаченные токены** | Per-call predicted-cost cap до запуска; не group-level cap (урок exp13) |
|
||||
| Робастность | Leave-one-judge-out + отдельный catastrophe screen | Коррелированные колонки одного судьи не считаются независимыми сигналами |
|
||||
|
||||
**CONFIRMED.** Контекстный arm должен иметь correct-context vs shuffled-context perturbation: иначе улучшение нельзя приписать использованию опоры. Источник: [Mohammed & Niculae 2024](https://aclanthology.org/2024.findings-eacl.113/), доступ 2026-07-11.
|
||||
|
||||
### C5. Критерии решения после полигона
|
||||
|
||||
- Если **P1 discourse prompt** закрывает абзацы без падения fidelity — катить prompt/few-shot; размер не менять.
|
||||
- Если помогает только **draft-layout ablation** — проблема в формальном якоре, строить deformat/atom rendering, не chapter editor.
|
||||
- Если **±1 reference** закрывает большинство смысловых traps — строить малое context-window rendering до Ф2-памяти.
|
||||
- Если нужна **chapter card**, но whole chapter не лучше — строить state extraction/retrieval в Ф2.
|
||||
- Если **whole chapter** выигрывает и по fidelity, и по абзацам, и по retry-adjusted COGS — только тогда проектировать per-stage granularity; повторить на более длинной главе до решения.
|
||||
- Если сильная модель выигрывает в обеих колонках 2×2, а организация почти не помогает — зафиксирован model floor; не строить сложную память ради слабой модели.
|
||||
- Если организация помогает обеим моделям, а сильная+организация даёт дополнительный лифт — разделить near-term context fix и premium model tier.
|
||||
|
||||
## §D. Вопросы, на которые не хватило данных
|
||||
|
||||
1. **Где именно supporting context у мест владельца?** D35 сообщает около 1,28 стыка чанков на главу, но нет разметки: какой процент смысловых провалов разрешается внутри чанка, предыдущим абзацем, следующим абзацем, всей главой или знанием мира.
|
||||
2. **Какова реальная длина/токенизация главы в выбранных traps?** Без распределения нельзя заранее оценить whole-chapter retry exposure и lost-in-middle.
|
||||
3. **Какой frontend/model будет «ChatGPT-arm» полигона?** Эффект prompt format и few-shot модель-специфичен; нельзя честно выдать единый prompt winner без точного model ID/posture.
|
||||
4. **Сохраняются ли source paragraph IDs до editor rendering?** Это определяет, можно ли сделать atom coverage/deformat без runner-изменения.
|
||||
5. **Можно ли дать editor соседний source/target как non-output reference текущим renderer-ом?** Если нет, ручной полигон всё равно возможен, но production-оценка стройки меняется с ПРОД-МИНОР на Ф2 runner work.
|
||||
6. **Каковы retry causes по размеру на боевых моделях?** Нужны отдельно timeout, refusal, length, echo, sanitizer и decode; общий retry-rate скрывает разные зависимости от `c`.
|
||||
7. **Есть ли канонический человеческий/фанатский zh→ru фрагмент с хорошей русской репараграфизацией?** Он нужен как calibration/few-shot, но не как единственный reference style. В репозиторий книжный текст переносить нельзя.
|
||||
8. **Как owner оценивает допустимую степень синтаксического split/merge?** Текущий запрет «не выбрасывай и не добавляй предложения» двусмыслен; нужно подтвердить, что сохраняется содержание, а не sentence count.
|
||||
9. **Насколько front matter должен входить в приёмку художественности?** Его регистр отличается от романа и может искажать итог главы 1.
|
||||
10. **Какой порог успеха «минимально художественно»?** Предлагается операционализировать: обе претензии закрыты на ≥80% заранее размеченных traps, 0 катастроф смысла, и blind majority предпочитает arm baseline на каждой из трёх регистровых глав. Число 80% — предложение для пререгистрации, не внешний факт.
|
||||
|
||||
### Финальный вердикт
|
||||
|
||||
**PLAUSIBLE.** Самый дешёвый следующий ход — не ещё один общий model bake-off и не немедленная Ф2-память. Это короткий причинный полигон: текущий baseline → discourse/few-shot reflow → deformatted draft → ±1 reference, затем 2×2 с frontier-моделью. Whole-chapter arm нужен как диагностическая граница, но не как заранее выбранная архитектура. Автоматический scene-state/DelTA-класс оправдан только если компактная ручная chapter card сначала докажет лифт.
|
||||
345
docs/research/18-quality-levers.md
Normal file
345
docs/research/18-quality-levers.md
Normal file
|
|
@ -0,0 +1,345 @@
|
|||
# research/18 — Рычаги качества: как дотянуть текущую фазу до минимально-художественного zh→ru
|
||||
|
||||
<!-- ─────────────────────────────────────────────────────────────────────────
|
||||
ОРКЕСТРАТОР — РЕВЬЮ-ШАПКА (лендинг, D36, 12.07 №4). Тело §A НЕ тронуто (заморожено;
|
||||
sha256 44f90364… СВЕРЕН побайтно из закоммиченных байтов между BEGIN/END → MATCH →
|
||||
§A доказуемо не редактировалась после заморозки). Поправки — в этой шапке и в §E
|
||||
(«испр. оркестратором»). Полный разбор — PROGRESS §лендинг D36 + D-лог D36.
|
||||
|
||||
ВЕРДИКТ: **ACCEPT_WITH_FIXES.** Более ценный из двух входов: единственный отвечает на
|
||||
вопрос владельца «конвенция vs стиль» с zh→ru источниками; строгость по COGS; честные
|
||||
само-поправки; каждый §C-арм привязан к D-номерам и re-gate D34.3. Несущий диагноз и
|
||||
набор §C-армов подтверждены; дефекты — цитатно-рамочные, ядро не рушат.
|
||||
|
||||
НЕЗАВИСИМАЯ ВЕРИФИКАЦИЯ (мультиагентный воркфлоу, 26 агентов, первоисточники + реплика
|
||||
сырья, $0, refute-by-default; author≠reviewer к отчёту):
|
||||
- **Источники: 57/57 несущих цитат СУЩЕСТВУЮТ — 0 сфабрикованных.** Проверены ВСЕ «2026»-
|
||||
препринты (2601.08070 / 2605.31056 / 2605.29800 / 2605.13596 / 2605.13368 / 2511.09796
|
||||
и др. резолвятся на arXiv к заявленным заголовкам). 50/57 — claim-fidelity полная; 7 —
|
||||
«частично» (источник реален, атрибуция переисчерпана; поправки 1–3 ниже).
|
||||
- **Эмпирика воспроизведена на сырье:** ch5.0 (draft 5425 симв.→финал ПУСТ, `sanitizer_defect`)
|
||||
и ch20.0 — ТОЧНО; CJK-утечка **13 финалов — точно** (draft-«21» включает U+3000-отступ —
|
||||
настоящих иероглифов в draft = 9); 41/51 ~1:1 — в допуске (знаменатель точен, числитель
|
||||
толеранс-чувствителен, вывод устойчив); gl.7-инверсия (没有一个不知道→«никто не знал») и
|
||||
gl.8-сплющивание (物是人非→«всё изменилось») — фактически ПРИСУТСТВУЮТ (тяжесть — на
|
||||
fidelity re-gate полигона, не здесь).
|
||||
- **Ван Цуй (несущий вклад) — ПОДТВЕРЖДЁН по ТЕЛУ статьи:** скептик-агент декодировал
|
||||
CID/Identity-H шрифт PDF (~42к симв., 7 ToUnicode-CMap) → 5 техник verbatim + причастные/
|
||||
деепричастные обороты + подчинение как инструмент слияния + прескриптивная необходимость.
|
||||
Вестник МГУ Сер.22, 2024 №3, с.86–105, DOI 10.55959/MSU2074-6636-22-2024-17-3-86-105,
|
||||
рецензирован — реальный peer-reviewed источник (не экстраполяция).
|
||||
- **Анти-анкоринг:** гардрейлов не нарушено; ни один D-номер не течёт в §A; книжные цитаты
|
||||
≤15 слов. Минор-провенанс: «(идея владельца)» на слое конвенций пары (§A4.4) не
|
||||
прослеживается к разрешённым фазе-1 входам (возможна устная вводная — не задокументирована).
|
||||
|
||||
ПОПРАВКИ К ЛЕНДИНГУ (§A заморожена → корректны здесь; §E дополнена ниже):
|
||||
1. **[цитата] DocRepair-числа** (deixis 50.0→91.8 / когезия 45.9→80.6 / эллипсис 53.0→86.4 /
|
||||
73% предпочтения; §A4.8, §B2.4) — числа ВСЕ верны, но принадлежат ОТДЕЛЬНОЙ статье DocRepair
|
||||
«Context-Aware Monolingual Repair for NMT» (EMNLP-IJCNLP 2019, aclanthology **D19-1081** /
|
||||
arXiv **1909.01383**), НЕ процитированной ACL-2019 **P19-1116** (там CADec 50.0→81.6). Обе —
|
||||
Voita/Sennrich/Titov 2019. Вывод (монолингв. RU repair-пасс работает, EN→RU, с этими
|
||||
магнитудами) СТОИТ; правка — расщепить две цитаты (сделано в §E).
|
||||
2. **[цитата] TransAgents** — §A зовёт «TACL-версия» (arXiv 2405.11804, «To appear at TACL» —
|
||||
подтверждено), §E зовёт «PP 2024-05»: выбрать одно (accepted-but-preprint точнее). Это
|
||||
ДРУГАЯ статья, чем EMNLP-demo `2024.emnlp-demo.14` в ChatGPT-отчёте — не конфликт, две
|
||||
реальные статьи об одной системе (см. §E).
|
||||
3. **[цитата] Z5 «Li & Thompson»** (RG 235852523) — на деле Dingxu Shi, «Topic and Topic-Comment
|
||||
Constructions in Mandarin» (Language 76(2), 2000); клейм топик-комментария верен, автор-метка
|
||||
ошибочна. **Z8 «96% чэнъюй»** — числа НЕТ на процитированной Wikipedia (там «most»); суть
|
||||
(подавляющее большинство четырёхзнаковые) верна, «96%» не источено.
|
||||
4. **[рамка] Ван Цуй = прескрипция переводческой ТЕХНИКИ zh→ru, не «связующая норма языка».**
|
||||
Рамка §A4.4/A5 «обязательная дискурс-операция наравне с нормой» слегка пере-возвышена: это
|
||||
сильнейший маргинальный вклад отчёта (peer-reviewed техника: паратаксис→гипотаксис), но
|
||||
ответ владельцу «конвенция, не стиль автора» несут в первую очередь Розенталь/Правила-1956
|
||||
(нормы абзаца/диалога — CONFIRMED), а Ван Цуй — КАК их технически исполнить.
|
||||
5. **[рамка] «Пост-черновая регрессия > многих качественных проблем»** (§A4.1/A2 headline) —
|
||||
переоценено: ярчайший кейс (ch5.0-void) сам же исправлен в §B3 как ЭКСПОРТ-баг (не порча
|
||||
смысла редактором); остаток = реальные, но узкие CJK-утечки + НЕподтверждённые инверсии (§A
|
||||
помечает PLAUSIBLE). «Класс пост-черновой порчи существует» — честен; ранг «выше 2 претензий
|
||||
владельца» — нет. Guard §C#5 всё равно дёшев → строить.
|
||||
6. **[рамка] «Тройная сходимость»** (§B0) — оговорка про общую внешне-лит-ногу ПРИСУТСТВУЕТ и
|
||||
честна (планка D25.10 взята). Уточнения оркестратора: (а) есть ВТОРАЯ необъявленная общая нога
|
||||
— оба §A читали одно сырьё/код (совпадение по «изоляции чанков / инертному reflow» тоже не
|
||||
независимо); (б) цитатные базы двух отчётов почти НЕ пересекаются (~3 общие статьи) → там, где
|
||||
литература всё же расходится, совпадение вывода СИЛЬНЕЕ, чем оговорка допускает; (в)
|
||||
ChatGPT-заморозку класть в вес сходимости с дисконтом — её sha256 НЕ воспроизводится из
|
||||
документа (внешний прогон владельца; см. шапку ChatGPT-отчёта).
|
||||
───────────────────────────────────────────────────────────────────────────── -->
|
||||
|
||||
> Ресёрч-доклад независимой сессии-ресёрчера (D35.5). Вход эмпирической сессии полигона.
|
||||
> Протокол — трёхфазный анти-анкоринг: §A построена ДО чтения наших решений (только две претензии владельца + сырьё пере-прогона + механизм-как-есть + собственный внешний ресёрч). §B/§C/§D — после чтения нашего стека.
|
||||
> Каждый несущий клейм: вердикт **CONFIRMED / PLAUSIBLE / REFUTED** + источник (тип/дата). Препринт ≠ peer-review; вендор-клейм ≠ независимый замер; результат «в английский» ≠ доказательство «в русский» (помечаю экстраполяцию явно). Отчёт пройдёт адверсариальную верификацию оркестратора по первоисточникам.
|
||||
|
||||
---
|
||||
|
||||
<!-- BEGIN §A FROZEN — не редактировать после заморозки; sha256 ниже в маркере -->
|
||||
|
||||
## §A — «Чистый лист» (заморожено)
|
||||
|
||||
### A0. Метод и границы
|
||||
|
||||
Прочитано в фазе 1 (разрешённое): две претензии владельца; сырьё пере-прогона — исходник `guzhenren-slice25.gb18030.txt`, `rerun/records.json` (по-чанково: source/draft/final/флаги), `rerun/rerun-ru.txt`; механизм-как-есть — `backend/internal/pipeline/chunker.go`, `backend/prompts/{translator,editor}.md`. Плюс собственный внешний веб-ресёрч (52-агентный фан-аут с адверсариальной верификацией).
|
||||
|
||||
НЕ читалось (анти-анкоринг): `05-decisions-log.md`, хендоффы (`ORCHESTRATOR_HANDOFF.md`, `FIDELITY_REGATE_HANDOFF.md`), `rootcause_auto.json`, glossary-signoff, `diag/arms/*`, выводы приёмки. Заголовки последних коммитов присутствовали в среде сессии ambient — на содержание §A не опирался.
|
||||
|
||||
### A1. Механизм как есть (из кода и промптов)
|
||||
|
||||
- **Нарезка** (`chunker.go`): жадно пакует ЦЕЛЫЕ абзацы до `targetChunkTokens=1500` (код-конст, версионируется `chunkerVersion`, фолдится в снапшот); абзац сверх бюджета спускается к границам ПРЕДЛОЖЕНИЙ (предложение не рвётся). Детерминированно, чисто. Фактически ~2 чанка на главу (57 чанков / 25 глав), медиана исходного чанка ~1639 zh-символов.
|
||||
- **Пайплайн**: по-чанково ПЕРЕВОД (draft) → по-чанково РЕДАКТУРА (bilingual, source+draft). Каждый чанк — в ИЗОЛЯЦИИ. НЕТ overlap между чанками, НЕТ running-summary, НЕТ контекста прошлых глав. Единственная кросс-чанковая память — термин-ГЛОССАРИЙ, добавляемый редактору.
|
||||
- **translator.md**: только `{{text}}`; инструкции — «живой литературный русский», верстать по нормам РЯ (НЕ копировать построчную разбивку), прямая речь через тире.
|
||||
- **editor.md**: bilingual, `{{text}}`(src)+`{{draft}}`; сверять смысл с исходником, убирать кальки, глоссарий СТРОГО; «собирай повествование в естественные русские абзацы (не копируя построчную разбивку)»; полнота — не выбрасывать/не добавлять.
|
||||
|
||||
### A2. Замеренная слабость (сырьё)
|
||||
|
||||
**Претензия 1 (рубленость) — ПОДТВЕРЖДЕНА замером.** 41/51 нарративных чанков дают ~1:1 отношение «финальных абзацев к строкам исходника»; 58% ненарративных абзацев — одно предложение; медиана предложений/нарративный-абзац = 1.0. Инструкция reflow, присутствующая в ОБОИХ промптах, практически инертна.
|
||||
|
||||
**Локализация reflow-провала.** Черновик уже рубленый в 43/49 чанков (переводчик зеркалит построчную разбивку). Редактор СОХРАНЯЕТ структуру черновика в 37/49, СЛИВАЕТ лишь в 1/49 → редактор структуро-сохраняющий, НЕ работает layout-пассом. Вариативность reflow живёт в основном на стадии черновика (гл.11 черновик 25 абз., гл.13 — 14: переводчик там СЛИЛ). Оформление диалогов через тире — работает.
|
||||
|
||||
**Претензия 2 (связность/смысл) — ПОДТВЕРЖДЕНА чтением zh↔ru гл.5–12.** На уровне ПРЕДЛОЖЕНИЯ голос в целом приемлем, редактура часто улучшает (внутренний монолог в кавычках, разбивка атрибуции, лексические апгрейды). «Слабая художественность» идёт не от предложенческой translationese, а от кластера сбоев связности/полноты/терминологии. Конкретика:
|
||||
- гл.7: инверсия двойного отрицания 没有一个不知道 («все знали») → «никто не знал» (противоречит главе). [дефект в черновике, редактура не починила]
|
||||
- гл.8: 物是人非 (заглавие-ключ) сплющено до «всё изменилось», теряя контраст «вещи те же — люди иные».
|
||||
- Терминология grade-системы 甲乙丙丁 — дрейф между разряд А/Б/В/Г, числовым «первого/третьего ранга» (коллизия с 转-рангом гу-мастера) и точечными сырыми глифами.
|
||||
|
||||
**Третья ось, НЕ входившая в претензии владельца (самое ценное наблюдение):** значимая доля «слабой художественности» — это РЕГРЕССИЯ ПОСЛЕ ЧЕРНОВИКА, а не качество перевода. Финал местами ХУЖЕ черновика:
|
||||
- **гл.5.0: полный черновик 5425 симв. → финал ПУСТ, `edit_flag='sanitizer_defect'`** (собственный флаг пайплайна). Санитайзер обнулил целый чанк — миф об основании (Жэнь-цзу и три гу, метафора-ядро книги). Один из 2 пустых финалов на книгу. **[CONFIRMED — проверено мной по records.json.]**
|
||||
- **Утечка CJK-глифов в вывод**: 13 строк финалов (и 21 строка черновиков) содержат сырые zh/полноширинные глифы; часть внесена редактурой (напр. гл.8 特产, гл.4.1 资质乙等 — в черновике корректно). **[CONFIRMED — проверено мной.]**
|
||||
- Правки, ломающие смысл: гл.9 (переворот разряда В→Б у Фан Юаня, против всей его сюжетной линии низкого разряда), гл.10 (перекройка процентов восстановления в противоречивые «десятые/сотые») — **[PLAUSIBLE — наблюдение чтения; требует адверсариальной re-проверки оркестратором.]**
|
||||
|
||||
Вывод A2: перед постройкой машинерии связности имеет смысл СНАЧАЛА не давать пост-черновым стадиям (edit/sanitizer) разрушать уже годный черновик.
|
||||
|
||||
### A3. Карта «проблема → механизм» по осям
|
||||
|
||||
#### Ось 1. Дискурс-гранулярность zh→ru: где потолок — в моделях или в организации?
|
||||
|
||||
- **Абзац — эмпирически лучшая единица перевода, чем предложение** (меньше mistranslation/грамматики/несогласованности, естественнее верстается). **[CONFIRMED]** — Karpinska & Iyyer, *LLMs Effectively Leverage Document-level Context for Literary Translation* (WMT 2023, peer-reviewed, ACL 2023.wmt-1.41; arXiv 2304.03245). **Экстраполяция для нас:** мишени в статье — англ./польск./яп., zh как ИСТОЧНИК; направление «в русский» напрямую не мерено (польский — славянский прокси). Единственная модель — GPT-3.5.
|
||||
- **Но у нас единица УЖЕ ~1600 симв. (много абзацев)** — то есть «апсайд от добавления контекста в единицу» в основном ПОТРАЧЕН; дальнейший рост единицы не даёт бесплатного качества. **[PLAUSIBLE]**
|
||||
- **Потолок связности — в ОРГАНИЗАЦИИ (изоляция чанков), а не в сырой модели.** Кросс-предложенческий контекст даёт большой прирост на именно тех дискурс-феноменах, что суть претензии 2. **[CONFIRMED для направления в русский]** — Voita et al., *When a Good Translation is Wrong in Context* (ACL 2019, peer-reviewed, EN→RU OpenSubtitles): 7% индивидуально-верных пар неверны в контексте; окно 3 предложений поднимает deixis 50.0→81.6, лексич. когезию 45.9→58.1, VP-эллипсис — существенно. Домен — субтитры (разговорный), не проза; магнитуды индикативны.
|
||||
- **«Потерянное в середине» ограничивает лишь ВЕРХНИЙ конец кривой** (целая глава / много чанков); на нашем ~1500-ток чанке эффект мягкий и НЕ объясняет текущие дефекты — это довод не прыгать к «глава целиком», а не диагноз. **[CONFIRMED]** — Liu et al., *Lost in the Middle* (TACL 2024; arXiv 2307.03172).
|
||||
- **Ближайший индустриальный аналог нашего пайплайна** — TransAgents (мультиагентная «переводческая компания», zh→en вебновеллы): работает ПО ГЛАВАМ с персистентной Translation Guideline (глоссарий+резюме+тон+стиль), роли Senior/Junior Editor + Proofreader сверх голого translate→edit. **[CONFIRMED]** — TransAgents (TACL; arXiv 2405.11804). Оговорка: под капотом GPT-4-Turbo (фронтир), не дешёвая модель; человеко-предпочтение — монолингвально (слепо к верности).
|
||||
|
||||
#### Претензия 1. Абзацы/конвенции — это КОНВЕНЦИЯ ЯЗЫКА, академически кодифицированная, а не авторский стиль
|
||||
|
||||
Прямой ответ на вопрос владельца — **ДА, это норма русского языка, а не стиль одного автора:**
|
||||
- **Русский абзац — логико-смысловая единица**, группирующая несколько предложений вокруг завершённой мысли; новый абзац — при логическом завершении мысли / смене темы-времени-места-говорящего. Построчно-однопредложенческое тело — по определению НЕ русское абзацирование. **[CONFIRMED]** — Текстология.ру, «Абзац как часть текста»; корпус-норма подтверждена независимо.
|
||||
- **Диалог: каждая реплика — с красной строки через тире; кавычки для бегущего диалога не используются.** Слова автора — строго кодифицированная пунктуация (двоеточие/запятая-тире и т.д.). **[CONFIRMED]** — Розенталь, «Справочник», §47/§50 (Оформление прямой речи); Правила-1956 §195. (Источники — веб-зеркала Розенталя; нумерация разнится по изданиям.)
|
||||
- **Китайская вебновелльная вёрстка расходится с РЯ по всем осям**: отступ (U+3000×2, правило Ху Ши 1919), полноширинная пунктуация, диалог в 引号 «“ ”», привычка очень коротких абзацев (часто одно предложение / 自然段 для мобильного ритма). **[CONFIRMED]** — Wikipedia «Chinese punctuation» + история.
|
||||
|
||||
**Ключевой синтез:** корректный zh→ru reflow — это структурный трансформ из ЧЕТЫРЁХ операций, а не одна инструкция «не копируй разбивку»: (a) СЛИЯНИЕ подряд идущих коротких нарративных строк в многопредложенческие логические абзацы; (b) КОНВЕРСИЯ 引号-диалога в тире-абзацы по репликам; (c) НОРМАЛИЗАЦИЯ глифов (полн.→полуширинные, “ ”→« », — для речи); (d) СНЯТИЕ -отступа. Операции (b),(c),(d) — **ДЕТЕРМИНИРОВАННЫЕ (код, без модели)**; операция (a) требует ДИСКУРСНОГО понимания, чем **сцепляет претензию 1 с претензией 2**. **[CONFIRMED как рамка]**
|
||||
|
||||
Почему инструкция игнорируется и чем чинить:
|
||||
- **LLM surface-копирует построчную структуру входа** (переводы строк — высокосалиентные, near-синтаксические признаки; структурная персистенция), поэтому bilingual-редактор зеркалит one-sentence-per-line черновика. **[PLAUSIBLE]** — Sclar et al. (2024, 2310.11324, format-sensitivity) — аналогия, не прямой замер layout.
|
||||
- **Гипотеза «негативный констрейнт («не копируй») сам по себе — главная причина» — REFUTED**: доказательства backfire негативных констрейнтов — слабые препринты про подавление англ. СЛОВ, не про zh→ru layout. **[PLAUSIBLE→REFUTED]**
|
||||
- **Самый надёжный рычаг — few-shot экземпляры** (рубленый источник/черновик → слитый многопредложенческий целевой абзац), и особенно **target-side якорь** (реальный русский литературный абзац в контексте), т.к. модель копирует структурные решения из демонстраций. **[PLAUSIBLE]** — FollowBench (2024, 2310.20410) — смежная опора.
|
||||
- **Отделить «дать верную русскую прозу» от «разложить в абзацы»** (отдельный reflow/layout-пасс или plan-then-write): инлайн-энфорсмент формата конкурирует с контент-целью; прирост измеримый, но скромный, +1 LLM-вызов. **[PLAUSIBLE]** — 2510.03595 (препринт).
|
||||
- **Осторожно**: слияние предложений и укрупнение контекста ПОВЫШАЮТ риск ОПУЩЕНИЙ и путаницы атрибуции — агрессивный reflow сам может терять/скремблить смысл; нужен guard полноты. **[CONFIRMED]** — Karpinska & Iyyer (WMT 2023).
|
||||
|
||||
#### Претензия 2. Понимание связей/смысла на дистанции
|
||||
|
||||
- **Корневая причина — кросс-чанковая ИЗОЛЯЦИЯ.** Впрыск даже малого контекста (предыдущий src/tgt-хвост + running bilingual summary + реестр имён/антецедентов) даёт большие замеренные приросты consistency и дискурса — на ТОМ ЖЕ домене (китайские вебновеллы). **[CONFIRMED ядро]** — DelTA (ICLR 2025, peer-reviewed; arXiv 2410.08143): память-тиры (Proper-Noun Records, running summary), GuoFeng zh→en; средний прирост согласованности +4.58 (заголовочный +48.5 — единичный best-case). Оговорка: не →ru; часть опор — препринты.
|
||||
- **zh-специфика: нулевые/опущенные местоимения и субъекты (zero anaphora)** — доминирующий драйвер провала на дистанции; русский (non-pro-drop, согласование род/число) требует ЭКСПЛИЦИТАЦИИ, а антецедент часто в ПРЕДЫДУЩЕМ предложении → корректное восстановление структурно НЕВОЗМОЖНО при поч-чанковой изоляции. **[CONFIRMED, что это архитектурный, а не только «дешёвая модель», баг]**. Голая инструкция «будь внимателен» почти не помогает; чинит только явный контекст/аннотация. **[PLAUSIBLE]** — препринт 2605.31056 (zh→en: <50% ZP базово, oracle-разметка +40 пт); экстраполяция на →ru.
|
||||
- **Глоссарий — слабейшая кросс-чанковая память**: адресует только лексическую когезию (~14% русских дискурс-ошибок), мимо deixis (~37%) и эллипсиса/морфологии (~29%). **[CONFIRMED]** — производно от Voita et al. (ACL 2019). Значит от глоссария в одиночку прироста связности ждать мало.
|
||||
|
||||
**Ранжирование лекарств претензии 2 (эффект / стройка):**
|
||||
1. **Running bilingual summary + previous-chunk carryover** — лучший НЕистраченный рычаг: замерен прямо на китайских вебновеллах (DelTA), стоит ~1 малый вспом-вызов на ~20 предложений; source-primed контекст предпочтительнее переиспользования прошлого МАШИННОГО перевода (последнее роняет качество из-за накопления ошибок). **[CONFIRMED направление / PLAUSIBLE магнитуда для →ru]**
|
||||
2. **Document/paragraph-level контекст** — лучший по доказательности, но у нас уже ПОТРАЧЕН (единица крупная).
|
||||
3. **Аннотатор (MAPS-класс: ключевые слова/тема/демо)** — снижает локальную mistranslation, но SENTENCE-level, требует 3-4 кандидата + QE-выбор (3-4× цена), бьёт по локальной адекватности, не по дальней связности. **[PLAUSIBLE]**
|
||||
4. **Сильнее модель** — крупнейший одиночный рычаг на дискурс, но лобовой конфликт с дешёвым COGS; контекст+память дают дешёвой модели закрыть бóльшую часть разрыва. **[PLAUSIBLE]**
|
||||
5. **Self-refine / итеративный пост-эдит — СПОРНО для MT**: полирует fluency/translationese, даёт скромный прирост и лишь при внешнем error/QE-сигнале, смещён «в английский», может деградировать/галлюцинировать на итерациях; связность, к которой модель НЕ имела доступа, не восстановит. **[CONFIRMED, что спорно]** — Chen et al. (EAMT 2024, TEaR) + др.
|
||||
|
||||
#### Ось 4. Кривая chunk ↔ качество ↔ биллинг ↔ ретраи (рамка для пре-регистрации)
|
||||
|
||||
- **Форма — перевёрнутая U**: снизу ограничена потерей когезии у слишком мелкой единицы (Karpinska), сверху — базово-модельной/позиционной деградацией у слишком крупной (Lost-in-Middle; для НЕ-дообученных инструкт-моделей качество ПАДАЕТ с ростом единицы — 2504.12140, препринт, малые модели). **[PLAUSIBLE]**
|
||||
- **COGS доминируется ВЫХОДНЫМИ токенами**, + «фертильность» русского/кириллицы на англо-центричных токенизаторах (~2–2.5× англ.). Значит КАЖДЫЙ добавленный русско-генерящий LLM-пасс множит доминирующую статью; префикс-кэш скидывает лишь дешёвый ВХОД. **[CONFIRMED]** — Petrov et al. (NeurIPS 2023, tokenizer fairness) для фертильности.
|
||||
- **Префикс-кэш делает пере-слание system+glossary почти бесплатным** — НО только если статику класть ПЕРВОЙ, а volatile-контекст (running summary, меняющийся каждый чанк) ПОСЛЕ неё (любой volatile-префикс инвалидирует кэш ниже). Тогда worry «глоссарий шлётся каждый чанк» — почти не-проблема. **[CONFIRMED для наших провайдеров с оговоркой ordering]**
|
||||
- **Retry blast radius тянет оптимум к МЕНЬШЕЙ единице** (переген всего чанка при мисматче) — центральное напряжение против качественного тяготения к крупной; оптимизировать надо на RETRY-ADJUSTED output-cost, а связность подавать глубиной кэшированного carryover, а НЕ размером единицы. **[PLAUSIBLE]**
|
||||
- **Вывод оси 4:** ОТВЯЗАТЬ дискурс-единицу от биллинг-единицы: держать чанк небольшим (дёшево, малый blast radius, меньше output-деградации), а когезию давать кэшированным summary/carryover.
|
||||
|
||||
### A4. Оси, которые команда могла не увидеть (приоритетно)
|
||||
|
||||
1. **Пост-черновая регрессия > многих «качественных» проблем.** Санитайзер/редактура местами уничтожают годный черновик (гл.5 обнулён; CJK-утечки; правки-перевороты смысла). Дешевле всего: гейт «финал не должен быть пустым/короче черновика на X%», «нет сырых CJK-глифов в выводе», «числа/термины из черновика не переворачиваются». Это адресует «слабую художественность» БЕЗ новой машинерии. **[CONFIRMED наблюдение]**
|
||||
2. **Reflow ЧАСТИЧНО БЕСПЛАТЕН.** Операции (b)/(c)/(d) 4-операционного трансформа — детерминированные (код-нормализация глифов/диалога/отступа); только (a) слияние — дискурсная. Отделить дешёвое-детерминированное от дорогого-модельного. **[CONFIRMED рамка]**
|
||||
3. **Метрика-инверсия для zh→ru — конкретно, не абстрактно.** На WMT24 zh→ru простой Google-NMT обошёл ВСЕ LLM/мультиагентные системы по d-BLEU (human-eval отсутствовал) — прямая same-pair демонстрация, что гейтинг художественности на авто-метрике ИНВЕРТИРУЕТ ранжирование. Следствие: претензию 1 сложить в дешёвый ДЕТЕРМИНИРОВАННЫЙ структурный KPI; художественность/связность — не на BLEU/COMET. **[PLAUSIBLE — источник WMT24 zh→ru; точный URL — к сверке оркестратором]**
|
||||
4. **Пара-конвенции как переиспользуемый ВЕРСИОНИРУЕМЫЙ слой** (идея владельца). Отделить (a) конвенции ПАРЫ ±жанр [zh→ru: паратаксис→гипотаксис, красная строка, тире, эксплицитация опущенных местоимений, политика 成语] — глобальный версионируемый ассет, ключ (src→tgt[×регистр]); (b) память КНИГИ (глоссарий/голоса) — как сейчас; (c) ручки прогона (venuti/honorifics). Грузонесущее свойство — версионирование+снапшот-фолд (смена = громкая ре-трансляция, как `chunkerVersion`), а не носитель (config-ассет или таблица БД). Есть **прямая zh→ru (не экстраполяция) peer-reviewed прескрипция**: 5 техник передачи китайских паратактических предложений в русский — (1) построить иерархию в русском, (2) сегментировать по смысловым единицам, (3) промаркировать вид/время предикатов по нормам РЯ, (4) варьировать лексику, (5) добавлять связки по контексту. **[CONFIRMED]** — Ван Цуй, «Анализ китайских паратактических предложений и их перевода на русский язык», Вестник МГУ Сер. 22 (Теория перевода). Русский-специфичный инструментарий слияния — причастные/деепричастные обороты + подчинительные союзы.
|
||||
- Открытая развилка (к замеру, не приговор): РАЗМЕР/ФОРМА пакета = вопрос «способность vs активация»; большой правилник может жечь токены и размывать внимание, если знание латентно; возможно, короткий указатель или 1–2 few-shot экземпляра бьют точнее. Ключ может быть пара×жанр. Пакет должен нести ОГРАНИЧИТЕЛИ против коллизии с инвариантом полноты (слияние/эксплицитация — на грани «добавления»).
|
||||
5. **Способность vs активация — диагностический арм.** Один и тот же reflow-промпт × дешёвая vs фронтир-модель: фронтир верстает, дешёвая нет → gap способности; ни та ни другая → недоспецифицированный промпт; краткое правило/пример чинит дешёвую → это была активация. Разводит «модель не умеет» от «модель недоактивирована».
|
||||
6. **Бюджет чанка — в ВЫХОДНЫХ токенах на реальном токенизаторе (DeepSeek/GLM), а не в zh-символах**; пере-калибровать под фертильность кириллицы и стабильный output-потолок модели (~3–4k ток у мелких — раньше). **[CONFIRMED довод]** — Petrov et al. (NeurIPS 2023).
|
||||
7. **Разметка нулевых местоимений/кореференции исходника** как дешёвый препроцесс перед переводом (zh zero-pronoun → явная маркировка): oracle-разметка стоит +40 пт там, где инструкции ~ничего. **[PLAUSIBLE, zh→en, экстраполяция на →ru]**
|
||||
8. **DocRepair-класс: монолингвальный РУССКИЙ reflow/repair-пасс**, который НЕ видит китайский, а чинит связность/абзацы уже переведённого + контекст соседей (это шаг Найды «реструктуризация»). EN→RU: deixis 50.0→91.8, лексич. когезия 45.9→80.6, эллипсис-флексия 53.0→86.4; аннотаторы предпочли 73%. **[CONFIRMED для EN→RU]** — Voita et al. (ACL 2019, DocRepair). Это отделяет fluency/layout-работу от fidelity-работы.
|
||||
|
||||
### A5. Гипотеза-резюме §A (моя карта до чтения нашего стека)
|
||||
|
||||
1. «Слабая художественность» = сумма ТРЁХ, не двух, слоёв: (i) **пост-черновая регрессия** (санитайзер/редактура ломают годный черновик) — вероятно, самый дешёвый и недооценённый; (ii) **рубленость** = source-mirroring + инертная инструкция, чинится дёшево смесью детерминированной нормализации + few-shot/target-anchor + (возможно) отдельного layout-пасса; часть рубленостей (слияние) — дискурсная и сцеплена с (iii); (iii) **связность на дистанции** = архитектурный баг изоляции чанков + zh zero-anaphora; лучший дешёвый рычаг — running bilingual summary + prev-chunk carryover (кэш-дружественно), НЕ глоссарий и НЕ self-refine.
|
||||
2. Потолок текущей фазы — в ОРГАНИЗАЦИИ (контекст/память/промпт/нарезка/пост-обработка), не в сырой дешёвой модели; переход на фронтир — рычаг, но не первый по эффективности-на-стройку.
|
||||
3. Измерять: претензию 1 — дешёвым ДЕТЕРМИНИРОВАННЫМ структурным KPI (без судьи); претензию 2 — судья/QA-стиль (TREQA) или дешёвый человеко-протокол (ESA); НИКОГДА не гейтить художественность на BLEU/COMET (для zh→ru доказана инверсия); беречься «сфабрикованной сходимости» судей (устанавливать независимость до агрегации).
|
||||
|
||||
<!-- END §A FROZEN -->
|
||||
<!-- FREEZE-MARKER §A: sha256=44f90364c786e86bf12e977b8a6712e9e2e89e7cd53d92540def624d842cce6f (хеш байтов между маркерами BEGIN..END; оркестратор: сверить перед фазой 2; ресёрчер §A после заморозки не редактировал — §B/§C/§D только ниже) -->
|
||||
|
||||
---
|
||||
|
||||
## §B — Дифф: §A против нашего стека (и параллельного ChatGPT-отчёта)
|
||||
|
||||
### B0. Метод и главный результат диффа
|
||||
|
||||
§A заморожена (sha256 `44f90364…`) ДО чтения: `05-decisions-log` (D1–D35), `research/07/15/16`, exp04/09/12/13, и параллельного `research/18-quality-levers-chatgpt.md`. Главный результат: **тройная независимая сходимость.** Три пути — (i) моя §A (сырьё+внешняя литература), (ii) ChatGPT-§A (тоже заморожена до стека, sha256 `b42c6f6e…`), (iii) эмпирический стек команды (D26→D35) — сошлись на диагнозе и на большинстве рычагов. Это сильное подтверждение. **Оговорка против сфабрикованной сходимости (D25.10/D32.4):** независимы попарно ПУТИ (я не читал ChatGPT до заморозки; обе §A заморожены до стека; команда пришла эмпирикой), но нога «внешняя MT-литература» ОБЩАЯ у меня и ChatGPT — совпадения там ≠ три независимых голоса. Поэтому ценность §A не в «ещё раз то же», а в остатке: где я расхожусь и что добавляю (B2), плюс честные само-поправки (B3).
|
||||
|
||||
### B1. Где §A СОШЛАСЬ с командой (команда угадала — не дублировать, подтвердить)
|
||||
|
||||
| §A-ось | У команды уже есть | Статус |
|
||||
|---|---|---|
|
||||
| Reflow зеркалит рубленость исходника = промпт-рычаг | D35.1 дословно; D30.2 снял «сохраняй разбивку», мандат репараграфизации | ✅ угадано |
|
||||
| Within-chunk (промпт-фиксимо) vs cross-chunk (Ф2) | D35.1 (чанк пакует ~34 абз. / ~1.28 стыка на главу) | ✅ угадано |
|
||||
| Ось «нарезка × промпт» — ключевой невыжатый рычаг | D35.3 (exp04/12/13 крутили только МОДЕЛЬ) | ✅ угадано |
|
||||
| Source-line strip как рычаг претензии 1 | **exp12:174 уже предлагает** снять построчную разбивку | ✅ угадано (моя §A НЕ первая) |
|
||||
| Русские нормы абзаца/диалога с первоисточниками | **research/16 §2.3: Розенталь §52-53, Лопатин ПАС §138, Правила-1956 §51**; тире-flagger | ✅ угадано (полнее, чем §A знала — см. B3) |
|
||||
| Running summary / annotator / межглавные резюме | Ф2: DelTA-обоснован (D21, D30.8); **exp09-M2 = «глоссарий+скользящее резюме» уже арм** | ✅ угадано (как Ф2/пилот-арм) |
|
||||
| Output-санитайзер / пост-черновые порчи | D30.3/D33/D33.1 (утёкшие преамбулы, латиница, markdown) | ✅ угадано |
|
||||
| Пустые финалы ch5/ch20 (моя «третья ось») | **D35.4a: известный экспорт-баг** (санитайзер флагает ведущий `###`, экспорт дропает) | ✅ угадано (см. B3) |
|
||||
| Сырой китайский 甲乙丙丁/资质 в глоссарий | D35.4c (глоссарий-адресуемая часть претензии 2) | ✅ угадано |
|
||||
| Декаплинг дискурс-единицы от биллинг-единицы | D35.7 (`draft=чанк/edit=глава`, runner-уровень) | ✅ угадано |
|
||||
| Метрика: детерминированный структурный KPI + judge-дисциплина | D29.1d диалог-flagger; 07:86 translationese-метрики; D13.3 панель; D25.10/D32.4 анти-сходимость; D30.1 span-судья | ✅ угадано (команда МЕТОДИЧЕСКИ впереди) |
|
||||
| Frontier-арм как диагностика потолка ≈ capability-vs-activation | D35.3 | ✅ угадано |
|
||||
| Промптинг литперевода (task-framing, few-shot по классам, sandwich, no manual CoT, «plan+translate в одном вызове не армить») | research/15 §1.2/§3 обширно | ✅ угадано (АУГМЕНТИРОВАТЬ, не дублировать) |
|
||||
|
||||
Вывод B1: команда угадала правильно почти всю карту. Диагноз D35 = моя §A. Это повышает доверие, что «строить» надо по этой карте — но и снижает новизну §A; реальная ценность — в B2.
|
||||
|
||||
### B2. Где §A РАСХОДИТСЯ / команда недостроила (несущий остаток)
|
||||
|
||||
1. **zh→ru ДИСКУРС-ТРАНСФОРМ как переводческая теория — самая тонкая ось стека.** research/16 grounds РУССКУЮ сторону (нормы абзаца/диалога) и на уровне ВЫРАВНИВАНИЯ отмечает китайский паратаксис (Xue&Yang ACL 2011, ~16.6% запятых — границы), но **нет переводоведческой рамки zh→ru**: паратаксис→гипотаксис (意合/形合), 流水句, обязательность сращивания. Критично: research/16 §2.3 считает слияние (N:1) «дискреционным стилем, не нормой» — а **прямая zh→ru peer-reviewed прескрипция (Ван Цуй, Вестник МГУ Сер.22) говорит: пересборка паратактической цепи в русскую иерархию ОБЯЗАТЕЛЬНА** (5 техник: иерархия / сегментация по смыслу / вид-время / лексика / добавление связок), а инструмент — причастные/деепричастные обороты + подчинение. **Это апгрейдит «слияние дискреционно» → «слияние — требуемая дискурс-операция, и вот КАК».** Даёт reflow-промпту реальный zh→ru СОДЕРЖАНИЕ, а не «не копируй разбивку». **[CONFIRMED; прямой источник, не экстраполяция]** — самый сильный вклад §A, прямо отвечает на вопрос владельца «это конвенция языка, а не стиль автора».
|
||||
2. **Слой «пакет конвенций пары» как ВЕРСИОНИРУЕМЫЙ артефакт (идея владельца) — структурный пробел.** research/07 держит конвенции пары как КОНТЕНТ (Палладий/Поливанов, Venuti, Нора Галь), но **«разбросаны как brief/config-политики, отдельного слоя нет»** (вывод фазы-2). Отделить (пара±жанр) от (книга) от (прогон); ключ (src→tgt[×регистр]); снапшот-фолд как `chunkerVersion`. Не носитель, а версионирование — грузонесущее. → §C-архитектура.
|
||||
3. **Running summary — переоценить для near-term, не только пилот.** Команда СОЗНАТЕЛЬНО не строит LLM-резюме (research/15: «DelTA платит вызовами — мы нет», COGS-козырь); имеет лишь детерминированную инъекцию срезов памяти (Aho-Corasick) + M2-арм в пилоте. Но DelTA даёт бенефит именно бегущим резюме на ТОМ ЖЕ домене (вебновеллы), а COGS-возражение слабеет при кэш-дружественном ordering (резюме — 1 малый вызов на ~20 предложений, вход near-free при префикс-кэше). → предлагаю мерить running summary как near-term рычаг претензии-2-кросс-чанк, не хоронить на COGS до замера.
|
||||
4. **DocRepair-класс (монолингвальный РУССКИЙ repair-пасс) с числами В РУССКИЙ.** ChatGPT тоже флоатит «отдельный target-only пасс», но без into-ru доказательств; у меня Voita 2019 EN→RU: deixis 50→91.8, когезия 45.9→80.6. Опция для op(a)+связность отдельно от билингв-fidelity-редактуры (editor-mono.md существует, но DORMANT — D33.4a). **[CONFIRMED для EN→RU]**
|
||||
5. **Стоимостная строгость: фертильность-налог + cache-ordering + перевёрнутая-U.** ChatGPT имеет формулу+retry-множитель; команда — exp08+чанкер-конст+D35.6-арм. Добавляю: COGS output-доминирован + **кириллица-фертильность ~2–2.5× (Petrov NeurIPS 2023)** → бюджет чанка в ВЫХОДНЫХ токенах на реальном токенизаторе, не zh-символах; **cache-ordering** (статик первым, volatile-summary после — иначе кэш бьётся); перевёрнутая-U (когезия снизу, позиционная деградация сверху).
|
||||
6. **Метрика-инверсия zh→ru — конкретный датапоинт.** WMT24 zh→ru: Google-NMT обошёл все LLM/мультиагент по d-BLEU без human-eval → не гейтить художественность на авто-метрике (у команды дисциплина есть, конкретного zh→ru датапоинта — нет). **[PLAUSIBLE — URL к сверке]**
|
||||
|
||||
### B3. Само-поправки §A после чтения стека (честно)
|
||||
|
||||
- **ch5.0 «санитайзер обнулил чанк» → НЕТ: экспорт-баг D35.4a.** Санитайзер ФЛАГАЕТ ведущий `###`, а экспорт дропает флагнутый чанк в пустоту вместо strip/fallback; текст правки ЦЕЛ. Класс тот же (пост-черновая порча), но механизм — экспорт, не санитайзер-void. Команда уже поймала (полигон обязан починить ch5/ch20 до слепых пакетов).
|
||||
- **«команда не заземлила reflow в Розенталя» → неверно.** research/16 заземлила РУССКУЮ сторону (Розенталь §52-53, Лопатин, Правила-1956). Точный пробел уже — zh→ru ТРАНСФОРМ-сторона (B2.1), не русские нормы.
|
||||
- **source-line strip как «новый рычаг» → не новый:** exp12:174 уже предлагает. §A-статус «оси, что могли не увидеть» для этого пункта снимаю.
|
||||
|
||||
### B4. Дифф против параллельного ChatGPT-отчёта (чтобы не дублировать)
|
||||
|
||||
Сходятся (обе независимые §A): source-strip, discourse-move few-shot, look-behind/look-ahead (особ. для zh нулевого подлежащего), chapter-card, декаплинг трёх единиц (coverage-atom ≠ generation-unit ≠ reference-span), perturbation-тест (correct vs random context) как центральная метрика, детерминированный структурный KPI, model-floor 2×2, «whole-chapter только как диагностический потолок», retry-adjusted cost. **Совпадение двух независимо-замороженных §A — корроборация** (с оговоркой общей лит-ноги B0).
|
||||
|
||||
Мой маргинальный вклад СВЕРХ ChatGPT: (1) zh→ru академ-грунтинг Ван Цуй/паратаксис-гипотаксис — ChatGPT ЯВНО пишет «zh→ru якорей нет»; (2) версионируемый слой пары; (3) DocRepair into-ru числа; (4) фертильность-налог + cache-ordering; (5) метрика-инверсия zh→ru. ChatGPT сверх меня: развёрнутая two-stage eval-схема (Stage I причинная проба на 6–8 ловушках / Stage II слепые 3 финалиста), «дискурсный пакет» как generation-unit, трёх-единичная факторизация — ценно, рекомендую взять в §C (не переизобретаю, ссылаюсь).
|
||||
|
||||
---
|
||||
|
||||
## §C — Рекомендации для полигона (таблица-вход эмпирической сессии D35.6)
|
||||
|
||||
Формат: {механизм → как измерить → цена → эффект на претензию → фаза}. Явно разведено: **СЕЙЧАС** (промпт/нарезка/глоссарий/детерминированный код, без Ф2-машинерии) vs **Ф2** (память/аннотатор/reference-тома). Строки согласованы с осями D35.6 (нарезка×промпт, frontier-арм, кривая размер↔качество↔биллинг↔ретраи, fidelity re-gate, слепые пакеты) и с методик-guard D32.4 (fidelity-first, leave-one-out, катастроф-скрин, per-call кап, независимость сигналов).
|
||||
|
||||
### C1. СЕЙЧАС — промпт/нарезка/глоссарий/детерминированный код
|
||||
|
||||
| # | Механизм | Как измерить (арм/проба) | Цена | Эффект → претензия | Фаза |
|
||||
|---|---|---|---|---|---|
|
||||
| 1 | **Дискурс-reflow промпт с zh→ru СОДЕРЖАНИЕМ** (5 техник Ван Цуй: иерархия/сегментация/вид-время/лексика/связки; причастные-деепричастные обороты; Розенталь-диалог) вместо «не копируй разбивку» | Структурный KPI (распределение предложений/нарратив-абзац vs русский референс) + слепое чтение; арм × (чанк\|глава) — ось нарезка×промпт | ~0 (промпт) | Претензия 1 (+сцеплённая часть 2) | Сейчас |
|
||||
| 2 | **Discourse-move few-shot** (рубленый→слитый; target-side русский якорь; diversity-подбор ≤5 — research/15 few-shot-дисциплина) | Тот же KPI + fidelity re-gate (omission-guard: слияние повышает опущения) | +вход-токены (кэшируемо) | Претензия 1 | Сейчас |
|
||||
| 3 | **Source-line strip / deformat черновика** до редактора (убрать зеркалящий cue) | A/B тот же KPI — изолирует построчный cue (exp12:174) | ~0 (детерм.) | Претензия 1 | Сейчас |
|
||||
| 4 | **Детерминированный reflow-постпроцессор** ops (b)+(c)+(d): тире-диалог + нормализация глифов (полн.→полу, “”→«», —) + снятие + strip markdown-`###` | CJK-глиф=0 гейт; диалог-парность-flagger (D29.1d) | ~0 (код) | Претензия 1 + утечка CJK-глифов | Сейчас |
|
||||
| 5 | **Guard пост-черновой регрессии**: финал не пуст / не короче черновика на X% / нет сырых CJK / числа-разряды не переворачиваются vs черновик | Детерм. гейт + fidelity re-gate (D34.3) | ~0 (код) | «Третья ось» (вкл. экспорт-баг ch5/ch20 D35.4a) | Сейчас |
|
||||
| 6 | **Глоссарий: засев сырых 甲乙丙丁/资质** (D35.4c) | Term-coverage post-check | ~0 | Претензия 2 (глоссарий-адресуемый срез) | Сейчас |
|
||||
| 7 | **±1 reference-контекст** (хвост пред-target + пред-source + след-source до границы сцены, НЕ переводится) | Кросс-граница trap-accuracy + **perturbation** (correct vs random context не должен совпасть); факторить prev-target/prev-source/next-source ОТДЕЛЬНО | +вход-токены (кэш); вопрос рендера (§D-7) | Претензия 2 near-term | Сейчас-ish |
|
||||
| 8 | **Кривая нарезки**: (0.75k/1.5k/3k/глава) × (жадная упаковка \| сцен-граница) на **retry-adjusted output-token cost**; бюджет в ВЫХОДНЫХ токенах (кириллица-фертильность Petrov) | Пре-регистрация: in/out/reasoning-токены, латентность, retry-rate ПО ПРИЧИНАМ, re-billed доля, coverage, слепое предпочтение, KPI-абзацы, trap-теги | Эксперимент | Обе + стоимость | Сейчас (диагностика) |
|
||||
| 9 | **Capability-vs-activation / model-floor 2×2** (слабая/сильная × текущий/дискурс-промпт) + **арм краткой инъекции правил** | Trap-closure на 2×2; фронтир-арм = диагностика потолка (модели vs организация); гарды D22.5 (эхо-скрин, self-family exclusion) | Фронтир $ (владелец согласовал) | Диагностика (потолок) | Сейчас |
|
||||
| 10 | **Автоматическая оценка качества (запрос владельца)**: претензия 1 = детерм. KPI (без судьи); претензия 2 = span-цитирующий билингв-судья + comprehension-QA (TREQA) + perturbation | Guard: leave-one-out, family-exclusion, per-call кап, **НИКОГДА не гейтить художественность на BLEU/COMET** (zh→ru инверсия WMT24); владелец кросс-чек ChatGPT+вручную | Судья-вызовы (кэш) | Инфра замера обеих | Сейчас |
|
||||
|
||||
### C2. НУЖНА Ф2-машинерия
|
||||
|
||||
| # | Механизм | Как измерить | Цена | Эффект → претензия | Фаза |
|
||||
|---|---|---|---|---|---|
|
||||
| 11 | **Running bilingual summary + реестр сущностей/антецедентов** (DelTA-класс) | exp09-memory-eval M2 + кросс-чанк trap; cache-friendly ordering | +1 малый вызов/~20 предл. (вход near-free при кэше) | Претензия 2 кросс-чанк | Ф2 (пере-взвесить vs COGS-депри research/15 — B2.3) |
|
||||
| 12 | **Chapter card** (сущности/связи/цель/место/время/нерешённые ссылки из 1 пред-чтения главы) | Кросс-чанк trap; сравнить с #11 (компактная ручная карта должна доказать лифт ДО авто-памяти) | 1 пред-чтение/глава | Претензия 2 | Ф2-lite (сходится с ChatGPT) |
|
||||
| 13 | **Пре-аннотация нулевых местоимений/кореференции** исходника | Trap-accuracy на ZP-кейсах | Аннотатор-пасс | Претензия 2 (zh-специфика) | Ф2 |
|
||||
| 14 | **Отдельный монолингв. РУССКИЙ reflow/repair-пасс** (DocRepair) vs комбинированный редактор | A/B: один редактор vs (билингв-семантика→target-only-reflow) под coverage-гейтом | +1 пасс (target-only дешевле) | Претензия 1 op(a) + связность | Ф2 / арм сейчас |
|
||||
|
||||
### C3. Архитектура (зона оркестратора/бэкенда — предложение, не приговор)
|
||||
|
||||
| # | Механизм | Как измерить/решить | Фаза |
|
||||
|---|---|---|---|
|
||||
| 15 | **Слой «пакет конвенций пары»** (идея владельца): контент = 5 ops Ван Цуй + русские нормы + Палладий; ключ (src→tgt[×жанр]); снапшот-фолд; **несёт ОГРАНИЧИТЕЛИ против инварианта полноты**; РАЗМЕР/ФОРМА (короткий указатель vs правилник vs few-shot) = исход арма #9/#1-2 | Reflow-промпт-армы #1-2 И ЕСТЬ проба размера/формы пакета; финальное размещение — оркестратор/бэкенд под доказанный ROI (Р2/D30.7) | Дизайн сейчас, стройка под ROI |
|
||||
|
||||
Рекомендую взять из ChatGPT-отчёта (не переизобретаю): two-stage eval (Stage I причинная проба на 6–8 ЛОВУШКАХ вместо «средних глав» / Stage II слепые 3 финалиста), «дискурсный пакет» как generation-unit, факторизацию трёх единиц.
|
||||
|
||||
---
|
||||
|
||||
## §D — Вопросы, на которые не хватило данных
|
||||
|
||||
1. **Где именно живёт опорный контекст провалов связности владельца** — в-чанке / пред / след / вся-глава / мир-знание? D35 даёт ~1.28 стыка/глава, но НЕ размечено. Без размеченного trap-набора нельзя выбрать между #7/#11/#12. (Флагаю и я, и ChatGPT.) — первично для полигона.
|
||||
2. **Магнитуда в РУССКИЙ.** Вся несущая внешняя эмпирика (Karpinska, DelTA, DocRepair, zero-pronoun) — into-English/EN→RU-экстраполяция; единственный zh→ru замер даст полигон (фронтир+дешёвый армы). Пометка обязательна на каждом клейме.
|
||||
3. **Размер/форма пакета конвенций (#15) = вопрос «способность vs активация»** — не решён до 2×2 (#9) + инъекц-армов (#1-2).
|
||||
4. **Коллизия слияния/эксплицитации с инвариантом полноты** на практике — semantic-atom-coverage vs sentence-count; нужен omission-guard-замер (#2/#5).
|
||||
5. **COGS running-summary при кэше** — стоит ли бенефит DelTA доп-вызова на наших ценах при cache-ordering (пере-взвесить депри research/15).
|
||||
6. **Retry-rate q(c) по типам провала на размер чанка** на живых дешёвых моделях — не замерено; нужно для retry-adjusted-кривой (#8).
|
||||
7. **Рендер: может ли runner подать соседний src/tgt как non-output reference** без нового persistent-домена? Определяет, #7 — это PROD-MINOR или Ф2 (вопрос бэкенду).
|
||||
8. **Владельцу:** допустимая степень синтакс-слияния/дробления; считается ли front-matter в художественную приёмку (из ChatGPT §D — решение владельца).
|
||||
|
||||
---
|
||||
|
||||
## §E — Источники (URL + дата + тип), несущие клеймы
|
||||
|
||||
Тип: **PR** peer-reviewed · **PP** preprint (не peer-review) · **STD** норм.-стандарт · **DOC** офиц./вендор-дока · **BLOG/OTH** блог/вторичное. Дата — публикация/доступ. Верификатор открывал ключевые (WebFetch); часть zh-источников по 403 — сверена сниппетами (помечено в §A/§B).
|
||||
|
||||
**Дискурс-гранулярность / doc-level (Ось 1):**
|
||||
- [PR 2023] Karpinska & Iyyer, *LLMs Effectively Leverage Document-level Context for Literary Translation*, WMT2023 — https://aclanthology.org/2023.wmt-1.41/ · arXiv https://arxiv.org/abs/2304.03245
|
||||
- [PR 2019] Voita et al., *When a Good Translation is Wrong in Context* (context-aware EN→RU; спутник DocRepair) — https://aclanthology.org/P19-1116/
|
||||
- [PR 2024] Liu et al., *Lost in the Middle* (TACL) — https://aclanthology.org/2024.tacl-1.9/
|
||||
- [PR 2021] G-Transformer for Doc-Level MT (ACL) — https://aclanthology.org/2021.acl-long.267/
|
||||
- [PP 2024-07] *Towards Chapter-to-Chapter Context-Aware Literary Translation* — https://arxiv.org/html/2407.08978
|
||||
- [PP 2025-04] *Multilingual Contextualization of LLMs for Doc-Level MT* (2504.12140; inverted-U, N=3 контекст) — https://arxiv.org/abs/2504.12140
|
||||
- [PP 2024-12] *Investigating Length Issues in Doc-Level MT* — https://arxiv.org/abs/2412.17592
|
||||
- [PP 2025-06] *Beyond the Sentence: Survey on Context-Aware MT with LLMs* — https://arxiv.org/abs/2506.07583
|
||||
|
||||
**Мультиагент/прайор-арт + fan/commercial:**
|
||||
- [PP 2024-05] TransAgents, *(Perhaps) Beyond Human Translation* (TACL-версия) — https://arxiv.org/abs/2405.11804
|
||||
- [PR 2024-10] DelTA (ICLR 2025; multi-level memory, running summary) — https://arxiv.org/abs/2410.08143 · https://openreview.net/forum?id=hoYFLRNbhc
|
||||
- [PP 2024-12] DRT, *Deep Reasoning Translation via long CoT* — https://arxiv.org/abs/2412.17498
|
||||
- [PR 2023] GuoFeng-Webnovel (zh↔ru/de, V2 без sent-align) — https://github.com/longyuewangdcu/GuoFeng-Webnovel
|
||||
- [DOC 2024] py3TranslateLLM (LLM=paragraph, NMT=line) — https://github.com/gdiaz384/py3TranslateLLM · [DOC 2026-07] DeepL split_sentences — https://developers.deepl.com/api-reference/translate · [VEND 2023] DeepL context param — https://www.deepl.com/en/blog/deepl-api-context-parameter · [VEND 2026] TeaNovel (consistency drift; full-chapter) — https://read.teanovel.com/blog/how-to-translate-chinese-novels-with-ai
|
||||
|
||||
**Претензия 1 — русские нормы + reflow-механика:**
|
||||
- [DOC 2026-07] Розенталь §47 прямая речь — http://old-rozental.ru/punctuatio.php?sid=155 · §52 диалог — http://old-rozental.ru/punctuatio.php?sid=160 · §50 слова автора — https://evartist.narod.ru/text1/52.htm
|
||||
- [STD 1956] Правила русской орфографии и пунктуации, знаки при прямой речи — https://gramota.ru/biblioteka/spravochniki/pravila-russkoj-orfografii-i-punktuacii/znaki-pri-pryamoj-rechi · [DOC 2026-07] Грамота, оформление диалога — https://gramota.ru/uchebnik/pravila/oformlenie-dilaoga
|
||||
- [OTH 2026-07] Абзац как логико-смысловая единица — Текстология.ру — https://www.textologia.ru/russkiy/sintaksis/stroenie-texta/abzac-kak-chast-teksta-i-ego-funkcii/646/ · Абзац (по Мильчину) — https://rus-stylistics-dict.slovaronline.com/1-%D0%90%D0%B1%D0%B7%D0%B0%D1%86
|
||||
- [OTH 2026-07] Chinese punctuation (полн. пунктуация, 引号, -отступ) — https://en.wikipedia.org/wiki/Chinese_punctuation
|
||||
- [PR 2022] Structural Persistence in LMs (priming) — https://aclanthology.org/2022.tacl-1.60/ · [PR 2024] Sensitivity to Spurious Prompt Features (Sclar) — https://arxiv.org/abs/2310.11324 · [PR 2024] FollowBench — https://arxiv.org/abs/2310.20410
|
||||
- [PP 2026-01] *Semantic Gravity Wells: Why Negative Constraints Backfire* (опора гипотезы негатив-констрейнта — REFUTED как главная причина) — https://arxiv.org/abs/2601.08070
|
||||
- [PP 2025-10] *Decoupling Task-Solving and Output Formatting* — https://arxiv.org/abs/2510.03595
|
||||
|
||||
**Претензия 2 — связность/zh-специфика + лекарства:**
|
||||
- [PP 2026-05] *How Much Do LLMs Know About Chinese Zero Pronouns?* (zh→en, <50% ZP базово, oracle +40) — https://arxiv.org/abs/2605.31056 · [PP 2023] Survey on Zero Pronoun Translation — https://arxiv.org/abs/2305.10196
|
||||
- [PR 2024] MAPS, *Exploring Human-Like Translation Strategy* (аннотатор) — https://arxiv.org/abs/2305.04118
|
||||
- [PR 2025] TEaR self-refine — https://aclanthology.org/2025.findings-naacl.218/ · [PP 2026-05] *What Does LLM Refinement Actually Improve? Doc-Level* (2605.13368; моно −2.2…−5.6 MQM) — https://arxiv.org/abs/2605.13368 · [PP 2024-02] *LLM Amplifies Self-Bias in Self-Refinement* — https://arxiv.org/abs/2402.11436
|
||||
- [PP 2025-03] *Source-primed Multi-turn Conversation Helps LLMs Translate Documents* — https://arxiv.org/abs/2503.10494
|
||||
|
||||
**zh↔ru контрастивная лингвистика (прямые/близкие):**
|
||||
- [PR 2024] **Ван Цуй, «Анализ китайских паратактических предложений и их перевода на русский язык», Вестник (Теория перевода)** — 5 техник — https://vestnik-translation.ru/articles/article/20081/ · [PR 2023] интерференция при переводе кит. лит-ры на русский (De Gruyter, cjss-2023-0017) — https://www.degruyterbrill.com/document/doi/10.1515/cjss-2023-0017/html
|
||||
- [OTH 2022] Application of Hypotaxis/Parataxis in C-E Translation (意合/形合, Lian Shuneng) — https://www.davidpublisher.com/Public/uploads/Contribute/620da97031d45.pdf · [OTH 2023] English Translation Strategies for Chinese Run-on (流水句) — https://www.davidpublisher.com/Public/uploads/Contribute/654354525d198.pdf · [PR 2011] xinghe/yihe (Perspectives) — https://www.tandfonline.com/doi/abs/10.1080/0907676X.2010.514347
|
||||
- [PR 2011] Topic-Comment in Mandarin (Li & Thompson) — https://www.researchgate.net/publication/235852523 · [OTH 2005] Курдюмов, теор. грамматика (топик-комментарий) — https://www.studmed.ru/kurdyumov-v-a-kurs-kitayskogo-yazyka-teoreticheskaya-grammatika_1d9fe4a728b.html
|
||||
- [PP 2025-11] *Predicate-Argument Divergences in Chinese-English* (кит. +24% глаголов) — https://arxiv.org/abs/2511.09796 · [OTH 2026-07] Chengyu (96% четырёхзнак.) — https://en.wikipedia.org/wiki/Chengyu
|
||||
|
||||
**Измерение качества:**
|
||||
- [PP 2025-04] TREQA (comprehension-QA eval) — https://arxiv.org/html/2504.07583v3 · [PR 2025] LITEVAL-CORPUS (MQM плох, BWS/SQ лучше) NAACL — https://aclanthology.org/2025.naacl-long.548/ · [PR 2023] GEMBA-MQM — https://aclanthology.org/2023.wmt-1.64/ · [PR 2024] xCOMET — https://aclanthology.org/2024.tacl-1.54/ · [PR 2024] ESA — https://aclanthology.org/2024.wmt-1.131/
|
||||
- [PP 2026-05] *Nine Judges, Two Effective Votes* (корр. судьи) — https://arxiv.org/pdf/2605.29800 · [PP 2026-05] *Creativity Bias* (метрики против художественности) — https://arxiv.org/html/2605.13596 · [BLOG 2026-04] LLM-judge length/position/format bias — https://tianpan.co/blog/2026-04-27-llm-judge-bias-audit-length-position-format
|
||||
|
||||
**Стоимость / нарезка:**
|
||||
- [PR 2023] Petrov et al., *LM Tokenizers Introduce Unfairness Between Languages* (кириллица-фертильность) — https://arxiv.org/pdf/2305.15425 · [BLOG 2023] интерактив — https://aleksandarpetrov.github.io/tokenization-fairness/
|
||||
- [DOC 2024] DeepSeek Context Caching (cache-hit ~2% miss) — https://api-docs.deepseek.com/guides/kv_cache/ · pricing — https://api-docs.deepseek.com/quick_start/pricing
|
||||
- [PP 2024-09] LongGenBench (output ~3–4k стабилен) — https://arxiv.org/html/2409.02076v7
|
||||
|
||||
**Метрика-инверсия zh→ru (§A4.3 — теперь с URL):**
|
||||
- [PR 2024-12] *Findings of WMT24 Discourse-Level Literary Translation* — https://arxiv.org/abs/2412.11732 · task page — https://www2.statmt.org/wmt24/literary-translation-task.html · [BLOG 2025] разбор d-BLEU/стоимости — https://gonzoml.substack.com/p/perhaps-beyond-human-translation
|
||||
|
||||
*(Полный список 125 верифицированных URL — в артефактах ресёрч-воркфлоу сессии; здесь — несущее подмножество.)*
|
||||
|
||||
**Errata источников (испр. оркестратором, D36):**
|
||||
- **DocRepair — расщепить с P19-1116.** Числа §A4.8/§B2.4 (deixis 50.0→91.8, когезия 45.9→80.6, эллипсис 53.0→86.4, 73% предпочтения) — из [PR 2019] Voita, Sennrich, Titov, *Context-Aware Monolingual Repair for NMT* (DocRepair), EMNLP-IJCNLP 2019 — https://aclanthology.org/D19-1081/ · arXiv https://arxiv.org/abs/1909.01383. Процитированная выше P19-1116 (ACL 2019) — статья-спутник, из неё число CADec 50.0→81.6 (§A3). Обе авторства одного трио; числа верны, атрибуция расщеплена.
|
||||
- **TransAgents** — arXiv 2405.11804 = *(Perhaps) Beyond Human Translation* (accepted-but-preprint, «To appear at TACL»; §A-метка «TACL-версия» и §E-метка «PP 2024-05» — об одной статье, оставить одну). Это ОТДЕЛЬНАЯ статья от EMNLP-Demo 2024 `2024.emnlp-demo.14` (*Build Your Translation Company…*), процитированной параллельным ChatGPT-отчётом — не конфликт, две реальные статьи об одной системе.
|
||||
- **Z5** — RG 235852523 = Dingxu Shi, *Topic and Topic-Comment Constructions in Mandarin Chinese* (Language 76(2), 2000), НЕ Li & Thompson (их канон — *Subject and Topic* 1976 / *A Functional Reference Grammar* 1981). Клейм топик-комментария верен; автор-метка исправлена.
|
||||
- **Z8 / R4 / R5 / P2 / CO5** — источники реальны, атрибуция частична: «96% чэнъюй» на цит. Wikipedia отсутствует (там «most»); -отступ/«короткие абзацы» — не на цит. Chinese-punctuation-стр. (конвенции реальны, стр. неточна); Structural-Persistence (TACL 2022) изучает СИНТАКСИЧЕСКИй прайминг, не копирование line-структуры (экстраполяция, отчёт помечает PLAUSIBLE); FollowBench (ACL 2024, не просто препринт) документирует ДЕГРАДАЦИю следования при накоплении констрейнтов — не «надёжный рычаг few-shot»; 2504.12140 подтверждает «мелкие инстракт-модели деградируют с ростом чанка», но «перевёрнутая-U / N=3-оптимум» — переформулировка (N=3 — фикс-конфиг, не найденный оптимум). Ни одна не рушит §C-арм — все меряются полигоном эмпирически.
|
||||
|
||||
---
|
||||
|
||||
<!-- Отчёт готов к адверсариальной верификации оркестратора по первоисточникам. §A заморожена (sha256 44f90364…); §B/§C/§D/§E — пост-дифф. Не коммитить — лендит оркестратор (как research/15/16/17). -->
|
||||
|
||||
90
eval/exp13_seed_signoff.py
Normal file
90
eval/exp13_seed_signoff.py
Normal file
|
|
@ -0,0 +1,90 @@
|
|||
#!/usr/bin/env python3
|
||||
"""exp13 — применение ПОДПИСИ владельца к сиду v2 (D30.5/D32). Провенанс подписи.
|
||||
Владелец подписал спорные + переопределил часть approved-dst (2026-07-12). Спорные → approved.
|
||||
Вход/выход: guzhenren-seed-v2.yaml (in-place). Лог: diag/glossary_v2_signoff_applied.md. ВНЕ git.
|
||||
"""
|
||||
from __future__ import annotations
|
||||
import yaml
|
||||
from pathlib import Path
|
||||
|
||||
BOOK = Path("/home/ubuntu/books/gu-zhenren")
|
||||
SEED = BOOK / "guzhenren-seed-v2.yaml"
|
||||
LOG = BOOK / "diag" / "glossary_v2_signoff_applied.md"
|
||||
|
||||
# src -> (new_dst, invariant, forms, note_tag)
|
||||
DECISIONS = {
|
||||
"花酒行者": ("Монах Цветочного Вина", False,
|
||||
["Монаха Цветочного Вина", "Монаху Цветочного Вина", "Монаха Цветочного Вина", "Монахом Цветочного Вина", "Монахе Цветочного Вина"],
|
||||
"подпись: НЕ «Странник Цветов и Вина»/«Винный Странник»; 行者=монах, 花酒=цветочное вино"),
|
||||
"蛊虫": ("гу-червь", False,
|
||||
["гу-червя", "гу-червю", "гу-червя", "гу-червём", "гу-черве"],
|
||||
"подпись: гу-червь (подтверждено)"),
|
||||
"本命蛊": ("гу Жизни", True, [],
|
||||
"подпись: «гу Жизни» (возврат к v1-форме; НЕ «жизненный гу»); инвариант как гу+генитив"),
|
||||
"修炼": ("культивация", False,
|
||||
["культивации", "культивации", "культивацию", "культивацией", "культивации"],
|
||||
"подпись: культивация (НЕ «совершенствование»)"),
|
||||
"修行": ("культивация", False,
|
||||
["культивации", "культивации", "культивацию", "культивацией", "культивации"],
|
||||
"подпись: согласовано с 修炼=культивация"),
|
||||
"人祖": ("Жэнь Цзу", True, [],
|
||||
"подпись: транслит «Жэнь Цзу» (НЕ «Первопредок», НЕ «Рен Зу»); -у → инвариант"),
|
||||
"古月山寨": ("деревня Гуюэ", False,
|
||||
["деревни Гуюэ", "деревне Гуюэ", "деревню Гуюэ", "деревней Гуюэ", "деревне Гуюэ"],
|
||||
"подпись: «деревня Гуюэ» (НЕ «селение»/«стан»)"),
|
||||
"白家寨": ("деревня Бай", False,
|
||||
["деревни Бай", "деревне Бай", "деревню Бай", "деревней Бай", "деревне Бай"],
|
||||
"консистентно-выровнено под 古月山寨→деревня (диклоуз владельцу)"),
|
||||
"熊家寨": ("деревня Сюн", False,
|
||||
["деревни Сюн", "деревне Сюн", "деревню Сюн", "деревней Сюн", "деревне Сюн"],
|
||||
"консистентно-выровнено под 古月山寨→деревня (диклоуз владельцу)"),
|
||||
"空窍": ("апертура", False,
|
||||
["апертуры", "апертуре", "апертуру", "апертурой", "апертуре"],
|
||||
"подпись: апертура (подтверждено)"),
|
||||
"元海": ("море истинной ци", False,
|
||||
["моря истинной ци", "морю истинной ци", "морем истинной ци", "море истинной ци"],
|
||||
"подпись: море истинной ци (подтверждено)"),
|
||||
"元石": ("первобытный камень", False,
|
||||
["первобытного камня", "первобытному камню", "первобытный камень", "первобытным камнем", "первобытном камне",
|
||||
"первобытные камни", "первобытных камней", "первобытным камням", "первобытными камнями", "первобытных камнях"],
|
||||
"подпись: «первобытные камни» → канон.ед. «первобытный камень» (НЕ «изначальный»/«первокамень»); +мн.ч. D24.4"),
|
||||
}
|
||||
|
||||
|
||||
def main():
|
||||
data = yaml.safe_load(SEED.read_text(encoding="utf-8"))
|
||||
applied, missing = [], []
|
||||
for t in data["terms"]:
|
||||
s = t.get("src")
|
||||
if s in DECISIONS:
|
||||
new_dst, inv, forms, tag = DECISIONS[s]
|
||||
old = t.get("dst")
|
||||
t["dst"] = new_dst
|
||||
t["decl"] = {"invariant": inv, "forms": list(forms)}
|
||||
t["status"] = "approved"
|
||||
t["note"] = f"[signoff:approved] {tag}. (было: «{old}»). " + (t.get("note") or "")
|
||||
applied.append((s, old, new_dst))
|
||||
seen = {t.get("src") for t in data["terms"]}
|
||||
missing = [s for s in DECISIONS if s not in seen]
|
||||
|
||||
SEED.write_text(yaml.dump(data, allow_unicode=True, sort_keys=False, width=200), encoding="utf-8")
|
||||
|
||||
lg = ["# Глоссарий v2 — ПОДПИСЬ владельца применена (D30.5/D32, 2026-07-12)", "",
|
||||
f"Применено решений: {len(applied)}. Все → status:approved. Провенанс: `eval/exp13_seed_signoff.py`.",
|
||||
"**Остаётся открытым (низкий приоритет, не блокирует resnapshot):** род бесплатного «гу» (蛊) — "
|
||||
"согласование «этот гу» (муж., как «гу-червь») vs «это гу» (сред.). Рекомендация: мужской. `蛊` инвариантен, "
|
||||
"single-char (не на горячем пути A3) → влияет только на прозу редактора, не на hard-constraint.", "",
|
||||
"| src | было | стало (approved) |", "|---|---|---|"]
|
||||
for s, old, new in applied:
|
||||
lg.append(f"| {s} | {old} | **{new}** |")
|
||||
if missing:
|
||||
lg += ["", "⚠ НЕ найдены в сиде (проверить): " + ", ".join(missing)]
|
||||
LOG.write_text("\n".join(lg), encoding="utf-8")
|
||||
|
||||
print(f"применено: {len(applied)}, ненайдено: {missing}")
|
||||
for s, old, new in applied:
|
||||
print(f" {s}: «{old}» → «{new}» [approved]")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
175
eval/exp14_arms.py
Normal file
175
eval/exp14_arms.py
Normal file
|
|
@ -0,0 +1,175 @@
|
|||
#!/usr/bin/env python3
|
||||
"""exp14 — раннер editor-армов (нарезка × промпт + аблации). Прямые вызовы, ручная упаковка.
|
||||
|
||||
Per-call predicted-cost кап (НЕ group-level). Персист usage/cost в exp14/costs.jsonl.
|
||||
P0 = reuse records.json final ($0). Черновик держим общим (flash-draft из records) — варьируем
|
||||
editor-стадию (модель × промпт × нарезка × reference).
|
||||
|
||||
Использование: exp14_arms.py --arm P1a [--chapters trap|stage2] [--model glm-5] [--dry]
|
||||
Армы: P0 P1a P1b P1c A-layout A-2pass A-ref-prev A-ref-next A-ref-both (+ frontier: F-base F-disc)
|
||||
"""
|
||||
from __future__ import annotations
|
||||
import argparse, json, re, sys, time
|
||||
from pathlib import Path
|
||||
|
||||
sys.path.insert(0, str(Path(__file__).resolve().parent))
|
||||
import exp14_common as C
|
||||
import exp14_prompts as P
|
||||
|
||||
MAT = json.load(open(C.DIAG / "material.json"))
|
||||
ARMSDIR = C.DIAG / "arms"; ARMSDIR.mkdir(exist_ok=True)
|
||||
CAPS = {"glm-5": 0.08, "glm-5.1": 0.10, "deepseek-v4-flash": 0.03, "deepseek-v4-pro": 0.06,
|
||||
"gpt-5.4": 0.40, "gemini-3.1-pro-preview": 0.30, "grok-4.3": 0.40,
|
||||
"gpt-5-mini": 0.20, "kimi-k2.6": 0.20, "mistral-large-2512": 0.10}
|
||||
SP = C.Spender(C.DIAG / "costs.jsonl", CAPS)
|
||||
|
||||
|
||||
def deformat_draft(draft: str) -> str:
|
||||
"""A-layout: снять построчную/пустострочную разбивку черновика (нейтральные сепараторы)."""
|
||||
lines = [l.strip() for l in draft.split("\n") if l.strip()]
|
||||
return " ".join(lines) # один поток; редактор не якорится на форме черновика
|
||||
|
||||
|
||||
def chunk_units(scope: str):
|
||||
"""Возвращает список единиц {id, source, draft, final_p0, editor_constraint, chapter, chunk_idx}."""
|
||||
if scope == "trap":
|
||||
return [dict(id=f"{u['chapter']}.{u['chunk_idx']}", **u) for u in MAT["trap_chunks"]]
|
||||
if scope == "stage2":
|
||||
out = []
|
||||
for ch, chunks in MAT["stage2"].items():
|
||||
for u in chunks:
|
||||
out.append(dict(id=f"{ch}.{u['chunk_idx']}", chapter=int(ch), **u))
|
||||
return out
|
||||
raise ValueError(scope)
|
||||
|
||||
|
||||
def chapter_units(scope: str):
|
||||
"""Whole-chapter единицы: клеим source/draft чанков главы + chapter-level инъекция."""
|
||||
inj = json.load(open(C.DIAG / "injection_blocks.json"))
|
||||
units = chunk_units(scope)
|
||||
by_ch = {}
|
||||
for u in units:
|
||||
by_ch.setdefault(u["chapter"], []).append(u)
|
||||
out = []
|
||||
for ch, us in by_ch.items():
|
||||
if len(us) < 2: # whole-chapter тест осмыслен только когда все чанки главы в наборе (ch8/11/24)
|
||||
continue
|
||||
us = sorted(us, key=lambda x: x["chunk_idx"])
|
||||
src = "\n\n".join(x["source"] for x in us)
|
||||
drf = "\n\n".join(x["draft"] for x in us)
|
||||
eb = inj.get(f"{ch}/ALL", {}).get("editor_constraint", "")
|
||||
out.append(dict(id=f"{ch}.ALL", chapter=ch, chunk_idx="ALL",
|
||||
source=src, draft=drf, editor_constraint=eb))
|
||||
return out
|
||||
|
||||
|
||||
def run_editor(arm: str, variant: str, units, model: str, reference_by=None,
|
||||
two_pass=False, deformat=False, dry=False):
|
||||
outdir = ARMSDIR / arm; outdir.mkdir(exist_ok=True)
|
||||
sys_disc = P.editor_system(variant)
|
||||
total_pred = 0.0
|
||||
for u in units:
|
||||
outp = outdir / f"{u['id']}.txt"
|
||||
if outp.exists():
|
||||
print(f" [skip exists] {arm} {u['id']}"); continue
|
||||
draft = deformat_draft(u["draft"]) if deformat else u["draft"]
|
||||
reference = reference_by.get(u["id"], "") if reference_by else ""
|
||||
user = P.editor_user(u["source"], draft, reference)
|
||||
msgs = C.messages_with_injection(sys_disc, u.get("editor_constraint", ""), user)
|
||||
in_est = C.count_tokens(sys_disc + u.get("editor_constraint", "") + user,
|
||||
"deepseek" if model.startswith("deepseek") else "glm")
|
||||
s = C.spec(model, temp=0.4)
|
||||
ok, pred = SP.guard(model, in_est, s["max_tokens"])
|
||||
total_pred += pred
|
||||
print(f" {arm} {u['id']}: in≈{in_est}tok predict=${pred:.4f} cap=${CAPS[model]} {'OK' if ok else 'OVER-CAP'}")
|
||||
if dry:
|
||||
continue
|
||||
if not ok:
|
||||
print(f" !! OVER per-call cap — skipped"); continue
|
||||
t0 = time.time()
|
||||
text, err, usage = C.call(s, msgs, timeout=360)
|
||||
dt = round(time.time() - t0, 1)
|
||||
rec = {"arm": arm, "model": model, "keyenv": s["keyenv"], "id": u["id"],
|
||||
"variant": variant, "err": err, "latency_s": dt, "usage": usage}
|
||||
c = SP.record(rec)
|
||||
if err:
|
||||
print(f" ERR {err[:80]} (${c:.4f}, {dt}s)")
|
||||
continue
|
||||
if two_pass: # second narrow pass: target-only literary reflow of the just-edited RU
|
||||
sys2 = P.editor_system("discourse") # target-only reflow uses discourse core
|
||||
u2 = ("Ниже — русский перевод. Перевёрстай его в естественные русские абзацы по "
|
||||
"правилам дискурс-перевёрстки; НЕ меняй смысл, НЕ добавляй и НЕ удаляй атомы, "
|
||||
"НЕ сверяйся с иностранным исходником (его нет):\n\n" + text)
|
||||
msgs2 = [{"role": "system", "content": sys2}, {"role": "user", "content": u2}]
|
||||
in2 = C.count_tokens(sys2 + u2, "glm")
|
||||
ok2, pred2 = SP.guard(model, in2, s["max_tokens"])
|
||||
if ok2:
|
||||
text2, err2, usage2 = C.call(s, msgs2, timeout=360)
|
||||
SP.record({"arm": arm, "model": model, "keyenv": s["keyenv"], "id": u["id"],
|
||||
"variant": "reflow-pass2", "err": err2, "usage": usage2})
|
||||
if not err2:
|
||||
text = text2
|
||||
outp.write_text(text, encoding="utf-8")
|
||||
print(f" ok {len(text)}chars ${c:.4f} {dt}s → {outp.name}")
|
||||
print(f" [{arm}] predicted total ≈ ${total_pred:.4f}; spent-by-key: {SP.by_key}")
|
||||
|
||||
|
||||
def run_p0(scope):
|
||||
outdir = ARMSDIR / "P0"; outdir.mkdir(exist_ok=True)
|
||||
for u in chunk_units(scope):
|
||||
(outdir / f"{u['id']}.txt").write_text(u["final_p0"], encoding="utf-8")
|
||||
print(f"[P0] reused {len(chunk_units(scope))} finals ($0)")
|
||||
|
||||
|
||||
def main():
|
||||
ap = argparse.ArgumentParser()
|
||||
ap.add_argument("--arm", required=True)
|
||||
ap.add_argument("--scope", default="trap", choices=["trap", "stage2"])
|
||||
ap.add_argument("--model", default="glm-5")
|
||||
ap.add_argument("--dry", action="store_true")
|
||||
a = ap.parse_args()
|
||||
|
||||
if a.arm == "P0":
|
||||
run_p0(a.scope); return
|
||||
if a.arm == "P1a":
|
||||
run_editor("P1a", "discourse", chunk_units(a.scope), a.model, dry=a.dry)
|
||||
elif a.arm == "P1b":
|
||||
run_editor("P1b", "baseline", chapter_units(a.scope), a.model, dry=a.dry)
|
||||
elif a.arm == "P1c":
|
||||
run_editor("P1c", "discourse", chapter_units(a.scope), a.model, dry=a.dry)
|
||||
elif a.arm == "A-layout":
|
||||
run_editor("A-layout", "discourse", chunk_units(a.scope), a.model, deformat=True, dry=a.dry)
|
||||
elif a.arm == "A-2pass":
|
||||
run_editor("A-2pass", "baseline", chunk_units(a.scope), a.model, two_pass=True, dry=a.dry)
|
||||
elif a.arm in ("A-ref-prev", "A-ref-next", "A-ref-both"):
|
||||
ref = build_reference(a.arm)
|
||||
run_editor(a.arm, "discourse", [u for u in chunk_units(a.scope) if u["id"] in ref],
|
||||
a.model, reference_by=ref, dry=a.dry)
|
||||
elif a.arm in ("F-base", "F-disc"):
|
||||
variant = "baseline" if a.arm == "F-base" else "discourse"
|
||||
run_editor(a.arm, variant, chunk_units(a.scope), a.model, dry=a.dry)
|
||||
else:
|
||||
raise SystemExit(f"unknown arm {a.arm}")
|
||||
|
||||
|
||||
def build_reference(kind: str) -> dict:
|
||||
"""±1 reference для кросс-граничных трапов (T5 24.1←24.0, T6 11.1←11.0). prev/next/both."""
|
||||
units = {u["id"]: u for u in chunk_units("trap")}
|
||||
pairs = [("24.0", "24.1"), ("11.0", "11.1")] # (prev_chunk, target_chunk)
|
||||
ref = {}
|
||||
for prev, tgt in pairs:
|
||||
parts = []
|
||||
if kind in ("A-ref-prev", "A-ref-both"):
|
||||
ptail = "\n".join(units[prev]["source"].split("\n")[-6:])
|
||||
ttail = "\n".join(units[prev]["final_p0"].split("\n")[-6:])
|
||||
parts.append("[ПРЕД-ИСХОДНИК]\n" + ptail + "\n[ПРЕД-ПЕРЕВОД]\n" + ttail)
|
||||
if kind in ("A-ref-next", "A-ref-both"):
|
||||
# next-source: следующий чанк того же trap-набора, если есть (для 24.1/11.1 нет — пропуск)
|
||||
pass
|
||||
if parts:
|
||||
ref[tgt] = "\n\n".join(parts)
|
||||
return ref
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
191
eval/exp14_common.py
Normal file
191
eval/exp14_common.py
Normal file
|
|
@ -0,0 +1,191 @@
|
|||
#!/usr/bin/env python3
|
||||
"""exp14 — общий харнес: провайдер-вызов, usage→$ (3 reasoning-режима), per-call
|
||||
predicted-cost кап (НЕ group-level — урок exp13 +10%), append-only персист usage/cost,
|
||||
токенайзер-счёт выходных токенов (кириллица-фертильность), spec-фабрика.
|
||||
|
||||
Зона eval/. Цены — ЗАМОРОЖЕННАЯ зеркальная копия backend/configs/models.yaml
|
||||
(prices_checked 2026-07-10) + фронтир gpt-5.4 live-фактчек 2026-07-11
|
||||
(developers.openai.com/api/docs/pricing). Единственный источник истины — models.yaml;
|
||||
при расхождении верить Go/models.yaml. Ключи из eval/.env через load_env_file (НЕ читаю .env).
|
||||
"""
|
||||
from __future__ import annotations
|
||||
import json, os, sys, time, urllib.request, urllib.error
|
||||
from pathlib import Path
|
||||
|
||||
sys.path.insert(0, str(Path(__file__).resolve().parent))
|
||||
from refusal_bench import load_env_file # noqa: E402
|
||||
|
||||
load_env_file()
|
||||
|
||||
DIAG = Path("/home/ubuntu/books/gu-zhenren/exp14")
|
||||
DIAG.mkdir(parents=True, exist_ok=True)
|
||||
RERUN = Path("/home/ubuntu/books/gu-zhenren/rerun")
|
||||
TOKDIR = Path(__file__).resolve().parent / "tokenizers"
|
||||
|
||||
# ── Цены $/1M (in, out, cached_in) + reasoning-режим. Зеркало models.yaml. ──────────
|
||||
PRICES = {
|
||||
"deepseek-v4-flash": (0.14, 0.28, 0.0028, "subset"),
|
||||
"deepseek-v4-pro": (0.435, 0.87, 0.003625, "subset"),
|
||||
"glm-5": (1.0, 3.2, 0.2, "subset"),
|
||||
"glm-5.1": (1.4, 4.4, 0.26, "subset"),
|
||||
"kimi-k2.6": (0.95, 4.0, 0.16, "subset"),
|
||||
"grok-4.3": (1.25, 2.50, 1.25, "additive"),
|
||||
"gemini-3.1-pro-preview": (2.0, 12.0, 0.20, "additive_total"),
|
||||
"gpt-5-mini": (0.25, 2.0, 0.025, "subset"),
|
||||
"gpt-5.4": (2.50, 15.0, 0.25, "subset"), # live 2026-07-11
|
||||
"mistral-large-2512": (0.5, 1.5, 0.5, "subset"),
|
||||
}
|
||||
FALLBACK = "deepseek-v4-flash" # никогда $0
|
||||
|
||||
# ── Спеки провайдеров (endpoint/keyenv/wire-квирки из 00-provider-quirks + models.yaml) ─
|
||||
def spec(model: str, *, temp: float | None = None, max_tokens: int | None = None,
|
||||
reasoning_effort: str | None = None) -> dict:
|
||||
"""Собирает per-call spec. temp/max_tokens/reasoning_effort перекрывают дефолты."""
|
||||
base_by = {
|
||||
"deepseek-v4-flash": ("https://api.deepseek.com/v1", "DEEPSEEK_API_KEY", {}),
|
||||
"deepseek-v4-pro": ("https://api.deepseek.com/v1", "DEEPSEEK_API_KEY", {}),
|
||||
"glm-5": ("https://api.z.ai/api/paas/v4", "ZAI_API_KEY", {"thinking": {"type": "disabled"}}),
|
||||
"glm-5.1": ("https://api.z.ai/api/paas/v4", "ZAI_API_KEY", {"thinking": {"type": "disabled"}}),
|
||||
"kimi-k2.6": ("https://api.moonshot.ai/v1", "KIMI_API_KEY", {}),
|
||||
"grok-4.3": ("https://api.x.ai/v1", "XAI_API_KEY", {}),
|
||||
"gemini-3.1-pro-preview": ("https://generativelanguage.googleapis.com/v1beta/openai", "GEMINI_API_KEY", {}),
|
||||
"gpt-5-mini": ("https://api.openai.com/v1", "OPENAI_API_KEY", {}),
|
||||
"gpt-5.4": ("https://api.openai.com/v1", "OPENAI_API_KEY", {}),
|
||||
"mistral-large-2512": ("https://api.mistral.ai/v1", "MISTRAL_API_KEY", {"safe_prompt": False}),
|
||||
}
|
||||
base, keyenv, extra = base_by[model]
|
||||
extra = dict(extra)
|
||||
s = {"model": model, "base": base, "keyenv": keyenv, "extra": extra}
|
||||
# reasoning wire per family
|
||||
if model in ("gpt-5-mini", "gpt-5.4"):
|
||||
s["openai_reasoner"] = True # max_completion_tokens, no temperature
|
||||
extra["reasoning_effort"] = reasoning_effort or "medium"
|
||||
elif model == "kimi-k2.6":
|
||||
s["force_temp"] = 1.0
|
||||
elif model == "grok-4.3":
|
||||
if reasoning_effort: # xAI plain reasoning_effort in body (none/low/medium/high)
|
||||
extra["reasoning_effort"] = reasoning_effort
|
||||
# temp
|
||||
if model in ("gpt-5-mini", "gpt-5.4"):
|
||||
s["temp"] = None
|
||||
elif model == "kimi-k2.6":
|
||||
s["temp"] = 1.0
|
||||
else:
|
||||
s["temp"] = 0.4 if temp is None else temp
|
||||
# max_tokens floors (D24.3)
|
||||
floor = 16000 if model == "kimi-k2.6" else (12000 if model == "gpt-5.4" else 8000)
|
||||
s["max_tokens"] = max_tokens or floor
|
||||
return s
|
||||
|
||||
|
||||
def call(s: dict, messages: list[dict], timeout: int = 300) -> tuple[str, str | None, dict]:
|
||||
"""Один chat/completions. Возврат (text, err|None, usage со стампом finish_reason).
|
||||
err — структурная строка: http|CODE|.. / transport|.. / content_filter|.. / empty|.."""
|
||||
key = os.environ.get(s["keyenv"], "")
|
||||
body = {"model": s["model"], "messages": messages, **s.get("extra", {})}
|
||||
if s.get("openai_reasoner"):
|
||||
body["max_completion_tokens"] = s["max_tokens"] # gpt-5: max_tokens → 400
|
||||
else:
|
||||
body["max_tokens"] = s["max_tokens"]
|
||||
if s.get("temp") is not None:
|
||||
body["temperature"] = s["temp"]
|
||||
data = json.dumps(body).encode()
|
||||
req = urllib.request.Request(s["base"].rstrip("/") + "/chat/completions", data=data,
|
||||
headers={"Content-Type": "application/json", "Authorization": f"Bearer {key}"})
|
||||
try:
|
||||
with urllib.request.urlopen(req, timeout=timeout) as r:
|
||||
d = json.loads(r.read())
|
||||
except urllib.error.HTTPError as e:
|
||||
return "", f"http|{e.code}|{e.read()[:300].decode('utf-8','replace')}", {}
|
||||
except Exception as e:
|
||||
return "", f"transport|{type(e).__name__}|{str(e)[:200]}", {}
|
||||
ch = (d.get("choices") or [{}])[0]
|
||||
finish = ch.get("finish_reason", "")
|
||||
msg = ch.get("message", {}) or {}
|
||||
text = (msg.get("content") or "").strip()
|
||||
usage = d.get("usage", {}) or {}
|
||||
usage["finish_reason"] = finish
|
||||
if str(finish).lower() in ("content_filter", "prohibited_content", "safety") or "prohibited" in str(finish).lower():
|
||||
return "", f"content_filter|finish={finish}", usage
|
||||
if not text:
|
||||
has_reason = bool((msg.get("reasoning_content") or "").strip())
|
||||
return "", f"empty|finish={finish}|reasoning={has_reason}", usage
|
||||
return text, None, usage
|
||||
|
||||
|
||||
def cost_of(model: str, usage: dict) -> float:
|
||||
"""usage→$ с 3 reasoning-режимами (subset/additive/additive_total)."""
|
||||
inp = usage.get("prompt_tokens", 0) or 0
|
||||
comp = usage.get("completion_tokens", 0) or 0
|
||||
total = usage.get("total_tokens", 0) or 0
|
||||
pin, pout, _c, regime = PRICES.get(model, (*PRICES[FALLBACK][:3], "subset"))
|
||||
if regime == "additive": # grok: reasoning_tokens отдельным полем, поверх completion
|
||||
reason = usage.get("reasoning_tokens", 0) or 0
|
||||
out = comp + reason
|
||||
elif regime == "additive_total": # gemini: thinking только в total
|
||||
out = max(comp, total - inp) if total else comp
|
||||
else: # subset: reasoning ⊆ completion
|
||||
out = comp
|
||||
return (inp * pin + out * pout) / 1_000_000
|
||||
|
||||
|
||||
def predict_cost(model: str, in_tokens_est: int, max_out: int) -> float:
|
||||
"""Верхняя оценка ДО вызова: in_est·pin + max_out·pout (потолок max_tokens как output)."""
|
||||
pin, pout, _c, _r = PRICES.get(model, (*PRICES[FALLBACK][:3], "subset"))
|
||||
return (in_tokens_est * pin + max_out * pout) / 1_000_000
|
||||
|
||||
|
||||
# ── Токенайзеры (кириллица-фертильность; deepseek-v4/kimi отсутствуют → v3.2 прокси) ──
|
||||
_TOK = {}
|
||||
def _load_tok(name: str):
|
||||
from tokenizers import Tokenizer
|
||||
p = TOKDIR / name / "tokenizer.json"
|
||||
if name not in _TOK:
|
||||
_TOK[name] = Tokenizer.from_file(str(p))
|
||||
return _TOK[name]
|
||||
|
||||
def count_tokens(text: str, family: str = "glm") -> int:
|
||||
name = {"glm": "glm-4.6", "deepseek": "deepseek-v3.2"}.get(family, "glm-4.6")
|
||||
return len(_load_tok(name).encode(text, add_special_tokens=False).ids)
|
||||
|
||||
|
||||
# ── Per-call кап + персист ────────────────────────────────────────────────────────
|
||||
class Spender:
|
||||
"""Per-key running spend + per-call predicted-cost кап (обязателен ДО вызова)."""
|
||||
def __init__(self, costs_path: Path, caps: dict[str, float]):
|
||||
self.path = costs_path
|
||||
self.caps = caps # model → per-call cap $
|
||||
self.by_key: dict[str, float] = {}
|
||||
|
||||
def guard(self, model: str, in_est: int, max_out: int) -> tuple[bool, float]:
|
||||
pc = predict_cost(model, in_est, max_out)
|
||||
cap = self.caps.get(model, 0.50)
|
||||
return (pc <= cap, pc)
|
||||
|
||||
def record(self, rec: dict) -> float:
|
||||
c = cost_of(rec["model"], rec.get("usage", {}))
|
||||
rec["cost"] = round(c, 6)
|
||||
keyenv = rec.get("keyenv", rec["model"])
|
||||
self.by_key[keyenv] = self.by_key.get(keyenv, 0.0) + c
|
||||
with open(self.path, "a", encoding="utf-8") as f:
|
||||
f.write(json.dumps(rec, ensure_ascii=False) + "\n")
|
||||
return c
|
||||
|
||||
|
||||
def messages_with_injection(system_prefix: str, injection: str, user: str) -> list[dict]:
|
||||
"""Layout render.go MessagesWithInjection: system(prefix,cache) → system(inj) → user."""
|
||||
m = [{"role": "system", "content": system_prefix}]
|
||||
if injection.strip():
|
||||
m.append({"role": "system", "content": injection})
|
||||
m.append({"role": "user", "content": user})
|
||||
return m
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
# смоук: цены/токенайзер/предикт
|
||||
ru = "Он шёл по тёмной улице, и снег ложился ему на плечи, укрывая следы."
|
||||
print("glm-4.6 tokens:", count_tokens(ru, "glm"))
|
||||
print("deepseek(v3.2) tokens:", count_tokens(ru, "deepseek"))
|
||||
u = {"prompt_tokens": 5000, "completion_tokens": 3000, "total_tokens": 8200}
|
||||
for m in ("glm-5", "gpt-5.4", "gemini-3.1-pro-preview", "grok-4.3"):
|
||||
print(f"cost_of {m}: ${cost_of(m, u):.5f} predict(5k in, 8k out): ${predict_cost(m,5000,8000):.4f}")
|
||||
156
eval/exp14_judges.py
Normal file
156
eval/exp14_judges.py
Normal file
|
|
@ -0,0 +1,156 @@
|
|||
#!/usr/bin/env python3
|
||||
"""exp14 — trap-accuracy судьи (Претензия 2): span-цитирующие, кросс-семейно,
|
||||
self-family exclusion, катастроф-флаг. Бюджет-умно: панель gpt-5-mini + kimi (дёшево);
|
||||
gemini — ТОЧЕЧНО (output $12/M, €2.6 крошечный). Claude-воркфлоу — адверсариальный верифай сверху.
|
||||
|
||||
Каждый (trap × arm) → per-judge {verdict: correct|partial|wrong, catastrophe, evidence≤15слов, note}.
|
||||
Blind: армы под нейтральными метками; ключ отдельно. Персист в exp14/trap_verdicts.jsonl.
|
||||
|
||||
Использование: exp14_judges.py [--dry]
|
||||
"""
|
||||
from __future__ import annotations
|
||||
import argparse, json, random, re, sys
|
||||
from pathlib import Path
|
||||
sys.path.insert(0, str(Path(__file__).resolve().parent))
|
||||
import exp14_common as C
|
||||
|
||||
ARMS = C.DIAG / "arms"
|
||||
MAT = json.load(open(C.DIAG / "material.json"))
|
||||
|
||||
# ── Заморожённые трапы (§1.0.1) — файл-чанк, где живёт рендер трапа ─────────────────
|
||||
TRAPS = [
|
||||
dict(id="T1", chunk="7.0", type="c-within", catastrophe=True,
|
||||
span="古月族人没有一个不知道的",
|
||||
meaning="В роду Гуюэ ЭТО ПРЕДАНИЕ знали ВСЕ/каждый (двойное отрицание «нет ни одного, кто не знал бы»). Инверсия «никто не знал» = КАТАСТРОФА."),
|
||||
dict(id="T2", chunk="8.1", type="c-within", catastrophe=False,
|
||||
span="物是人非",
|
||||
meaning="Контраст: вещи/места ПРЕЖНИЕ, но люди уже НЕ ТЕ (物是 «вещи те же» + 人非 «люди иные»). Плоское «всё изменилось» ТЕРЯЕТ половину идиомы (物是)."),
|
||||
dict(id="T2b", chunk="8.0", type="c-title", catastrophe=False,
|
||||
span="第八节:物是人非 (заглавие)",
|
||||
meaning="Заглавие главы: тот же контраст «вещи прежние — люди иные». Плоское «Всё изменилось» — потеря атома."),
|
||||
dict(id="T5", chunk="24.1", type="d-cross-prev", catastrophe=False,
|
||||
span="这当然不是他的肌肤本色,而是一种铜皮蛊的效果",
|
||||
meaning="«这/他» отсылает к бронзовому цвету кожи НАСТАВНИКА (описан в конце пред-чанка 24.0). Верно: «это [бронзовый цвет кожи наставника] — не природный, а эффект гу медной кожи». Провал = потеря антецедента (кто/что)."),
|
||||
dict(id="T6", chunk="11.1", type="d-cross-prev", catastrophe=False,
|
||||
span="那隐藏在暗处的人马,见到沈翠这般出来",
|
||||
meaning="«那…人马» = засадный отряд, который舅父/舅母 подготовили (введён в конце 11.0: «внизу тоже расставлены люди»). Верно: понятно, ЧЬИ это люди/засада. Провал = «какие-то люди» без связи."),
|
||||
dict(id="T4", chunk="9.0", type="b-dialogue-control", catastrophe=False,
|
||||
span="舅父…开口道:“…” (обмен репликами дядя/тётя/Фан Чжэн)",
|
||||
meaning="КОНТРОЛЬ-регресс: реплики с «—», слова автора при своей реплике (Розенталь). P0 это делает верно. Арм НЕ должен СЛОМАТЬ диалог-оформление."),
|
||||
]
|
||||
|
||||
JUDGE_POOL = { # judge_model → family (для self-family exclusion)
|
||||
"gpt-5-mini": "openai", "kimi-k2.6": "moonshot", "gemini-3.1-pro-preview": "google",
|
||||
}
|
||||
ARM_FAMILY = { # editor-модель арма → family (author≠reviewer)
|
||||
"P0": "zai", "P1a": "zai", "P1b": "zai", "P1c": "zai", "A-layout": "zai",
|
||||
"A-2pass": "zai", "A-ref-prev": "zai", "A-ref-both": "zai",
|
||||
"F-base": "openai", "F-disc": "openai",
|
||||
}
|
||||
# draft общий = deepseek → deepseek не судья (self-family к черновику, где рождается T1)
|
||||
|
||||
JUDGE_SYS = ("Ты — билингвальный эксперт zh→ru, оцениваешь ТОЧНОСТЬ передачи одного смыслового "
|
||||
"фрагмента. Тебе дан китайский span, его допустимый смысл, и русский перевод отрывка "
|
||||
"(под нейтральной меткой). Ответь СТРОГО JSON без markdown: "
|
||||
'{"verdict":"correct|partial|wrong","catastrophe":true|false,'
|
||||
'"evidence":"дословная цитата из перевода ≤15 слов","note":"кратко почему"}. '
|
||||
"verdict=correct только если смысл span передан без искажения полярности/участника/"
|
||||
"потери атома. catastrophe=true при инверсии полярности или подмене участника/действия.")
|
||||
|
||||
|
||||
def build_tasks(dry):
|
||||
tasks = []
|
||||
for tr in TRAPS:
|
||||
arms = [a for a in ARM_FAMILY if (ARMS / a / f"{tr['chunk']}.txt").exists()]
|
||||
# blind labels
|
||||
order = list(arms); random.Random(f"exp14-trap-{tr['id']}").shuffle(order)
|
||||
label = {a: f"V{i+1}" for i, a in enumerate(order)}
|
||||
for a in arms:
|
||||
txt = (ARMS / a / f"{tr['chunk']}.txt").read_text(encoding="utf-8")
|
||||
# окно вокруг трапа не вырезаем — даём весь отрывок (судья видит контекст)
|
||||
for jm in JUDGE_POOL:
|
||||
if JUDGE_POOL[jm] == ARM_FAMILY[a]:
|
||||
continue # self-family exclusion
|
||||
if jm == "gemini-3.1-pro-preview":
|
||||
continue # gemini — точечно, отдельным проходом (бюджет); тут пропускаем
|
||||
tasks.append(dict(trap=tr["id"], arm=a, label=label[a], judge=jm,
|
||||
chunk=tr["chunk"], text=txt, span=tr["span"],
|
||||
meaning=tr["meaning"]))
|
||||
return tasks
|
||||
|
||||
|
||||
def run():
|
||||
ap = argparse.ArgumentParser(); ap.add_argument("--dry", action="store_true"); a = ap.parse_args()
|
||||
caps = {"gpt-5-mini": 0.05, "kimi-k2.6": 0.08, "gemini-3.1-pro-preview": 0.30}
|
||||
sp = C.Spender(C.DIAG / "judge_costs.jsonl", caps)
|
||||
tasks = build_tasks(a.dry)
|
||||
# resume: пропустить уже отсуженные (trap,arm,judge)
|
||||
vpath = C.DIAG / "trap_verdicts.jsonl"
|
||||
out = []
|
||||
done = set()
|
||||
if vpath.exists():
|
||||
for l in vpath.read_text(encoding="utf-8").splitlines():
|
||||
if not l.strip():
|
||||
continue
|
||||
v = json.loads(l); out.append(v); done.add((v["trap"], v["arm"], v["judge"]))
|
||||
tasks = [t for t in tasks if (t["trap"], t["arm"], t["judge"]) not in done]
|
||||
print(f"trap-judge tasks: {len(tasks)} new ({len(done)} already done) "
|
||||
f"({len(set(t['arm'] for t in tasks))} arms × {len(TRAPS)} traps × cross-family judges)")
|
||||
if a.dry:
|
||||
from collections import Counter
|
||||
print("by judge:", Counter(t["judge"] for t in tasks))
|
||||
return
|
||||
for t in tasks:
|
||||
user = (f"КИТАЙСКИЙ SPAN: {t['span']}\nДОПУСТИМЫЙ СМЫСЛ: {t['meaning']}\n\n"
|
||||
f"РУССКИЙ ПЕРЕВОД ОТРЫВКА (метка {t['label']}):\n{t['text']}\n\n"
|
||||
f"Оцени ТОЛЬКО передачу указанного span. Ответь JSON.")
|
||||
s = C.spec(t["judge"], max_tokens=(16000 if t["judge"] == "kimi-k2.6" else 4000))
|
||||
msgs = [{"role": "system", "content": JUDGE_SYS}, {"role": "user", "content": user}]
|
||||
in_est = C.count_tokens(JUDGE_SYS + user, "glm")
|
||||
ok, pred = sp.guard(t["judge"], in_est, s["max_tokens"])
|
||||
if not ok:
|
||||
print(f" OVER-CAP {t['judge']} {t['trap']} {t['arm']} pred=${pred:.3f}"); continue
|
||||
text, err, usage = C.call(s, msgs, timeout=300)
|
||||
c = sp.record({"model": t["judge"], "judge": t["judge"], "keyenv": s["keyenv"],
|
||||
"trap": t["trap"], "arm": t["arm"], "err": err, "usage": usage})
|
||||
v = parse_verdict(text) if not err else {"verdict": "ERR", "catastrophe": False, "note": err[:60]}
|
||||
v.update(trap=t["trap"], arm=t["arm"], judge=t["judge"], label=t["label"])
|
||||
out.append(v)
|
||||
print(f" {t['trap']} {t['arm']:<10} {t['judge']:<18} → {v.get('verdict'):<8} cat={v.get('catastrophe')} ${c:.4f}")
|
||||
(C.DIAG / "trap_verdicts.jsonl").write_text("\n".join(json.dumps(v, ensure_ascii=False) for v in out), encoding="utf-8")
|
||||
summarize(out)
|
||||
|
||||
|
||||
def parse_verdict(text: str) -> dict:
|
||||
m = re.search(r"\{.*\}", text, re.S)
|
||||
if not m:
|
||||
return {"verdict": "PARSE", "catastrophe": False, "note": text[:60]}
|
||||
try:
|
||||
d = json.loads(m.group(0))
|
||||
return {"verdict": str(d.get("verdict", "?")).lower(), "catastrophe": bool(d.get("catastrophe")),
|
||||
"evidence": d.get("evidence", "")[:120], "note": d.get("note", "")[:120]}
|
||||
except Exception:
|
||||
vv = re.search(r'"verdict"\s*:\s*"(\w+)"', m.group(0))
|
||||
return {"verdict": vv.group(1).lower() if vv else "PARSE", "catastrophe": "true" in m.group(0).lower(), "note": text[:60]}
|
||||
|
||||
|
||||
def summarize(out):
|
||||
from collections import defaultdict
|
||||
agg = defaultdict(lambda: defaultdict(list))
|
||||
for v in out:
|
||||
agg[v["trap"]][v["arm"]].append(v)
|
||||
print("\n=== TRAP-ACCURACY (per arm: majority verdict / catastrophe flags) ===")
|
||||
for tr in TRAPS:
|
||||
t = tr["id"]
|
||||
if t not in agg: continue
|
||||
print(f"\n{t} ({tr['type']}):")
|
||||
for arm in ["P0","P1a","P1b","P1c","A-layout","A-2pass","A-ref-prev","A-ref-both","F-base","F-disc"]:
|
||||
vs = agg[t].get(arm)
|
||||
if not vs: continue
|
||||
verds = [v["verdict"] for v in vs]
|
||||
cat = any(v["catastrophe"] for v in vs)
|
||||
print(f" {arm:<11} {verds} catastrophe={cat}")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
run()
|
||||
108
eval/exp14_kpi.py
Normal file
108
eval/exp14_kpi.py
Normal file
|
|
@ -0,0 +1,108 @@
|
|||
#!/usr/bin/env python3
|
||||
"""exp14 — детерминированный структурный KPI (Претензия 1, БЕЗ судьи) + гварды.
|
||||
|
||||
$0. Метрика Претензии 1: распределение предложений/нарратив-абзац (baseline P0: медиана 1.0,
|
||||
среднее 1.70, доля 1-предл. 0.58). Гварды: CJK-утечка=0, length-ratio, glossary-присутствие,
|
||||
диалог-тире-парность. Аварийный гейт: нельзя «побеждать» только МЕНЬШИМ числом абзацев →
|
||||
KPI парно с atom-coverage-прокси (длина не должна коллапсировать).
|
||||
|
||||
Использование: exp14_kpi.py [--scope trap|stage2]
|
||||
"""
|
||||
from __future__ import annotations
|
||||
import argparse, json, re, statistics
|
||||
from pathlib import Path
|
||||
import exp14_common as C
|
||||
|
||||
ARMS = C.DIAG / "arms"
|
||||
MAT = json.load(open(C.DIAG / "material.json"))
|
||||
|
||||
|
||||
def paras(t): return [p for p in re.split(r"\n\s*\n", t.strip()) if p.strip()]
|
||||
def sents(p): return [s for s in re.split(r"(?<=[.!?…])\s+", p.strip()) if s.strip()]
|
||||
def is_dlg(p): return p.strip().startswith("—") or p.strip().startswith("–")
|
||||
def han(t): return sum(1 for c in t if "一" <= c <= "鿿" or "㐀" <= c <= "䶿")
|
||||
|
||||
|
||||
def kpi_of(text: str) -> dict:
|
||||
ps = paras(text)
|
||||
narr = [p for p in ps if not is_dlg(p)]
|
||||
dlg = [p for p in ps if is_dlg(p)]
|
||||
sp = [len(sents(p)) for p in narr] or [0]
|
||||
return dict(
|
||||
n_para=len(ps), n_narr=len(narr), n_dlg=len(dlg),
|
||||
median_spp=statistics.median(sp), mean_spp=round(statistics.mean(sp), 2),
|
||||
share_1sent=round(sum(1 for x in sp if x == 1) / len(sp), 3),
|
||||
chars=len(text), han=han(text),
|
||||
)
|
||||
|
||||
|
||||
def gloss_presence(text: str, editor_constraint: str) -> float:
|
||||
"""Доля dst-форм из инъекции, чьё СТЕММ (первые 4 симв.) встречается в выходе (прокси)."""
|
||||
dsts = re.findall(r"«([^»]+)»", editor_constraint)
|
||||
if not dsts:
|
||||
return 1.0
|
||||
hit = 0
|
||||
for d in dsts:
|
||||
stem = d.split()[0][:4]
|
||||
if stem and stem.lower() in text.lower():
|
||||
hit += 1
|
||||
return round(hit / len(dsts), 3)
|
||||
|
||||
|
||||
def unit_map(scope):
|
||||
if scope == "trap":
|
||||
return {f"{u['chapter']}.{u['chunk_idx']}": u for u in MAT["trap_chunks"]}
|
||||
m = {}
|
||||
for ch, chunks in MAT["stage2"].items():
|
||||
for u in chunks:
|
||||
m[f"{ch}.{u['chunk_idx']}"] = dict(chapter=int(ch), **u)
|
||||
return m
|
||||
|
||||
|
||||
def main():
|
||||
ap = argparse.ArgumentParser()
|
||||
ap.add_argument("--scope", default="trap")
|
||||
a = ap.parse_args()
|
||||
units = unit_map(a.scope)
|
||||
arms = sorted(d.name for d in ARMS.iterdir() if d.is_dir())
|
||||
print(f"=== exp14 KPI ({a.scope}, {len(units)} chunks) — Претензия 1 + гварды ===\n")
|
||||
rows = {}
|
||||
for arm in arms:
|
||||
agg = []
|
||||
han_total, chars_total, chars_p0 = 0, 0, 0
|
||||
gl = []
|
||||
for uid, u in units.items():
|
||||
fp = ARMS / arm / f"{uid}.txt"
|
||||
if not fp.exists():
|
||||
continue
|
||||
t = fp.read_text(encoding="utf-8")
|
||||
k = kpi_of(t)
|
||||
agg.append(k); han_total += k["han"]; chars_total += k["chars"]
|
||||
chars_p0 += len(u["final_p0"])
|
||||
gl.append(gloss_presence(t, u.get("editor_constraint", "")))
|
||||
if not agg:
|
||||
continue
|
||||
allsp_median = statistics.median([k["median_spp"] for k in agg])
|
||||
mean_spp = round(statistics.mean([k["mean_spp"] for k in agg]), 2)
|
||||
share1 = round(statistics.mean([k["share_1sent"] for k in agg]), 3)
|
||||
lr = round(chars_total / max(1, chars_p0), 3)
|
||||
rows[arm] = dict(n=len(agg), mean_spp=mean_spp, share_1sent=share1,
|
||||
han=han_total, len_ratio_vs_p0=lr,
|
||||
gloss=round(statistics.mean(gl), 3))
|
||||
hdr = f"{'arm':<12}{'n':>3}{'mean_spp':>10}{'share_1s':>10}{'CJK':>6}{'len/P0':>8}{'gloss':>7}"
|
||||
print(hdr); print("-" * len(hdr))
|
||||
# baseline first
|
||||
order = [a for a in ["P0", "P1a", "P1b", "P1c", "A-layout", "A-2pass",
|
||||
"A-ref-prev", "A-ref-next", "A-ref-both", "F-base", "F-disc"] if a in rows]
|
||||
order += [a for a in rows if a not in order]
|
||||
for arm in order:
|
||||
r = rows[arm]
|
||||
print(f"{arm:<12}{r['n']:>3}{r['mean_spp']:>10}{r['share_1sent']:>10}"
|
||||
f"{r['han']:>6}{r['len_ratio_vs_p0']:>8}{r['gloss']:>7}")
|
||||
print("\nПретензия-1 сигнал: mean_spp↑ и share_1sent↓ vs P0 = меньше рублености (лучше);")
|
||||
print("гейт: len/P0 не должен коллапсировать (<~0.9 = подозрение на потерю атомов); CJK=0 обяз.")
|
||||
(C.DIAG / f"kpi_{a.scope}.json").write_text(json.dumps(rows, ensure_ascii=False, indent=1), encoding="utf-8")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
168
eval/exp14_material.py
Normal file
168
eval/exp14_material.py
Normal file
|
|
@ -0,0 +1,168 @@
|
|||
#!/usr/bin/env python3
|
||||
"""exp14 — материал: trap-чанки, Stage-II главы (детерм. D), реконструкция глоссарий-
|
||||
инъекции из rerun-store (rig-фиделити A1′, как exp12_blocks), P0-baseline paragraph-KPI.
|
||||
|
||||
$0. Выход: /home/ubuntu/books/gu-zhenren/exp14/material.json (ВНЕ git).
|
||||
"""
|
||||
from __future__ import annotations
|
||||
import json, re, sqlite3, statistics
|
||||
from pathlib import Path
|
||||
|
||||
RERUN = Path("/home/ubuntu/books/gu-zhenren/rerun")
|
||||
OUT = Path("/home/ubuntu/books/gu-zhenren/exp14"); OUT.mkdir(parents=True, exist_ok=True)
|
||||
DB = RERUN / "guzhenren-rerun.db"
|
||||
|
||||
# ── Заморожённый выбор (§1.0) ──────────────────────────────────────────────────────
|
||||
TRAP_CHUNKS = [(7, 0), (8, 0), (8, 1), (9, 0), (10, 0), (11, 0), (11, 1), (24, 0), (24, 1)]
|
||||
STAGE2 = [19, 17, 18]
|
||||
EXCLUDE = {(5, 0), (20, 0)} # экспорт-баг D35.4a
|
||||
|
||||
EDITOR_HEADER = ("КАНОНИЧЕСКИЕ ПЕРЕВОДЫ имён и терминов (в черновике эти сущности должны быть "
|
||||
"переданы ИМЕННО этими формами — приводи к ним любые расхождения, склоняя по "
|
||||
"контексту; не вводи иных вариантов и не меняй ничего другого):")
|
||||
GLOSS_HEADER = ("ГЛОССАРИЙ (используй эти утверждённые переводы имён и терминов последовательно; "
|
||||
"строки с пометкой ⟨проверить⟩ — неподтверждённые кандидаты):")
|
||||
|
||||
|
||||
def load_records():
|
||||
d = json.load(open(RERUN / "records.json"))
|
||||
return {(r["chapter"], r["chunk_idx"]): r for r in d}, d
|
||||
|
||||
|
||||
def paras(t: str):
|
||||
return [p for p in re.split(r"\n\s*\n", t.strip()) if p.strip()]
|
||||
|
||||
def sents(p: str):
|
||||
return [s for s in re.split(r"(?<=[.!?…])\s+", p.strip()) if s.strip()]
|
||||
|
||||
def dialogue_D(source: str) -> float:
|
||||
"""exp12 §1.1: доля символов внутри «“…”» (U+201C..U+201D) от не-пробельных."""
|
||||
nonspace = sum(1 for c in source if not c.isspace())
|
||||
inq, indq = 0, False
|
||||
for c in source:
|
||||
if c == "“":
|
||||
indq = True; continue
|
||||
if c == "”":
|
||||
indq = False; continue
|
||||
if indq and not c.isspace():
|
||||
inq += 1
|
||||
return inq / max(1, nonspace)
|
||||
|
||||
|
||||
def reconstruct_injection():
|
||||
"""editor_constraint (dst-only, approved, dedup) + bilingual_glossary (src→dst[+⟨проверить⟩])
|
||||
per chunk из injected_ids + glossary. Sticky union chunk0∪.. внутри главы (exp12 A5)."""
|
||||
con = sqlite3.connect(DB); con.row_factory = sqlite3.Row
|
||||
gl = {(r["src"], r["sense"], r["since_ch"], r["until_ch"]): (r["dst"], r["status"])
|
||||
for r in con.execute("SELECT src,sense,since_ch,until_ch,dst,status FROM glossary")}
|
||||
inj = {}
|
||||
for r in con.execute("SELECT chapter,chunk_idx,injected_ids,n_sticky,n_evicted FROM retrieval_state"):
|
||||
inj[(r["chapter"], r["chunk_idx"])] = (json.loads(r["injected_ids"] or "[]"),
|
||||
r["n_sticky"], r["n_evicted"])
|
||||
con.close()
|
||||
|
||||
def keydec(k):
|
||||
src, sense, since, until = k.split("\x1f")
|
||||
return (src, sense, int(since), int(until))
|
||||
|
||||
def block_for(keys):
|
||||
recs = []
|
||||
for k in keys:
|
||||
src, sense, since, until = keydec(k)
|
||||
dst, status = gl.get((src, sense, since, until), ("", "auto"))
|
||||
if dst.strip():
|
||||
recs.append((src, dst.strip(), status == "approved"))
|
||||
seen, el = set(), []
|
||||
for src, dst, conf in recs:
|
||||
if conf and dst not in seen:
|
||||
seen.add(dst); el.append(f"- «{dst}»")
|
||||
eb = (EDITOR_HEADER + "\n" + "\n".join(el)) if el else ""
|
||||
glines = [f"{src} → {dst}" + ("" if conf else " ⟨проверить⟩") for src, dst, conf in recs]
|
||||
gb = (GLOSS_HEADER + "\n" + "\n".join(glines)) if glines else ""
|
||||
return eb, gb, len(el), len(glines)
|
||||
|
||||
out = {}
|
||||
chapters = sorted(set(ch for ch, _ in inj))
|
||||
for ch in chapters:
|
||||
cidxs = sorted(c for (cc, c) in inj if cc == ch)
|
||||
chunk0keys = inj.get((ch, 0), ([], 0, 0))[0]
|
||||
for c in cidxs:
|
||||
keys, nst, nev = inj[(ch, c)]
|
||||
active = list(keys)
|
||||
for k in chunk0keys: # sticky scene-inertia within chapter
|
||||
if c > 0 and k not in active:
|
||||
active.append(k)
|
||||
eb, gb, ne, ng = block_for(active)
|
||||
out[f"{ch}/{c}"] = {"editor_constraint": eb, "bilingual_glossary": gb,
|
||||
"n_constraint": ne, "n_gloss": ng, "n_sticky": nst, "n_evicted": nev}
|
||||
# chapter-level union (для P1b/P1c whole-chapter арма)
|
||||
allkeys = []
|
||||
for c in cidxs:
|
||||
for k in inj[(ch, c)][0]:
|
||||
if k not in allkeys:
|
||||
allkeys.append(k)
|
||||
eb, gb, ne, ng = block_for(allkeys)
|
||||
out[f"{ch}/ALL"] = {"editor_constraint": eb, "bilingual_glossary": gb,
|
||||
"n_constraint": ne, "n_gloss": ng}
|
||||
return out
|
||||
|
||||
|
||||
def p0_kpi(recs):
|
||||
"""P0 baseline: sentences/narrative-paragraph по 55 committed чанкам (freeze-число)."""
|
||||
sp = []
|
||||
for (ch, ck), r in recs.items():
|
||||
if (ch, ck) in EXCLUDE:
|
||||
continue
|
||||
for p in paras(r["final"]):
|
||||
if p.strip().startswith("—"):
|
||||
continue
|
||||
sp.append(len(sents(p)))
|
||||
return {"n_paras": len(sp), "median": statistics.median(sp),
|
||||
"mean": round(statistics.mean(sp), 3),
|
||||
"share_1sent": round(sum(1 for x in sp if x == 1) / len(sp), 3)}
|
||||
|
||||
|
||||
def main():
|
||||
recs, _ = load_records()
|
||||
inj = reconstruct_injection()
|
||||
|
||||
# verify: trap chunks have reconstructed blocks
|
||||
print("=== Инъекция реконструирована (trap-чанки) ===")
|
||||
for ch, ck in TRAP_CHUNKS:
|
||||
b = inj[f"{ch}/{ck}"]
|
||||
print(f" {ch}.{ck}: {b['n_constraint']} constraint / {b['n_gloss']} gloss "
|
||||
f"(sticky={b['n_sticky']} evict={b['n_evicted']})")
|
||||
|
||||
# Stage-II D
|
||||
print("\n=== Stage-II главы: детерм. D (диалого-плотность) ===")
|
||||
d_scores = {}
|
||||
for ch in STAGE2:
|
||||
src = "".join(recs[(ch, c)]["source"] for (cc, c) in recs if cc == ch)
|
||||
d_scores[ch] = round(dialogue_D(src), 3)
|
||||
print(f" гл.{ch}: D={d_scores[ch]}")
|
||||
|
||||
# P0 KPI
|
||||
kpi = p0_kpi(recs)
|
||||
print(f"\n=== P0 baseline paragraph-KPI (freeze-сверка) ===\n {kpi}")
|
||||
|
||||
# export material for arms
|
||||
mat = {"trap_chunks": [], "stage2": {}, "kpi_p0": kpi, "stage2_D": d_scores}
|
||||
for ch, ck in TRAP_CHUNKS:
|
||||
r = recs[(ch, ck)]
|
||||
mat["trap_chunks"].append({"chapter": ch, "chunk_idx": ck,
|
||||
"source": r["source"], "draft": r["draft"], "final_p0": r["final"],
|
||||
"editor_constraint": inj[f"{ch}/{ck}"]["editor_constraint"],
|
||||
"bilingual_glossary": inj[f"{ch}/{ck}"]["bilingual_glossary"]})
|
||||
for ch in STAGE2:
|
||||
mat["stage2"][ch] = [{"chunk_idx": c, "source": recs[(ch, c)]["source"],
|
||||
"draft": recs[(ch, c)]["draft"], "final_p0": recs[(ch, c)]["final"],
|
||||
"editor_constraint": inj[f"{ch}/{c}"]["editor_constraint"],
|
||||
"bilingual_glossary": inj[f"{ch}/{c}"]["bilingual_glossary"]}
|
||||
for (cc, c) in sorted(recs) if cc == ch]
|
||||
(OUT / "material.json").write_text(json.dumps(mat, ensure_ascii=False), encoding="utf-8")
|
||||
(OUT / "injection_blocks.json").write_text(json.dumps(inj, ensure_ascii=False, indent=1), encoding="utf-8")
|
||||
print(f"\n→ {OUT/'material.json'} ({len(mat['trap_chunks'])} trap chunks, {len(STAGE2)} stage-II chapters)")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
101
eval/exp14_prompts.py
Normal file
101
eval/exp14_prompts.py
Normal file
|
|
@ -0,0 +1,101 @@
|
|||
#!/usr/bin/env python3
|
||||
"""exp14 — рендер промптов армов (ЗАМОРОЖЕНЫ; sha256 в §2 дока).
|
||||
|
||||
- baseline editor = backend/prompts/editor.md (v2-bilingual-reflow), brief-filled.
|
||||
- discourse editor = baseline + дискурс-reflow ядро (§1.2: 5 техник Ван Цуй + Розенталь) + few-shot.
|
||||
- translator (для re-draft глав/нарезки) = backend/prompts/translator.md (v1-reflow).
|
||||
Few-shot — минимальные ортогональные (narrative N:1, dialogue 1:N, focal-shift). НЕ ручной CoT.
|
||||
"""
|
||||
from __future__ import annotations
|
||||
import hashlib
|
||||
from pathlib import Path
|
||||
|
||||
PROMPTS = Path("/home/ubuntu/projects/textmachine/backend/prompts")
|
||||
BRIEF = dict(source_lang="zh", target_lang="ru", genre="вебновелла",
|
||||
audience="взрослые читатели вебновелл", title="蛊真人",
|
||||
honorifics="keep", transcription="palladius", venuti="0.6", footnotes="minimal")
|
||||
|
||||
|
||||
def _fill(t: str) -> str:
|
||||
for k, v in BRIEF.items():
|
||||
t = t.replace("{{" + k + "}}", v)
|
||||
return t
|
||||
|
||||
|
||||
def _split(md_text: str) -> tuple[str, str]:
|
||||
sysmd, usermd = md_text.split("---USER---", 1)
|
||||
return _fill(sysmd).strip(), _fill(usermd).strip()
|
||||
|
||||
|
||||
# ── Дискурс-reflow ядро (§1.2; арм для ЗАМЕРА, не «оптимальный промпт») ──────────────
|
||||
DISCOURSE_CORE = """
|
||||
ДИСКУРС-ПЕРЕВЁРСТКА (обязательная операция передачи китайского паратаксиса в русскую гипотактическую прозу — это КОНВЕНЦИЯ русского языка, а не вольность):
|
||||
1. Молча определи смысловые ходы фрагмента: единый фокал/наблюдатель; действие и его непосредственная реакция; одна тема рассуждения; границы — смена говорящего, времени, места или фокала.
|
||||
2. Один повествовательный ход оформляй ОДНИМ русским абзацем, ДАЖЕ если китайский исходник разбит на однофразовые строки. Инструмент слияния — причастные и деепричастные обороты, подчинительные союзы и связки (построй иерархию, сегментируй по смыслу, промаркируй вид/время предикатов, варьируй лексику, добавляй связки). Не сливай ТОЛЬКО ради длины и не теряй смысловые атомы.
|
||||
3. Каждую новую реплику начинай с нового абзаца через тире «—»; слова автора при той же реплике оставляй в её абзаце.
|
||||
4. Разрешено объединять и делить русские предложения; число предложений и абзацев совпадать с исходником НЕ обязано. Запрещено терять смысловые атомы (участников, действия, числа, полярность, заголовки).
|
||||
"""
|
||||
|
||||
FEWSHOT = """
|
||||
Примеры требуемой ПЕРЕВЁРСТКИ (показана структура вывода, не стиль):
|
||||
|
||||
[narrative N:1] Исходник построчно — «Он вышел за дверь.» / «Небо было серым.» / «Он вздохнул.» / «Дорога уходила вдаль.» — становится ОДНИМ абзацем:
|
||||
Он вышел за дверь. Небо было серым; вздохнув, он смотрел, как дорога уходит вдаль.
|
||||
|
||||
[dialogue 1:N] Исходник — «Дядя нахмурился и сказал: „Время летит. Садись.“ Племянник ответил: „Спасибо.“» — становится:
|
||||
Дядя нахмурился.
|
||||
— Время летит. Садись, — сказал он.
|
||||
— Спасибо, — ответил племянник.
|
||||
|
||||
[focal-shift] При смене наблюдателя/места/времени — новый абзац, даже если в исходнике это продолжение той же строки.
|
||||
"""
|
||||
|
||||
REFERENCE_NOTE = ("\n\nСПРАВОЧНЫЙ КОНТЕКСТ (соседние фрагменты — ТОЛЬКО для разрешения связей, "
|
||||
"местоимений и опущенных подлежащих; НЕ переводи и НЕ пересказывай его в выходе):")
|
||||
|
||||
|
||||
def editor_system(variant: str, few_shot: bool = True) -> str:
|
||||
sysmd, _ = _split((PROMPTS / "editor.md").read_text(encoding="utf-8"))
|
||||
if variant == "baseline":
|
||||
return sysmd
|
||||
if variant == "discourse":
|
||||
out = sysmd + "\n" + DISCOURSE_CORE
|
||||
if few_shot:
|
||||
out += FEWSHOT
|
||||
return out
|
||||
raise ValueError(variant)
|
||||
|
||||
|
||||
def editor_user(source: str, draft: str, reference: str = "") -> str:
|
||||
_, usermd = _split((PROMPTS / "editor.md").read_text(encoding="utf-8"))
|
||||
u = usermd.replace("{{text}}", source).replace("{{draft}}", draft)
|
||||
if reference.strip():
|
||||
u += REFERENCE_NOTE + "\n" + reference.strip()
|
||||
return u
|
||||
|
||||
|
||||
def translator_system() -> str:
|
||||
sysmd, _ = _split((PROMPTS / "translator.md").read_text(encoding="utf-8"))
|
||||
return sysmd
|
||||
|
||||
def translator_user(source: str) -> str:
|
||||
_, usermd = _split((PROMPTS / "translator.md").read_text(encoding="utf-8"))
|
||||
return usermd.replace("{{text}}", source)
|
||||
|
||||
|
||||
def sha_frozen() -> dict:
|
||||
return {
|
||||
"editor_baseline_sys": hashlib.sha256(editor_system("baseline").encode()).hexdigest()[:16],
|
||||
"editor_discourse_sys": hashlib.sha256(editor_system("discourse").encode()).hexdigest()[:16],
|
||||
"discourse_core": hashlib.sha256(DISCOURSE_CORE.encode()).hexdigest()[:16],
|
||||
"fewshot": hashlib.sha256(FEWSHOT.encode()).hexdigest()[:16],
|
||||
"translator_sys": hashlib.sha256(translator_system().encode()).hexdigest()[:16],
|
||||
}
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
import json
|
||||
print("=== frozen prompt sha256[:16] ===")
|
||||
print(json.dumps(sha_frozen(), indent=1, ensure_ascii=False))
|
||||
print("\n=== editor discourse system (first 600) ===")
|
||||
print(editor_system("discourse")[:600])
|
||||
Loading…
Add table
Reference in a new issue