Перейти к содержанию

Обработка контента

Pipeline извлечения текста

  1. Определение типа — по расширению выбирается парсер (DirectReader, DocxParser, PDFKit+OCR, Whisper для аудио/видео).
  2. Сохранение content_original — сырой извлечённый текст в file_contents.
  3. Чанкинг — разбиение на фрагменты (300–500 токенов, overlap 50–100), предпочтительно по границам предложений.
  4. Эмбеддинги — генерация через Ollama (mxbai-embed-large или bge-m3), запись в vec_embeddings.
  5. Юридические сущности — извлечение статей, пунктов, ссылок на законы, номеров дел (regex/NLP).
  6. Готово — файл доступен для полнотекстового и семантического поиска.

Стратегии индексации

Стратегия Когда использовать
lazy Индексировать при первом поиске — маленькие базы
eager Сразу при добавлении — критичные документы
background Фоновая очередь с приоритетами — рекомендуется
scheduled По расписанию — очень большие базы

Инвалидация индекса

  • В files хранится content_hash (SHA256 содержимого).
  • При изменении файла hash меняется → триггер помечает чанки как pending, сбрасывается chunks_valid.
  • Переиндексация выполняется фоновой очередью.

Анонимизация

  • Поддерживаются типы сущностей: person, address, phone, passport и т.д.
  • Варианты замены: плейсхолдеры ([PERSON_1]), подставные данные, хеш.
  • Сопоставления хранятся в anonymization_mappings для последующей деанонимизации.

Почему sqlite-vec, а не FAISS

Критерий FAISS sqlite-vec
Портативность Отдельные файлы Один .db файл
SQL-интеграция Нет Полная
Swift Через Python Нативно
Масштаб Миллионы Сотни тысяч

Для переносимой юридической базы sqlite-vec даёт один файл БД и единый слой доступа.