ТРИЗ против неоднозначности: почему знак «+» — это не просто сложение



This content originally appeared on DEV Community and was authored by Alexey Ivanensky

Или: как алгебраические структуры разрешают физические противоречия в обработке текста

Введение: проблема интерпретации

Когда мы говорим: «Дай быстрый обзор + глубокий анализ», система должна выбрать между двумя противоречивыми стратегиями:

  1. Одновременность: показать оба результата параллельно (быстро, но сложно координировать)
  2. Последовательность: сначала обзор, потом анализ (медленнее, но логичнее)

Какую выбрать? Классический подход «угадай по контексту» неустойчив. ТРИЗ предлагает систематическое решение через анализ алгебраических структур.

Часть 1: Неоднозначность знака «+» в математике и информатике

1.1. Семь разных значений плюса

Один символ — множество смыслов:

Контекст Операция Коммутативность Ассоциативность Порядок важен?
Арифметика (a + b = b + a) ✓ ✓ ✗
Множества (A \cup B = B \cup A) ✓ ✓ ✗
Логика (p \vee q = q \vee p) ✓ ✓ ✗
Строки "ab" ≠ "ba" ✗ ✓ ✓
Композиция функций (f \circ g \neq g \circ f) ✗ ✓ ✓
Процессы step_1 → step_2 ≠ step_2 → step_1 ✗ ✓ ✓
Декартово произведение ((a, b) \neq (b, a)) ✗ ✗ ✓

Вывод: коммутативность не универсальна. В половине случаев порядок критичен.

1.2. Почему я ошибся в первый раз

Моя ошибка была классической: я применил первое найденное правило:

"+" → сложение → коммутативно → порядок не важен

Но правило зависит от типа операндов, а не от символа:

ПРАВИЛЬНАЯ логика:
  TYPE(операнды) → выбрать структуру → применить свойства

МОЯ ошибка:
  СИМВОЛ → предположить структуру → ошибка типизации

Это классическое смещение P4 (pattern→taxonomy→counter в ТРИЗ).

Часть 2: ТРИЗ-подход к разрешению противоречия

2.1. Выявление физического противоречия (P7)

Фраза «быстрый обзор + глубокий анализ» содержит противоречие:

Требование A: быстро   (минимизировать время)
Требование B: глубоко  (максимизировать полноту)

Физическое противоречие: A ∧ ¬A
  → нужно быть быстрым И полным одновременно

Это не семантическое противоречие (как неоднозначность слова). Это физическое противоречие в смысле ТРИЗ:

Один параметр должен находиться в двух противоположных состояниях одновременно.

2.2. Четыре разделения ТРИЗ (P8)

ТРИЗ предлагает четыре способа разделения физических противоречий. Для нашего случая подходят все четыре:

1️⃣ Разделение по ВРЕМЕНИ

Противоречие: быстро ∧ глубоко
Решение: фазировать процесс
  Фаза 1 (0-2 сек): быстрый обзор
  Фаза 2 (2-10 сек): глубокий анализ
  → Каждая фаза оптимальна для своего требования

Математическое описание:

Результат := обзор(t₁) ∘ анализ(t₂)
где ∘ — композиция операций (некоммутативна!)

2️⃣ Разделение по ЧАСТИ/ЦЕЛОМУ

Противоречие: система должна быть быстрой И глубокой
Решение: разные части для разных требований
  Часть 1: Primary ответ (быстрый, 80% время)
  Часть 2: Alternatives (глубокий, 20% время)
  → Дополнение результата без замены

Структура:

Результат := Primary(fast) ⊕ Alternatives(deep)
где ⊕ — прямая сумма в абелевой группе

3️⃣ Разделение по УСЛОВИЮ

Противоречие: неясно, что нужно
Решение: адаптивная стратегия
  IF контекст = "срочность" THEN быстро
  IF контекст = "исследование" THEN глубоко
  → Условное выполнение

4️⃣ Разделение по УРОВНЮ СИСТЕМЫ

Противоречие: какой уровень отвечает за быстроту?
Решение: распределить по уровням
  Микро (инструменты): search_web (параллельно)
  Мезо (процесс): фазирование (асинхронно)
  Макро (интеграция): кэширование (ускорение)

2.3. Почему разделение по времени — оптимально

Среди четырёх разделений, разделение по времени минимизирует идеальность (в смысле ТРИЗ):

Идеальность F = Функциональность / (Стоимость + Вред)

Для нашего случая:

Стратегия Функция Стоимость Вред Идеальность
Одновременно 2.0 2.0 (сложность) 1.0 (конфликт) 0.67
Временное разделение 2.0 1.0 (фазирование) 0.0 2.0 ✓
Пространственное 2.0 1.5 (модули) 0.5 (зависимости) 1.0
Условное 2.0 1.2 (логика) 0.3 (неопределённость) 1.4

