textmachine/docs/experiments/13-translator-bakeoff.md

81 lines
13 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Эксперимент 13. Бейк-офф ПЕРЕВОДЧИКОВ (蛊真人 zh→ru) + финализация сида v2
**Статус:** полигон-сессия exp13 (D30.6, приоритет №1). Пре-скрин пилота Ф2.5, безκ-режим, N-судьи + флагман-сверка владельца. Смену дефолта ратифицирует ОРКЕСТРАТОР (D-блоком) — не эта сессия.
**Мандат:** `docs/POLYGON_EXP13_SESSION_PROMPT.md` + D30.6/30.10. Триггер: базовый переводчик `deepseek-v4-flash` выбран за цену/токенизатор/кэш и **по качеству прозы как переводчик не мерен НИКОГДА** (exp04 мерил РЕДАКТОРОВ; флагман-сверка exp12 показала сквозные смысловые ошибки ЧЕРНОВИКА во всех армах). Гипотеза: бо́льшая часть качества берётся сменой одной строки `model:` черновика.
**Зона:** `eval/` + этот файл + PROGRESS «Полигон» + курация сида (вне git). Бэкенд не трогаю (пакет D15.2). Кап **$5**.
**Артефакты:** сэмплы/выходы/сырьё судей — `/home/ubuntu/books/gu-zhenren/diag/` (ВНЕ git; в доке — числа и цитаты ≤15 слов). Каждый платный скрипт персистит usage/cost (D30.10).
---
## 0. Онбординг-факты (контракт, на которых стоит дизайн)
- **D30.6 (ратификация):** exp13 приоритет №1; армы mistral-large-2512 / glm-5 / deepseek-v4-pro / **grok-4.3 reasoning-ON** (единственный CJK-чистый замер 10/10 exp10; ключ разблокирован D27); qwen — опционально, гейт на DashScope-ключ владельца; deepseek — thinking ON (эхо-мина). Судьи span-цитирующие reasoning-ON (урок exp12) + флагман-сверка владельца monitor-паттерном.
- **D30.1 (флип D1):** редактор пере-прогона — БИЛИНГВАЛЬНЫЙ glm-5; re-gate верности обязателен. Пере-прогон 25 глав = {переводчик по exp13} → glm-5-билингв → reflow → сид v2 → санитайзер. Т.е. exp13 выбирает ТОЛЬКО стадию черновика; downstream-редактор чинит вёрстку и стиль.
- **D30.2 (reflow):** «Сохраняй разбивку на абзацы» снимается из `translator.md:9`/`editor.md:8`. Пакет бэкенда D15.2 НЕ залендён на момент exp13 (translator.md ещё несёт строку 9) → армы строят промпт переводчика в eval-коде, **удаляя строку 9 согласно ратифицированному D30.2** (не изобретаю новую строку; PROGRESS-пинг оркестратору на сверку финальной прод-редакции). Влияние на РАНЖИРОВАНИЕ мало: reflow-вёрстку downstream делает билингв-редактор (D30.1), не черновик.
- **Draft-стадия РЕАЛЬНО инъектит глоссарий** (`chunkrun.go:68` `translatorInjection = renderGlossaryBlock`) → армы несут ТОТ ЖЕ блок инъекции (`blocks.json[chunk].bilingual_glossary`, «src → dst», V1-сид приёмки), идентичный по чанку у ВСЕХ армов. Единственная варьируемая переменная — модель переводчика.
- **exp04 (D3):** мерил РЕДАКТОРОВ (билингв, PD-классика). Переводчики как таковые не меряны никем. deepseek выбран за цену/токенизатор/кэш (Р4), не за качество прозы.
- **grok-биллинг:** reasoning-ON = additive (xAI отдаёт `reasoning_tokens` отдельным полем; в eval даём max_tokens с запасом, считаем по usage). deepseek: thinking ON, reasoning ⊆ completion (subset). glm: thinking off (`extra_body {thinking:{type:disabled}}`). mistral: не reasoning-модель. Пруф-слаги/цены — models.yaml, prices_checked 2026-07-10.
---
## 1. ПРЕ-РЕГИСТРАЦИЯ (заморожена ДО платных вызовов; коммит до первого платного вызова — D30.10)
Всё ниже зафиксировано до генерации армов и оценки. Промпт переводчика **заморожен** — никакого промпт-инжиниринга по ходу (урок exp04: сломанная слепота однажды уже дала дефолт-редактора).
### 1.1. Материал — те же 3 чистые главы/6 чанков, что exp12 (сравнимость)
Frame и выбор — унаследованы из exp12 §1.1 (детерминированная формула диалого-плотности `D`, не черри-пик): **гл. 7** (диалого-плотная, D=0.490), **гл. 5** (смешанная = медиана, D=0.222), **гл. 14** (экспозиция, D=0.022). По 2 чанка на главу → 6 источников. Источник zh и его V1-инъекция — из приёмочного store (`diag/chunks.json`, `diag/blocks.json`), общие для всех армов.
### 1.2. Армы-переводчики (варьируется ТОЛЬКО модель черновика)
Каждый арм: `system(translator.md reflow-edition, brief-filled)``system(инъекция = blocks[chunk].bilingual_glossary)` [если непусто] → `user("Переведи следующий фрагмент:\n\n{source}")`. Layout = `MessagesWithInjection` (render.go). Brief-vars из `acceptance/book.yaml`: source_lang=zh, target_lang=ru, genre=вебновелла, audience=взрослые читатели вебновелл, title=蛊真人, honorifics=keep, transcription=palladius, venuti=0.6, footnotes=minimal. Decoding: **temperature 0.3** (прод draft-стадия), max_tokens 8000 (запас под thinking-модели; счёт по usage).
| Арм | Модель | Провайдер | reasoning-постура | Источник | Прайм-цена $/1M (in/out) |
|---|---|---|---|---|---|
| **T1** | deepseek-v4-flash (=база) | deepseek | thinking ON (эхо-мина; прод no-op «off») | **store, $0** (`chunks.json.draft`) | 0.14 / 0.28 |
| **T2** | mistral-large-2512 | mistral | нет (не reasoning-модель) | live | 0.5 / 1.5 |
| **T3** | glm-5 | zai | thinking OFF (`{thinking:{type:disabled}}`, = прод draft-постура) | live | 1.0 / 3.2 |
| **T4** | deepseek-v4-pro | deepseek | thinking ON (эхо-мина; subset) | live | 0.435 / 0.87 |
| **T5** | grok-4.3 **reasoning-ON** | xai | reasoning ON (default low; additive) — МАНДАТ D30.6 (reasoning-off = доказанный no-op) | live | 1.25 / 2.50 |
| **T6** | qwen-flash | dashscope | нет | **ТОЛЬКО если владелец даст DashScope-ключ** (спрошено 1 раз, не блокируюсь) | — |
Постуры зафиксированы как прод-draft-постура каждой модели (draft-стадия шлёт reasoning «off»), КРОМЕ T5: reasoning-off grok = доказанный no-op (exp12 §2.2), поэтому мандат меряет grok reasoning-ON — единственный содержательный замер grok-как-переводчика.
### 1.3. Гейты на выходах (все армы; D30.10)
- **Эхо-rate** (отдельная колонка; deepseek-прайор 25%): доля Han-символов в ru-выходе > порога ⇒ эхо/копия исходника. Порог: >10% Han (нормальный ru-перевод ≈02% Han на редких терминах; полное эхо ≈100%). Флаг + запись, не роняю.
- **Refusal:** маркеры отказа (не могу/не буду/as an AI) на не-18+ SFW-входе = дефект.
- **Объём-коридор:** `len(ru)/len(zh_source)` вне zh→ru-бандов приёмки `[2.2, 4.2]` ⇒ флаг (усечение/раздувание).
- **Полнота:** пустой выход / finish=length ⇒ дефект арма.
### 1.4. Оценка (уроки exp12 — D30.1/30.10)
**Судейская панель (кросс-семейная; НИ ОДИН арм не из семей судей → self-family exclusion соблюдён без исключений):**
- **J1 gemini-3.1-pro-preview** (Google; thinking mandatory = reasoning-ON), **J2 gpt-5-mini** (OpenAI; reasoning_effort=medium = ON), **J3 kimi-k2.6** (Moonshot; reasoning-ON, temp=1 форс, max_tokens 16000). Ни deepseek/mistral/glm/grok (все — армы) в судьи не берём.
- **Раздельные оси:** ВЕРНОСТЬ и СТИЛЬ — РАЗНЫМИ вызовами (урок exp12: смешанные скаляры слепы). Каждый вызов — ранжирование всех армов по одной оси на одном чанке.
- **Рационале обязательно:** JSON `{ranking:[labels best→worst], evidence_spans:[{label, quote(zh/ru ≤15 слов), note}]}`. Пустой evidence ⇒ вызов невалиден, повтор.
- **Слепота:** метки V1..VN, перемешанные СВОЕЙ перестановкой на каждый (чанк × ось × повтор); ключ — отдельный файл, не открывается до агрегации.
- **≥3 повтора** со свапом на (чанк × ось × судья). Агрегация — среднее место (Borda), устойчивость к leak — по разбросу.
- **Parse-чек полноты ранжирования:** `set(ranking)==set(labels)`; неполный вердикт выбрасывается (не доклеивается), дисклоуз в отчёте.
- **Флагман-сверка владельца:** тем же monitor-паттерном (слепые метки, ключ отдельно, оригинал+вариант на копирование во Fable 5/5.6). Сырьё флагманов → `diag/`.
- Судьи — вторичны к чтению владельца/флагманов (урок exp12: судейский слой давал ложные «единогласия»).
### 1.5. Гигиена (D30.10)
Каждый платный вызов персистит usage+cost в `diag/arms13/costs.jsonl`; финальная сумма — в отчёте. Хард-стоп на 80% капа ($4). Пре-регистрация коммитится ДО первого платного вызова. Аномалии провайдеров → вендор-дока, не гадание.
### 1.6. Deliverable
Таблица армов (стиль/верность со спанами/эхо-rate/цена за главу) → рекомендация переводчика для пере-прогона 25 глав (+ цена/25 глав) → финальный сид v2 со статусами после подписи владельца. **Перенос победителя на 18+ регистры требует ОТДЕЛЬНОЙ пробы** (D22/exp10-11): этот срез — ранние SFW-главы, канал-B ToS не активен здесь.
### 1.7. Финализация сида v2 (D30.5, вторая половина сессии)
- Спорные термины → `status:draft` (修炼/культивация, 人祖/Первопредок, род «гу», 花酒行者; тихие промоушены draft→approved откатить) → таблица на подпись владельцу → статусы после подписи.
- Влить обогащение мн.ч. (D24.4: 元石/凡人/蛊师-класс, все счётные) в ту же v2-итерацию.
- Дисклоузер-аддендум в exp12-док §4.2 (провенанс v2-сида и делегации — дефект провенанса из ревью D30.5).
---
## 2. Результаты
_(заполняется после исполнения; ничего выше не редактируется — пре-рег заморожен)_