textmachine/docs/experiments/09-pilot-protocol.md

17 KiB
Raw Blame History

Эксперимент 09. Протокол пилота Фазы 2.5 — выбор ядра, memory-bet, судья, think-режим

Дата: 2026-07-05 · Зона: полигон (флагман) · Статус: протокол + харнесс-скелет; решающий прогон ждёт корпус владельца + человеческих аннотаторов. Закрывает решения: выбор ядра C0C3 (Р2), go/no-go на банк памяти (research/13 §Вердикт), валидность LLM-судьи (research/11-gap-3), think-ON/OFF (D6), ценность пре-пасса Annotator (04-unhappy).

Пилот — единственная точка, где сходятся все отложенные «решаемые только человеком» вопросы качества. Он же — дециждающий эксперимент банка памяти (ставка не морозится до него, вердикт GO-на-схему был условным).

1. Что пилот решает (и почему только он)

Решение Почему не решено раньше Рука пилота
Ядро C0C3 (baseline / draft→editor / generate-select / select-refine) arXiv:2603.20324 «When Agents Disagree» не покрывает перевод; на zh/ja→ru нужен свой (research/11-gap-3) человеческий BWS + судья-панель
Банк памяти vs длинный контекст (go/no-go на ставку) DelTA — LLM-в-цикле, не наш детерминированный путь; сравнение «банк vs длинный контекст» на zh/ja→ru не проведено (research/13 Q6) memory-eval (§6), WMT25-3-режим
Валиден ли LLM-судья вообще LAIT: судьи расходятся с людьми; на s* висит вся ставка generate-select C2/C3 корреляция судья↔человек + калибровка s* (§5)
think-ON vs OFF по качеству (draft/translator + editor) локально подтвердилось на реалиях (羅生門→Радзёмон), но COGS +1325% (эксп.08) — стоит ли think-рука (§7), встроена в ядро
Ценность пре-пасса Annotator улучшает ли настолько, чтобы оправдать вызов A/B в ядре (§8)

2. Корпус (нужен от владельца)

  • 2535 глав реальных произведений с приватными эталонными переводами (издательскими или выверенными). GuoFeng V2 — только dev, non-commercial (нельзя в продукт-оценку).
  • Покрытие: zh→ru (вебновелла + данмэй), ja→ru (ранобэ), en→ru (роман) — по 812 глав. Диалого-плотные и нарративные главы (см. эксп.07: диалог-плотность — ключевая ось).
  • Рекуррентные имена/термины обязательны (≥8 сущностей, повторяющихся через главы) — иначе memory-eval нечего мерить.
  • ⚠ Методическое ограничение (эксп.04): владелец читает только en/ru. → человеческая оценка ВЕРНОСТИ возможна лишь на en→ru (и русская сторона стиля любого перевода). Для zh/ja верность оценивается: (а) английским якорь-подстрочником (профессиональный en-перевод как мост), (б) LLM-судьёй чужого семейства против исходника, (в) сверкой с приватным русским эталоном. Заложено в дизайн (§45).

Пока корпуса нет — индикативный прогон на PD-Ah-Q (eval/pilot/memory_eval.py) валидирует харнесс и decl-метрику.

3. Дизайн ядра (C0C3, Р2)

Один и тот же чанк проходит 4 конфигурации ядра, все на ратифицированном стеке (draft=DeepSeek-v4-flash, editor=grok-non-reason):

  • C0 baseline — один проход переводчика (+ детерминированный глоссарий = уровень VseGPT; baseline метрики, PROGRESS §синтез).
  • C1 draft→editor — черновик → моноязычный редактор (D1). Дефолт Ф1.
  • C2 generate-then-select — N черновиков → судья-селектор выбирает лучший (arXiv:2603.20324). Висит на калибровке s* и валидности судьи (§5).
  • C3 select-then-refine — селект + точечный re-ask/refine на выбранном (verifier-gated, research/14 M2; рычаг L3 эксп.adaptive_reask).

Каждая конфигурация × {think-OFF, think-ON} (§7) × {Annotator-pre-pass OFF/ON} (§8) — факторный, но приоритезированный (полный крест дорог; ядро × think — первично, Annotator — вторичный A/B на подвыборке).

4. Человеческая оценка — Best-Worst Scaling (BWS)

