Bibliothèque / SDK
RyanCodrai/turbovec avatar
RyanCodrai/turbovec

turbovec : un index vectoriel Rust sur TurboQuant

Un index vectoriel construit sur TurboQuant, écrit en Rust avec des liaisons Python.

17 181 étoiles1 470 forksPythonMIT

En bref

De quoi s’agit-il ?
Comment le README décrit les API, la synchronisation incrémentale, la recherche filtrée et les comparaisons FAISS de turbovec.
À qui s’adresse-t-il ?
Le README fournit une explication d'algorithme concrète, des scripts de benchmark reproductibles et des exemples d'API clairs ; les chiffres de performance sont toutefois des affirmations du projet.
Puis-je l’utiliser commercialement ?
Oui. MIT est une licence permissive : vous pouvez utiliser, modifier et vendre un logiciel qui en dépend, à condition de conserver les mentions de droit d’auteur et de licence.
Est-il encore maintenu ?
Oui. Les derniers commits datent d’il y a 2 jours.
En quel langage est-il écrit ?
Principalement Python, d’après les statistiques de langage de GitHub.

Ces réponses reposent sur les données GitHub du projet (dernière synchronisation le 15 septembre 2026) et sur notre analyse. Elles ne constituent pas un avis juridique.

ANALYSE OPEN SOURCE APPROFONDIE

L'affirmation de mémoire en tête du README : turbovec

Le README commence par une comparaison concrète : un corpus de 10 millions de documents occupe 31 Go de RAM en float32, turbovec le fait tenir dans 4 Go et le recherche plus vite que FAISS. C'est une affirmation du projet, pas un résultat vérifiable indépendamment à partir du seul dépôt. Les métadonnées du dépôt indiquent que turbovec est un index vectoriel écrit en Rust avec des liaisons Python, et le README dit qu'il implémente TurboQuant de Google Research, un quantificateur indépendant des données sans phase d'entraînement séparée. Le dépôt liste 14 629 étoiles, 1 303 forks et 63 problèmes ouverts. Ces chiffres décrivent l'activité du dépôt, pas la justesse du projet. [repère 1-1]

turbovec: reprendre l’entrée, la sortie, les modules et la commande montrés dans le README, puis comparer avec les exemples du dépôt. Repère de la section 1: comparer ce point au README de turbovec et conserver le résultat observé. [repère 1-2]

Entrées Python et Rust : turbovec

Les deux interfaces sont montrées avec des exemples exécutables. En Python, après `pip install turbovec`, on utilise `TurboQuantIndex(dim=1536, bit_width=4)` ; `add` n'accepte que les tableaux float32 à deux dimensions et rejette les autres types, il faut donc convertir avec `np.asarray(x, dtype=np.float32)`. `search(query, k)` renvoie scores et indices. `IdMapIndex` fournit des identifiants externes stables, prend en charge `add_with_ids`, et `remove(id)` est présenté comme étant en O(1). La persistance se fait dans un fichier `.tvim`. En Rust, on utilise `cargo add turbovec` puis `TurboQuantIndex::new(1536, 4)` ; le flux add/search/write/load est le même. Le README renvoie à `docs/api.md` pour la référence complète, mais ne liste pas toute la surface d'API dans le README lui-même. [repère 2-1]

turbovec: reprendre l’entrée, la sortie, les modules et la commande montrés dans le README, puis comparer avec les exemples du dépôt. Repère de la section 2: comparer ce point au README de turbovec et conserver le résultat observé. [repère 2-2]

Enregistrement incrémental et recherche filtrée : turbovec

Le modèle de persistance a deux niveaux. `sync(path)` n'écrit que ce qui a changé depuis la dernière synchronisation, avec un fsync par appel, et le README dit que c'est sûr en cas de crash à n'importe quel octet ; les suppressions et les petites ajouts prennent des millisecondes même sur de grands index. `write` et `load` servent pour des instantanés de fichier entier. La recherche peut être restreinte avec une liste d'autorisation d'identifiants externes ou un masque de bits de slots. Le noyau SIMD traite des blocs de 32 vecteurs ; les blocs sans slots autorisés sont sautés avant le scoring, et les slots non autorisés dans les blocs scorés sont écartés à l'insertion dans le tas. La longueur du résultat est `min(k, n_allowed)`, où `n_allowed` compte les vecteurs autorisés distincts. Le README liste aussi des remplacements pour les stores en mémoire de LangChain, LlamaIndex, Haystack et Agno, installés via des extras comme `pip install turbovec[langchain]`. [repère 3-1]

