Обработка контента
Pipeline извлечения текста
- Определение типа — по расширению выбирается парсер (DirectReader, DocxParser, PDFKit+OCR, Whisper для аудио/видео).
- Сохранение content_original — сырой извлечённый текст в
file_contents.
- Чанкинг — разбиение на фрагменты (300–500 токенов, overlap 50–100), предпочтительно по границам предложений.
- Эмбеддинги — генерация через Ollama (mxbai-embed-large или bge-m3), запись в
vec_embeddings.
- Юридические сущности — извлечение статей, пунктов, ссылок на законы, номеров дел (regex/NLP).
- Готово — файл доступен для полнотекстового и семантического поиска.
Стратегии индексации
| Стратегия |
Когда использовать |
| 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 даёт один файл БД и единый слой доступа.