Интеграция ChromaDB для векторного хранилища AI в мобильном приложении
ChromaDB — легковесная open-source векторная БД, написанная преимущественно для Python-экосистемы. Запускается в памяти, встроенно или как сервер. Главное преимущество — минимальный порог входа: pip install chromadb и три строки кода до первого поиска.
Где ChromaDB уместен в мобильном контексте
Честный ответ: ChromaDB — бэкенд-решение, не мобильное. На iOS и Android ChromaDB не запускается нативно. Интеграция в мобильное приложение означает:
- Сервер ChromaDB на вашем бэкенде (Python/FastAPI) + REST API для мобильного клиента
- Python-скрипты для offline-индексации документов + экспорт результатов
Это отличает ChromaDB от Pinecone (managed cloud) и Weaviate (поддерживает Java/TS клиенты). ChromaDB — правильный выбор для прототипов, небольших внутренних инструментов и стартапов с Python-бэкендом, которые хотят быстро добавить RAG.
Базовая интеграция на Python-бэкенде
import chromadb
from chromadb.config import Settings
# Persistent клиент (хранит данные на диске)
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.
Ограничения, которые нужно знать до интеграции
Мультитенантность через metadata filter. ChromaDB не имеет нативной изоляции по пользователям, как Weaviate tenants. Изоляция только через where={"user_id": ...}. При большом количестве пользователей или документов это становится медленным — filter применяется после ANN, не до.
Отсутствие горизонтального масштабирования. ChromaDB не распределённый. Один узел. Для крупных продуктов (10M+ векторов, высокий RPS) это ограничение. Для стартапа до 500K документов — достаточно.
Без встроенного hybrid search. Только векторный поиск. Для качественного RAG придётся добавлять BM25 вручную (например, через rank_bm25 Python-библиотеку) и делать RRF-слияние результатов.
# RRF (Reciprocal Rank Fusion) для hybrid search
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 недели. Производственный вариант с hybrid search и правильной изоляцией пользователей — 3–4 недели.







