Recern Vector DB · Prototype

Une base vectorielle dans un seul fichier.

Recern Vector est une base de données vectorielle embarquée, dans l’esprit de SQLite. Elle tourne dans votre application, garde tout dans un seul fichier et vous montre comment chaque recherche s’est exécutée. Nous la développons en parallèle de l’espace de travail Recern.

pip install recern-vectorNotes de version v0.0.1
Rust · Python · CLI · MIT OR Apache-2.0
1,30×

le débit de faiss HNSW à un recall de 0,95 sur SIFT1M

1,78×

la même comparaison sur GloVe-100

35s

pour indexer un million de vecteurs sur 14 cœurs

0,11ms

latence médiane par requête à un recall de 0,983 sur SIFT1M

Pourquoi Recern Vector

Assez petite pour être embarquée. Assez ouverte pour être comprise.

01

Un seul fichier

Une base est un fichier unique que vous pouvez copier, sauvegarder ou livrer avec votre application. Les sauvegardes sont atomiques et chaque fichier est vérifié par CRC32 à l’ouverture.

02

Aucun serveur

Recern Vector est une bibliothèque qui tourne dans votre processus, avec des bindings Rust et Python et un outil en ligne de commande. Rien à déployer, à configurer ni à maintenir en marche.

03

Rien de caché

Chaque recherche peut indiquer sa stratégie, les nœuds visités, la sélectivité du filtre et sa durée. Les statistiques montrent les couches du graphe, la mémoire utilisée et les enregistrements qu’aucune recherche ne peut atteindre, et le recall se mesure sur vos propres données.

En pratique

Cherchez, puis demandez comment la recherche s’est déroulée

La même base depuis Python et depuis la ligne de commande. La sortie à droite provient d’une vraie exécution sur 20 000 enregistrements avec un filtre sur les métadonnées.

import recern_vector as rv

db = rv.Database.open_or_create("docs.rvec")
docs = db.create_collection("docs", dim=384, metric="cosine")
docs.upsert_many(ids, embeddings, metadatas)

hits = docs.search(query, k=5, filter={"lang": "en"})
docs.explain(query, k=5)  # strategy, visited nodes, time
$ recern-vector query docs.rvec docs --like doc-42 -k 3 \
    --filter '{"lang": "en", "year": {"$gte": 2020}}' \
    --explain

  #  id          distance  metadata
  1  doc-42      -0.00000  {"lang":"en","year":2024}
  2  doc-18861    0.63155  {"lang":"en","year":2022}
  3  doc-10899    0.63834  {"lang":"en","year":2024}

  strategy      hnsw
  ef            64
  selectivity   ~19.9% of records match the filter
  visited       7,244 nodes
  distances     7,330 computed
  time          529 µs

Les bindings Python acceptent des tableaux NumPy float32 sans convertir chaque élément. Les insertions par lot construisent l’index sur tous les cœurs.

Dans le prototype aujourd’hui

Ce qui fonctionne déjà

  • HNSW et recherche exacte

    Un index en graphe avec m, ef_construction et ef_search par collection, et un parcours exact quand il vous faut la vérité terrain.

  • Cosinus, L2 et produit scalaire

    Chaque collection a une dimension et une métrique fixes. Les vecteurs cosinus sont normalisés à l’enregistrement.

  • Filtres sur les métadonnées

    Égalité, $in et intervalles, dans le style de MongoDB. Quand un filtre ne retient que très peu d’enregistrements, la requête passe à un parcours exact.

  • Insertions parallèles et atomiques

    Les insertions par lot construisent l’index sur tous les cœurs. Si un vecteur est invalide, rien n’est écrit.

  • Upsert, suppression et compactage

    Remplacez ou supprimez des enregistrements par id, puis compactez pour reconstruire la collection sans les enregistrements supprimés.

  • API d’introspection

    stats(), explain() et estimate_recall() font partie de l’API, pas d’un outil séparé.

  • Bindings Python

    Une wheel PyO3 pour CPython 3.11 et plus, avec annotations de type.

  • Outil en ligne de commande

    init, create-collection, insert, query, inspect, recall et compact.

Benchmarks

Plus rapide que faiss HNSW à recall égal

Une requête à la fois depuis Python sur Apple M3 Max, avec la latence médiane sous chaque valeur. Le rapport complet couvre aussi la construction de l’index, la taille sur disque, la méthode et les limites.

Requêtes par seconde à recall@10 ≥ 0,95

MoteurSIFT1MGloVe-100
Recern VectorHNSW9 0410,11 ms6351,60 ms
faissHNSWFlat6 9610,15 ms3562,83 ms
LanceDBIVF_HNSW_SQ7311,34 msnon atteint
LanceDBIVF_PQ, tuned2454,03 ms1675,93 ms
sqlite-vecexact scan1283,79 ms7140,43 ms
Lire le rapport complet (en anglais)
État

Où va Recern Vector

  1. Aujourd’hui

    Prototype

    • Phase 1 terminée : format de fichier, HNSW, filtres, introspection
    • Bindings Python et CLI
    • Benchmarks publics sur SIFT1M et GloVe-100
    • Open source (MIT ou Apache-2.0), sur PyPI et crates.io
  2. Ensuite

    Première version, v0.1

    • Format de fichier stable et versionné
    • Documentation et exemples
    • Ouverture des fichiers Recern Vector dans l’espace de travail Recern
  3. Hors v0

    Hors périmètre

    • Mode serveur
    • Sharding et réplication
    • Accélération GPU
    • Un service cloud

Pour l’instant, toute la base est chargée en mémoire, chaque sauvegarde réécrit le fichier et le format peut encore évoluer. Installation avec pip install recern-vector ou cargo add recern-vector ; les versions restent en 0.0.x tant que le format n’est pas stable.

Espace de travail Recern

Une pièce d’un ensemble plus large

Recern est un espace de travail de bureau pour comprendre les bases de données. Il expliquera aussi la recherche vectorielle dans les bases que vous utilisez déjà, comme pgvector et Redis. Recern Vector est un projet compagnon distinct, qui ne fait pas partie de l’alpha privée de l’espace de travail.

Rejoindre l’alpha privée de l’espace de travail