Почему BWS, не шкала Ликерта: BWS (выбери ЛУЧШИЙ и ХУДШИЙ из набора) даёт более надёжные, менее шумные ранги, чем абсолютные оценки (устойчив к разнице калибровки аннотаторов) — стандарт для сравнения близких систем. LAIT показал: абсолютные оценки судей плывут, ранги — надёжнее.

  • Единица: абзац/короткий чанк (не вся глава — усталость аннотатора). Наборы из 34 систем (C0C3, или think-ON vs OFF пары).
  • Слепота: аннотатор не видит, какая система какой выход дал (рандомизация порядка + меток).
  • Оси оценки (раздельно, НЕ смешивать):
    • Стиль/естественность (русская сторона) — владелец/русскоязычный аннотатор, любой языковой парой (не нужен исходник).
    • Верность/полнота — только en→ru напрямую; для zh/ja — через en-якорь-подстрочник (§2). Отдельная BWS-задача с исходником/якорем на виду.
  • N: ≥3 аннотатора на набор для inter-annotator agreement (κ); при низком κ — расширять, не усреднять шум.
  • Стилевая ось для M1 (in-context демонстрации, research/14): бьёт ли демо-рука стиль БЕЗ потери консистентности/fidelity (индикатив: по консистентности не бьёт; стиль не мерен).

5. LLM-судейская панель (валидация + калибровка)

Судья держит две вещи: (а) выбор в C2/C3 (селектор), (б) валидацию качества offline. Обе непроверены на домене → пилот их валидирует, не принимает на веру.

  • Панель чужих семейств (анти-self-preference): Gemini-3.1-Pro (нативный, safety-off для 18+), grok-4.3, gpt-5-mini — судят выходы deepseek/grok. Никогда не судить моделью своего семейства свой выход.
  • Шкала Комиссарова (анкета MQM-весов, 04-unhappy): mistranslation / omission / addition / терминология / согласование рода / стиль-канцелярит.
  • Валидация #1 — корреляция судья↔человек на BWS-ранге (LAIT: расходятся). Если ранговая корреляция (Kendall τ) судья↔человек низка → судья не годен как прокси, C2/C3 под вопросом.
  • Валидация #2 — калибровка порога s* (на нём вся ставка generate-select, arXiv:2603.20324): при каком судейском скоре «выбрать/переспросить» максимизируется человеческий win-rate. Пред-регистрировать s* ДО финального прогона.
  • Cross-family fidelity-судья vs источника — для memory-eval (§6, ось б).

6. Memory-eval — дециждающий эксперимент банка (WMT25 три-режимный)

Вопрос (страх владельца + go/no-go): оправдана ли ДЕТЕРМИНИРОВАННАЯ селективная инъекция (наш банк) vs просто весь глоссарий в длинном контексте, и вредит ли ошибочная инъекция (тихая деградация).

Три режима терминологии (WMT25) × baseline:

  • C0 без глоссария; C1 селективная инъекция (наш банк, §ниже); C2 полный глоссарий + скользящее резюме (длинный контекст); C3 случайный/неверный глоссарий (dst перемешан) — адверсариальная рука, прямой замер тихой деградации.

Инъекция C1 = ЗЕРКАЛО Go-горячего-пути (backend/internal/pipeline/memory.go — ИСТОЧНИК ИСТИНЫ): нормализованный точный матч, per-язык min-key (Han≥2/фонетич.≥3), collision-prone короткий фонетический ключ → AMBIGUOUS, longest-match containment, спойлер-окно since/until (hard-reject), sticky scene-inertia. Сверено с Go-юнит-тестами; при расхождении — верить Go. eval/memory_hotpath.py — прототип ДО cc57c7b (глобальный MIN_KEY=2, без collision-downgrade) — не переиспользовать; актуальный контракт — в eval/pilot/memory_eval.py.

Метрики (три оси раздельно):

  • (а) консистентность — decl-осознанная (eval/pilot/declmetric.py, pymorphy3): одинаково ли рендерится approved-dst во всех чанках, где встречается src. ОБЯЗАНА быть decl-осознанной — наивный матч даёт 1867% ложных флагов (research/14 §2; backend memory_e1_test.go full-decl 0% / base-only 67%). Заодно — валидация E1-надёжности post-check на РЕАЛЬНОМ корпусе (жёсткий гейт postcheck_gate флипается только после этого замера precision на живых книгах — mirror D12/Q4).
  • (б) верность/пропуски — CometKiwi (валидировать на ru-литературе — не подтверждён, research/11-gap-2) + LLM-судья чужого семейства против источника + сверка с эталоном. ru-специфика: согласование рода (вкл. глагол прош.вр.), склонение dst.
  • (в) стоимость — input/output токены по условиям (C2 заметно дороже — часть решения; эксп.08 цены).

