Un archivo
Una base de datos es un solo archivo que puedes copiar, respaldar o distribuir con tu aplicación. El guardado es atómico y cada archivo se verifica con CRC32 al abrirlo.
Recern Vector es una base de datos vectorial embebida, al estilo de SQLite. Se ejecuta dentro de tu aplicación, guarda todo en un solo archivo y te muestra cómo se ejecutó cada búsqueda. La estamos creando junto al espacio de trabajo de Recern.
pip install recern-vectorNotas de la versión v0.0.1 el rendimiento de faiss HNSW con recall 0,95 en SIFT1M
la misma comparación en GloVe-100
para indexar un millón de vectores en 14 núcleos
latencia mediana por consulta con recall 0,983 en SIFT1M
Una base de datos es un solo archivo que puedes copiar, respaldar o distribuir con tu aplicación. El guardado es atómico y cada archivo se verifica con CRC32 al abrirlo.
Recern Vector es una biblioteca que se ejecuta en tu proceso, con bindings para Rust y Python y una herramienta de línea de comandos. No hay nada que desplegar, configurar ni mantener en marcha.
Cada búsqueda puede informar su estrategia, los nodos visitados, la selectividad del filtro y cuánto tardó. Las estadísticas muestran las capas del grafo, el uso de memoria y los registros que ninguna búsqueda puede alcanzar, y el recall se mide con tus propios datos.
La misma base de datos desde Python y desde la línea de comandos. La salida de la derecha es una ejecución real con 20.000 registros y un filtro por metadatos.
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 µsLos bindings de Python aceptan arrays float32 de NumPy sin convertir cada elemento. Las inserciones por lotes construyen el índice en todos los núcleos.
Un índice de grafo con m, ef_construction y ef_search por colección, y un recorrido exacto cuando necesitas la verdad de referencia.
Cada colección tiene una dimensión y una métrica fijas. Los vectores de coseno se normalizan al guardarse.
Igualdad, $in y rangos al estilo de MongoDB. Cuando un filtro coincide con muy pocos registros, la consulta pasa a un recorrido exacto.
Las inserciones por lotes construyen el índice en todos los núcleos. Si un vector no es válido, no se escribe nada.
Reemplaza o borra registros por id y compacta para reconstruir la colección sin los registros borrados.
stats(), explain() y estimate_recall() son parte de la API, no una herramienta aparte.
Un wheel de PyO3 para CPython 3.11 o posterior, con anotaciones de tipo.
init, create-collection, insert, query, inspect, recall y compact.
Una consulta a la vez desde Python en Apple M3 Max, con la latencia mediana debajo de cada cifra. El informe completo también cubre la construcción del índice, el tamaño en disco, el método y las limitaciones.
| Motor | SIFT1M | GloVe-100 |
|---|---|---|
| Recern VectorHNSW | 90410,11 ms | 6351,60 ms |
| faissHNSWFlat | 69610,15 ms | 3562,83 ms |
| LanceDBIVF_HNSW_SQ | 7311,34 ms | no alcanzado |
| LanceDBIVF_PQ, tuned | 2454,03 ms | 1675,93 ms |
| sqlite-vecexact scan | 1283,79 ms | 7140,43 ms |
Por ahora, toda la base de datos se mantiene en memoria, cada guardado reescribe el archivo y el formato aún puede cambiar. Se instala con pip install recern-vector o cargo add recern-vector; las versiones seguirán en 0.0.x hasta que el formato sea estable.
Recern es un espacio de trabajo de escritorio para entender bases de datos. También explicará la búsqueda vectorial en las bases que ya usas, como pgvector y Redis. Recern Vector es un proyecto complementario independiente y no forma parte de la Alpha privada del espacio de trabajo.
Unirse a la Alpha privada del espacio de trabajo