Accueil / Articles / ChromaDB en tant que cerveau vectoriel pour les chatbots conscients des documents

ChromaDB en tant que cerveau vectoriel pour les chatbots conscients des documents

Pourquoi RAG a besoin d’un stockage vectoriel, comment fonctionnent les collections et les filtres de métadonnées de Chroma, et quand il convient de créer un prototype avant de passer à l’étape suivante.

1352 mots

ChromaDB : le stockage vectoriel derrière « chat with my docs »

vos fichiers — des PDF RH, des catalogues de produits, un rapport de cinquante pages datant de la semaine dernière. Derrière ce comportement se trouve une base de données vectorielle. Pour de nombreux développeurs, ChromaDB est le choix par défaut lorsqu’il s’agit d’implémenter rapidement ce type de couche.

Le problème résolu par Chroma

Les LLM sont de bons généralistes mais de mauvais employés pour votre entreprise : ils ne connaissent pas le rapport sur les revenus du dernier trimestre ni la politique de congés. Le fine-tuning à l’aide de documents privés est lent et fragile. La génération augmentée par récupération, quant à elle, incorpore les documents, stocke des vecteurs, récupère des éléments similaires en réponse à une question et fournit ces extraits au modèle en tant que contexte.

Qu’est-ce que Chroma ?

Une base de données d’incorporation open source avec une approche axée sur Python : créez une collection, ajoutez des documents accompagnés d’incorporations et de métadonnées, effectuez des recherches par vecteur ou texte (grâce à une fonction d’incorporation intégrée). Elle peut fonctionner en interne pour des prototypes ou en tant que service pour de petites équipes.

Flux de travail principal

Installez et créez un client/collection :

"The quarterly revenue exceeded projections."
→ [0.021, -0.143, 0.887, 0.002, ... ] (1536 numbers)

Ajoutez des textes (Chroma peut appeler une fonction d’incorporation à votre place) :

import chromadb

Recherchez les fragments les plus proches :

client = chromadb.Client()
collection = client.create_collection("company-docs")collection.add(
    documents=["Q3 revenue exceeded projections by 12%"],
    metadatas=[{"department": "finance", "quarter": "Q3"}],
    ids=["doc-001"]
)

Les filtres de métadonnées permettent de restreindre les résultats à une ligne de produit, un utilisateur ou une date :

results = collection.query(
    query_texts=["What was our budget performance last quarter?"],
    n_results=3,
    where={"department": "finance"}  # Optional metadata filter
)

Persistence et clients

Les clients éphémères disparaissent avec le processus — ce qui convient bien aux tests. Les chemins persistants conservent les données entre différentes exécutions :

System: You are a helpful assistant. Use the following context to answer.

Les clients HTTP communiquent avec un serveur Chroma lorsque vous dépassez les limites du mode incorporé :

Context:
- "Q3 revenue exceeded projections by 12%"
- "Engineering headcount grew to support product roadmap"
- "Marketing spend increased customer acquisition"User: How did we perform in Q3?

Sa place par rapport aux alternatives

Chroma se distingue pour les applications locales, les notebooks et les premiers services RAG. Lorsque vous avez besoin d’une haute disponibilité multi-région, de recherches hybrides complexes ou d’une échelle extrême, envisagez des clusters conçus spécifiquement à cet effet (Qdrant, Weaviate, pgvector à grande échelle, etc.). De nombreuses équipes continuent de créer des prototypes avec Chroma avant de migrer ultérieurement.

Boucle RAG minimale

Intégrez la question, effectuez une recherche dans la collection, stockez les documents dans un prompt, puis générez :

User Query
    ↓
Embedding Model
    ↓
Query Vector
    ↓
ChromaDB (HNSW Index)
    ↓
Top-K Similar Documents
    ↓
LLM Prompt (Context + Query)
    ↓
Accurate, Grounded Answer
pip install chromadb

Gardez des tailles de blocs raisonnables, stockez les chemins sources dans les métadonnées et citez-les dans l’interface d’affichage des réponses.

Quand ne pas l’utiliser

