Собственный индекс для корпоративных файлов
Локальный поисковый движок на 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.