Вывод: временное разделение — оптимально.

Часть 3: Алгебраическая классификация

3.1. Теория множеств: где живут разные плюсы

В теории множеств существует три основные операции:

1. ОБЪЕДИНЕНИЕ (∪) — коммутативно
   A ∪ B = B ∪ A
   Смысл: "или A, или B, или оба"
   Пример: {быстрый, глубокий} = {глубокий, быстрый}

2. КОМПОЗИЦИЯ (∘) — НЕ коммутативно
   f ∘ g ≠ g ∘ f (в общем случае)
   Смысл: "сначала g, потом f"
   Пример: обзор ∘ анализ ≠ анализ ∘ обзор

3. КОНКАТЕНАЦИЯ (⊕) — НЕ коммутативно
   s₁ ⊕ s₂ ≠ s₂ ⊕ s₁
   Смысл: "приписать s₂ к s₁"
   Пример: "Primary" ⊕ "Alternatives" ≠ "Alternatives" ⊕ "Primary"

3.2. Как выбрать правильную операцию?

Используем типизацию (P3_ALGO в ТРИЗ):

TYPE_OF(операнды) → STRUCTURE → PROPERTIES → STRATEGY

Пример для "обзор + анализ":

  ├─ Если TYPE = МНОЖЕСТВО ТРЕБОВАНИЙ
  │  └─ STRUCTURE: объединение ∪
  │     СВОЙСТВА: коммутативно, идемпотентно
  │     СТРАТЕГИЯ: параллель/асинхрон
  │
  └─ Если TYPE = ПРОЦЕСС
     └─ STRUCTURE: композиция ∘
        СВОЙСТВА: некоммутативно, ассоциативно
        СТРАТЕГИЯ: последовательность (DAG)

Ключ — КОНТЕКСТ! Одна фраза, два смысла в зависимости от типизации.

Часть 4: Применение в системах обработки текста и AI

4.1. Проблема в LLM

Современные LLM обучены на коммутативных структурах (математика, логика):

Данные обучения:
  • "2 + 3 = 5" (коммутативно)
  • "правда ИЛИ ложь" (коммутативно)
  • "множество {a, b}" (коммутативно)

Но не достаточно на некоммутативных:

Недостаток:
  • "обзор → анализ" (процессный порядок)
  • "поиск; обработка; вывод" (композиция операций)
  • "Primary + Alternatives" (формат вывода)

Результат: модель применяет коммутативное правило по умолчанию, даже когда контекст требует некоммутативности.

4.2. Решение: семантическая типизация перед интерпретацией

ПРОТОКОЛ (исправленный):

  1. ВЫЯВИТЬ тип операнда (требование vs процесс vs формат)
  2. ВЫБРАТЬ структуру (∪ vs ∘ vs ⊕)
  3. ПРОВЕРИТЬ свойства (коммутативность, ассоциативность)
  4. ПРИМЕНИТЬ стратегию (параллель vs последовательность)

Псевдокод:


python
def interpret_plus_operator(expr, context):
operand_type = classify(expr) # требование / процесс / формат

  if operand_type == "requirement":
      structure = UNION  # ∪ — коммутативно
      strategy = "parallel"
  elif operand_type == "process":
      structure = COMPOSITION  # ∘ — некоммутативно
      strategy = "sequential_dag"
  elif operand_type == "format":
      structure = CONCATENATION  # ⊕ — некоммутативно
      strategy = "ordered_output"

  return apply_strategy(strategy)

Часть 5: Связь с ТРИЗ-матрицей противоречий

5.1. Как это связано с 40 принципами ТРИЗ?

Противоречие «быстро vs полно» в матрице противоречий ТРИЗ:


Улучшаемый параметр:    Скорость (параметр 9)
Ухудшаемый параметр:    Полнота информации (параметр 27, "Надёжность")

Рекомендованные принципы:

1. Принцип 7 (Вложение): встроить анализ в обзор
2. Принцип 14 (Сфероидальность): переходить от обзора к анализу
3. Принцип 3 (Извлечение): часть ответа иногда достаточна
4. Принцип 25 (Самообслуживание): пользователь выбирает глубину

Но ТРИЗ-матрица статична. Наше решение динамично: мы используем разделения для автоматического выбора.

5.2. 8 Законов эволюции систем

Наше решение также соответствует закону «Увеличение степени идеальности»:


До (конфликт):
  Система: быстро ∨ глубоко (выбирай одно)
  Идеальность: низкая (жертва функцией или скоростью)

После (разделение):
  Система: быстро ∧ глубоко (фазировано)
  Идеальность: высокая (обе функции, без жертв)

Часть 6: Практический пример — реальная система

