Chroma

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

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

ИсточникОпциональный — установить: hermes 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

инфо

Ниже приведено полное определение навыка, которое Hermes Agent загружает при его активации. Именно эти инструкции видит агент во время работы.

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

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

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

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

  • строишь RAG-приложения (retrieval-augmented generation)
  • нужна локальная или self-hosted векторная база
  • важна опенсорс-лицензия (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=["This is document 1", "This is document 2"],
    metadatas=[{"source": "doc1"}, {"source": "doc2"}],
    ids=["id1", "id2"]
)

# Запрос
results = collection.query(
    query_texts=["document about topic"],
    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=["Doc 1", "Doc 2", "Doc 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=["Doc 1", "Doc 2"],
    ids=["id1", "id2"]
)

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

# Базовый запрос
results = collection.query(
    query_texts=["machine learning tutorial"],
    n_results=5
)

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

# Запрос с фильтрацией по метаданным
results = collection.query(
    query_texts=["advanced topics"],
    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=["Updated content"],
    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=["Doc 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=["query"],
    where={"category": "tutorial"}
)

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

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

# Вхождение в список
results = collection.query(
    query_texts=["query"],
    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("machine learning", 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("What is machine learning?")

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

# Запуск сервера 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 мсБыстро при правильной индексации

Ресурсы

ESC