Используйте Chroma — открытую базу данных эмбеддингов для RAG и семантического поиска.

Chroma — это база данных эмбеддингов, разработанная специально для ИИ, для создания приложений на основе LLM с возможностью хранения памяти, таких как конвейеры RAG и семантический поиск.

Hermes OpenClaw Средний Скопировали: 0
1 ресурс

Что понадобится

  • Требуются зависимости chromadb и sentence-transformers; работает на Linux, macOS и Windows.

Как применить

Используйте Chroma при разработке приложений типа RAG (генерация с дополнением информацией из внешних источников), когда нужна локальная или самостоятельно размещаемая векторная база данных, когда требуется решение с открытым исходным кодом (лицензия Apache 2.0), при прототипировании в ноутбуках, при семантическом поиске по документам или при хранении эмбеддингов с метаданными.

Подходит для создания приложений типа RAG (генерация с дополнением информацией из внешних источников).

Также подходит, когда нужна локальная или самостоятельно размещаемая векторная база данных.

Является открытым программным обеспечением под лицензией Apache 2.0.

Отлично подходит для прототипирования в ноутбуках.

Поддерживает семантический поиск по документам.

Может хранить эмбеддинги с метаданными.

В этих случаях используйте альтернативы: Pinecone — для управляемого облачного решения с автоматическим масштабированием, FAISS — для чистого поиска по схожести без метаданных, Weaviate — для производственной базы данных, ориентированной на машинное обучение, или Qdrant — для высокой производительности на базе Rust.

Pinecone — это управляемое облачное решение с автоматическим масштабированием.

FAISS обеспечивает чистый поиск по схожести, но не поддерживает метаданные.

Weaviate — это производственная база данных, ориентированная на машинное обучение.

Qdrant отличается высокой производительностью и реализован на Rust.

Установите Chroma через pip для Python или через npm, используя пакеты chromadb и @chroma-core/default-embed для JavaScript/TypeScript.

# Python
pip install chromadb

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

Начните с базового использования в Python: создайте клиент, коллекцию, добавьте документы с метаданными и идентификаторами, затем выполните запрос с параметрами query_texts и n_results и выведите результаты.

import chromadb

# Create client
client = chromadb.Client()

# Create collection
collection = client.create_collection(name="my_collection")

# Add documents
collection.add(
    documents=["This is document 1", "This is document 2"],
    metadatas=[{"source": "doc1"}, {"source": "doc2"}],
    ids=["id1", "id2"]
)

# Query
results = collection.query(
    query_texts=["document about topic"],
    n_results=2
)

print(results)

Создайте коллекцию с помощью client.create_collection, при желании передав собственную функцию эмбеддинга, например OpenAIEmbeddingFunction; также можно получить существующую коллекцию через get_collection или удалить её с помощью delete_collection.

# Simple collection
collection = client.create_collection("my_docs")

# With custom embedding function
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
)

# Get existing collection
collection = client.get_collection("my_docs")

# Delete collection
client.delete_collection("my_docs")

Добавьте документы с помощью collection.add, указав документы, метаданные и идентификаторы; также можно добавить заранее вычисленные эмбеддинги вместо использования автоматического эмбеддинга.

# Add with auto-generated IDs
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"]
)

# Add with custom embeddings
collection.add(
    embeddings=[[0.1, 0.2, ...], [0.3, 0.4, ...]],
    documents=["Doc 1", "Doc 2"],
    ids=["id1", "id2"]
)

Выполните поиск по схожести с помощью collection.query, при необходимости ограничив результаты фильтром where или условиями $and; результаты включают документы, метаданные, расстояния и идентификаторы.

# Basic query
results = collection.query(
    query_texts=["machine learning tutorial"],
    n_results=5
)

# Query with filters
results = collection.query(
    query_texts=["Python programming"],
    n_results=3,
    where={"source": "web"}
)

# Query with metadata filters
results = collection.query(
    query_texts=["advanced topics"],
    where={
        "$and": [
            {"category": "tutorial"},
            {"difficulty": {"$gte": 3}}
        ]
    }
)

# Access results
print(results["documents"])      # List of matching documents
print(results["metadatas"])      # Metadata for each doc
print(results["distances"])      # Similarity scores
print(results["ids"])            # Document IDs

Получите документы с помощью collection.get по их идентификаторам, с фильтром where и ограничением или без аргументов, чтобы получить все документы.

# Get by IDs
docs = collection.get(
    ids=["id1", "id2"]
)

# Get with filters
docs = collection.get(
    where={"category": "tutorial"},
    limit=10
)

# Get all documents
docs = collection.get()

Обновите содержимое и метаданные документа с помощью collection.update, указав его идентификатор.

# Update document content
collection.update(
    ids=["id1"],
    documents=["Updated content"],
    metadatas=[{"source": "updated"}]
)

Удалите документы с помощью collection.delete либо по идентификаторам, либо по фильтру where.

# Delete by IDs
collection.delete(ids=["id1", "id2"])

# Delete with filter
collection.delete(
    where={"source": "outdated"}
)

Для сохранения данных используйте chromadb.PersistentClient с путём вроде ./chroma_db; данные сохраняются автоматически и могут быть загружены позже путём создания клиента с тем же путём и вызова get_collection.

# Persist to disk
client = chromadb.PersistentClient(path="./chroma_db")

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

# Data persisted automatically
# Reload later with same path
client = chromadb.PersistentClient(path="./chroma_db")
collection = client.get_collection("my_docs")

По умолчанию Chroma использует sentence-transformers для эмбеддингов, причём моделью по умолчанию является all-MiniLM-L6-v2.

# Uses sentence-transformers by default
collection = client.create_collection("my_docs")
# Default model: all-MiniLM-L6-v2