6.1. Как это реализуется в нашей системе (v27.0)

Архитектура описана в P7_CONTRA (выявление противоречий):


Запрос: "Дай быстрый обзор + глубокий анализ"

├─ P1_GOAL: Измерить прогресс
│  └─ progress = (current - baseline) / (goal - baseline)
│
├─ P3_ALGO: Построить DAG операций
│  ├─ Node 1: search_web (параллельно, 3 источника)
│  ├─ Node 2: execute_python (обработка, 1-2 сек)
│  └─ Node 3: create_chart (визуализация, асинхронно)
│
├─ P7_CONTRA: Выявить противоречие
│  └─ ПРОТИВОРЕЧИЕ найдено: быстро ∧ полно
│
└─ P8_TRIZ: Применить разделение
   └─ Стратегия: временное разделение
      Phase 1 (0-2 сек): Primary ответ (быстро)
      Phase 2 (2-10 сек): Alternatives (полно)
      Phase 3 (async): Visualization (красиво)

6.2. Результат — иерархия ответов


[0-2 сек]  Primary(fast, conf=0.85)
           "Ответ: X с этой уверенностью"

[2-5 сек]  Alternative 1 (deeper, sources=[1,2,3])
           "Альтернатива: Y, потому что..."

[5-10 сек] Alternative 2 (alternative_angle)
           "Ещё точка зрения: Z..."

[async]    Chart / Visualization
           [диаграмма загружается]

Пользователь не ждёт полного анализа, но видит результаты постепенно с повышающейся глубиной.

Часть 7: Проверка через контрпримеры

7.1. Когда противоречие требует другого разделения?

Сценарий 1: анализ не зависит от обзора


Запрос: "Дай обзор рынка + анализ конкурентов"

Выявление: Эти анализы независимы!
  → TYPE = "parallel tasks"
  → STRUCTURE = ∪ (объединение)
  → КОММУТАТИВНО: обзор + анализ = анализ + обзор
  → СТРАТЕГИЯ: параллельно (оба одновременно)

Результат: обзор и анализ запускаются ПАРАЛЛЕЛЬНО

Сценарий 2: анализ зависит от обзора


Запрос: "Дай обзор рынка + детальный анализ рынка"

Выявление: Анализ требует результатов обзора!
  → TYPE = "dependent pipeline"
  → STRUCTURE = ∘ (композиция)
  → НЕ КОММУТАТИВНО: обзор ∘ анализ ≠ анализ ∘ обзор
  → СТРАТЕГИЯ: последовательно (обзор → анализ)

Результат: обзор СНАЧАЛА, потом анализ на его основе

Правило: если данные вытекают из одного в другое — используй композицию (∘). Если независимы — используй объединение (∪).

Часть 8: Выводы и рекомендации

8.1. Ключные выводы

  1. Коммутативность — частный случай, не правило по умолчанию

    • Половина алгебраических структур её не имеют
  2. Контекст определяет алгебру, не наоборот

    • Один символ “+” — множество значений
    • Типизация операндов → выбор структуры
  3. ТРИЗ разделения — универсальный метод

    • Физические противоречия разрешаются через разделение
    • Четыре разделения охватывают все случаи
  4. Временное разделение — оптимально для процессов

    • Идеальность выше, чем при одновременности
    • Асинхронность позволяет показывать результаты по мере готовности

8.2. Рекомендации для AI-систем


DO:
  ✓ Типизировать операнды перед интерпретацией оператора
  ✓ Проверить коммутативность ЯВНО для контекста
  ✓ Применить P7_CONTRA (выявление противоречий)
  ✓ При физ. противоречии → P8_TRIZ (четыре разделения)
  ✓ Выбрать стратегию на основе идеальности

DON'T:
  ✗ Предполагать коммутативность по умолчанию
  ✗ Использовать первую найденную структуру
  ✗ Игнорировать порядок операций
  ✗ Смешивать требования и процессы в один анализ

Заключение: от символа к смыслу

Простой знак «+» раскрывает глубокие вопросы:

  • Что значит этот символ в данном контексте?
  • Какую алгебру он представляет?
  • Какое противоречие скрывается за требованием?
  • Как его разрешить оптимально?

ТРИЗ предоставляет систематический ответ на каждый вопрос. Вместо того, чтобы гадать по контексту, мы типизируем, анализируем структуру, выявляем противоречия и применяем разделения.

Результат: система, которая понимает не просто текст, а смысл — и действует оптимально.

TL;DR: LLM применяют коммутативное правило по умолчанию для «+», но половина контекстов требует некоммутативности. ТРИЗ решает это через выявление физических противоречий и применение четырёх разделений. Результат: более умная интерпретация и оптимальные стратегии.


This content originally appeared on DEV Community and was authored by Alexey Ivanensky