# Спецификация входа для генерации эмбеддинга главы

Текст, который передаётся в модель эмбеддингов (по умолчанию BAAI/bge-m3), строится из **валидированного анализа главы**. Источник полей — JSON анализа по схеме из ARCHITECTURE_SUMMARY.md (блоки framework, insights, application). Цель — сохранить смысл для семантического поиска: по вектору ищут главы по смыслу (принципы, инсайты, техники), а не по сырому тексту.

---

## ЧТО ВКЛЮЧАТЬ

В текст для эмбеддинга входят **только** блоки анализа:

1. **Framework (каркас):** принципы (title, description, example), terms (термин → краткое пояснение), при необходимости — ключевые цепочки cause–mechanism–result (кратко).

2. **Insights (инсайты):** title, description (и при необходимости example) по каждому инсайту. Без лишних метаполей.

3. **Application (применение):** техники — name, goal, steps (кратко или полный список), при необходимости context_example. То, по чему будет искаться «как это применить».

**Не включать:**
- Оригинальный текст главы.
- Limitations — по умолчанию не включать (опционально через конфиг).
- Теги — хранятся в payload Qdrant, в вектор не входят.

---

## ПОРЯДОК И ФОРМАТ СЕРИАЛИЗАЦИИ

**Язык текста:** тот же, что и язык главы (или основной язык книги). Для мультиязычных коллекций — зафиксировать в конфиге (например, всегда русский / всегда язык главы).

**Порядок секций** (приоритет при truncation — сверху вниз):

```
FRAMEWORK
{framework}

INSIGHTS
{insights}

APPLICATION
{application}
```

**Разделители:**
- Между секциями: заголовок секции (FRAMEWORK, INSIGHTS, APPLICATION) + пустая строка.
- Внутри секции: элементы разделять переносом строки или маркером «—»; не склеивать в один абзац. Пример: каждый принцип — с новой строки; каждый инсайт — с новой строки; каждая техника — с новой строки.

**Формат полей:** читаемый текст с подписями («Принцип: …», «Инсайт: …», «Техника: …») или компактный структурированный текст. Избегать сырого JSON без подписей; предпочитать человекочитаемую склейку.

**Подстановки при сборке:**
- `{framework}` — строка из JSON блока framework (принципы, terms; chains при необходимости).
- `{insights}` — строка из JSON блока insights.
- `{application}` — строка из JSON блока application.

**Пример сериализации (фрагмент):**

```
FRAMEWORK

Принцип: Правило двух минут. Описание: Если действие занимает меньше двух минут — сделай его сразу. Пример: ответ на короткий email, вынести мусор.
Термины: атомная привычка — сверхмалое действие, повторяемое ежедневно.

INSIGHTS

Инсайт: Привычки формируют идентичность. Мы меняемся не через цели, а через системы и повторяющиеся действия.

APPLICATION

Техника: Снижение барьера входа. Цель: начать действие без откладывания. Шаги: сформулировать версию привычки «на 2 минуты»; выполнять её в одно и то же время; после закрепления — расширять.
```

**Нормализация перед подачей в модель:** схлопнуть множественные пробелы и переносы в один; обрезать пробелы по краям строк и в начале/конце итогового текста. Это уменьшает разброс из‑за форматирования.

---

## ЛИМИТ МОДЕЛИ И СТРАТЕГИЯ ПРЕВЫШЕНИЯ

- **Лимит (bge-m3):** 8192 токенов на вход. Полный анализ главы обычно укладывается. Для других моделей — лимит указывать в конфиге.

- **Если текст укладывается в лимит:** передать один сконкатенированный текст (FRAMEWORK + INSIGHTS + APPLICATION) в один вызов модели.

- **Если текст длиннее лимита** — выбрать одну из стратегий (зафиксировать в конфиге):

  1. **truncate_priority:** обрезать текст до лимита. Сохранять в порядке приоритета: сначала APPLICATION (техники важны для поиска), затем INSIGHTS, затем FRAMEWORK. Отбрасывать с конца не поместившегося блока.

  2. **truncate_per_section:** обрезать до лимита, сохраняя начало каждой секции. Сначала поместить начало FRAMEWORK, затем начало INSIGHTS, затем начало APPLICATION, пока не исчерпается лимит.

  3. **chunk_aggregate:** разбить текст **последовательно** (с начала к концу) на чанки по лимиту; получить вектор для каждого чанка; усреднить векторы (или другой способ агрегации) и сохранить один итоговый вектор. Способ агрегации — в конфиге.

---

## ВЫХОД

- Один вектор фиксированной размерности. Для bge-m3 — **1024**. При смене модели размерность меняется; коллекции Qdrant создавать с соответствующим size.
- Вектор сохраняется в Qdrant в коллекции `chapter_analyses`. Payload — по схеме из ARCHITECTURE_SUMMARY.md: bookId, chapterId, chapterNumber, chapterTitle, validationScore, tags и др. Текст анализа в payload при необходимости хранить отдельно или не хранить (по политике системы).

---

## КОНФИГУРАЦИЯ

- Модель эмбеддингов: env/конфиг (по умолчанию EMBED_MODEL=bge-m3).
- Лимит токенов модели: конфиг (для bge-m3: EMBED_MAX_TOKENS=8192).
- Размерность вектора: для bge-m3 — 1024; при смене модели задавать в конфиге и пересоздавать коллекции Qdrant.
- Стратегия при превышении: конфиг (truncate_priority | truncate_per_section | chunk_aggregate).
- Включение limitations в текст: опционально, конфиг (по умолчанию false).
- Язык сериализации (при мультиязычности): опционально, конфиг (например, chapter_lang | book_lang | fixed:ru).
