average Telegram

Семантический поиск

Собственный индекс для корпоративных файлов

Локальный поисковый движок на Rust: полнотекстовый и семантический поиск по корпоративным файлам, SQLite FTS5, векторный индекс и серверный inference на EmbeddingGemma 2. Поддерживаются офисные документы, PDF и мультимедийные материалы.

Цель

Дать возможность искать корпоративные документы по содержанию, а не только по названиям и расположению файлов.

Дополнительное требование — не размещать тяжёлые модели на компьютере каждого сотрудника. Индекс и доступ к файлам должны оставаться локальными, а ML-инференс — централизованным.

Собственный индексатор

Для Windows-клиента я разработал поисковый слой на Rust. Он обходит разрешённые каталоги, извлекает содержимое документов, разбивает данные на фрагменты и обновляет индекс при изменении исходных файлов.

В качестве локального хранилища использовал SQLite. FTS5 отвечает за лексический поиск, sqlite-vec хранит 768-мерные embeddings и выполняет vector similarity search.

Оба режима используют общий каталог файлов и метаданных. Пользователь может искать точную формулировку или близкие по смыслу фрагменты.

Разделение локальной и серверной обработки

Векторизация вынесена на корпоративный сервер с EmbeddingGemma 2. Это избавляет пользовательские компьютеры от необходимости запускать собственную модель и упрощает управление inference-инфраструктурой.

Локальный компонент отвечает за файловый scope, индекс, очередь обработки и retrieval. Сервер выполняет вычисления для документов и поисковых запросов. Векторы сохраняются на стороне клиента.

Для разных форматов используется подходящий способ извлечения содержимого. Текст офисных файлов можно обрабатывать структурно, PDF без текстового слоя и изображения требуют визуального анализа, а аудио и видео разбиваются на фрагменты для последующей модельной обработки.

Производительность и контроль доступа

Поисковый запрос не должен ждать переиндексации всего каталога. Поэтому обновление индекса выполняется отдельно, а вычисленные embeddings повторно используются, пока исходные данные не изменятся.

Ориентир для серверного inference поискового запроса — около 120 мс.

Результат

Собственный поисковый движок, встроенный в Windows-клиент: индекс, полнотекстовый и семантический retrieval, работа с разными форматами и серверный inference.

Для меня этот проект интересен на стыке Rust, поисковых структур, мультимодальной обработки и архитектуры распределённого ML-сервиса.

Стек: Rust, SQLite, FTS5, sqlite-vec, EmbeddingGemma 2, vector search, Tauri, React, TypeScript.

ATLAS: записанный мультимодальный эксперимент

Демо воспроизводит четыре сохранённых запроса по 39 файлам: 15 фотографиям упаковок и 24 текстовым отрывкам в PDF, DOCX и TXT. EmbeddingGemma 2 кодирует изображения непосредственно и сопоставляет их с русским запросом в общем 768-мерном пространстве. Использован квантованный runtime: текст Q4_K_XL, vision Q8_0.

Сохранены реальные токены, компоненты вектора, cosine similarity и ранги sqlite-vec. FTS5 выполняется по аннотациям изображений и тексту документов; его выдача сохранена в trace, но не занимает место в визуальной сцене. Карточки размещены композиционно, а не по PCA. Три кандидата и их порядок определены реальными cosine scores. Числовой фрагмент показывает первые 32 компоненты настоящего вектора; вычисление ранга использует все 768.

Дополнительные документы — конвертированные отрывки из Alice in Wonderland Льюиса Кэрролла и Sherlock Holmes Артура Конан Дойла, Project Gutenberg (public domain in USA).

Данные: Food Packaging OCR Dataset v2, Chia Zi Qi, CC BY 4.0.