Пред-регистрированное правило решения: C1≈C2 по качеству но C1 дешевле → банк оправдан; C2≫C1 → нужен полнее контекст; C3 роняет vs C0 по верности → страх владельца подтверждён, post-check/disposition обоснованы (и мы их конвертируем в громкое, а не устраняем).

Спойлер-рука: отдельный замер — инъектится ли спойлер-запись (since_ch) до её главы (должна hard-reject) — валидировано в харнессе (глава 6 отвергает 革命党, глава 7 инъектит).

7. Think-ON vs OFF (D6, встроено в ядро)

Гипотеза владельца частично подтвердилась локально (羅生門→Радзёмон) + DRT (arXiv:2412.17498). Но COGS: deepseek-reasoning мал, grok-4.3 +25% (эксп.08), Gemini форс. Мерить по качеству на draft/translator И editor (не только Terminologist):

  • пары think-ON vs think-OFF того же ядра → BWS + судья;
  • скоуп think-ON — subset-billing провайдеры (deepseek/glm/kimi, reasoning ⊆ completion); xAI/Grok think-ON только после reasoning-буфера в EstimateUSD (D6.2);
  • вход в решение: оправдывает ли прирост качества +1325% COGS редактора (эксп.08 §grok-4.3).

8. Пре-пасс Annotator (A/B)

Улучшает ли пре-пасс (извлечение терминов/резюме/контекста ДО перевода) качество настолько, чтобы оправдать вызов. A/B на подвыборке: ядро с Annotator-pre-pass vs без. Метрика — та же BWS + консистентность (пре-пасс должен поднимать recall глоссария).

9. Пред-регистрация (до финального прогона — против p-hacking)

Зафиксировать ДО прогона: пороги s*, допустимый flag-volume на главу (эксп.07: ≥2 excision-флага = fail), decl-метрику и её матчер, состав судейской панели, правило решения memory-eval, N аннотаторов и κ-порог. Изменения после — отдельным разделом с обоснованием.

10. Харнесс eval/pilot/ (построено / нужно)

Построено (runnable):

  • declmetric.py — decl-осознанная консистентность (pymorphy3 lemma + hyphen-translit + Go-style stored-decl whole-word). Smoke: склонённые формы (Вэйчжуане/Вана/Дэна/сюцая) → 0 ложных флагов.
  • memory_eval.py — WMT25 3-режим + bank-vs-long-context, инъекция = зеркало Go-контракта (спойлер/disposition/sticky/containment валидированы dry-run). Индикативный прогон на PD-Ah-Q; масштабируется на корпус владельца (--src).

Нужно достроить (когда есть корпус):

  • BWS item-generator + агрегатор (наборы, рандомизация, κ, ранги) → bws.py.
  • CometKiwi-обёртка (+ её валидация на ru-литературе, research/11-gap-2) → cometkiwi.py.
  • Судейская панель обёртка (cross-family, Комиссаров-анкета) → judge_panel.py.
  • en-якорь-подстрочник pipeline для zh/ja верности.

11. Ограничения и что нужно от владельца

  • Корпус (§2) — блокер решающего прогона: 2535 глав с приватными эталонами, рекуррентные имена, диалог/нарратив баланс.
  • Человеческие аннотаторы BWS (≥3) — минимум владелец (en/ru); для zh/ja верности — en-якорь.
  • 18+ рука (канал B, судья 18+) — explicit-фрагменты только от владельца, gitignored; на выделенном xAI-промо-аккаунте (не клиентские книги).
  • CometKiwi на ru-литературе не валидирован (research/11-gap-2) — пилот его и валидирует; до того — не доверять как единственной оси верности.

Воспроизведение (индикатив, без корпуса владельца)

eval/.venv/bin/python eval/pilot/declmetric.py                       # decl-метрика smoke
eval/.venv/bin/python eval/pilot/memory_eval.py --dry-run --chapter 6  # инъекция-зеркало + спойлер-гейт
eval/.venv/bin/python eval/pilot/memory_eval.py --chapter 6 --max-chunks 5  # индикативный C0C3 на Ah-Q