Чтобы использовать эмбеддинги OpenAI, создайте объект OpenAIEmbeddingFunction с вашим ключом API и именем модели, например text-embedding-3-small, затем передайте его как параметр embedding_function при создании коллекции.

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, создайте объект HuggingFaceEmbeddingFunction с вашим ключом API и именем модели, например sentence-transformers/all-mpnet-base-v2, и передайте его при создании коллекции.

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
)

Для собственной функции эмбеддинга унаследуйтесь от класса EmbeddingFunction и реализуйте метод __call__, чтобы возвращать эмбеддинги; затем передайте экземпляр этой функции как параметр embedding_function при создании коллекции.

from chromadb import Documents, EmbeddingFunction, Embeddings

class MyEmbeddingFunction(EmbeddingFunction):
    def __call__(self, input: Documents) -> Embeddings:
        # Your embedding logic
        return embeddings

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

Фильтруйте запросы с помощью условий where: точные совпадения, операторы сравнения вроде $gt, $gte, $lt, $lte и $ne, логические операторы $and и $or, а также $in для поиска значений в списке, например тегов.

# Exact match
results = collection.query(
    query_texts=["query"],
    where={"category": "tutorial"}
)

# Comparison operators
results = collection.query(
    query_texts=["query"],
    where={"page": {"$gt": 10}}  # $gt, $gte, $lt, $lte, $ne
)

# Logical operators
results = collection.query(
    query_texts=["query"],
    where={
        "$and": [
            {"category": "tutorial"},
            {"difficulty": {"$lte": 3}}
        ]
    }  # Also: $or
)

# Contains
results = collection.query(
    query_texts=["query"],
    where={"tags": {"$in": ["python", "ml"]}}
)

Интегрируйтесь с LangChain, разделив документы с помощью RecursiveCharacterTextSplitter, создав векторное хранилище Chroma с использованием Chroma.from_documents и модели эмбеддингов вместе с параметром persist_directory, а затем выполняйте запросы через similarity_search или используйте его как ретривер через as_retriever с параметрами search_kwargs.

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

# Split documents
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000)
docs = text_splitter.split_documents(documents)

# Create Chroma vector store
vectorstore = Chroma.from_documents(
    documents=docs,
    embedding=OpenAIEmbeddings(),
    persist_directory="./chroma_db"
)

# Query
results = vectorstore.similarity_search("machine learning", k=3)

# As retriever
retriever = vectorstore.as_retriever(search_kwargs={"k": 5})

Интегрируйтесь с LlamaIndex, создав объект PersistentClient и получив или создав коллекцию, обернув её в ChromaVectorStore внутри StorageContext, построив индекс VectorStoreIndex из ваших документов и выполняя запросы через index.as_query_engine().

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

# Initialize Chroma
db = chromadb.PersistentClient(path="./chroma_db")
collection = db.get_or_create_collection("my_collection")

# Create vector store
vector_store = ChromaVectorStore(chroma_collection=collection)
storage_context = StorageContext.from_defaults(vector_store=vector_store)

# Create index
index = VectorStoreIndex.from_documents(
    documents,
    storage_context=storage_context
)

# Query
query_engine = index.as_query_engine()
response = query_engine.query("What is machine learning?")

В режиме сервера запустите сервер Chroma из терминала командой chroma run --path ./chroma_db --port 8000, затем подключитесь к нему через chromadb.HttpClient, указав хост, порт и объект Settings, в котором можно установить параметр anonymized_telemetry в значение False, и используйте клиент как обычно.

# Run Chroma server
# Terminal: chroma run --path ./chroma_db --port 8000

# Connect to server
import chromadb
from chromadb.config import Settings

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

# Use as normal
collection = client.get_or_create_collection("my_docs")

Используйте постоянный клиент, чтобы не потерять данные при перезапуске.

Добавляйте метаданные к документам — это позволяет фильтровать их и отслеживать.

Используйте пакетные операции для добавления нескольких документов за один раз.

Выбирайте подходящую модель эмбеддингов, учитывая баланс между скоростью и качеством.

Используйте фильтры для сужения области поиска.

Применяйте уникальные идентификаторы, чтобы избежать конфликтов.

Регулярно делайте резервные копии, копируя директорию chroma_db.

Следите за размером коллекции и масштабируйте её при необходимости.

Проверяйте функции эмбеддингов на качество.

Для продакшена используйте режим сервера — он лучше подходит для многопользовательских сред.

Источник: nousresearch/hermes-agent и участники проекта. Лицензия: MIT.

Copyright (c) 2025 Nous Research

Перевод и редакционная адаптация: ClawCases.

>Ресурсы

>Похожие юзкейсы

Разработка

Арбитр разрешения конфликтов слияния агентов

Разрешает конфликт слияния Git между ветками двух агентов в качестве беспристрастной третьей стороны: нейтральный арбитр, который принимает обе версии изменений и указанные намерения, после чего формирует итоговый результат слияния, не перезаписывая ни одну из сторон.

Hermes Средний
Автоматизация Разработка

Автономное управление проектами с помощью подагентов

Координация проектов автономно: главный агент делегирует работу подагентам-менеджерам проектов, которые отслеживают задачи в общем файле STATE.yaml, обновляют его по мере выполнения, параллельно берутся за неблокируемые задачи и сохраняют всё состояние задач в файлах с контролем версий.

OpenClaw Средний
Продуктивность Знания

Второй мозг

Этот рабочий процесс превращает OpenClaw в систему памяти второго мозга, куда вы можете добавлять данные с помощью текстовых сообщений через Telegram, iMessage или Discord. Вся информация хранится в удобном для поиска дашборде на базе Next.js, к которому можно обратиться в любое время.

OpenClaw Средний

>Ещё на этом уровне: Средний