Что такое 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.