textmachine/docs/experiments/01-token-calibration.md
Claude (backend session) 9bb00d49f2 Initial commit: documentation, eval polygon, backend step 0 verdict
TextMachine project repository (AI translation of literary books).
Includes: v2 architecture decisions, MVP plan, research 01-12,
polygon experiments 01-03, backend-session revalidation verdict
(03-implementation-notes.md).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-04 06:50:59 +03:00

112 lines
14 KiB
Markdown
Raw Permalink 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.

# Эксперимент 01. Токен-калибровка на реальных текстах
Дата прогона: 2026-07-04. Статус: **завершён** (public-domain калибровка; уточнение на реальных вебновеллах — по мере поступления файлов владельца).
## TL;DR
1. **Китайский токенизируется дороже, чем заложено в cost-model**: 0.860.93 ток./иероглиф у DeepSeek/Qwen/GLM (закладывали 0.650.75), 1.07 у GPT-o200k. B (токены исходника) 500-главной вебновеллы — не 1.1M, а **~1.29M (DeepSeek) / 1.61M (OpenAI)**, +17…+45%.
2. **Допущение «объём перевода ≈ объёму исходника ±20%» сломано для zh→ru**: русский перевод «А-Кью» весит **1.88× оригинала в токенах DeepSeek** (1.64× GLM, 1.34× o200k). en→ru: 1.41.53×; ja→ru: 1.01.29×. Выходная статья пайплайна для zh→ru почти вдвое больше модельной.
3. Пересчёт COGS: дешёвый контур подорожал, но остаётся копеечным (**стандарт-вебновелла DeepSeek: $1.85 → ~$2.6**); главный удар — по премиум-миксу вебновеллы: **~$28 → ~$49** ($26 с batch). Под якорем GlobeScribe $100 всё ещё помещаемся, но буфер сжался вдвое.
4. Приятные новости: **японский дешевле допущений** (0.810.95 ток./знак против 1.01.2 — том ранобэ ~113k токенов вместо 150k), премиум-микс ранобэ даже подешевел (~$3.1 против ~$3.9). Английский — в рамках модели.
5. Нюанс выбора моделей: у **Qwen-Flash дорогой ru-выход** ($0.40/M × самый неэффективный ru-токенизатор 2.39 ток./слово) — для zh→ru он теперь дороже DeepSeek ($2.61 против $2.57 за стандарт-вебновеллу против прежних $1.65 vs $1.85). **GLM-4.6 — самый ru-эффективный из китайских токенизаторов** (2.03 ток./слово, на 13% лучше DeepSeek) — плюс к роли редактора (Р4).
## Методика
- **Корпус**: 16 файлов художественной прозы (см. `eval/data/samples/manifest.json`): zh — Лу Синь («阿Q正传» полностью, «祝福»; упрощённые иероглифы через OpenCC t2s, как в вебновеллах), ja — Акутагава, Дадзай, Сосэки (Aozora Bunko, фуригана вычищена), en — Burroughs, Wells, Howard (Project Gutenberg, жанровая проза), ru — Чехов, Гоголь, Куприн + три параллельных перевода: «А-Кью» (пер. Рогова, zh→ru), «Машина времени» гл. III (пер. Морозова 1909, en→ru), «Нос» Акутагавы (пер. А. Стругацкого, ja→ru). Соответствие параллельных пар проверено по границам глав/зачинам/концовкам. Лицензии: оригиналы PD; переводы Рогова и Стругацкого под копирайтом — используются только для приватной калибровки, в git не попадают (`eval/data/` вне репо-артефактов).
- **Токенизаторы** (скачаны с HuggingFace 2026-07-04): `deepseek-ai/DeepSeek-V3.2-Exp`, `Qwen/Qwen3-8B`, `Qwen/Qwen2.5-7B-Instruct`, `zai-org/GLM-4.6` (tokenizer.json, replaceable в `eval/tokenizers/`); tiktoken 0.13.0: `o200k_base` (GPT-4o/5), `cl100k_base` (GPT-4, для сравнения с литературными данными). **Оговорка**: публичного токенизатора DeepSeek V4 на HF нет (репо закрыто/отсутствует) — использован V3.2; токенизатор Claude/Gemini/Grok не публикуется — прокси o200k, уточнение через count_tokens API при появлении ключей.
- **Скрипт**: `eval/token_calc.py` (venv `eval/.venv`); сырые числа — `eval/data/token_calc_results.json`. Qwen3 и Qwen2.5 дали идентичные значения (один словарь 151k BBPE) — в таблицах объединены.
## Результаты
### Токены на опорную единицу (агрегат по корпусу, взвешенный по объёму)
| Язык | Единица | o200k (GPT-4o/5) | cl100k (GPT-4) | DeepSeek V3.2 | Qwen3/2.5 | GLM-4.6 |
|---|---|---|---|---|---|---|
| zh | иероглиф | 1.072 | 1.553 | **0.859** | 0.927 | 0.897 |
| ja | знак (кандзи+кана) | 0.947 | 1.251 | 0.835 | **0.807** | 0.872 |
| en | слово | **1.241** | 1.250 | 1.251 | 1.251 | 1.250 |
| ru | слово | **1.992** | 3.210 | 2.252 | 2.394 | 2.029 |
Разброс по файлам внутри языка — ±58% (стиль имеет значение, но не порядково).
### Символов (без пробелов) на токен
| Язык | o200k | cl100k | DeepSeek | Qwen | GLM-4.6 |
|---|---|---|---|---|---|
| zh | 1.11 | 0.76 | **1.38** | 1.28 | 1.32 |
| ja | 1.16 | 0.87 | 1.31 | **1.36** | 1.25 |
| en | 3.67 | 3.64 | 3.64 | 3.64 | 3.64 |
| ru | **2.72** | 1.69 | 2.40 | 2.26 | 2.67 |
### Параллельные пары: токены перевода / токены оригинала (r)
| Пара | Объект | o200k | cl100k | DeepSeek | Qwen | GLM-4.6 |
|---|---|---|---|---|---|---|
| zh→ru | «А-Кью» целиком (21.4k зн. → 69.7k зн. ru) | 1.34 | 1.50 | **1.88** | 1.86 | 1.64 |
| en→ru | «Машина времени» гл. III | 1.40 | 2.32 | **1.53** | 1.68 | 1.40 |
| ja→ru | «Нос» Акутагавы | 1.01 | 1.17 | **1.29** | 1.43 | 1.13 |
Посимвольная сверка подтверждает арифметику: 1 иероглиф → ~3.26 ru-символов; 3.26 × (1.365 zh-симв./ток ÷ 2.36 ru-симв./ток) = 1.885 ✓.
## Расхождение №1: цена иероглифа (>15%)
`09-cost-model.md` §1.1 закладывал **0.65 (DeepSeek) / 0.75 (GPT-4o) ток./иероглиф** по внешним бенчмаркам. Замер на литературной прозе (упрощённые иероглифы): **DeepSeek 0.86 (+32%), Qwen 0.93, GLM 0.90, o200k 1.07 (+43%)**. Причина, вероятно, в составе внешних замеров (новостной/веб-текст с иной долей пунктуации и частотных клише). Следствие: B вебновеллы 500 глав (1.5M иероглифов) = **1.29M токенов DeepSeek / 1.39M Qwen / 1.61M o200k** вместо модельных 1.01.15M.
## Расхождение №2: объём русского выхода (>15%, критично для zh→ru)
Модель считала «объём перевода в токенах ≈ объёму исходника (±20%)» и все output-множители — от B. Фактически перевод на русский **систематически тяжелее оригинала в токенах**, для zh→ru — почти вдвое (r=1.88 DeepSeek). Рекомендуемые коэффициенты r (перевод/оригинал, в токенах одного токенизатора):
| Пара | r (внутрисемейный токенизатор) | r (o200k-прокси для Claude/GPT) |
|---|---|---|
| zh→ru | **1.651.90** | 1.35 |
| en→ru | 1.501.70 | 1.40 |
| ja→ru | 1.151.30 | 1.00 |
Русская сторона также дороже допущений per-word: 2.252.39 ток./слово у DeepSeek/Qwen (закладывали 1.62.0); в норме только o200k (1.99) и GLM (2.03).
## Расхождение №3 (в плюс): японский дешевле
Для смешанного литературного ja закладывали 1.01.2 ток./знак; фактически **0.810.95**. Том ранобэ 135k знаков = ~113k токенов DeepSeek (модель брала 150k, 25%).
## Пересчёт COGS
Множители пересчитаны покомпонентно через r (стандарт-сценарий: переводчик 2.0 in / r out; редактор (1.5+r) in / r out; судья на 20% выборки 0.2(1+2r) in / 0.1r out):
**M_in(r) = 3.7 + 1.4r; M_out(r) = 2.1r** — при r=1 даёт 5.1/2.1, что чуть оптимистичнее модельных 6/3 (модель включала запас; сравнение ниже — против её же табличных цифр).
| Кейс | Было (09-cost-model) | Стало (калибровка) | Δ |
|---|---|---|---|
| Вебновелла 500 гл. zh→ru, DeepSeek V4 Flash, стандарт | $1.85 | **$2.57** (B=1.29M, r=1.88) | +39% |
| — то же, Qwen-Flash | $1.65 | **$2.61** (B=1.39M, r=1.86; дорогой ru-выход $0.40/M) | +58% |
| — то же, GPT-5 nano | $1.65 | **$2.26** (B=1.61M, r=1.34) | +37% |
| Премиум-микс вебновеллы (стандарт DeepSeek + Sonnet-финал) | ≈$28 | **≈$49** (Sonnet-проход: in (1+r+0.5)·B_o200k=4.57M×$3 + out 1.34·B_o200k=2.16M×$15 = $46.2) | +75% |
| — с Batch 50% на Sonnet | ≈$15 | **≈$26** | +73% |
| Том ранобэ ja→ru, DeepSeek, стандарт | $0.25 | **$0.17** (B=113k, r=1.29) | 32% |
| Премиум-микс ранобэ | ≈$3.9 | **≈$3.1** (Sonnet-проход $2.9) | 20% |
| Англ. роман en→ru, DeepSeek, стандарт | $0.23 | **$0.22** (B=131k, r=1.53) | ≈0 |
Выводы для архитектуры (Р5):
1. **Экономика жива**, но буфер премиум-микса вебновеллы под якорем $100 сжался с ~3.5× до ~2× (без batch). Правило «дорогая модель — точечно, по бюджету» становится жёстче: полный Sonnet-финал 500-главной вебновеллы сам по себе — $46 (или $23 batch / $31 промо-тарифом Sonnet 5).
2. **«Бюджет премиум-токенов ≤2×B»** (Р5) для zh→ru пересчитывать с учётом r: один полный финальный проход уже расходует ~2.8×B o200k-input + 1.34×B output — формулировку бюджета лучше привязать к «×B_o200k input-эквивалентов» с r из таблицы выше.
3. **Выбор дешёвой модели для zh→ru сместился**: Qwen-Flash потерял преимущество (дорогой output на неэффективном ru-словаре), DeepSeek остаётся оптимумом с учётом cache-hit $0.0028; GPT-5 nano конкурентоспособен, GLM интересен для output-тяжёлых ролей (редактор).
4. Cache-hit экономика и batch-скидки не зависят от калибровки — рычаги из Р5 в силе.
## Оговорка: контуры «чей ключ» (v2 архитектуры)
Все цифры пересчёта выше — для **контура прямых ключей** (Р5 v2). Для RU-агрегаторского контура (ProxyAPI/VseGPT/AITunnel) поверх них действуют наценки: дешёвые модели ×1.21.3, флагманы ×26 — премиум-микс с Sonnet там экономически недоступен независимо от калибровки, а проброс cache-hit тарифов агрегаторами не подтверждён (эмпирическая проверка — бэклог полигона: два одинаковых запроса подряд, сравнить usage/стоимость). Калибровка токенизации от контура не зависит (токенизатор тот же), меняются только $-множители.
## Ограничения
- Корпус — классика начала XX века, не вебновеллы: проза Лу Синя плотнее вебновелльной, перевод Рогова — полный литературный (без сокращений). На реальных главах вебновелл цена иероглифа может быть чуть ниже, r — чуть ниже. **Нужна довалидация на 35 главах реальных вебновелл с ru-переводами** (файлы владельца → `eval/data/samples/`, скрипт пересчитает автоматически).
- По одной параллельной паре на направление; перевод Морозова (1909) местами вольный. Порядок величин надёжен (подтверждён посимвольной арифметикой), второй знак — нет.
- Токенизаторы Claude/Gemini/Grok закрыты; o200k-прокси для Sonnet-прохода может недооценивать стоимость (исторически токенизатор Anthropic на кириллице до +1520% к o200k). Уточнить через `count_tokens` при появлении ключа — тогда премиум-цифры могут ещё подрасти.
- DeepSeek V4: замер на словаре V3.2 (V4-токенизатор не опубликован); если V4 сменил словарь — пересчитать (скрипт готов).
## Воспроизведение
```bash
eval/.venv/bin/python eval/token_calc.py # таблицы в stdout + JSON
# добавить свои тексты: файл в eval/data/samples/<lang>/, при наличии перевода —
# запись с parallel_of в eval/data/samples/manifest.json, и перезапустить
```