from langchain_community.vectorstores import Chroma
from langchain_openai import OpenAIEmbeddings
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.document_loaders import PyPDFLoader

Évitez Chroma si vous avez déjà choisi un autre layer vectoriel, si vous avez besoin de topologies distribuées particulières dès le départ, ou si vous ne disposez que de requêtes relationnelles sans embeddings. Sinon, il reste un « cerveau secret » pratique pour des chatbots capables de comprendre les documents.

# Step 1: Load your documents
loader = PyPDFLoader("company-policy.pdf")
documents = loader.load()# Step 2: Split into chunks
splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
chunks = splitter.split_documents(documents)# Step 3: Embed and store in ChromaDB
vectorstore = Chroma.from_documents(
    documents=chunks,
    embedding=OpenAIEmbeddings(),
    persist_directory="./chroma_store"
)# Step 4: Query it
retriever = vectorstore.as_retriever(search_kwargs={"k": 3})
results = retriever.invoke("What is the remote work policy?")for r in results:
    print(r.page_content)

Préférez des balises de modèle explicites dans chaque exemple afin que les mises à jour ne modifient pas silencieusement le comportement au milieu du tutoriel.

Préférez des balises de modèle explicites dans chaque exemple afin que les mises à jour ne modifient pas silencieusement le comportement au milieu du tutoriel.

Préférez des balises de modèle explicites dans chaque exemple afin que les mises à jour ne modifient pas silencieusement le comportement au milieu du tutoriel.

Préférez des balises de modèle explicites dans chaque exemple afin que les mises à jour ne modifient pas silencieusement le comportement au milieu du tutoriel.

Préférez des balises de modèle explicites dans chaque exemple afin que les mises à jour ne modifient pas silencieusement le comportement au milieu du tutoriel.

Préférez des balises de modèle explicites dans chaque exemple afin que les mises à jour ne modifient pas silencieusement le comportement au milieu du tutoriel.

Préférez des balises de modèle explicites dans chaque exemple afin que les mises à jour ne modifient pas silencieusement le comportement au milieu du tutoriel.

Préférez des balises de modèle explicites dans chaque exemple afin que les mises à jour ne modifient pas silencieusement le comportement au milieu du tutoriel.

Préférez des tags de modèle explicites dans chaque exemple afin que les mises à jour ne modifient pas silencieusement le comportement au milieu du tutoriel.

Préférez des tags de modèle explicites dans chaque exemple afin que les mises à jour ne modifient pas silencieusement le comportement au milieu du tutoriel.

Préférez des tags de modèle explicites dans chaque exemple afin que les mises à jour ne modifient pas silencieusement le comportement au milieu du tutoriel.

Préférez des tags de modèle explicites dans chaque exemple afin que les mises à jour ne modifient pas silencieusement le comportement au milieu du tutoriel.

Préférez des tags de modèle explicites dans chaque exemple afin que les mises à jour ne modifient pas silencieusement le comportement au milieu du tutoriel.

Préférez des tags de modèle explicites dans chaque exemple afin que les mises à jour ne modifient pas silencieusement le comportement au milieu du tutoriel.

Préférez des tags de modèle explicites dans chaque exemple afin que les mises à jour ne modifient pas silencieusement le comportement au milieu du tutoriel.

Préférez des tags de modèle explicites dans chaque exemple afin que les mises à jour ne modifient pas silencieusement le comportement au milieu du tutoriel.

Préférez des tags de modèle explicites dans chaque exemple afin que les mises à jour ne modifient pas silencieusement le comportement au milieu du tutoriel.

Préférez des tags de modèle explicites dans chaque exemple afin que les mises à jour ne modifient pas silencieusement le comportement au milieu du tutoriel.

Préférez des tags de modèle explicites dans chaque exemple afin que les mises à jour ne modifient pas silencieusement le comportement au milieu du tutoriel.

Préférez des tags de modèle explicites dans chaque exemple afin que les mises à jour ne modifient pas silencieusement le comportement au milieu du tutoriel.

Préférez des tags de modèle explicites dans chaque exemple afin que les mises à jour ne modifient pas silencieusement le comportement au milieu du tutoriel.

