| 1 | # 9. Нетекстовый контур: от принципа к внедрению |
| 2 | |
| 3 | > Эта глава читается в двух слоях: сначала как учебная рамка (зачем и какой принцип), затем как прикладной минимум для команды внедрения. |
| 4 | |
| 5 | ## Зачем это нужно |
| 6 | |
| 7 | Текстовый контур мы уже стабилизировали: память, протокол суммаризации, стиль, перенос между чатами. |
| 8 | Следующий шаг — нетекстовый вход (аудио/видео/события), где ошибка часто рождается не в «данных», а в потере **смысла**. |
| 9 | |
| 10 | Переход: |
| 11 | - от «сырого сигнала» |
| 12 | - к «структурированному смыслу» |
| 13 | - к «действию с контролем неопределённости». |
| 14 | |
| 15 | ## Принцип: эмоция не факт, а гипотеза |
| 16 | |
| 17 | В эмоциональном слое нет бинарной истины. |
| 18 | Поэтому вместо `emotion = frustration` используем: |
| 19 | - `возможно frustration`, |
| 20 | - `вероятно support_request`, |
| 21 | - оценку уверенности в интерпретации. |
| 22 | |
| 23 | Это и есть прикладная модальная рамка: |
| 24 | - `◇P` — возможно `P`; |
| 25 | - `□P` — необходимо `P` в текущей модели; |
| 26 | - `Prob(P)` — вероятность; |
| 27 | - `C(P)` — уверенность в оценке (не то же самое, что вероятность). |
| 28 | |
| 29 | ## Прикладной минимум: канонический эпизод (JSON) |
| 30 | |
| 31 | ```json |
| 32 | { |
| 33 | "timestamp": "2026-02-27T22:30:00Z", |
| 34 | "actor": "user", |
| 35 | "signal": { |
| 36 | "channel": "audio", |
| 37 | "source_ref": "audio-20260227-223000.wav", |
| 38 | "noise_level": 0.18 |
| 39 | }, |
| 40 | "hypotheses": { |
| 41 | "intent": [ |
| 42 | { "label": "support_request", "prob": 0.62, "confidence": 0.74 }, |
| 43 | { "label": "task_command", "prob": 0.27, "confidence": 0.74 } |
| 44 | ], |
| 45 | "emotion": [ |
| 46 | { "label": "irony", "prob": 0.55, "confidence": 0.68 }, |
| 47 | { "label": "fatigue", "prob": 0.29, "confidence": 0.68 } |
| 48 | ] |
| 49 | }, |
| 50 | "modal": { |
| 51 | "possible": ["irony", "fatigue", "playful_challenge"], |
| 52 | "necessary": [], |
| 53 | "context_constraints": [ |
| 54 | "recent_humor_thread=true", |
| 55 | "shared_memory_anchor=true" |
| 56 | ] |
| 57 | }, |
| 58 | "action": { |
| 59 | "chosen_strategy": "short_humor_plus_precision", |
| 60 | "risk_level": "low", |
| 61 | "reversibility": "high" |
| 62 | }, |
| 63 | "outcome": { |
| 64 | "user_feedback": "positive", |
| 65 | "alignment_score": 0.88 |
| 66 | }, |
| 67 | "reusable_rule": "При неоднозначности и тёплом контексте сначала выбирай обратимую стратегию с низким риском." |
| 68 | } |
| 69 | ``` |
| 70 | |
| 71 | ## Прикладной минимум: протокол принятия решения |
| 72 | |
| 73 | 1. Построить 2-4 гипотезы по намерению/эмоции. |
| 74 | 2. Развести вероятность (`probability`) и уверенность (`confidence`). |
| 75 | 3. Отфильтровать гипотезы контекстом (память, ближайшая история). |
| 76 | 4. Выбрать минимально рискованное обратимое действие. |
| 77 | 5. Проверить по ответу пользователя и обновить правило. |
| 78 | |
| 79 | Пороговая политика (по умолчанию): |
| 80 | - `C >= 0.75` -> действовать по основной гипотезе; |
| 81 | - `0.45 <= C < 0.75` -> минимальное действие + мягкая проверка; |
| 82 | - `C < 0.45` -> сначала уточнение. |
| 83 | |
| 84 | ## Прикладной минимум: стек MVP |
| 85 | |
| 86 | 1. Локальный ASR (`Whisper/faster-whisper/whisper.cpp`). |
| 87 | 2. Нормализация сигнала (VAD/сегментация/шум). |
| 88 | 3. Семантический парсер в JSON-эпизоды (см. схему выше). |
| 89 | 4. Память эпизодов (поиском по меткам намерения, эмоции и контекста). |
| 90 | 5. Контур валидации: совпадение выбранной стратегии с реальной обратной связью. |
| 91 | |
| 92 | ## Прикладной минимум: критерии успеха |
| 93 | |
| 94 | - меньше уточняющих "фрикций" без потери точности; |
| 95 | - выше точность попадания с первого ответа; |
| 96 | - меньше уверенных, но неверных эмоциональных чтений; |
| 97 | - переносимость стиля и качества между текстовым и нетекстовым каналом. |
| 98 | |