Перейти к основному содержимому

Chroma

Открытая база данных эмбеддингов для AI-приложений. Храните эмбеддинги и метаданные, выполняйте векторный и полнотекстовый поиск, фильтруйте по метаданным. Простой API из 4 функций. Масштабируется от ноутбуков до производственных кластеров. Используйте для семантического поиска, RAG-приложений или поиска документов. Лучший выбор для локальной разработки и open-source проектов.

Метаданные навыка​

ИсточникОпционально — установка с помощью vibeos skills install official/mlops/chroma
Путьoptional-skills/mlops/chroma
Версия1.0.0
АвторOrchestra Research
ЛицензияMIT
Зависимостиchromadb, sentence-transformers
Платформыlinux, macos, windows
ТегиRAG, Chroma, Vector Database, Embeddings, Semantic Search, Open Source, Self-Hosted, Document Retrieval, Metadata Filtering

Справочник: полный SKILL.md​

к сведению

Ниже приведено полное описание навыка, которое VibeOS загружает при его активации. Агент видит эти инструкции, когда навык активен.

Chroma — открытая база данных эмбеддингов

База данных, созданная для AI, для построения LLM-приложений с памятью.

Когда использовать Chroma​

Используйте Chroma, когда:

  • Строите RAG-приложения (retrieval-augmented generation)
  • Нужна локальная/самостоятельно размещённая векторная база данных
  • Хотите open-source решение (Apache 2.0)
  • Прототипируете в ноутбуках
  • Выполняете семантический поиск по документам
  • Храните эмбеддинги с метаданными

Метрики:

  • 24 300+ звёзд на GitHub
  • 1 900+ форков
  • v1.3.3 (стабильная, еженедельные релизы)
  • Лицензия Apache 2.0

Вместо этого используйте альтернативы:

  • Pinecone: Управляемое облако, авто-масштабирование
  • FAISS: Чистый поиск по сходству, без метаданных
  • Weaviate: Продуктовая ML-ориентированная база данных
  • Qdrant: Высокая производительность, на Rust

Быстрый старт​

Установка​

# Python
pip install chromadb

# JavaScript/TypeScript
npm install chromadb @chroma-core/default-embed

Базовое использование (Python)​

import chromadb

# Создание клиента
client = chromadb.Client()

# Создание коллекции
collection = client.create_collection(name="my_collection")

# Добавление документов
collection.add(
documents=["Это документ 1", "Это документ 2"],
metadatas=[{"source": "doc1"}, {"source": "doc2"}],
ids=["id1", "id2"]
)

# Запрос
results = collection.query(
query_texts=["документ по теме"],
n_results=2
)

print(results)

Основные операции​

1. Создание коллекции​

# Простая коллекция
collection = client.create_collection("my_docs")

# С пользовательской функцией эмбеддинга
from chromadb.utils import embedding_functions

openai_ef = embedding_functions.OpenAIEmbeddingFunction(
api_key="your-key",
model_name="text-embedding-3-small"
)

collection = client.create_collection(
name="my_docs",
embedding_function=openai_ef
)

# Получение существующей коллекции
collection = client.get_collection("my_docs")

# Удаление коллекции
client.delete_collection("my_docs")

2. Добавление документов​

# Добавление с автоматически сгенерированными ID
collection.add(
documents=["Док 1", "Док 2", "Док 3"],
metadatas=[
{"source": "web", "category": "tutorial"},
{"source": "pdf", "page": 5},
{"source": "api", "timestamp": "2025-01-01"}
],
ids=["id1", "id2", "id3"]
)

# Добавление с пользовательскими эмбеддингами
collection.add(
embeddings=[[0.1, 0.2, ...], [0.3, 0.4, ...]],
documents=["Док 1", "Док 2"],
ids=["id1", "id2"]
)

3. Запрос (поиск по сходству)​

# Базовый запрос
results = collection.query(
query_texts=["учебник по машинному обучению"],
n_results=5
)

# Запрос с фильтрами
results = collection.query(
query_texts=["программирование на Python"],
n_results=3,
where={"source": "web"}
)

# Запрос с фильтрами по метаданным
results = collection.query(
query_texts=["продвинутые темы"],
where={
"$and": [
{"category": "tutorial"},
{"difficulty": {"$gte": 3}}
]
}
)

# Доступ к результатам
print(results["documents"]) # Список соответствующих документов
print(results["metadatas"]) # Метаданные для каждого документа
print(results["distances"]) # Оценки сходства
print(results["ids"]) # ID документов

4. Получение документов​

# Получение по ID
docs = collection.get(
ids=["id1", "id2"]
)

# Получение с фильтрами
docs = collection.get(
where={"category": "tutorial"},
limit=10
)

# Получение всех документов
docs = collection.get()

5. Обновление документов​

# Обновление содержимого документа
collection.update(
ids=["id1"],
documents=["Обновлённое содержимое"],
metadatas=[{"source": "updated"}]
)

6. Удаление документов​

# Удаление по ID
collection.delete(ids=["id1", "id2"])

