ChromaDB als Vektor-Brain für dokumentenbewusste Chatbots
Warum RAG einen Vektorstore benötigt, wie Chromas Sammlungen und Metadatenfilter funktionieren, und wann man vor dem Abschluss dort Prototypen erstellen sollte.
ChromaDB: der Vektor-Speicher hinter „Chat with my Docs“
Manche Chatbots scheinen seltsamerweise Kenntnis von Ihren Dateien zu haben – HR-PDFs, Produktkataloge oder ein fünfzigseitiger Bericht von letzter Woche. Hinter diesem Verhalten steckt eine Vector-Datenbank. Für viele Entwickler ist ChromaDB die Standardwahl, wenn diese Schicht schnell aufgebaut werden soll.
Das Problem, das Chroma löst
LLMs sind starke Allrounder, aber schwache Mitarbeiter Ihres Unternehmens: Sie kennen weder den Umsatzbericht des letzten Quartals noch die Urlaubsrichtlinien. Die Feinabstimmung an privaten Dokumenten ist langsam und anfällig. Retrieval-augmented Generation hingegen embeddet Dokumente, speichert Vektoren, holt für eine Frage passende Ergebnisse ab und gibt diese Auszüge dem Modell als Kontext.
Ihnen fehlt ein Ort, an dem Sie Embeddings speichern, Metadaten filtern und die nächstgelegenen Ergebnisse abrufen können. Chroma soll genau diesen Ort mit einer benutzerfreundlichen API bieten.
Was Chroma ist
Eine Open-Source-Embedding-Datenbank mit einem Python-fokussierten Entwicklungsansatz: Erstellen Sie eine Sammlung, fügen Sie Dokumente mit Embeddings und Metadaten hinzu sowie führen Sie Abfragen über Vektoren oder Text durch (mit integrierter Embedding-Funktion). Sie kann für Prototypen im Prozess selbst laufen oder als Service für kleine Teams genutzt werden.
Kernworkflow
Installieren und eine Client/Sammlung erstellen:
"The quarterly revenue exceeded projections."
→ [0.021, -0.143, 0.887, 0.002, ... ] (1536 numbers)
Texte hinzufügen (Chroma kann hierfür eine Embedding-Funktion aufrufen):
import chromadb
Nächste Passagen abfragen:
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"]
)
Metadatenfilter eingrenzen die Ergebnisse auf eine Produktlinie, einen Nutzer oder ein Datum:
results = collection.query(
query_texts=["What was our budget performance last quarter?"],
n_results=3,
where={"department": "finance"} # Optional metadata filter
)
Persistenz und Clients
Vorübergehende Clients gehen mit dem Prozess unter – geeignet für Tests. Persistente Pfade bewahren die Daten über mehrere Ausführungen hinweg auf:
System: You are a helpful assistant. Use the following context to answer.
Http-Clients kommunizieren mit einem Chroma-Server, wenn der eingebettete Modus nicht mehr ausreicht:
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?
Ihre Stärken im Vergleich zu Alternativen
Chroma eignet sich hervorragend für lokale Anwendungen, Notebooks sowie frühe RAG-Dienste. Wenn Sie eine Hochverfügbarkeit in mehreren Regionen, komplexe hybride Suchoperationen oder eine extreme Skalierbarkeit benötigen, sollten Sie auf speziell dafür konzipierte Cluster zurückgreifen (z. B. Qdrant, Weaviate, pgvector in großem Maßstab usw.). Viele Teams entwickeln zunächst Prototypen mit Chroma und migrieren später um.
Minimaler RAG-Zyklus
Embedden Sie die Frage, führen Sie eine Query-Operation auf der Sammlung durch, speichern Sie die Dokumente in einem Prompt und erzeugen Sie anschließend das Ergebnis:
User Query
↓
Embedding Model
↓
Query Vector
↓
ChromaDB (HNSW Index)
↓
Top-K Similar Documents
↓
LLM Prompt (Context + Query)
↓
Accurate, Grounded Answer
pip install chromadb
Achten Sie darauf, die Größen der Datenblöcke angemessen zu halten, speichern Sie die Quellpfade in den Metadaten und geben Sie sie in der Antwort-Oberfläche an.
Wann man es nicht verwenden sollte
from langchain_community.vectorstores import Chroma
from langchain_openai import OpenAIEmbeddings
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.document_loaders import PyPDFLoader
Verzichten Sie auf Chroma, wenn Sie bereits eine andere Vektor-Schicht standardisiert haben, von Anfang an exotische verteilte Topologien benötigen oder nur relationale Abfragen ohne Embeddings haben. Ansonsten bleibt es ein praktisches „geheimes Gehirn“ für chatbasierte Systeme, die Dokumente berücksichtigen müssen.
# 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)
Verwenden Sie in jedem Beispiel lieber explizite Modelltags, damit Updates das Verhalten während des Tutorials nicht heimlich ändern.
Verwenden Sie in jedem Beispiel lieber explizite Modelltags, damit Updates das Verhalten während des Tutorials nicht heimlich ändern.
Verwenden Sie in jedem Beispiel lieber explizite Modelltags, damit Updates das Verhalten während des Tutorials nicht heimlich ändern.
Verwenden Sie in jedem Beispiel lieber explizite Modelltags, damit Updates das Verhalten während des Tutorials nicht heimlich ändern.
Verwenden Sie in jedem Beispiel lieber explizite Modelltags, damit Updates das Verhalten während des Tutorials nicht heimlich ändern.
Verwenden Sie in jedem Beispiel lieber explizite Modelltags, damit Updates das Verhalten während des Tutorials nicht heimlich ändern.
Verwenden Sie in jedem Beispiel lieber explizite Modelltags, damit Updates das Verhalten während des Tutorials nicht heimlich ändern.
Verwenden Sie in jedem Beispiel lieber explizite Modelltags, damit Updates das Verhalten während des Tutorials nicht heimlich ändern.
Verwenden Sie in jedem Beispiel explizite Modelltags, damit Updates das Verhalten während des Tutorials nicht heimlich ändern.
Verwenden Sie in jedem Beispiel explizite Modelltags, damit Updates das Verhalten während des Tutorials nicht heimlich ändern.
Verwenden Sie in jedem Beispiel explizite Modelltags, damit Updates das Verhalten während des Tutorials nicht heimlich ändern.
Verwenden Sie in jedem Beispiel explizite Modelltags, damit Updates das Verhalten während des Tutorials nicht heimlich ändern.
Verwenden Sie in jedem Beispiel explizite Modelltags, damit Updates das Verhalten während des Tutorials nicht heimlich ändern.
Verwenden Sie in jedem Beispiel explizite Modelltags, damit Updates das Verhalten während des Tutorials nicht heimlich ändern.
Verwenden Sie in jedem Beispiel explizite Modelltags, damit Updates das Verhalten während des Tutorials nicht heimlich ändern.
Verwenden Sie in jedem Beispiel explizite Modelltags, damit Updates das Verhalten während des Tutorials nicht heimlich ändern.
Verwenden Sie in jedem Beispiel explizite Modelltags, damit Updates das Verhalten während des Tutorials nicht heimlich ändern.
Verwenden Sie in jedem Beispiel explizite Modelltags, damit Updates das Verhalten während des Tutorials nicht heimlich ändern.
Verwenden Sie in jedem Beispiel explizite Modelltags, damit Updates das Verhalten während des Tutorials nicht heimlich ändern.
Verwenden Sie in jedem Beispiel explizite Modelltags, damit Updates das Verhalten während des Tutorials nicht heimlich ändern.
Verwenden Sie in jedem Beispiel explizite Modelltags, damit Updates das Verhalten während des Tutorials nicht heimlich ändern.
Verwenden Sie in jedem Beispiel explizite Modelltags, damit Updates das Verhalten während des Tutorials nicht heimlich ändern.
Verwenden Sie in jedem Beispiel explizite Modelltags, damit Updates das Verhalten während des Tutorials nicht heimlich ändern.
Verwenden Sie in jedem Beispiel explizite Modelltags, damit Updates das Verhalten während des Tutorials nicht heimlich ändern.
Verwenden Sie in jedem Beispiel explizite Modelltags, damit Updates das Verhalten während des Tutorials nicht heimlich ändern.
Verwenden Sie in jedem Beispiel explizite Modelltags, damit Updates das Verhalten während des Tutorials nicht heimlich ändern.
Verwenden Sie in jedem Beispiel explizite Modelltags, damit Updates das Verhalten während des Tutorials nicht heimlich ändern.
Verwenden Sie in jedem Beispiel explizite Modelltags, damit Updates das Verhalten während des Tutorials nicht heimlich ändern.
Verwenden Sie in jedem Beispiel explizite Modelltags, damit Updates das Verhalten während des Tutorials nicht heimlich ändern.
Verwenden Sie in jedem Beispiel explizite Modelltags, damit Updates das Verhalten während des Tutorials nicht heimlich ändern.
Verwenden Sie in jedem Beispiel explizite Modelltags, damit Updates das Verhalten während des Tutorials nicht heimlich ändern.
Verwenden Sie in jedem Beispiel explizite Modelltags, damit Updates das Verhalten während des Tutorials nicht heimlich ändern.
Verwenden Sie in jedem Beispiel explizite Modelltags, damit Updates das Verhalten während des Tutorials nicht heimlich ändern.
Verwenden Sie in jedem Beispiel explizite Modelltags, damit Updates das Verhalten während des Tutorials nicht heimlich ändern.
Verwenden Sie in jedem Beispiel explizite Modelltags, damit Updates das Verhalten während des Tutorials nicht heimlich ändern.
Verwenden Sie in jedem Beispiel explizite Modelltags, damit Updates das Verhalten während des Tutorials nicht heimlich ändern.
Verwenden Sie in jedem Beispiel explizite Modelltags, damit Updates das Verhalten während des Tutorials nicht heimlich ändern.
Verwenden Sie in jedem Beispiel explizite Modelltags, damit Updates das Verhalten während des Tutorials nicht heimlich ändern.
Verwenden Sie in jedem Beispiel explizite Modelltags, damit Updates das Verhalten während des Tutorials nicht heimlich ändern.
Verwenden Sie in jedem Beispiel explizite Modelltags, damit Updates das Verhalten während des Tutorials nicht heimlich ändern.
Verwenden Sie in jedem Beispiel explizite Modelltags, damit Updates das Verhalten während des Tutorials nicht heimlich ändern.
Verwenden Sie in jedem Beispiel explizite Modelltags, damit Updates das Verhalten während des Tutorials nicht heimlich ändern.
Verwenden Sie in jedem Beispiel explizite Modelltags, damit Updates das Verhalten während des Tutorials nicht heimlich ändern.
Verwenden Sie in jedem Beispiel explizite Modelltags, damit Updates das Verhalten während des Tutorials nicht heimlich ändern.
Verwenden Sie in jedem Beispiel explizite Modelltags, damit Updates das Verhalten während des Tutorials nicht heimlich ändern.
Verwenden Sie in jedem Beispiel explizite Modelltags, damit Updates das Verhalten während des Tutorials nicht heimlich ändern.
Verwenden Sie in jedem Beispiel explizite Modelltags, damit Updates das Verhalten während des Tutorials nicht heimlich ändern.
Verwenden Sie in jedem Beispiel explizite Modelltags, damit Updates das Verhalten während des Tutorials nicht heimlich ändern.