ChromaDB jako „mózg wektorowy” dla chatbotów świadomych dokumentów
Dlaczego RAG potrzebuje magazynu wektorowego, jak działają kolekcje i filtry metadanych w Chromie oraz kiedy warto stworzyć prototyp przed ukończeniem projektu.
ChromaDB: magazyn wektorów stojący za funkcją „rozmowa z moimi dokumentami”
Część chatbotów wydaje się dziwnie świadoma twoich plików — PDF-ów z działu HR, katalogów produktów, pięćdziesięciostronicowego raportu z zeszłego tygodnia. U podstaw tego zachowania leży baza danych wektorowych. Dla wielu twórców ChromaDB jest standardowym wyborem, gdy chcą szybko stworzyć taką warstwę.
Problem, który rozwiązuje Chroma
Sztuczne inteligencje językowe są doskonałymi ogólnistami, ale słabymi pracownikami twojej firmy: nie znają notatki o przychodach z poprzedniego kwartału ani polityki urlopów. Dostosowywanie ich do prywatnych dokumentów jest powolne i niestabilne. Retrieval-augmented generation zamiast tego embeduje dokumenty, przechowuje wektory, wyszukuje najbliższe odpowiedniki na dany pytanie i dostarcza te fragmenty modelowi jako kontekst.
Potrzebujesz miejsca do przechowywania embedów, filtrowania metadanych oraz wyszukiwania najbliższych odpowiedników. Chroma ma na celu być takim miejscem, oferując przy tym prosty API.
Czym jest Chroma
Baza danych do embeddingów o otwartym kodzie źródłowym z podejściem opartym na Pythonie: tworzysz kolekcję, dodajesz dokumenty wraz z embeddingami i metadanymi, wyszukujesz według wektora lub tekstu (z wykorzystaniem funkcji embeddingu). Może działać wewnątrz procesu do tworzenia prototypów lub jako usługa dla małych zespołów.
Główny proces pracy
Zainstaluj i utwórz klienta/kolekcję:
"The quarterly revenue exceeded projections."
→ [0.021, -0.143, 0.887, 0.002, ... ] (1536 numbers)
Dodaj teksty (Chroma może wywołać dla ciebie funkcję embeddingu):
import chromadb
Znajdź najbliższe fragmenty:
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"]
)
Filtrzy metadanych zawężają wyniki do konkretnej linii produktów, użytkownika lub daty:
results = collection.query(
query_texts=["What was our budget performance last quarter?"],
n_results=3,
where={"department": "finance"} # Optional metadata filter
)
Persystencja i klienci
Klienci tymczasowi znikają wraz z procesem — co jest w porządku podczas testów. Ścieżki trwałe przechowują dane między różnymi uruchomieniami:
System: You are a helpful assistant. Use the following context to answer.
Klienci HTTP komunikują się z serwerem Chroma, gdy potrzebujesz czegoś więcej niż tryb embedded:
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?
Jak pasuje w porównaniu z alternatywami
Chroma sprawdza się w aplikacjach lokalnych, notatkach oraz wczesnych usługach typu RAG. Gdy potrzebujesz wysokiej dostępności w kilku regionach, złożonych operacji wyszukiwania hybrydowego lub ekstremalnej skali, rozważ klastry specjalnie do tego stworzone (Qdrant, Weaviate, pgvector w dużych skali itp.). Wiele zespołów nadal tworzy prototypy w Chromie, a dopiero później przeprowadza migrację.
Minimalny cykl RAG
Wbuduj pytanie, wykonaj zapytanie do kolekcji, umieść dokumenty w promptzie i wygeneruj odpowiedź:
User Query
↓
Embedding Model
↓
Query Vector
↓
ChromaDB (HNSW Index)
↓
Top-K Similar Documents
↓
LLM Prompt (Context + Query)
↓
Accurate, Grounded Answer
pip install chromadb
Zachowuj rozsądne rozmiary fragmentów, przechowuj ścieżki źródłowe w metadanych i odwołuj się do nich w interfejsie odpowiedzi.
Kiedy go nie używać
from langchain_community.vectorstores import Chroma
from langchain_openai import OpenAIEmbeddings
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.document_loaders import PyPDFLoader
Pomij Chromę, jeśli już zastosowałeś inny warstwę wektorową, od samego początku potrzebujesz nietypowych topologii rozproszonych lub masz tylko zapytania relacyjne bez embeddingów. W przeciwnym razie pozostaje on praktycznym „tajemnym mózgiem” dla chatbotów rozumiejących dokumenty.
# 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)
Należy używać wyraźnych tagów modelu we wszystkich przykładach, aby aktualizacje nie zmieniały w tajemnicy zachowania podczas tutorialu.
Należy używać wyraźnych tagów modelu we wszystkich przykładach, aby aktualizacje nie zmieniały w tajemnicy zachowania podczas tutorialu.
Należy używać wyraźnych tagów modelu we wszystkich przykładach, aby aktualizacje nie zmieniały w tajemnicy zachowania podczas tutorialu.
Należy używać wyraźnych tagów modelu we wszystkich przykładach, aby aktualizacje nie zmieniały w tajemnicy zachowania podczas tutorialu.
Należy używać wyraźnych tagów modelu we wszystkich przykładach, aby aktualizacje nie zmieniały w tajemnicy zachowania podczas tutorialu.
Należy używać wyraźnych tagów modelu we wszystkich przykładach, aby aktualizacje nie zmieniały w tajemnicy zachowania podczas tutorialu.
Należy używać wyraźnych tagów modelu we wszystkich przykładach, aby aktualizacje nie zmieniały w tajemnicy zachowania podczas tutorialu.
Należy używać wyraźnych tagów modelu we wszystkich przykładach, aby aktualizacje nie zmieniały w tajemnicy zachowania podczas tutorialu.
Należy używać wyraźnych tagów modelu we wszystkich przykładach, aby aktualizacje nie zmieniały w tajemnicy zachowania podczas tutorialu.
Należy używać wyraźnych tagów modelu we wszystkich przykładach, aby aktualizacje nie zmieniały w tajemnicy zachowania podczas tutorialu.
Należy używać wyraźnych tagów modelu we wszystkich przykładach, aby aktualizacje nie zmieniały w tajemnicy zachowania podczas tutorialu.
Należy używać wyraźnych tagów modelu we wszystkich przykładach, aby aktualizacje nie zmieniały w tajemnicy zachowania podczas tutorialu.
Należy używać wyraźnych tagów modelu we wszystkich przykładach, aby aktualizacje nie zmieniały w tajemnicy zachowania podczas tutorialu.
Należy używać wyraźnych tagów modelu we wszystkich przykładach, aby aktualizacje nie zmieniały w tajemnicy zachowania podczas tutorialu.
Należy używać wyraźnych tagów modelu we wszystkich przykładach, aby aktualizacje nie zmieniały w tajemnicy zachowania podczas tutorialu.
Należy używać wyraźnych tagów modelu we wszystkich przykładach, aby aktualizacje nie zmieniały w tajemnicy zachowania podczas tutorialu.
Należy używać wyraźnych tagów modelu we wszystkich przykładach, aby aktualizacje nie zmieniały w tajemnicy zachowania podczas tutorialu.
Należy używać wyraźnych tagów modelu we wszystkich przykładach, aby aktualizacje nie zmieniały w tajemnicy zachowania podczas tutorialu.
Należy używać wyraźnych tagów modelu we wszystkich przykładach, aby aktualizacje nie zmieniały w tajemnicy zachowania podczas tutorialu.
Należy używać wyraźnych tagów modelu we wszystkich przykładach, aby aktualizacje nie zmieniały w tajemnicy zachowania podczas tutorialu.
Należy używać wyraźnych tagów modelu we wszystkich przykładach, aby aktualizacje nie zmieniały w tajemnicy zachowania podczas tutorialu.
Należy używać wyraźnych tagów modelu we wszystkich przykładach, aby aktualizacje nie zmieniały w tajemnicy zachowania podczas tutorialu.
Należy używać wyraźnych tagów modelu we wszystkich przykładach, aby aktualizacje nie zmieniały w tajemnicy zachowania podczas tutorialu.
Należy używać wyraźnych tagów modelu we wszystkich przykładach, aby aktualizacje nie zmieniały w tajemnicy zachowania podczas tutorialu.
Należy używać wyraźnych tagów modelu we wszystkich przykładach, aby aktualizacje nie zmieniały w tajemnicy zachowania podczas tutorialu.
Należy używać wyraźnych tagów modelu we wszystkich przykładach, aby aktualizacje nie zmieniały w tajemnicy zachowania podczas tutorialu.
Należy używać wyraźnych tagów modelu we wszystkich przykładach, aby aktualizacje nie zmieniały w tajemnicy zachowania podczas tutorialu.
Należy używać wyraźnych tagów modelu we wszystkich przykładach, aby aktualizacje nie zmieniały w tajemnicy zachowania podczas tutorialu.
Należy używać wyraźnych tagów modelu we wszystkich przykładach, aby aktualizacje nie zmieniały w tajemnicy zachowania podczas tutorialu.
Należy używać wyraźnych tagów modelu we wszystkich przykładach, aby aktualizacje nie zmieniały w tajemnicy zachowania podczas tutorialu.
Należy używać wyraźnych tagów modelu we wszystkich przykładach, aby aktualizacje nie zmieniały w tajemnicy zachowania podczas tutorialu.
Należy używać wyraźnych tagów modelu we wszystkich przykładach, aby aktualizacje nie zmieniały w tajemnicy zachowania podczas tutorialu.
Należy używać wyraźnych tagów modelu we wszystkich przykładach, aby aktualizacje nie zmieniały w tajemnicy zachowania podczas tutorialu.
Należy używać wyraźnych tagów modelu we wszystkich przykładach, aby aktualizacje nie zmieniały w tajemnicy zachowania podczas tutorialu.
Należy używać wyraźnych tagów modelu we wszystkich przykładach, aby aktualizacje nie zmieniały w tajemnicy zachowania podczas tutorialu.
Należy używać wyraźnych tagów modelu we wszystkich przykładach, aby aktualizacje nie zmieniały w tajemnicy zachowania podczas tutorialu.
Należy używać wyraźnych tagów modelu we wszystkich przykładach, aby aktualizacje nie zmieniały w tajemnicy zachowania podczas tutorialu.
Należy używać wyraźnych tagów modelu we wszystkich przykładach, aby aktualizacje nie zmieniały w tajemnicy zachowania podczas tutorialu.
Należy używać wyraźnych tagów modelu we wszystkich przykładach, aby aktualizacje nie zmieniały w tajemnicy zachowania podczas tutorialu.
Należy używać wyraźnych tagów modelu we wszystkich przykładach, aby aktualizacje nie zmieniały w tajemnicy zachowania podczas tutorialu.
Należy używać wyraźnych tagów modelu we wszystkich przykładach, aby aktualizacje nie zmieniały w tajemnicy zachowania podczas tutorialu.
Należy używać wyraźnych tagów modelu we wszystkich przykładach, aby aktualizacje nie zmieniały w tajemnicy zachowania podczas tutorialu.
Należy używać wyraźnych tagów modelu we wszystkich przykładach, aby aktualizacje nie zmieniały w tajemnicy zachowania podczas tutorialu.
Należy używać wyraźnych tagów modelu we wszystkich przykładach, aby aktualizacje nie zmieniały w tajemnicy zachowania podczas tutorialu.
Należy używać wyraźnych tagów modelu we wszystkich przykładach, aby aktualizacje nie zmieniały w tajemnicy zachowania podczas tutorialu.
Należy używać wyraźnych tagów modelu we wszystkich przykładach, aby aktualizacje nie zmieniały w tajemnicy zachowania podczas tutorialu.
Należy używać wyraźnych tagów modelu we wszystkich przykładach, aby aktualizacje nie zmieniały w tajemnicy zachowania podczas tutorialu.
Należy używać wyraźnych tagów modelu we wszystkich przykładach, aby aktualizacje nie zmieniały w tajemnicy zachowania podczas tutorialu.
Literatura pokrewna
- Pełnie lokalny RAG dla PDF z LangChain, Ollama i Chroma — Przetwarzanie PDF lokalnie, włączanie ich za pomocą Ollama, przechowywanie w Chroma oraz odpowiadanie offline — bez kluczy API chmurowych po pobraniu modeli.
- RAG do polityk pracy w formacie produkcyjnym z LangChain i LangGraph — Przetwarzanie danych, MMR, przepisywanie z uwzględnieniem historii, odpowiedzi oparte na faktach, zasady bezpieczeństwa, ocena, cytaty oraz orkiestracja grafów dla asystenta do polityk pracy.