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>
112 lines
14 KiB
Markdown
112 lines
14 KiB
Markdown
# Эксперимент 01. Токен-калибровка на реальных текстах
|
||
|
||
Дата прогона: 2026-07-04. Статус: **завершён** (public-domain калибровка; уточнение на реальных вебновеллах — по мере поступления файлов владельца).
|
||
|
||
## TL;DR
|
||
|
||
1. **Китайский токенизируется дороже, чем заложено в cost-model**: 0.86–0.93 ток./иероглиф у DeepSeek/Qwen/GLM (закладывали 0.65–0.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.4–1.53×; ja→ru: 1.0–1.29×. Выходная статья пайплайна для zh→ru почти вдвое больше модельной.
|
||
3. Пересчёт COGS: дешёвый контур подорожал, но остаётся копеечным (**стандарт-вебновелла DeepSeek: $1.85 → ~$2.6**); главный удар — по премиум-миксу вебновеллы: **~$28 → ~$49** ($26 с batch). Под якорем GlobeScribe $100 всё ещё помещаемся, но буфер сжался вдвое.
|
||
4. Приятные новости: **японский дешевле допущений** (0.81–0.95 ток./знак против 1.0–1.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), «Машина времени» гл. I–II (пер. Морозова 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 |
|
||
|
||
Разброс по файлам внутри языка — ±5–8% (стиль имеет значение, но не порядково).
|
||
|
||
### Символов (без пробелов) на токен
|
||
|
||
| Язык | 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 | «Машина времени» гл. I–II | 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.0–1.15M.
|
||
|
||
## Расхождение №2: объём русского выхода (>15%, критично для zh→ru)
|
||
|
||
Модель считала «объём перевода в токенах ≈ объёму исходника (±20%)» и все output-множители — от B. Фактически перевод на русский **систематически тяжелее оригинала в токенах**, для zh→ru — почти вдвое (r=1.88 DeepSeek). Рекомендуемые коэффициенты r (перевод/оригинал, в токенах одного токенизатора):
|
||
|
||
| Пара | r (внутрисемейный токенизатор) | r (o200k-прокси для Claude/GPT) |
|
||
|---|---|---|
|
||
| zh→ru | **1.65–1.90** | 1.35 |
|
||
| en→ru | 1.50–1.70 | 1.40 |
|
||
| ja→ru | 1.15–1.30 | 1.00 |
|
||
|
||
Русская сторона также дороже допущений per-word: 2.25–2.39 ток./слово у DeepSeek/Qwen (закладывали 1.6–2.0); в норме только o200k (1.99) и GLM (2.03).
|
||
|
||
## Расхождение №3 (в плюс): японский дешевле
|
||
|
||
Для смешанного литературного ja закладывали 1.0–1.2 ток./знак; фактически **0.81–0.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.2–1.3, флагманы ×2–6 — премиум-микс с Sonnet там экономически недоступен независимо от калибровки, а проброс cache-hit тарифов агрегаторами не подтверждён (эмпирическая проверка — бэклог полигона: два одинаковых запроса подряд, сравнить usage/стоимость). Калибровка токенизации от контура не зависит (токенизатор тот же), меняются только $-множители.
|
||
|
||
## Ограничения
|
||
|
||
- Корпус — классика начала XX века, не вебновеллы: проза Лу Синя плотнее вебновелльной, перевод Рогова — полный литературный (без сокращений). На реальных главах вебновелл цена иероглифа может быть чуть ниже, r — чуть ниже. **Нужна довалидация на 3–5 главах реальных вебновелл с ru-переводами** (файлы владельца → `eval/data/samples/`, скрипт пересчитает автоматически).
|
||
- По одной параллельной паре на направление; перевод Морозова (1909) местами вольный. Порядок величин надёжен (подтверждён посимвольной арифметикой), второй знак — нет.
|
||
- Токенизаторы Claude/Gemini/Grok закрыты; o200k-прокси для Sonnet-прохода может недооценивать стоимость (исторически токенизатор Anthropic на кириллице до +15–20% к 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, и перезапустить
|
||
```
|