ChromaDB як векторний мозок для чат-ботів, що розуміють документи
Чому RAG потребує сховища векторів, як працюють колекції та фільтри метаданих у Chroma, і коли варто створити прототип ще до завершення навчання.
ChromaDB: база даних векторів, що лежить в основі „чату з моїми документами“
Деякі чат-боти дивно добре знають ваші файли — PDF-документи від відділу кадрів, каталоги продукції, п’ятдесятисторінковий звіт з минулого тижня. За цією поведінкою стоїть база даних векторів. Для багатьох розробників ChromaDB є стандартним вибором для швидкого створення такого шару.
Проблема, яку вирішує Chroma
Багатомовні моделі є сильними універсалами, але слабкими працівниками вашої компанії: вони не знають звіту про дохід за попередній квартал чи правил відпусток. Доопрацювання моделей на приватних документах є повільним та нестабільним. Retrieval-augmented generation натомість вбудовує документи, зберігає вектори, знаходить сусідні елементи для певного запиту та передає ці фрагменти моделі як контекст.
Вам потрібне місце для зберігання ембеддингів, фільтрації метаданих та пошуку найближчих елементів. Chroma прагне стати саме таким місцем із простим API.
Що таке Chroma
Це база даних з вбудовуванням відкритого коду із фокусом на Python: створюється колекція, додаються документи з ембеддингами та метаданими, виконуються запити за допомогою векторів або тексту (з використанням підключеної функції ембеддингу). Її можна використовувати безпосередньо у процесі для прототипування або як сервіс для невеликих команд.
Основний процес роботи
Встановіть та створіть клієнта/колекцію:
"The quarterly revenue exceeded projections."
→ [0.021, -0.143, 0.887, 0.002, ... ] (1536 numbers)
Додайте тексти (Chroma може викликати функцію ембеддингу за вас):
import chromadb
Знайдіть найближчі фрагменти:
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"]
)
Фільтри метаданих дозволяють звузити результати до певної лінійки продуктів, користувача чи дати:
results = collection.query(
query_texts=["What was our budget performance last quarter?"],
n_results=3,
where={"department": "finance"} # Optional metadata filter
)
Зберігання та клієнти
Тимчасові клієнти зникають разом із процесом — це підходить для тестів. Постійні шляхи зберігають дані між запусками:
System: You are a helpful assistant. Use the following context to answer.
Klientи HTTP взаємодіють із сервером Chroma, коли потреби виходять за межі режиму вбудовування:
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?
Місце Chroma серед альтернатив
Chroma ідеально підходить для локальних додатків, ноутбуків та початкових сервісів типу RAG. Якщо вам потрібна робота у кількох регіонах з підтримкою відмовостійкості, складні гібридні операції пошуку чи екстремальна масштабованість, розгляньте спеціально створені кластери (Qdrant, Weaviate, pgvector у масштабі тощо). Багато команд все ще створюють прототипи за допомогою Chroma, а потім мігрують на інші рішення.
Мінімальний цикл RAG
Вбудуйте запит, виконайте пошук у колекції, збережіть документи у форматі запиту та генеруйте результат:
User Query
↓
Embedding Model
↓
Query Vector
↓
ChromaDB (HNSW Index)
↓
Top-K Similar Documents
↓
LLM Prompt (Context + Query)
↓
Accurate, Grounded Answer
pip install chromadb
Тримайте розміри частин розсудливими, зберігайте шляхи до вихідних даних у метаданах та вказуйте їх у інтерфейсі відповідей.
Коли не варто його використовувати
from langchain_community.vectorstores import Chroma
from langchain_openai import OpenAIEmbeddings
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.document_loaders import PyPDFLoader
Обійдіться без Chroma, якщо ви вже обрали інший векторний шар, потребуєте екзотичних розподілених топологій вже з самого початку чи маєте лише реляційні запити без вбудованих даних. В іншому випадку це залишається практичним „тайним мозком“ для чат-ботів, які розуміють документи.
# 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)
Будь ласка, використовуйте чіткі теги моделей у кожному прикладі, щоб оновлення не таємно змінювали поведінку під час навчання.
Будь ласка, використовуйте чіткі теги моделей у кожному прикладі, щоб оновлення не таємно змінювали поведінку під час навчання.
Будь ласка, використовуйте чіткі теги моделей у кожному прикладі, щоб оновлення не таємно змінювали поведінку під час навчання.
Будь ласка, використовуйте чіткі теги моделей у кожному прикладі, щоб оновлення не таємно змінювали поведінку під час навчання.
Будь ласка, використовуйте чіткі теги моделей у кожному прикладі, щоб оновлення не таємно змінювали поведінку під час навчання.
Будь ласка, використовуйте чіткі теги моделей у кожному прикладі, щоб оновлення не таємно змінювали поведінку під час навчання.
Будь ласка, використовуйте чіткі теги моделей у кожному прикладі, щоб оновлення не таємно змінювали поведінку під час навчання.
Будь ласка, використовуйте чіткі теги моделей у кожному прикладі, щоб оновлення не таємно змінювали поведінку під час навчання.
Будь ласка, використовуйте чіткі теги моделей у кожному прикладі, щоб оновлення не таємно змінювали поведінку під час навчання.
Будь ласка, використовуйте чіткі теги моделей у кожному прикладі, щоб оновлення не таємно змінювали поведінку під час навчання.
Будь ласка, використовуйте чіткі теги моделей у кожному прикладі, щоб оновлення не таємно змінювали поведінку під час навчання.
Будь ласка, використовуйте чіткі теги моделей у кожному прикладі, щоб оновлення не таємно змінювали поведінку під час навчання.
Будь ласка, використовуйте чіткі теги моделей у кожному прикладі, щоб оновлення не таємно змінювали поведінку під час навчання.
Будь ласка, використовуйте чіткі теги моделей у кожному прикладі, щоб оновлення не таємно змінювали поведінку під час навчання.
Будь ласка, використовуйте чіткі теги моделей у кожному прикладі, щоб оновлення не таємно змінювали поведінку під час навчання.
Будь ласка, використовуйте чіткі теги моделей у кожному прикладі, щоб оновлення не таємно змінювали поведінку під час навчання.
Будь ласка, використовуйте чіткі теги моделей у кожному прикладі, щоб оновлення не таємно змінювали поведінку під час навчання.
Будь ласка, використовуйте чіткі теги моделей у кожному прикладі, щоб оновлення не таємно змінювали поведінку під час навчання.
Будь ласка, використовуйте чіткі теги моделей у кожному прикладі, щоб оновлення не таємно змінювали поведінку під час навчання.
Будь ласка, використовуйте чіткі теги моделей у кожному прикладі, щоб оновлення не таємно змінювали поведінку під час навчання.
Будь ласка, використовуйте чіткі теги моделей у кожному прикладі, щоб оновлення не таємно змінювали поведінку під час навчання.
Будь ласка, використовуйте чіткі теги моделей у кожному прикладі, щоб оновлення не таємно змінювали поведінку під час навчання.
Будь ласка, використовуйте чіткі теги моделей у кожному прикладі, щоб оновлення не таємно змінювали поведінку під час навчання.
Будь ласка, використовуйте чіткі теги моделей у кожному прикладі, щоб оновлення не таємно змінювали поведінку під час навчання.
Будь ласка, використовуйте чіткі теги моделей у кожному прикладі, щоб оновлення не таємно змінювали поведінку під час навчання.
Будь ласка, використовуйте чіткі теги моделей у кожному прикладі, щоб оновлення не таємно змінювали поведінку під час навчання.
Будь ласка, використовуйте чіткі теги моделей у кожному прикладі, щоб оновлення не таємно змінювали поведінку під час навчання.
Будь ласка, використовуйте чіткі теги моделей у кожному прикладі, щоб оновлення не таємно змінювали поведінку під час навчання.
Будь ласка, використовуйте чіткі теги моделей у кожному прикладі, щоб оновлення не таємно змінювали поведінку під час навчання.
Будь ласка, використовуйте чіткі теги моделей у кожному прикладі, щоб оновлення не таємно змінювали поведінку під час навчання.
Будь ласка, використовуйте чіткі теги моделей у кожному прикладі, щоб оновлення не таємно змінювали поведінку під час навчання.
Будь ласка, використовуйте чіткі теги моделей у кожному прикладі, щоб оновлення не таємно змінювали поведінку під час навчання.
Будь ласка, використовуйте чіткі теги моделей у кожному прикладі, щоб оновлення не таємно змінювали поведінку під час навчання.
Будь ласка, використовуйте чіткі теги моделей у кожному прикладі, щоб оновлення не таємно змінювали поведінку під час навчання.
Будь ласка, використовуйте чіткі теги моделей у кожному прикладі, щоб оновлення не таємно змінювали поведінку під час навчання.
Будь ласка, використовуйте чіткі теги моделей у кожному прикладі, щоб оновлення не таємно змінювали поведінку під час навчання.
Будь ласка, використовуйте чіткі теги моделей у кожному прикладі, щоб оновлення не таємно змінювали поведінку під час навчання.
Будь ласка, використовуйте чіткі теги моделей у кожному прикладі, щоб оновлення не таємно змінювали поведінку під час навчання.
Будь ласка, використовуйте чіткі теги моделей у кожному прикладі, щоб оновлення не таємно змінювали поведінку під час навчання.
Будь ласка, використовуйте чіткі теги моделей у кожному прикладі, щоб оновлення не таємно змінювали поведінку під час навчання.
Будь ласка, використовуйте чіткі теги моделей у кожному прикладі, щоб оновлення не таємно змінювали поведінку під час навчання.
Будь ласка, використовуйте чіткі теги моделей у кожному прикладі, щоб оновлення не таємно змінювали поведінку під час навчання.
Будь ласка, використовуйте чіткі теги моделей у кожному прикладі, щоб оновлення не таємно змінювали поведінку під час навчання.
Будь ласка, використовуйте чіткі теги моделей у кожному прикладі, щоб оновлення не таємно змінювали поведінку під час навчання.
Будь ласка, використовуйте чіткі теги моделей у кожному прикладі, щоб оновлення не таємно змінювали поведінку під час навчання.
Будь ласка, використовуйте чіткі теги моделей у кожному прикладі, щоб оновлення не таємно змінювали поведінку під час навчання.
Будь ласка, використовуйте чіткі теги моделей у кожному прикладі, щоб оновлення не таємно змінювали поведінку під час навчання.