Chroma
目次
RAG と意味検索のための埋め込みデータベースです。
skill の情報
| 提供元 | 追加インストール — 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 全文
Chroma - Open-Source Embedding Database
記憶を持つ LLM アプリを作るための、AI に寄り添った作りのデータベースです。
Chroma が向いているとき
次のようなときに使います:
- RAG(検索して補いながら文章を作る仕組み)のアプリを作る
- 手元や自前のサーバーでベクトルデータベースを動かしたい
- オープンソース(Apache 2.0)で済ませたい
- ノートブックで試作したい
- 文書を意味で検索したい
- 埋め込みをメタデータと一緒に保存したい
数字で見ると:
- GitHub のスター 24,300 以上
- フォーク 1,900 以上
- v1.3.3(安定版。毎週リリースされています)
- Apache 2.0 ライセンス
他を選んだほうがよいとき:
- Pinecone: 運用込みのクラウド、自動でのスケール
- FAISS: 純粋な類似検索だけでよく、メタデータは不要
- Weaviate: 本番向けの、機械学習に寄せたデータベース
- Qdrant: Rust 製で性能が高い
すぐ試す
導入
# Python
pip install chromadb
# JavaScript/TypeScript
npm install chromadb @chroma-core/default-embed基本の使い方(Python)
# 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)基本の操作
1. コレクションを作る
# 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")2. 文書を追加する
# 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"]
)3. 検索する(類似検索)
# 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 IDs4. 文書を取り出す
# 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()5. 文書を更新する
# Update document content
collection.update(
ids=["id1"],
documents=["Updated content"],
metadatas=[{"source": "updated"}]
)6. 文書を削除する
# Delete by IDs
collection.delete(ids=["id1", "id2"])
# Delete with filter
collection.delete(
where={"source": "outdated"}
)ディスクに残す
# 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")埋め込みの作り方
既定(Sentence Transformers)
# Uses sentence-transformers by default
collection = client.create_collection("my_docs")
# Default model: all-MiniLM-L6-v2OpenAI
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:
# Your embedding logic
return embeddings
my_ef = MyEmbeddingFunction()
collection = client.create_collection(
name="custom_docs",
embedding_function=my_ef
)メタデータで絞り込む
# 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 と組み合わせる
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 と組み合わせる
from llama_index.vector_stores.chroma import ChromaVectorStore
from llama_index.core import VectorStoreIndex, StorageContext
# 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?")サーバーとして動かす
# Run Chroma server
# Terminal: chroma run --path ./chroma_db --port 8000
# Connect to server
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")うまくやるこつ
- ディスクに残すクライアントを使う - 再起動でデータを失わないように
- メタデータを付ける - 絞り込みや追跡ができるようになります
- まとめて処理する - 文書は一度に複数追加します
- 合う埋め込みモデルを選ぶ - 速さと質のつり合いを取ります
- 絞り込みを使う - 探す範囲を狭めます
- ID を重複させない - ぶつからないように
- こまめに控えを取る - chroma_db のディレクトリをコピーします
- コレクションの大きさを見ておく - 必要なら増強します
- 埋め込みの作り方を試す - 質を確かめます
- 本番ではサーバーとして動かす - 複数の利用者に向いています
性能の目安
| 操作 | 待ち時間 | 補足 |
|---|---|---|
| 文書 100 件の追加 | 約 1〜3 秒 | 埋め込みの作成を含みます |
| 検索(上位 10 件) | 約 50〜200 ミリ秒 | コレクションの大きさによります |
| メタデータでの絞り込み | 約 10〜50 ミリ秒 | 索引が整っていれば高速です |
参考先
- GitHub: https://github.com/chroma-core/chroma ⭐ 24,300+
- Docs: https://docs.trychroma.com
- Discord: https://discord.gg/MMeYNTmh3x
- バージョン: 1.3.3 以降
- ライセンス: Apache 2.0