# Удаление с фильтром
collection.delete(
where={"source": "outdated"}
)

Постоянное хранение​

# Сохранение на диск
client = chromadb.PersistentClient(path="./chroma_db")

collection = client.create_collection("my_docs")
collection.add(documents=["Док 1"], ids=["id1"])

# Данные сохраняются автоматически
# Повторная загрузка с тем же путём
client = chromadb.PersistentClient(path="./chroma_db")
collection = client.get_collection("my_docs")

Функции эмбеддинга​

По умолчанию (Sentence Transformers)​

# По умолчанию используется sentence-transformers
collection = client.create_collection("my_docs")
# Модель по умолчанию: all-MiniLM-L6-v2

OpenAI​

from chromadb.utils import embedding_functions

openai_ef = embedding_functions.OpenAIEmbeddingFunction(
api_key="your-key",
model_name="text-embedding-3-small"
)

collection = client.create_collection(
name="openai_docs",
embedding_function=openai_ef
)

HuggingFace​

huggingface_ef = embedding_functions.HuggingFaceEmbeddingFunction(
api_key="your-key",
model_name="sentence-transformers/all-mpnet-base-v2"
)

collection = client.create_collection(
name="hf_docs",
embedding_function=huggingface_ef
)

Пользовательская функция эмбеддинга​

from chromadb import Documents, EmbeddingFunction, Embeddings

class MyEmbeddingFunction(EmbeddingFunction):
def __call__(self, input: Documents) -> Embeddings:
# Ваша логика эмбеддинга
return embeddings

my_ef = MyEmbeddingFunction()
collection = client.create_collection(
name="custom_docs",
embedding_function=my_ef
)

Фильтрация по метаданным​

# Точное совпадение
results = collection.query(
query_texts=["запрос"],
where={"category": "tutorial"}
)

# Операторы сравнения
results = collection.query(
query_texts=["запрос"],
where={"page": {"$gt": 10}} # $gt, $gte, $lt, $lte, $ne
)

# Логические операторы
results = collection.query(
query_texts=["запрос"],
where={
"$and": [
{"category": "tutorial"},
{"difficulty": {"$lte": 3}}
]
} # Также: $or
)

# Содержит
results = collection.query(
query_texts=["запрос"],
where={"tags": {"$in": ["python", "ml"]}}
)

Интеграция с LangChain​

from langchain_chroma import Chroma
from langchain_openai import OpenAIEmbeddings
from langchain.text_splitter import RecursiveCharacterTextSplitter

# Разделение документов
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000)
docs = text_splitter.split_documents(documents)

# Создание векторного хранилища Chroma
vectorstore = Chroma.from_documents(
documents=docs,
embedding=OpenAIEmbeddings(),
persist_directory="./chroma_db"
)

# Запрос
results = vectorstore.similarity_search("машинное обучение", k=3)

# Как ретривер
retriever = vectorstore.as_retriever(search_kwargs={"k": 5})

Интеграция с LlamaIndex​

from llama_index.vector_stores.chroma import ChromaVectorStore
from llama_index.core import VectorStoreIndex, StorageContext
import chromadb

# Инициализация Chroma
db = chromadb.PersistentClient(path="./chroma_db")
collection = db.get_or_create_collection("my_collection")

# Создание векторного хранилища
vector_store = ChromaVectorStore(chroma_collection=collection)
storage_context = StorageContext.from_defaults(vector_store=vector_store)

# Создание индекса
index = VectorStoreIndex.from_documents(
documents,
storage_context=storage_context
)

# Запрос
query_engine = index.as_query_engine()
response = query_engine.query("Что такое машинное обучение?")

Режим сервера​

# Запуск сервера Chroma
# Терминал: chroma run --path ./chroma_db --port 8000

# Подключение к серверу
import chromadb
from chromadb.config import Settings

client = chromadb.HttpClient(
host="localhost",
port=8000,
settings=Settings(anonymized_telemetry=False)
)

# Использование как обычно
collection = client.get_or_create_collection("my_docs")

Лучшие практики​

  1. Используйте постоянный клиент — не теряйте данные при перезапуске
  2. Добавляйте метаданные — это позволяет фильтровать и отслеживать
  3. Пакетные операции — добавляйте несколько документов за раз
  4. Выбирайте правильную модель эмбеддинга — баланс скорости и качества
  5. Используйте фильтры — сужайте пространство поиска
  6. Уникальные ID — избегайте коллизий
  7. Регулярное резервное копирование — копируйте директорию chroma_db
  8. Мониторьте размер коллекции — масштабируйте при необходимости
  9. Тестируйте функции эмбеддинга — обеспечивайте качество
  10. Используйте серверный режим для продакшена — лучше для многопользовательской работы

Производительность​

ОперацияЗадержкаПримечания
Добавление 100 документов~1-3 сС эмбеддингом
Запрос (топ 10)~50-200 мсЗависит от размера коллекции
Фильтр по метаданным~10-50 мсБыстро с правильной индексацией

Ресурсы​