К основному содержимому

Chroma DB на VDS: векторная база данных для RAG

AI-агенты на VDS · 19.04.2026 · 4 мин чтения
Иллюстрация к статье «Chroma DB на VDS: векторная база данных для RAG»

Что такое Chroma?

Chroma — открытая векторная база данных, специально разработанная для AI-приложений. Она встраивается в Python без дополнительных сервисов (embedded mode) или работает как отдельный сервер. Идеальна для RAG-систем на небольших и средних объёмах данных.

Установка

>pip install chromadb

Embedded режим (без сервера)

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 vs Qdrant: Chroma проще в старте, подходит для прототипов. Qdrant мощнее для продакшна с большими объёмами (миллионы векторов).

Частые ошибки при работе с 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 locked

Embedded-режим Chroma хранит данные в SQLite прямо в файловой системе, а SQLite плохо переносит параллельную запись из нескольких процессов одновременно. Если к одному persist_directory обращаются несколько воркеров приложения, переходите на server-режим — там доступ к хранилищу идёт через один процесс по сети.

Embedded и Server режимы: что выбрать

Разница между режимами не в возможностях поиска, а в том, кто и как обращается к хранилищу: один процесс напрямую или несколько клиентов по сети.

КритерийEmbedded режимServer режим
Где живут данныеВнутри процесса PythonОтдельный сервис по сети
Доступ из нескольких приложенийНетДа
Подходит дляПрототипов и скриптовПродакшн-сервисов
Параллельная запись из нескольких процессовПроблематичнаПоддерживается

Когда Chroma не подходит

Простота Chroma на старте оборачивается ограничениями там, где нагрузка или требования к данным выходят за рамки небольшого проекта.

  • Объём данных растёт к миллионам векторов с высокой нагрузкой на поиск — для такого масштаба лучше подходит Qdrant с его продакшн-ориентированной архитектурой на Rust
  • Данные уже хранятся в PostgreSQL и хочется единую базу без отдельного сервиса — тогда логичнее pgvector
  • Нужна сложная фильтрация по вложенным метаданным при поиске — возможности Chroma в этом плане ограниченнее, чем у специализированных векторных БД
  • Критична горизонтальная масштабируемость на несколько узлов — Chroma для этого не проектировалась изначально
  • Несколько процессов приложения должны одновременно писать в одну коллекцию — embedded-режим на SQLite для этого не рассчитан

Проверка результата

Перед тем как полагаться на Chroma в продакшне, стоит проверить и качество поиска, и устойчивость к перезапуску процесса.

  1. Добавьте тестовые документы в коллекцию и выполните запрос query с понятным по смыслу текстом
  2. Убедитесь, что среди результатов на первом месте оказывается наиболее релевантный документ
  3. В server-режиме проверьте доступность API снаружи контейнера через curl
  4. Перезапустите процесс или контейнер и убедитесь, что ранее добавленные документы никуда не делись
  5. Если к базе обращаются несколько воркеров, убедитесь, что используется server-режим, а не общий файл SQLite

По теме: более мощная база для продакшна — Qdrant на VDS, сравнение всех вариантов — векторные базы данных, готовая система ответов по документам — RAG на VDS.

Статья помогла?
← Назад в базу знаний Задать вопрос поддержке