turbovec: reprendre l’entrée, la sortie, les modules et la commande montrés dans le README, puis comparer avec les exemples du dépôt. Repère de la section 3: comparer ce point au README de turbovec et conserver le résultat observé. [repère 3-2]

Le pipeline de quantification : turbovec

Le README explique l'algorithme en six étapes. Les vecteurs sont normalisés en directions unitaires. Une rotation aléatoire commune fait suivre à chaque coordonnée une distribution bêta qui converge vers une gaussienne en haute dimension. La calibration TQ+ optionnelle ajuste un décalage et une échelle par coordonnée ; le README dit qu'un échantillon d'environ 1024 lignes suffit. `calibrate(sample)` valide la calibration et les ajouts suivants la réutilisent. Le codebook Lloyd-Max est dérivé de la distribution, pas des données, et produit 4 compartiments en 2 bits et 16 en 4 bits. Les coordonnées sont empaquetées en bits : un vecteur de dimension 1536 passe de 6144 à 384 octets en 2 bits. Le scoring avec renormalisation de longueur stocke un scalaire par vecteur pour corriger le biais vers le bas du produit scalaire. À la recherche, la requête est tournée une fois et scorée directement contre les valeurs du codebook, avec NEON sur ARM et AVX-512BW sur x86, puis repli sur AVX2 et scalaire. [repère 4-1]

turbovec: reprendre l’entrée, la sortie, les modules et la commande montrés dans le README, puis comparer avec les exemples du dépôt. Repère de la section 4: comparer ce point au README de turbovec et conserver le résultat observé. [repère 4-2]

Ce que disent les chiffres de benchmark : turbovec

Le README rapporte des comparaisons avec FAISS sur plusieurs cellules. En vitesse de recherche sur ARM (GCP c4a-standard-8, Google Axion), TurboQuant bat FAISS FastScan de 19 à 31 % dans toutes les configurations. Sur x86, un Intel Xeon Platinum 8481C, il gagne les configurations 4 bits par jusqu'à environ 5 % et perd sur 2 bits, le plus visible étant d=1536 mono-thread à environ 8 %. Pour le rappel, la baseline est FAISS IndexPQ ; sur OpenAI d=1536 et d=3072, TurboQuant devance de 0,4 à 3,1 points en R@1, et les deux atteignent 1,0 à k=8. Sur GloVe d=200, l'avance est de 1,4 point en 4 bits et 0,5 en 2 bits. Les benchmarks d'insertion, suppression et sauvegarde/chargement sont aussi documentés, avec des fichiers JSON liés. Ces chiffres sont rapportés par le projet et n'ont pas été vérifiés indépendamment ici. [repère 5-1]

turbovec: reprendre l’entrée, la sortie, les modules et la commande montrés dans le README, puis comparer avec les exemples du dépôt. Repère de la section 5: comparer ce point au README de turbovec et conserver le résultat observé. [repère 5-2]

Construction, benchmarks et licence : turbovec

Les builds Python utilisent maturin ; les builds Rust utilisent `cargo build --release`. Tous les builds x86_64 ciblent `x86-64-v2` comme base, avec les noyaux AVX-512 et AVX2 contrôlés par `#[target_feature]` et sélectionnés à l'exécution ; les CPU sans ces instructions utilisent un repli scalaire. Les scripts de benchmark sont dans `benchmarks/suite/`, les résultats en JSON dans `benchmarks/results/`, et les graphiques peuvent être régénérés avec `benchmarks/create_diagrams.py`. La licence MIT accorde l'utilisation, la copie, la modification, la fusion, la publication, la distribution, la sous-licence et la vente, et fournit le logiciel 'tel quel' sans garantie. Le texte de licence ne dit rien sur la posture de sécurité, le support ou l'état de préparation à la production. [repère 6-1]

turbovec: reprendre l’entrée, la sortie, les modules et la commande montrés dans le README, puis comparer avec les exemples du dépôt. Repère de la section 6: comparer ce point au README de turbovec et conserver le résultat observé. [repère 6-2]

Conclusion éditoriale

Le README fournit une explication d'algorithme concrète, des scripts de benchmark reproductibles et des exemples d'API clairs ; les chiffres de performance sont toutefois des affirmations du projet.

Sources officielles

  1. Official documentation
  2. Official README
  3. Project repository
Notes de la communauté

Notes de la communauté