Как работает NOUZ
NOUZ читает YAML-блоки заметок, строит направленный ациклический граф, классифицирует контент через эталоны и предлагает связи между ветками. Вы задаёте структуру и принимаете решения; ИИ помогает считать, сравнивать и замечать слабые места графа.
Формула сущности
Каждый узел можно показать компактной формулой:
(дети)[узел]{родители}( ) — потомки. Знаки агрегируются, число перед знаком появляется только если таких знаков больше одного.
[ ] — сам узел: его sign или artifact_sign.
{ } — родители. Формула остаётся компактной даже в обычном тексте.
(2E)[E]{S} — два потомка E, сам узел E, родитель S
(σE)[σE]{E} — квант с artifact_sign σ и доменным знаком E
[β] — артефакт без родителей и детейformat_entity_compact возвращает эту формулу для любой заметки. Это не отдельная логика классификации, а визуальная координата: по ней быстро видно, что лежит ниже узла, какой знак у самого узла и к какой структуре он привязан сверху.
Графовый контекст
NOUZ строит граф сверху вниз: от доменов к артефактам. Граф задаёт явную структуру, а семантический слой добавляет вычисленные признаки: домен, мосты, core_mix и сигналы дрифта.
Через MCP агент может явно запросить место заметки в графе:
- родителей и детей;
- уровень и
sign; - компактную формулу
(дети)[узел]{родители}; core_mix, если включён режим PRIZMA или SLOI.
Так агент работает не только с текстом заметки, но и с её положением в базе. Семантические расчёты идут отдельно: текст сравнивается с эталонами, мосты ищутся по embeddings, а core_mix показывает, как содержание квантов меняет картину снизу вверх.
Level 0 (meta_root)
Якорный узел для всей базы. Задаётся в config.yaml как meta_root: "Моя база". Все L1-ядра могут ссылаться на него, а сам узел исключается из семантических расчётов. В визуализации это центр графа: он держит домены в одной системе, но не влияет на классификацию их содержания.
artifact_sign
Знак, определяемый эвристикой содержимого (логи, чаты, конфиги). Используется для L5, чтобы отделять тип материала от его темы. Для L4 он становится частью составного знака: тип материала + домен.
sign и artifact_sign
У NOUZ два слоя знаков:
| Уровень | Как определяется |
|---|---|
| L1-L3 | Доменный sign по эталонам, если sign не задан вручную |
| L4 Квант | Составной знак: artifact_sign из связанных артефактов + доменный sign по контенту |
| L5 Артефакт | artifact_sign по эвристике содержимого, без доменного sign |
Ручная разметка имеет приоритет. Если sign уже задан в YAML, сервер не переписывает его как “истину”, но может посчитать sign_auto для сравнения.
artifact_sign описывает тип материала: заметка, понятие, референс, лог, новость, гипотеза, спецификация. Для L4 он может сохраняться в YAML как часть составного знака; для L5 хранится в базе и отображается как знак артефакта.
Классификация по эталонам
Домены задаются в config.yaml списком etalons. Инструмент calibrate_cores превращает эти тексты в эталонные векторы и сохраняет их в SQLite.
При классификации сервер:
- Берёт embedding содержимого без HTML-формул.
- Сравнивает его с mean-centered эталонами.
- Считает spread:
max_score - min_score. - Если
spread < sign_spread(0.05) — различие между доменами слишком слабое, и сервер не выбирает домен. - Иначе переводит scores в проценты:
adjusted = score - min_score
percent = adjusted / sum(adjusted) * 100Все домены с процентом ≥ pattern_second_sign_threshold (30.0) входят в составной sign. Доминанта считается уверенной, если её процент ≥ confident_spread (60.0).
Mean-centering против анизотропии
У трансформерных эмбеддингов есть неприятная особенность: многие тексты выглядят “немного похожими” друг на друга, даже если домены разные. Абсолютный cosine из-за этого может быть обманчивым.
В сервере это решается функцией _mean_center: перед сравнением из эталонов вычитается их общий средний вектор. После этого NOUZ смотрит не на голый cosine, а на разницу между доменами: насколько один эталон выигрывает у остальных. Поэтому важны spread, проценты и пороги, а не одно число близости.
core_mix и дрифт
sign — это намерение: как узел размечен или классифицирован. core_mix — фактический доменный профиль, который собирается из содержимого нижних уровней.
↑ core_mix: L4 → L3 → L2, агрегируется снизу вверх
Если sign модуля говорит “Engineering”, а core_mix показывает рост “Systems Analysis”, появляется сигнал дрифта: содержимое модуля сместилось относительно исходной рамки.
Типы связей
| Тип | Кто создаёт | Смысл |
|---|---|---|
hierarchy | Пользователь | Основная структурная связь |
temporary | Пользователь или ИИ | Временная связь для материала, который ещё не прирос к графу |
semantic | ИИ предлагает | Тексты из разных доменов говорят об одном смысле |
tag | ИИ предлагает | Сходство отдельных тегов или понятий |
analogy | ИИ предлагает | Похожая роль в графе при разных доменах |
error | Сервер | Нарушение строгой иерархии в SLOI |
В формуле отображаются только hierarchy, semantic и temporary, чтобы она оставалась читаемой. Остальные типы связей доступны в данных MCP и в индексе.
Мосты
Семантические мосты (semantic) сравнивают весь текст заметки с заметками других доменов. Порог по умолчанию: semantic_bridge_threshold = 0.55.
Теговые мосты (tag) сравнивают теги и короткие понятия. Это помогает находить скрытые общие концепты даже когда тексты целиком разные.
Аналогические мосты (analogy) ищут структурное сходство: похожий core_mix, уровень, степень узла и пересечение тегов. Порог по умолчанию: structural_bridge_threshold = 0.55.
Все мосты возвращаются как предложения (proposed: true). Сервер показывает кандидатов; вы решаете, превращать ли их в связи.
Автоматический поиск родителей
suggest_parents, process_orphans и add_entity могут предложить место для заметки без родителей.
Сервер сравнивает текст заметки с потенциальными родителями. Кандидаты ниже parent_link_threshold (0.55) отбрасываются. Если несколько кандидатов близки, родитель из того же домена получает приоритет.
Пайплайн
Заметка
Markdown-файл с YAML: type, level, sign, parents, tags. Файл без YAML тоже индексируется, но требует доразметки.
Индекс
Сервер сохраняет метаданные, контент, связи и embeddings в SQLite.
Классификация
Контент сравнивается с эталонами; L5 получает artifact_sign, L4 может получить составной знак.
Агрегация
L4 получает профиль из классификации текста; L3 и L2 агрегируют дочерние узлы снизу вверх.
Предложения
Мосты, родители, теги и ошибки иерархии возвращаются как кандидаты для вашего решения.
База данных
NOUZ хранит индекс в SQLite (obsidian_kb.db в корне vault):
- метаданные файлов;
- связи графа;
- embeddings;
- reference vectors эталонов;
core_mix,sign_auto,sign_source,artifact_sign.
Заметки и база остаются локальными. Если используется облачный embedding provider, наружу отправляются только тексты, для которых запрошен embedding.
SQLite не требует отдельного сервера: Python поставляется с модулем sqlite3, а NOUZ использует aiosqlite как асинхронную обёртку. Файл индекса создаётся локально при индексации базы.