Préférez des tags de modèle explicites dans chaque exemple afin que les mises à jour ne modifient pas silencieusement le comportement au milieu du tutoriel.

Préférez des tags de modèle explicites dans chaque exemple afin que les mises à jour ne modifient pas silencieusement le comportement au milieu du tutoriel.

Préférez des tags de modèle explicites dans chaque exemple afin que les mises à jour ne modifient pas silencieusement le comportement au milieu du tutoriel.

Préférez des tags de modèle explicites dans chaque exemple afin que les mises à jour ne modifient pas silencieusement le comportement au milieu du tutoriel.

Préférez des tags de modèle explicites dans chaque exemple afin que les mises à jour ne modifient pas silencieusement le comportement au milieu du tutoriel.

Préférez des tags de modèle explicites dans chaque exemple afin que les mises à jour ne modifient pas silencieusement le comportement au milieu du tutoriel.

Préférez des tags de modèle explicites dans chaque exemple afin que les mises à jour ne modifient pas silencieusement le comportement au milieu du tutoriel.

Préférez des tags de modèle explicites dans chaque exemple afin que les mises à jour ne modifient pas silencieusement le comportement au milieu du tutoriel.

Préférez des tags de modèle explicites dans chaque exemple afin que les mises à jour ne modifient pas silencieusement le comportement au milieu du tutoriel.

Préférez des tags de modèle explicites dans chaque exemple afin que les mises à jour ne modifient pas silencieusement le comportement au milieu du tutoriel.

Préférez des tags de modèle explicites dans chaque exemple afin que les mises à jour ne modifient pas silencieusement le comportement au milieu du tutoriel.

Préférez des tags de modèle explicites dans chaque exemple afin que les mises à jour ne modifient pas silencieusement le comportement au milieu du tutoriel.

Préférez des tags de modèle explicites dans chaque exemple afin que les mises à jour ne modifient pas silencieusement le comportement au milieu du tutoriel.

Préférez des tags de modèle explicites dans chaque exemple afin que les mises à jour ne modifient pas silencieusement le comportement au milieu du tutoriel.

Préférez des tags de modèle explicites dans chaque exemple afin que les mises à jour ne modifient pas silencieusement le comportement au milieu du tutoriel.

Préférez des tags de modèle explicites dans chaque exemple afin que les mises à jour ne modifient pas silencieusement le comportement au milieu du tutoriel.

Préférez des tags de modèle explicites dans chaque exemple afin que les mises à jour ne modifient pas silencieusement le comportement au milieu du tutoriel.

Préférez des tags de modèle explicites dans chaque exemple afin que les mises à jour ne modifient pas silencieusement le comportement au milieu du tutoriel.

Préférez des tags de modèle explicites dans chaque exemple afin que les mises à jour ne modifient pas silencieusement le comportement au milieu du tutoriel.

Préférez des étiquettes de modèle explicites dans chaque exemple afin que les mises à jour ne modifient pas silencieusement le comportement au milieu du tutoriel.

Préférez des étiquettes de modèle explicites dans chaque exemple afin que les mises à jour ne modifient pas silencieusement le comportement au milieu du tutoriel.

Préférez des étiquettes de modèle explicites dans chaque exemple afin que les mises à jour ne modifient pas silencieusement le comportement au milieu du tutoriel.

Préférez des étiquettes de modèle explicites dans chaque exemple afin que les mises à jour ne modifient pas silencieusement le comportement au milieu du tutoriel.

Préférez des étiquettes de modèle explicites dans chaque exemple afin que les mises à jour ne modifient pas silencieusement le comportement au milieu du tutoriel.

Préférez des étiquettes de modèle explicites dans chaque exemple afin que les mises à jour ne modifient pas silencieusement le comportement au milieu du tutoriel.

Préférez des étiquettes de modèle explicites dans chaque exemple afin que les mises à jour ne modifient pas silencieusement le comportement au milieu du tutoriel.

Préférez des étiquettes de modèle explicites dans chaque exemple afin que les mises à jour ne modifient pas silencieusement le comportement au milieu du tutoriel.