Що таке Chroma?
Chroma — відкрита векторна база даних, спеціально розроблена для AI-застосунків. Вона вбудовується в Python без додаткових сервісів (embedded mode) або працює як окремий сервер. Ідеальна для RAG-систем на невеликих та середніх обсягах даних.
Встановлення
>pip install chromadbEmbedded режим (без сервера)
import chromadb
# Постійне сховище на диску
client = chromadb.PersistentClient(path="./my_chroma_db")
# Створення колекції
collection = client.get_or_create_collection("documents")
# Додавання документів
collection.add(
documents=["VDS сервер надає виділені ресурси", "Хостинг підходить для невеликих сайтів"],
metadatas=[{"source": "faq"}, {"source": "faq"}],
ids=["doc1", "doc2"]
)
# Пошук
results = collection.query(
query_texts=["який хостинг обрати для високого навантаження?"],
n_results=2
)
print(results["documents"])Server режим (для продакшна)
docker run -d \
--name chroma \
-p 8000:8000 \
-v chroma_data:/chroma/chroma \
--restart always \
chromadb/chromaІнтеграція з LangChain
from langchain_community.vectorstores import Chroma
from langchain_community.embeddings import OllamaEmbeddings
embeddings = OllamaEmbeddings(model="nomic-embed-text")
db = Chroma(persist_directory="./chroma_db", embedding_function=embeddings)
# Пошук схожих документів
docs = db.similarity_search("питання користувача", k=3)
for doc in docs:
print(doc.page_content)Часті помилки під час роботи з Chroma
«Collection expecting embedding with dimension»
InvalidDimensionException: Embedding dimension 384 does not match collection dimensionality 768Як і в інших векторних базах, розмірність фіксується при першому додаванні векторів у колекцію. Якщо пізніше змінили модель ембеддингів на іншу розмірність, стара колекція з новими векторами працювати не буде — потрібна нова колекція.
PersistentClient не зберігає дані між запусками
Якщо шлях у PersistentClient(path=...) при кожному запуску скрипту вказує на різні відносні директорії (наприклад, скрипт запускається з різних робочих каталогів), Chroma щоразу створює нове порожнє сховище. Використовуйте абсолютний шлях.
Server-режим недоступний ззовні контейнера
curl: (7) Failed to connect to IP port 8000: Connection refusedПеревірте прокидання порту -p 8000:8000 і те, що volume chroma_data примонтовано — без цього дані server-режиму також втрачаються при перестворенні контейнера.
«database is locked» за паралельного доступу в embedded-режимі
sqlite3.OperationalError: database is lockedEmbedded-режим Chroma зберігає дані в SQLite прямо у файловій системі, а SQLite погано переносить паралельний запис з кількох процесів одночасно. Якщо до одного persist_directory звертаються кілька воркерів застосунку, переходьте на server-режим — там доступ до сховища йде через один процес мережею.
Embedded і Server режими: що обрати
Різниця між режимами не в можливостях пошуку, а в тому, хто і як звертається до сховища: один процес напряму чи кілька клієнтів мережею.
| Критерій | Embedded режим | Server режим |
|---|---|---|
| Де живуть дані | Усередині процесу Python | Окремий сервіс мережею |
| Доступ з кількох застосунків | Ні | Так |
| Підходить для | Прототипів і скриптів | Продакшн-сервісів |
| Паралельний запис з кількох процесів | Проблематичний | Підтримується |
Коли Chroma не підходить
Простота Chroma на старті обертається обмеженнями там, де навантаження чи вимоги до даних виходять за межі невеликого проєкту.
- Обсяг даних зростає до мільйонів векторів з високим навантаженням на пошук — для такого масштабу краще підходить Qdrant з його продакшн-орієнтованою архітектурою на Rust
- Дані вже зберігаються в PostgreSQL, і хочеться єдину базу без окремого сервісу — тоді логічніше pgvector
- Потрібна складна фільтрація за вкладеними метаданими під час пошуку — можливості Chroma в цьому плані обмеженіші, ніж у спеціалізованих векторних БД
- Критична горизонтальна масштабованість на кілька вузлів — Chroma для цього не проєктувалася від початку
- Кілька процесів застосунку мають одночасно писати в одну колекцію — embedded-режим на SQLite для цього не розрахований
Перевірка результату
Перш ніж покладатися на Chroma в продакшні, варто перевірити і якість пошуку, і стійкість до перезапуску процесу.
- Додайте тестові документи в колекцію і виконайте запит
queryзі зрозумілим за змістом текстом - Переконайтеся, що серед результатів на першому місці опиняється найрелевантніший документ
- У server-режимі перевірте доступність API ззовні контейнера через curl
- Перезапустіть процес або контейнер і переконайтеся, що раніше додані документи нікуди не поділися
- Якщо до бази звертаються кілька воркерів, переконайтеся, що використовується server-режим, а не спільний файл SQLite
За темою: потужніша база для продакшна — Qdrant на VDS, порівняння всіх варіантів — векторні бази даних, готова система відповідей за документами — RAG на VDS.