До основного вмісту

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.

Чи була стаття корисною?
← Назад до бази знань Поставити питання підтримці