Strona główna / Artykuły / ChromaDB jako „mózg wektorowy” dla chatbotów świadomych dokumentów

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.

1352 słów

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