9.3 KiB
Эксперимент 06. Экстракция терминов: локаль vs облако (write-path банка памяти)
Дата: 2026-07-04. Закрывает дыру G1 реестра рисков (architecture/06: «качество популяции глоссария не измерено»). Скрипт: eval/extract_bench.py; сырьё: eval/data/extract_bench/results.json.
Зачем. Горячий путь банка памяти модель НЕ использует (детерминированный матч). Локаль касается банка в 2 точках: эмбеддинги (exp там же → bge-m3) и экстракция кандидатов в глоссарий из сырого текста (bootstrap write-path). Полигон exp03 мерил локаль как ПЕРЕВОДЧИКА (вердикт: не годится). Экстракция — другая, более лёгкая задача; здесь меряем её отдельно и верифицированно.
Метод (в ответ на «сделай нормально, не обрывочно»):
- 13 моделей: 6 локальных (
qwen3-abliterated:8b/9b,qwen3:8b,qwen3-vojo,ruadapt-qwen3:8b,qwen3-abliterated:30b-a3b) + 7 облачных (deepseek-v4-flash,grok-4.20-non-reasoning,glm-4.5-air,kimi-k2.6,gemini-2.5-flash,gpt-5-mini, +deepseek-nothinkкак дешёвый вариант без reasoning). - 12 кейсов, 3 языка, эдж-кейсы: zh (имена+реалии 送灶/祝福/秀才, алиас 王癞胡=王胡), ja (羅生門/朱雀大路, западные имена через катакану メロス→Мелос / セリヌンティウス→Селинунтий, буддийское 禅智内供 по эталону Стругацкого), en (Джон Картер/Конан/Филби — эдж на транскрипцию). Gold — сущности + канонический RU (accept-регэксп: Палладий/Поливанов/устоявшиеся).
- Запросы — через рабочий
refusal_bench.call_provider+ каноническийproviders.json(квирки уже верны: deepseek thinking-ON+max_tokens 8000— иначе reasoning съедает бюджет иcontentпуст; kimi temp=1/24k; gpt-5-minimax_completion_tokens+no-temp; gemini/glm thinking-off). Управление thinking у DeepSeek —extra_body={"thinking":{"type":"..."}}(офиц. доки, см.00-provider-quirks). - Каждый ответ верифицируется на здоровость (пустой/echo/http/unparseable → ретрай с бо́льшим бюджетом → явный
HEALTH=failed, НЕ засчитывается как recall 0 — урок прошлого обрывочного прогона). Метрики детерминированные, без судьи.
Результаты
Агрегат по health==ok (recall = спот сущностей; render = доля найденных с каноническим RU; halluc = извлечённое, чего нет в тексте):
| Модель | тип | recall | render | halluc | n | сек | ok/all |
|---|---|---|---|---|---|---|---|
| qwen3-abliterated:8b | local | 0.98 | 0.48 | 0.0 | 3.9 | 5.1 | 12/12 |
| qwen3.5-abliterated:9b | local | 1.00 | 0.54 | 0.0 | 3.2 | 6.6 | 12/12 |
| qwen3:8b | local | 0.98 | 0.49 | 0.0 | 3.8 | 4.9 | 12/12 |
| qwen3-vojo | local | 0.98 | 0.51 | 0.0 | 3.4 | 3.4 | 12/12 |
| qwen3-abliterated:30b-a3b | local | 0.91 | 0.55 | 0.0 | 3.1 | 13.5 | 12/12 |
| ruadapt-qwen3:8b | local | 1.00 | 0.72 | 0.07 | 3.6 | 3.7 | 5/12 |
| deepseek-v4-flash | cloud | 0.97 | 0.85 | 0.0 | 3.3 | 8.9 | 12/12 |
| grok-4.20-non-reasoning | cloud | 0.98 | 0.69 | 0.0 | 3.2 | 1.1 | 12/12 |
| glm-4.5-air | cloud | 0.98 | 0.68 | 0.0 | 3.2 | 1.9 | 12/12 |
| kimi-k2.6 | cloud | 1.00 | 0.96 | 0.0 | 3.5 | 38.2 | 12/12 |
| gemini-2.5-flash | cloud | 0.97 | 0.92 | 0.0 | 3.4 | 1.4 | 12/12 |
| gpt-5-mini | cloud | 0.95 | 0.67 | 0.0 | 4.4 | 2.5 | 12/12 |
| deepseek-nothink | cloud | 0.98 | 0.58 | 0.0 | 3.5 | 1.6 | 12/12 |
Ключевая разбивка — render по языку (пул из 5 локальных dense/MoE vs топ-3 облака deepseek/kimi/gemini):
| Группа | zh | ja | en |
|---|---|---|---|
| локаль (пул) | 0.26 | 0.53 | 0.82 |
| облако-топ | 0.75 | 0.98 | 1.00 |
Recall по языку у всех ~0.95–1.0 (спот не зависит от языка).
Выводы (верифицированные)
- СПОТ сущностей — решённая задача для ВСЕХ, локаль включительно (recall 0.95–1.0 на zh/ja/en). Кандидат-споттинг write-path можно гнать на дешёвой локальной 8b. Даже 0 галлюцинаций (кроме ruadapt).
- РЕНДЕР канонического RU — вот где разрыв, и он с крутым ЯЗЫКОВЫМ градиентом у локали: en 0.82 (западные имена локаль транскрибирует нормально — Джон Картер/Конан), ja 0.53 (средне), zh 0.26 (локаль проваливается). Облако-топ сильно везде (zh 0.75, ja 0.98, en 1.0).
- Провалы локали на zh — это прямая нонконформность стандарту Палладия (реестр B6, эмпирически подтверждён): 阿Q→«Ах-Чу», 赵太爷→«Тяо Тай-Я», 祥林嫂→«Сяньлинсяо», 送灶→«Сув-цзя», 祝福→«Бэ-цзю», 羅生門→«Ро-сёмон», 朱雀大路→«Чжу-сюкэ-дайро» — фонетический мусор вместо Палладий-канона («А-кью», «Чжао»). Локаль не знает системы транскрипции zh→ru; это не «плохой перевод», а систематически неверная по стандарту транслитерация.
- Бо́льшая локаль НЕ помогает: 30b-a3b render 0.55 ≈ 8b (0.48–0.55), но в 3–4× медленнее (13.5с vs 3–5с) и recall даже ниже (0.91). Для спота брать дешёвую 8b, не 30b.
- deepseek: thinking ПОМОГАЕТ рендеру (0.85 с thinking vs 0.58 без) — reasoning вытаскивает канон реалий (согласуется с exp03). Но thinking-off deepseek на экстракции здоров (12/12, echo бьёт перевод, не JSON-вывод) — просто рендерит хуже (≈уровень локали).
- Лучший рендер-value — gemini-2.5-flash (render 0.92 за 1.4с); kimi лучший по качеству (0.96), но 38с/дорого; deepseek-think 0.85/8.9с. grok/glm/gpt-5-mini слабее по рендеру (0.67–0.69).
- ruadapt-qwen3 — ненадёжен (5/12 health, единственный с галлюцинациями) — как и предупреждал exp03 «понимание разрушено ru-адаптацией».
Следствие для дизайна (write-path, уточняет Р4/G1)
Экстракцию разбить на две подзадачи, и разбивка язык-зависима:
- (а) СПОТ кандидатов-спанов — локальная 8b (recall ~0.98 на всех языках, дёшево/быстро, 0 галлюцинаций). Это дешёвый пре-пасс NER.
- (б) РЕНДЕР dst — зависит от языка источника: для zh — обязательно облако/человек + детерминированная таблица Палладия (локаль даёт мусор 0.26; даже облако лишь 0.75 — часть zh→ru реалий не имеет единого канона, нужен словарь B6); для ja — облако (локаль 0.53); для en/западных имён — локаль потянет (0.82), облако для надёжности. Рендер-модель по value — gemini-2.5-flash.
- Промоушен
auto→approved— с человеком/судьёй (G1), особенно на zh, где даже сильная модель не гарантирует Палладий.
Ограничения
12 кейсов (умеренно, не сотни), 1 прогон на ячейку (temp низкая), gold-render = мой набор accept-регэкспов канона (для спорных реалий — 送灶/洛中 — канон нестрогий, render занижен честно). Render — объективно более трудная для авто-оценки ось, чем recall; человеческая сверка на выборке усилит. Но языковой град**иент (zh≪ja≪en у локали) устойчив и с этим N.
Провенанс: eval/extract_bench.py (переиспользует refusal_bench.call_provider + providers.json), results.json с per-кейс records. Реальные PD-тексты eval/data/samples.