Об этом проекте
turbovec — это векторный индекс, реализованный на Rust и предоставляемый для Python через привязки. Он построен на алгоритме TurboQuant от Google Research — методе квантования без учета данных, который использует нормализацию, фиксированное случайное вращение, скалярное квантование Ллойда-Макса на основе распределения, упаковку битов и оценку внутреннего произведения с повторной нормализацией длины. Проект ориентирован на локальный векторный поиск с ограниченной памятью и низкой задержкой и не требует управляемого сервиса.
Основной TurboQuantIndex создается с указанием размерности и разрядности; документированы 2-битное и 4-битное индексирование. Векторы добавляются инкрементально без отдельного этапа обучения, настройки параметров или перестроения индекса. Входные данные Python принимаются в виде массивов NumPy типа float32; другие типы отклоняются, а не молча преобразуются. API предоставляет операции add, search, write, load и sync. Поиск возвращает оценки и индексы для запрошенных k ближайших результатов.
IdMapIndex добавляет стабильные внешние идентификаторы uint64, add_with_ids и удаление за O(1) по идентификатору, согласно документации. Он поддерживает тот же рабочий процесс записи/загрузки целого файла и инкрементальное сохранение через sync. Метод sync описан как сохраняющий только изменения с момента предыдущего вызова sync, используя один fsync на вызов и позволяя небольшие добавления или удаления без перезаписи всего индекса. write и load остаются доступными для полных снимков.
Фильтрованный или гибридный поиск поддерживается через белый список идентификаторов или битовую маску слотов, передаваемые в search. Белый список может поступать из внешней системы, такой как SQL, BM25, логика контроля доступа или временной фильтр. В README указано, что фильтрация применяется внутри ядра SIMD-поиска, блоки без разрешенных векторов пропускаются, а количество результатов равно min(k, количество различных разрешенных векторов).
Поиск использует написанные вручную SIMD-ядра с выбором функций во время выполнения. Документированные цели включают ARM NEON SDOT/SMMLA, x86 AVX-512 VNNI и vpermb, а также AVX2 и скалярные запасные варианты. Сборка Rust использует базовый уровень x86-64-v2, включая более новые ядра на поддерживающем оборудовании. Многопоточность обеспечивается через Rayon в описанной конфигурации бенчмарка.
Необязательный этап калибровки TQ+ может подогнать значения сдвига и масштаба для каждой координаты на основе репрезентативной выборки перед индексированием. В README это описано как улучшение полноты в условиях конечной размерности или низкой разрядности, особенно для эмбеддингов типа GloVe, при этом оставаясь пригодным для последующих добавлений. Некалиброванный индекс использует обычный TurboQuant.
Установка Python доступна через pip, а Rust — через cargo add turbovec. Проект документирует опциональные интеграции для LangChain, LlamaIndex, Haystack и Agno, позиционируемые как готовые замены для их внутрипроцессорных или эталонных векторных хранилищ. Эти интеграции устанавливаются через опциональные дополнительные пакеты.
Репозиторий включает бенчмарки, выполненные проектом, сравнивающие turbovec с конфигурациями FAISS IndexPQFastScan и IndexPQ. В README сообщается о меньшем использовании памяти, более быстром измеренном поиске в протестированных конфигурациях ARM и x86, измерениях задержки вставки и удаления, графиках полноты, результатах сжатия и времени сохранения/загрузки. Это предоставленные результаты бенчмарков, а не независимые сторонние измерения. Скрипты для загрузки наборов данных эмбеддингов GloVe и OpenAI, запуска тестов полноты/скорости/сжатия, сохранения результатов в JSON и регенерации графиков включены в каталог benchmarks.
Comments
0 Rating appears after 10 ratings
Sign in to join the discussion.