Chroma
На этой странице База данных векторных эмбеддингов с открытым исходным кодом для AI-приложений. Храните эмбеддинги и метаданные, выполняйте векторный и полнотекстовый поиск, фильтруйте по метаданным. Простой API из 4 функций. Масштабируется от ноутбуков до производственных кластеров. Используйте для семантического поиска, RAG-приложений или поиска документов. Лучшее решение для локальной разработки и проектов с открытым исходным кодом.
Метаданные навыка¶
| Источник | Опционально — установите с помощью hermes skills install official/mlops/chroma |
| Путь | optional-skills/mlops/chroma |
| Версия | 1.0.0 |
| Автор | Orchestra Research |
| Лицензия | MIT |
| Зависимости | chromadb, sentence-transformers |
| Теги | RAG, Chroma, Vector Database, Embeddings, Semantic Search, Open Source, Self-Hosted, Document Retrieval, Metadata Filtering |
| ## Справочник: полный SKILL.md | |
| info | |
| Ниже приведено полное определение навыка, которое Hermes загружает при активации этого навыка. Это то, что агент видит в качестве инструкций, когда навык активен. | |
| # Chroma — база данных эмбеддингов с открытым исходным кодом | |
| AI-ориентированная база данных для создания LLM-приложений с памятью. | |
| ## Когда использовать Chroma | |
| Используйте Chroma когда: | |
| * Создаёте RAG-приложения (retrieval-augmented generation) | |
| * Нужна локальная/самостоятельно размещённая векторная база данных | |
| * Хотите решение с открытым исходным кодом (Apache 2.0) | |
| * Прототипируете в ноутбуках | |
| * Нужен семантический поиск по документам | |
| * Храните эмбеддинги с метаданными |
Метрики: * 24 300+ звёзд на GitHub * 1 900+ форков * v1.3.3 (стабильная, еженедельные релизы) * Лицензия Apache 2.0
Вместо этого используйте альтернативы: * Pinecone: Управляемое облачное решение, авто-масштабирование * FAISS: Чистый поиск по сходству, без метаданных * Weaviate: Продуктовая ML-ориентированная база данных * Qdrant: Высокая производительность, на Rust
Быстрый старт¶
Установка¶
[code]
# Python
pip install chromadb
# JavaScript/TypeScript
npm install chromadb @chroma-core/default-embed
[/code]
Базовое использование (Python)¶
[code] 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)
[/code]
Основные операции¶
1\. Создание коллекции¶
[code]
# Простая коллекция
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")
[/code]
2\. Добавление документов¶
[code]
# Добавление с авто-генерируемыми 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"]
)
[/code]
3\. Запрос (поиск по сходству)¶
[code]
# Базовый запрос
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 документов
[/code]
4\. Получение документов¶
[code]
# Получение по ID
docs = collection.get(
ids=["id1", "id2"]
)
# Получение с фильтрами
docs = collection.get(
where={"category": "tutorial"},
limit=10
)
# Получение всех документов
docs = collection.get()
[/code]
5\. Обновление документов¶
[code]
# Обновление содержимого документа
collection.update(
ids=["id1"],
documents=["Обновлённое содержимое"],
metadatas=[{"source": "updated"}]
)
[/code]
6\. Удаление документов¶
[code]
# Удаление по ID
collection.delete(ids=["id1", "id2"])
# Удаление с фильтром
collection.delete(
where={"source": "outdated"}
)
[/code]
Постоянное хранение¶
[code]
# Сохранение на диск
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")
[/code]
Функции эмбеддинга¶
По умолчанию (Sentence Transformers)¶
[code]
# По умолчанию используется sentence-transformers
collection = client.create_collection("my_docs")
# Модель по умолчанию: all-MiniLM-L6-v2
[/code]
OpenAI¶
[code] 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
)
[/code]
HuggingFace¶
[code]
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
)
[/code]
Пользовательская функция эмбеддинга¶
[code] 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
)
[/code]
Фильтрация по метаданным¶
[code]
# Точное совпадение
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"]}}
)
[/code]
Интеграция с LangChain¶
[code]
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})
[/code]
Интеграция с LlamaIndex¶
[code]
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("Что такое машинное обучение?")
[/code]
Режим сервера¶
[code]
# Запуск сервера 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")
[/code]
Лучшие практики¶
- Используйте постоянный клиент — не теряйте данные при перезапуске
- Добавляйте метаданные — это обеспечивает фильтрацию и отслеживание
- Пакетные операции — добавляйте несколько документов за раз
- Выбирайте правильную модель эмбеддинга — баланс скорости и качества
- Используйте фильтры — сужайте пространство поиска
- Уникальные ID — избегайте коллизий
- Регулярные резервные копии — копируйте директорию chroma_db
- Следите за размером коллекции — масштабируйте при необходимости
- Тестируйте функции эмбеддинга — обеспечивайте качество
- Используйте серверный режим для продакшена — лучше для многопользовательской работы
Производительность¶
| Операция | Задержка | Примечания |
|---|---|---|
| Добавление 100 документов | ~1–3 с | С эмбеддингом |
| Запрос (топ 10) | ~50–200 мс | Зависит от размера коллекции |
| Фильтрация по метаданным | ~10–50 мс | Быстро при правильной индексации |
| ## Ресурсы | ||
| * GitHub: https://github.com/chroma-core/chroma ⭐ 24 300+ | ||
| * Документация: https://docs.trychroma.com | ||
| * Discord: https://discord.gg/MMeYNTmh3x | ||
| * Версия: 1.3.3+ | ||
| * Лицензия: Apache 2.0 |