# Генерация эмбеддингов (шаг 6)

Отдельный шаг пайплайна после мержа анализа и тегов (шаг 5). В вектор превращается **валидированный анализ главы** (каркас, инсайты, применение), а не сырой текст — поиск идёт по смыслу, а не по формулировкам.

## Модель

- **По умолчанию:** **BAAI/bge-m3** (bge-m3). Мультиязычная модель, хорошая поддержка русского; размерность вектора **1024**, лимит контекста **8192 токенов** — полный анализ главы обычно укладывается без обрезки. Размер ~1.2GB, ~5–15 сек на главу.
- **Лимит входа:** 8192 токенов (bge-m3). При превышении — стратегия из `embed_input_spec.txt` (truncation или chunk + агрегация).
- **Альтернативы:** nomic-embed-text, evilfreelancer/enbeddrus (для более лёгкого режима). Модель задаётся конфигом; при смене — пересоздание коллекций Qdrant (размерность 1024 для bge-m3).

## Вход

Выход шага 5 (мерж): валидированный анализ главы (framework, insights, application) — сериализуется в текст по спецификации `embed_input_spec.txt`. Теги в вектор не входят; они хранятся в payload Qdrant для фильтрации.

## Выход

Вектор эмбеддинга фиксированной размерности (**1024** для bge-m3). Сохраняется в Qdrant в коллекции `chapter_analyses` (коллекция создаётся с size=1024) вместе с payload (book_id, chapter_id, validation_score, tags и т.д.).

## Спецификация входа

| Файл                  | Назначение                                                                 |
|-----------------------|----------------------------------------------------------------------------|
| embed_input_spec.txt  | Рецепт построения текста для эмбеддинга: какие поля, порядок, приоритет при truncation |

## Подстановки при построении текста

- `{framework}` — сериализованный блок framework (принципы, terms, chains)
- `{insights}` — сериализованный блок insights
- `{application}` — сериализованный блок application

Ограничения и limitations в эмбеддинг по умолчанию не включаются (опционально — в конфиге). Теги — только в payload, не в тексте для эмбеддинга.

## Скрипт через Ollama

`run_embed_ollama.py` — один вызов Ollama `/api/embed` для генерации вектора по JSON шага 5. Текст для эмбеддинга собирается из framework, insights, application по `embed_input_spec.txt` (функция `merged_json_to_embed_text` из `embed_cli.py`).

**Вход (по умолчанию):**
- `../5_мерж_анализа_и_тегов/merged_with_tags.json` — результат шага 5 (анализ + теги)

**Выход:** `embedding.json` в каталоге скрипта — массив float (вектор размерности 1024 для bge-m3).

**Запуск:**
```bash
cd 6_генерация_эмбеддингов
python3 run_embed_ollama.py
# с указанием путей:
python3 run_embed_ollama.py --merged /path/to/merged_with_tags.json -o embedding.json
# другая модель или URL Ollama:
python3 run_embed_ollama.py --model bge-m3 --ollama-url http://localhost:11434
```

## Универсальный CLI (OpenAI-совместимый API)

`embed_cli.py` — для LM Studio или другого OpenAI-совместимого API (позиционные аргументы: путь к JSON, имя модели, опционально `--base-url`, `-o`).

## Использование в пайплайне

Вызывается после шага 5 (мерж анализа и тегов). Модель задаётся конфигом (env/конфиг); смена модели не меняет формат хранения в Qdrant, при смене — пересчёт эмбеддингов по необходимости.
