Configuration de ChromaDB pour les applications RAG
Démarrez avec ChromaDB : base de données vectorielle légère et rapide, parfaite pour le prototypage et les systèmes RAG en production.
Pourquoi ChromaDB ?
ChromaDB est le moyen le plus rapide de commencer avec la recherche vectorielle :
- ✅ Aucune infrastructure requise
- ✅ Fonctionne en mémoire ou persistant
- ✅ Fonctions d'embedding intégrées
- ✅ Parfait pour le prototypage
- ✅ Évolue vers la production
Installation (novembre 2025)
DEVELOPERbashpip install chromadb # Optional: For persistent storage pip install chromadb[server]
Démarrage rapide
DEVELOPERpythonimport chromadb # Create client (in-memory) client = chromadb.Client() # Or persistent client = chromadb.PersistentClient(path="./chroma_db") # Create collection collection = client.create_collection( name="my_documents", metadata={"description": "RAG knowledge base"} )
Ajout de documents
DEVELOPERpython# Add documents with automatic embedding collection.add( documents=[ "This is about machine learning", "Python is a programming language", "Vector databases store embeddings" ], metadatas=[ {"source": "ml_book", "page": 1}, {"source": "python_guide", "page": 5}, {"source": "db_manual", "page": 12} ], ids=["doc1", "doc2", "doc3"] )
Utilisation d'embeddings personnalisés
DEVELOPERpythonfrom sentence_transformers import SentenceTransformer model = SentenceTransformer('all-MiniLM-L6-v2') # Generate embeddings texts = ["doc1 text", "doc2 text"] embeddings = model.encode(texts).tolist() # Add with pre-computed embeddings collection.add( embeddings=embeddings, documents=texts, ids=["id1", "id2"] )
Requêtes
DEVELOPERpython# Simple similarity search results = collection.query( query_texts=["machine learning algorithms"], n_results=5 ) print(results['documents']) print(results['distances']) print(results['metadatas'])
Filtrage avancé
DEVELOPERpython# Filter by metadata results = collection.query( query_texts=["python"], n_results=10, where={"source": "python_guide"} # Only from python_guide ) # Filter by ID results = collection.query( query_texts=["databases"], where_document={"$contains": "vector"} # Document must contain "vector" )
Mise à jour des documents
DEVELOPERpython# Update existing document collection.update( ids=["doc1"], documents=["Updated content about ML"], metadatas=[{"source": "ml_book", "page": 2, "updated": True}] ) # Delete documents collection.delete(ids=["doc2"])
Configuration production (2025)
Mode serveur ChromaDB pour la production :
DEVELOPERbash# Start server chroma run --host 0.0.0.0 --port 8000
DEVELOPERpython# Connect from client import chromadb client = chromadb.HttpClient( host="localhost", port=8000 )
Déploiement Docker
DEVELOPERyaml# docker-compose.yml version: '3.8' services: chromadb: image: chromadb/chroma:latest ports: - "8000:8000" volumes: - chroma_data:/chroma/chroma environment: - ALLOW_RESET=true volumes: chroma_data:
Optimisation des performances
DEVELOPERpython# Batch operations for speed batch_size = 100 for i in range(0, len(docs), batch_size): batch = docs[i:i+batch_size] collection.add( documents=batch, ids=[f"doc_{j}" for j in range(i, i+len(batch))] )
Recherche hybride (ChromaDB + BM25)
DEVELOPERpythonfrom rank_bm25 import BM25Okapi # BM25 for keyword search tokenized_docs = [doc.split() for doc in documents] bm25 = BM25Okapi(tokenized_docs) # Query both def hybrid_search(query, n_results=5, alpha=0.7): # Vector search (ChromaDB) vector_results = collection.query( query_texts=[query], n_results=n_results*2 ) # Keyword search (BM25) bm25_scores = bm25.get_scores(query.split()) # Merge results # ... (combine scores with alpha weighting) return top_results
ChromaDB vs Alternatives (nov 2025)
| Fonctionnalité | ChromaDB | Pinecone | Qdrant |
|---|---|---|---|
| Configuration | Instantané | Inscription cloud | Docker |
| Coût | Gratuit | $70/mois+ | Gratuit/auto-hébergé |
| Échelle | 1M+ vecteurs | Milliards | Milliards |
| Meilleur pour | Prototypage | Production | Fonctionnalités avancées |
Migration vers base de données de production
Lorsque ChromaDB devient insuffisant :
DEVELOPERpython# Export from ChromaDB chroma_docs = collection.get() # Import to Pinecone/Qdrant for doc, emb in zip(chroma_docs['documents'], chroma_docs['embeddings']): production_db.upsert(doc, emb)
Bonnes pratiques
- Utilisez le mode persistant pour les données importantes
- Opérations par batch pour les performances
- Indexez les champs de métadonnées sur lesquels vous filtrez
- Surveillez la taille de la collection (ChromaDB est meilleur < 10M vecteurs)
- Sauvegardez régulièrement si vous utilisez le mode persistant
ChromaDB est parfait pour démarrer. C'est ce que nous utilisons chez Ailog pour le développement et les petits déploiements.
Tags
Articles connexes
Bases de Données Vectorielles : Stocker et Rechercher des Embeddings
Guide complet sur les bases de données vectorielles pour le RAG : comparaison des options populaires, stratégies d'indexation et optimisation des performances.
Qdrant : Fonctionnalités Avancées de Recherche Vectorielle
Exploitez les fonctionnalités puissantes de Qdrant : indexation de payload, quantization, déploiement distribué pour des systèmes RAG haute performance.
Pinecone pour le RAG de Production à Grande Échelle
Déployez la recherche vectorielle prête pour la production : configuration de Pinecone, stratégies d'indexation et mise à l'échelle jusqu'à des milliards de vecteurs.