Інтеграція ChromaDB для векторного сховища AI в мобільних додатках
ChromaDB — легка open-source векторна база даних, написана переважно для Python-екосистеми. Запускається у пам'яті, вбудованої або як сервер. Головна перевага — мінімальний поріг входження: pip install chromadb і три рядки коду до першого пошуку.
Де ChromaDB доречний у мобільному контексті
Щира відповідь: ChromaDB — це рішення для бекенду, не для мобільного. На iOS та Android ChromaDB не запускається нативно. Інтеграція в мобільний додаток означає:
- Сервер ChromaDB на вашому бекенді (Python/FastAPI) + REST API для мобільного клієнта
- Python-скрипти для офлайн-індексації документів + експорт результатів
Це відрізняє ChromaDB від Pinecone (керована хмара) та Weaviate (підтримує Java/TS клієнти). ChromaDB — правильний вибір для прототипів, малих внутрішніх інструментів та стартапів з Python-бекендом, які хочуть швидко додати RAG.
Базова інтеграція на Python-бекенді
import chromadb
from chromadb.config import Settings
# Постійний клієнт (зберігає дані на диску)
client = chromadb.PersistentClient(path="/data/chroma")
# Колекція з метрикою косинусної схожості
collection = client.get_or_create_collection(
name="knowledge_base",
metadata={"hnsw:space": "cosine"}
)
# Добавлення документів
collection.add(
documents=["текст чанка 1", "текст чанка 2"],
embeddings=[[0.1, 0.2, ...], [0.3, 0.4, ...]], # ваші вбудовування
metadatas=[
{"source": "manual.pdf", "user_id": "42", "lang": "ru"},
{"source": "faq.txt", "user_id": "42", "lang": "ru"}
],
ids=["doc1_chunk1", "doc1_chunk2"]
)
Якщо не передавати embeddings, ChromaDB створить їх через вбудовану DefaultEmbeddingFunction (Sentence Transformers all-MiniLM-L6-v2). Зручно для прототипу, але повільно для продакшену — краще генерувати вбудовування окремо пакетом.
FastAPI-обгортка для мобільного клієнта
from fastapi import FastAPI, Depends
from pydantic import BaseModel
app = FastAPI()
class SearchRequest(BaseModel):
query: str
user_id: str
limit: int = 5
@app.post("/api/search")
async def search(req: SearchRequest, user=Depends(get_current_user)):
# Перевіряємо, що user_id збігається з аутентифікованим користувачем
if req.user_id != user.id:
raise HTTPException(status_code=403)
query_embedding = embedder.embed(req.query)
results = collection.query(
query_embeddings=[query_embedding],
n_results=req.limit,
where={"user_id": req.user_id}, # фільтр по користувачу
include=["documents", "metadatas", "distances"]
)
return format_results(results)
Мобільний клієнт викликає /api/search — без прямого доступу до ChromaDB.
Обмеження, які нужно знати перед інтеграцією
Багатотенантність через фільтр метаданих. ChromaDB не має нативної ізоляції по користувачам, як Weaviate tenants. Ізоляція тільки через where={"user_id": ...}. При великій кількості користувачів або документів це стає повільним — фільтр застосовується після ANN, не до.
Відсутність горизонтального масштабування. ChromaDB не розподілений. Один вузол. Для великих продуктів (10М+ векторів, високий RPS) це обмеження. Для стартапу до 500К документів — достатньо.
Без вбудованого гібридного пошуку. Тільки векторний пошук. Для якісного RAG доведеться додавати BM25 вручну (наприклад, через бібліотеку rank_bm25 Python) і робити RRF-слиття результатів.
# RRF (Reciprocal Rank Fusion) для гібридного пошуку
def rrf_merge(vector_results, bm25_results, k=60):
scores = {}
for rank, doc_id in enumerate(vector_results):
scores[doc_id] = scores.get(doc_id, 0) + 1 / (k + rank + 1)
for rank, doc_id in enumerate(bm25_results):
scores[doc_id] = scores.get(doc_id, 0) + 1 / (k + rank + 1)
return sorted(scores.keys(), key=lambda x: scores[x], reverse=True)
Міграція з ChromaDB на production-систему
Часто ChromaDB використовують як стартову точку, а при зростанні навантаження мігрують на Weaviate або pgvector. Це нормальний шлях. Робіть інтерфейс пошуку абстрактним з самого початку:
class VectorStore(ABC):
@abstractmethod
def search(self, embedding: List[float], user_id: str, limit: int) -> List[Document]:
pass
class ChromaVectorStore(VectorStore): ...
class WeaviateVectorStore(VectorStore): ...
Заміна реалізації не вплине на мобільний API.
Етапи та термін
Розгортання сервера ChromaDB → FastAPI-обгортка з аутентифікацією → ingestion скрипти → endpoint пошуку для мобільного клієнта → тестування якості → моніторинг.
MVP з ChromaDB та базовим RAG — 1–2 тижні. Виробничий варіант з гібридним пошуком та правильною ізоляцією користувачів — 3–4 тижні.







