Сжатие и скорость: цифры, которые важны
Основная проблема векторных баз данных — потребление памяти. Корпус из 10 миллионов документов в формате float32 занимает 31 ГБ ОЗУ. Библиотека turbovec упаковывает тот же объем данных в 4 ГБ, используя алгоритм квантования TurboQuant от Google Research. Это не просто экономия места: индекс становится быстрее благодаря оптимизированным SIMD-ядрам.
Разработчики провели бенчмарки на корпусе из 100 000 векторов (1 000 запросов, k=64). Результаты показывают, что turbovec превосходит FAISS IndexPQFastScan во всех конфигурациях:
| Архитектура | Битность | Ускорение над FAISS | Детали реализации |
|---|---|---|---|
| ARM (Google Axion) | 4-bit | 3.5x (в среднем) | NEON SDOT/SMMLA |
| ARM (Google Axion) | 2-bit | 26% | NEON SDOT/SMMLA |
| x86 (Intel Sapphire Rapids) | 4-bit | 3.4x (в среднем) | AVX-512 VNNI |
| x86 (Intel Sapphire Rapids) | 2-bit | 20% | AVX-512 VNNI + vpermb |
Производительность вставки и удаления
В отличие от многих индексов, требующих переобучения при изменении данных, turbovec поддерживает онлайн-ингест. Добавление векторов происходит мгновенно без этапа тренировки. Задержка вставки одного вектора составляет всего 6.3–19.7 мкс (в 7.6–13.9 раза быстрее аналога в FAISS). Удаление по ID (O(1)) занимает 0.44–1.22 мкс, что критично для систем с частыми обновлениями.
Фильтрация на уровне ядра
Важная особенность для RAG-систем: фильтрация происходит внутри SIMD-ядра. При поиске с allowlist (списком разрешенных ID) блоки, не содержащие разрешенных слотов, отбрасываются до вычислений. Это позволяет избежать накладных расходов на перебор всего индекса, если выборка узкая.
Интеграция и безопасность
Библиотека написана на Rust и предоставляет биндинги для Python. Она полностью локальна (air-gapped), не требует внешних сервисов и совместима с популярными фреймворками через плагины:
- LangChain: замена InMemoryVectorStore
- LlamaIndex: замена SimpleVectorStore
- Haystack: замена InMemoryDocumentStore
Установка через pip: pip install turbovec. Для работы с устойчивыми ID (сохраняемыми при удалении) используется класс IdMapIndex.
Источник: Github ↗
