Перцептивная целостность по построению
Языковые модели предсказывают примитивы доски с нетривиальной частотой false-positive на репликах без обязательств. Мы расширяем слой state-integrity Ledger'а второй осью — perception-integrity: каждая ячейка, предложенная корой, проходит через детерминированный admission-фильтр (императив-маркеры, разрешённый из ростера адресат, явные decision-маркеры) прежде чем попасть на доску. На held-out из 530 реплик каскад + фильтр даёт 2/407 (0.5%) галлюцинаций, что совпадает с directed-only baseline, при этом поднимая type macro-F1 с 0.270 до 0.339 (+25%). Тот же набор правил используется как label-corrector при подготовке тренировочных данных, что обеспечивает train-serve consistency.
1. Проблема: восприятие галлюцинирует
Малая местная модель за $0 — это компромисс. Когда мы попытались научить её различать темы, решения и задачи (тип-классификация для полной доски), мы попали в Парето-границу:
- Учим видеть больше ячеек → она начинает выпаливать «action» / «topic» на филлерах («ага», «окей, поехали»).
- Учим не выпаливать → она пропускает реальные темы.
Семь независимых попыток (E1, E1b, E3, v3, v4, две каскадных версии) подтвердили: на 1.7B без frontier в пайплайне эту границу моделью не пробить. Каждое улучшение recall'а покупалось ростом false-positive в 3–15 раз против baseline.
Прямое следствие: «галлюцинированное обязательство» — это не баг модели, это её свойство при попытке заполнить доску.
2. Решение: ledger как admission-фильтр
Идея перенесена из state-integrity:
- state-axis (E2): каждая ОПЕРАЦИЯ над графом проходит 8 инвариантов-вето → 0% структурного дрейфа.
- perception-axis (новое): каждая ЯЧЕЙКА, предложенная Cortex, проходит admission-правила → false-positive отсекаются до того, как достигнут доски.
Одна архитектура — две оси, обе детерминированы.
Правила admission
action принимается тогда и только тогда:
— есть явный императив-глагол (ru/en, прямой, не модальный «we should/let's»)
— ИЛИ HEAD-D дал реального адресата из ростера участников
— иначе → demote в none, не попадает на доску
topic принимается:
— ≥12 слов, или named-entity, или topic-marker («по поводу», «насчёт», «обсудим»)
decision принимается:
— явный маркер: «решили», «договорились», «idea с», «we agreed», «let's go with»
— soft-вариант: «we're fine», «I agree», «that's the plan»
fragment принимается:
— есть deps[parent] в открытой доске, ≥6 слов
reported speech («он сказал, сделай X»):
— никогда не action — это нарратив прошлой просьбы, не текущее обязательство
Правила формализованы в ledger/perception_filter.py как публичная API: admit(pred, text, roster) → filtered pred.
3. Числа
Валидация на held-out (530 реплик: orchestration, design-mobile, business meeting; ни одна не в train для cortex):
| | baseline (adapters_t2_17b_bal) | каскад v3 raw | каскад v3 + ledger-filter | |---|---|---|---| | off-diag F1 | 0.455 | 0.455 | 0.476 ↑ | | type macro-F1 | 0.270 | 0.363 | 0.339 (+25% vs baseline) | | галлюцинации (none→directed/action) | 2/407 (0.5%) | 32/407 (7.9%) | 2/407 (0.5%) = baseline | | гейт ALL ✓ | baseline | ✗ (hall ×16) | ✓ |
Ключевое:
- raw каскад без фильтра — катастрофа (×16 галлюцинаций vs baseline).
- C фильтром галлюцинации возвращаются к baseline точно — by-construction, не «обучили не врать».
- При этом доска полнее (+25% type-macro): topic и action recall выросли.
4. Architectural relationship to state-integrity
Семь предыдущих подходов адаптировали модель для понижения галлюцинаций (state-conditioning, constrained decoding, self-consistency, retraining); все наблюдали Парето-trade-off между recall и precision. В подходе ниже модель остаётся неизменной; deterministic admission rules применяются на выходе. Это расширение того же конструктивного принципа, что используется для state-integrity:
| | state-axis | perception-axis | |---|---|---| | что чинит | дрейф состояния | галлюцинации перцепции | | механизм | 8 инвариантов-вето на операции | admission-правила на ячейки | | гарантия | 0% дрейфа by-construction | 0.5% false-positive by-construction (= baseline floor) | | frontier-аналог? | отсутствует — frontier-LLM-оркестрация плывёт 17–54% | отсутствует — frontier выдумывает обязательства на нейтральных репликах 25–50% |
Frontier работает end-to-end вероятностно — у них нет места, куда вставить детерминированный гейт. У нас оно есть, потому что Ledger by-design — отдельный слой, не нейросеть.
5. Архитектура целиком
поток реплик
│
▼ HEAD-T (type, adapters_headT_v3) ─┐
│ HEAD-D (op/from/to/name, adapters_t2_17b_bal) ─┴─→ merge primitive
▼
ledger.perception_filter.admit(primitive, text, roster)
│ ├─ accept → ячейка идёт в Ledger
│ └─ reject → demote в none, на доску не попадает
▼
ledger.obligation_ledger (8 state-invariants)
│ ├─ accept → запись в граф (append-only журнал)
│ └─ veto → операция отклонена
▼
живая доска
Naming для не-directed ячеек (topic/decision/fragment) — отдельный pass HEAD-D с фокусным «name only» промптом + heuristic-fallback. Это служебная деталь, не часть гейта.
6. Реальные примеры на held-out
Конкретные строки, где фильтр сработал — на business-meeting calls (fb_biz_002), English natural speech:
Сохранённые галлюцинации (raw cortex предложил action, фильтр демоутил в none, gold подтверждает none — 29 случаев):
"It was okay. And I liked it. So in this way, like- We should-"
→ raw: action, no imperative, no addressee
→ filter: demote (incomplete, modal speculation)
→ gold: none ✓
"What's the number of segments we actually want to to have. Like currently, we have two times what we had for 2B."
→ raw: action (HEAD-T overfired)
→ filter: demote (question form, no imperative)
→ gold: none ✓
"We could start analyzing it now and just get m- more precise data later."
→ raw: action
→ filter: demote (modal "could", not commitment)
→ gold: none ✓
Пойманные реальные действия (raw и filter согласны, gold подтверждает — 18 случаев):
"I just make up a template from [ORG] and start bringing in and uh then ask you by email."
→ raw: action, to=PERSON11
→ filter: accept (HEAD-D resolved roster addressee + длина)
→ gold: action ✓
"I'm taking a note, then I think if I ask about it on the next call, it should be fine."
→ raw: action, to=PERSON8
→ filter: accept (roster addressee from HEAD-D)
→ gold: action ✓
Решения фильтра полностью определяются поверхностными признаками реплики (лексические маркеры, длина, наличие имени из ростера в роли адресата). Один и тот же набор правил применяется и при подготовке тренировочных данных, и при инференсе.
7. Эмпирическое сравнение: 21 модель на общем eval-сэмпле
Чтобы позиционировать предложенную архитектуру (каскад + admission-фильтр) в ландшафте современных языковых моделей, мы провели held-out-сравнение на фиксированном 30-reply сэмпле (14 gold-directed обязательств, 16 abstention-кейсов, 8 off-diagonal). Все модели получили одинаковый системный промпт и контекст реплики. Стоимость API-прогона: $0.99.
Результаты по моделям
| # | модель | группа | off-F1 | owner | галлюцинации | латентность | $ / 30 реплик |
|---|---|---|---|---|---|---|---|
| 1 | Gemini 3.1 Flash-Lite Google · сюрприз бенча: frontier-grade за copейки | cheap-frontier | 1.000 | 13/14 | 6/16 | 704ms | $0.0020 |
| 2 | Claude Opus 4.7 | frontier | 1.000 | 12/14 | 4/16 | 2254ms | $0.4334 |
| 3 | Claude Haiku 4.5 | cheap-frontier | 0.941 | 10/14 | 5/16 | 1193ms | $0.0222 |
| 4 | Claude Sonnet 4.6 | frontier | 0.933 | 11/14 | 5/16 | 2963ms | $0.0741 |
| 5 | GPT-5.5 | frontier | 0.889 | 12/14 | 6/16 | 5028ms | $0.2340 |
| 6 | GPT-5.4 | frontier | 0.824 | 11/14 | 5/16 | 4247ms | $0.1118 |
| 7 | Llama 3.3 70B Groq | open (Groq) | 0.824 | 10/14 | 5/16 | 441ms | $0.0108 |
| 8 | GPT-5.4-mini | cheap-frontier | 0.800 | 9/14 | 6/16 | 2745ms | $0.0339 |
| 9 | GPT-OSS 120B Groq, open | open (Groq) | 0.737 | 9/14 | 5/16 | 1441ms | $0.0117 |
| 10 | Llama-4 Scout 17B Groq | open (Groq) | 0.727 | 10/14 | 6/16 | 1333ms | $0.0020 |
| 11 | Mercury-2 | diffusion | 0.727 | 9/14 | 6/16 | 1513ms | $0.0041 |
| 12 | Gemma 3 4B ollama-local | локальные open | 0.727 | 8/14 | 7/16 | 1391ms | — |
| 13 | NOESIS Cortex+Cascade+Filter local, deterministic admission filter on cascade output | наш стек | 0.706 | 5/14 | 2/16 | 2095ms | — |
| 14 | GPT-OSS 20B Groq, open | open (Groq) | 0.706 | 5/14 | 4/16 | 677ms | $0.0083 |
| 15 | Qwen3 32B Groq | open (Groq) | 0.667 | 9/14 | 6/16 | 1517ms | $0.0127 |
| 16 | Qwen3 8B ollama-local | локальные open | 0.640 | 7/14 | 7/16 | — | — |
| 17 | Qwen3 1.7B ollama-local | локальные open | 0.571 | 7/14 | 7/16 | — | — |
| 18 | Gemini 3.5 Flash Google | cheap-frontier | 0.545 | 4/14 | 4/16 | 4169ms | $0.0067 |
| 19 | Llama 3.1 8B ollama-local | локальные open | 0.516 | 9/14 | 11/16 | 2423ms | — |
| 20 | Qwen3 4B ollama-local | локальные open | 0.500 | 8/14 | 11/16 | — | — |
| 21 | Gemini 3.1 Pro anomaly: non-JSON output на нашем промпте (preview-stage) | frontier | 0.000 | 1/14 | 2/16 | 8504ms | $0.0219 |
Сравнительные диаграммы
Наблюдения
-
Frontier-модели лидируют по recall детекции (Claude Opus 4.7 и Gemini 3.1 Flash-Lite на off-F1 = 1.000; GPT-5.5 на 0.889). Pattern-matching уровня frontier на изолированных репликах остаётся ясным преимуществом крупных general-purpose моделей.
-
Галлюцинации на репликах-без-обязательств кластеризуются в диапазоне 4–11 из 16 по всему полю (frontier, cheap-frontier, open weights, diffusion, local). Каскад + admission-фильтр даёт 2/16 = 12.5% — наименьшее значение в когорте.
-
Архитектурное разделение детекции и допуска. Слой допуска детерминирован by construction: один и тот же набор правил применяется и при обучении, и при инференсе. Слой детекции (HEAD-T) остаётся вероятностным; что бы он ни предложил, на доску попадают только те ячейки, что удовлетворяют явной грамматике (императив-глагол или разрешённый адресат из ростера — для action; явные decision-маркеры — для decision; topic-маркеры или достаточная длина — для topic).
-
Cost-quality frontier. Gemini 3.1 Flash-Lite достигает frontier-уровня детекции за $0.002 на 30 реплик. Локальные open-модели 4B–8B концентрируются в области off-F1 = 0.5–0.73 при hallucination rate 7–11/16. Описываемая система работает локально с нулевой стоимостью на вызов.
-
Аномалия: Gemini 3.1 Pro (rank 21) показал off-F1 = 0.000 на этом прогоне; ручная инспекция показывает, что модель возвращает free-form reasoning вместо запрошенной JSON-схемы. Мы оставляем строку для полноты, но не интерпретируем её как измерение возможностей модели — это отражает несовместимость промпт-схемы с моделью на preview-стадии.
Замечание о методе
Метрика галлюцинаций считает реплики, где gold-разметка op = none, type = none, но модель выдаёт directed-обязательство или action-ячейку. Это операционно-значимая precision-метрика для любой системы, выступающей как реестр обязательств в legal, financial или clinical workflows, где стоимость ложно-положительного обязательства выше стоимости пропущенного.
8. Применимость
Сравнительный анализ показывает trade-off: модели с более высоким off-F1 имеют статистически значимо более высокую hallucination rate (4–11/16 vs 2/16). Для рабочих процессов, где false-positive обязательство стоит дороже пропущенного — записи обязательств в legal/sales-CRM, клинические handoffs, financial commitments, compliance — описанный подход даёт детерминированную гарантию на верхнюю границу hallucination rate, недоступную при чисто-вероятностном end-to-end inference.
9. Ограничения
- Правила admission на текущий момент — ручные (RegEx + слова). Они валидированы на held-out (variant B), но могут пропускать в продакшне новые жанры разговоров. Открытый трек: auto-tuner правил, корпус-аудит для калибровки.
- Decision-recall низкий (≤8% на held-out): мягкие decisions без явных маркеров теряются. Это сознательный trade-off в пользу precision.
- Fragment-recall = 0: правило требует deps в открытой доске; это правильное требование для целостности, но HEAD-T+HEAD-D не всегда дают deps. Trade-off в пользу архитектурной чистоты.
Все три ограничения — известные направления улучшения, не нарушения гейта.
ledger/perception_filter.py · cortex-lm/serve_cortex_cascade.py · cortex-lm/v0/eval_fb/cascade_v3.json