Introduction
LanceDB est une base de données vectorielle open-source, construite en Rust pour une performance optimale, qui s'intègre parfaitement dans des applications Python. Contrairement aux bases comme Pinecone ou Weaviate qui nécessitent un cloud, LanceDB est embarqué : il fonctionne localement sans serveur dédié, idéal pour les prototypes IA, les apps edge ou les environnements contraints.
Pourquoi l'utiliser en 2026 ? Avec l'essor des LLMs et embeddings (comme ceux de Hugging Face), les recherches sémantiques sont essentielles. LanceDB excelle en vitesse (recherches ANN en millisecondes) et simplicité : pas de schéma rigide, support SQL-like et intégration native avec LangChain ou LlamaIndex. Ce tutoriel beginner vous guide pas à pas pour créer une DB, insérer des vecteurs et querying. À la fin, vous manipulerez des embeddings réels pour une recherche similaireité. Gain concret : réduisez vos coûts cloud de 100% tout en boostant la vitesse x10.
Prérequis
- Python 3.10 ou supérieur installé
- pip à jour (
python -m pip install --upgrade pip) - Connaissances basiques en Python (listes, dictionnaires)
- Un éditeur comme VS Code ou Jupyter Notebook (optionnel mais recommandé)
Installation de LanceDB
pip install lancedb
pip install numpy
pip install sentence-transformersCes commandes installent le SDK Python de LanceDB, NumPy pour les vecteurs et sentence-transformers pour générer des embeddings réels. LanceDB est pur Rust sous le capot, donc ultra-rapide sans dépendances lourdes. Évitez pip install --user en prod pour des environnements virtuels.
Création de la base de données
Commençons par les bases : connectez-vous à une DB LanceDB. Elle peut être en mémoire (éphémère, pour tests) ou sur disque (persistante). Analogie : comme un SQLite pour vecteurs, mais optimisé pour la similarité cosinus ou euclidienne.
Connexion et création d'une table
import lancedb
from lancedb.embeddings import get_registry
# Connexion à une DB sur disque (créée si inexistante)
db = lancedb.connect("./ma_base_lancedb")
# Schéma simple : vecteur de dim 384 + métadonnées
schema = {
"vector": "float[384]",
"item": "string",
"price": "float"
}
table = db.create_table("produits", schema=schema)
print("Table 'produits' créée avec succès !")Ce code crée une DB persistante et une table avec schéma vectoriel (384 dims, standard pour all-MiniLM). Le registre d'embeddings est prêt pour plus tard. Piège : toujours spécifier les dims exactes, sinon les inserts échouent.
Insertion de données vectorielles
Maintenant, peuplons la table. LanceDB accepte des DataFrames Pandas ou listes de dicts. Nous générons des embeddings simples avec un modèle léger.
Génération et insertion d'embeddings
import lancedb
import numpy as np
from sentence_transformers import SentenceTransformer
# Modèle d'embedding lightweight
model = SentenceTransformer('all-MiniLM-L6-v2')
db = lancedb.connect("./ma_base_lancedb")
table = db.open_table("produits")
# Données texte
textes = [
"iPhone 15 Pro Max bleu",
"Samsung Galaxy S24 Ultra",
"MacBook Air M3",
"iPad Pro 2024",
"Google Pixel 8"
]
# Générer embeddings
embeddings = model.encode(textes).tolist()
# Données à insérer
data = [
{"vector": emb, "item": texte, "price": 1200.0},
{"vector": embeddings[1], "item": textes[1], "price": 1100.0},
{"vector": embeddings[2], "item": textes[2], "price": 1300.0},
{"vector": embeddings[3], "item": textes[3], "price": 900.0},
{"vector": embeddings[4], "item": textes[4], "price": 800.0}
]
table.add(data)
print("5 produits insérés avec embeddings !")
print(table.to_pandas())On encode les textes en vecteurs 384D, puis insert via add(). Les embeddings capturent la sémantique (ex: 'iPhone' proche de 'iPad'). Astuce : batcher les inserts pour >10k items ; piégez pas en réutilisant le même vecteur.
Recherche vectorielle de base
Le cœur de LanceDB : la recherche ANN (Approximate Nearest Neighbors). Query par vecteur ou texte (auto-embedding).
Query simple par similarité
import lancedb
from sentence_transformers import SentenceTransformer
model = SentenceTransformer('all-MiniLM-L6-v2')
db = lancedb.connect("./ma_base_lancedb")
table = db.open_table("produits")
# Query texte : auto-embedding
query = "smartphone Apple haut de gamme"
results = table.search(query).limit(3).to_pandas()
print("Top 3 résultats :")
print(results[['item', 'price', '_distance']])LanceDB embedde automatiquement la query et trouve les plus proches (métrique cosinus par défaut). _distance mesure la similarité (0=identique). Limitez avec .limit() pour la perf ; threshold via select(['*']).where("_distance < 0.3").
Recherche avancée avec filtres
Ajoutez des filtres SQL-like pour raffiner : prix < 1000, etc. LanceDB combine vecteurs + metadata seamlessly.
Query filtrée et métrique personnalisée
import lancedb
db = lancedb.connect("./ma_base_lancedb")
table = db.open_table("produits")
# Query avec filtre SQL et métrique L2
query_vector = [0.1] * 384 # Vecteur exemple (remplacez par vrai embedding)
results = (
table
.search(query_vector, search_type="L2") # Distance euclidienne
.where("price < 1000") # Filtre metadata
.limit(2)
.to_pandas()
)
print("Résultats filtrés :")
print(results).where() applique des predicates SQL sur metadata avant recherche vectorielle. Choisissez cosine, L2 ou dot. Gain perf : indexation automatique ; évitez les queries sans index pour gros datasets.
Mise à jour et suppression
import lancedb
db = lancedb.connect("./ma_base_lancedb")
table = db.open_table("produits")
# Mise à jour par ID (premier item)
table.update(
where="price > 1100",
values={"price": 1150.0}
)
# Suppression
n_suppr = table.delete(where="price < 900")
print(f"{n_suppr} lignes supprimées.")
# Vérif
table.to_pandas().head()Updates et deletes via SQL where. LanceDB regénère les index automatiquement. Piège : backups avant bulk ops ; IDs sont auto-générés si non fournis.
Bonnes pratiques
- Utilisez des environnements virtuels :
venvpour isoler LanceDB et dépendances. - Choisissez la dim fixe : Alignez sur votre modèle (ex: 384 pour MiniLM, 1536 pour OpenAI).
- Batching inserts : >1000 items ? Utilisez Pandas DataFrame pour x5 vitesse.
- Index FALANN : Activez pour datasets >1M vecteurs via
create_index(metric_type="L2"). - Persistez sur SSD : LanceDB est I/O-heavy ; évitez HDD pour queries live.
Erreurs courantes à éviter
- Dimensions mismatch : Erreur
Vector dim mismatch? Vérifiez schema vs embeddings. - Oubli de connexion : Toujours
db.open_table()aprèsconnect(). - Queries sans limit : Risque OOM sur gros datasets ; capez à 100 max.
- Modèle non chargé : Chargez SentenceTransformer une fois globalement, pas par query.
Pour aller plus loin
Maîtrisez les embeddings avancés avec Hugging Face. Intégrez à LangChain : pip install langchain-lancedb. Docs officiels : LanceDB Docs. Découvrez nos formations Learni sur les bases vectorielles pour scaler en prod.