chromadb.errors.NotFoundError: Collection 'my_docs' Not Found の解決方法

初級🧠 AI Tools2026-05-17| Python 3.9+, ChromaDB 0.4.x or 0.5.x, LangChain, Windows/Linux/macOS

Error Message

chromadb.errors.NotFoundError: Collection 'my_docs' not found
#chromadb#rag#python#vector-database#langchain#troubleshooting

エラーの概要5,000件のドキュメントをベクトルストアにインデックスし終えたところだとしましょう。クエリ用のスクリプトを実行し、スマートなレスポンスを期待した矢先、アプリケーションが即座にクラッシュします。結果が表示される代わりに、無機質なエラーメッセージが表示されます。

chromadb.errors.NotFoundError: Collection 'my_docs' not found

これは通常、スクリプトが現在のコンテキスト内に存在しないデータベースを探していることを意味します。ファイルがハードドライブ上に存在していても、パス指定や初期化ロジックにわずかなズレがあるため、ChromaDBがそれらを認識できていない状態です。

原因ChromaDBは軽量で高速ですが、デフォルトの永続化の挙動によって多くの開発者が落とし穴にハマります。通常、原因は以下の3つのいずれかです。

  • パスの混乱: インジェクション(データ投入)スクリプトは ./db にデータを保存したが、クエリスクリプトは ./chroma_db や別のサブディレクトリを探している。- メモリ内ストレージのみの使用: PersistentClient() ではなく標準の Client() を使用している。これにより、すべてがRAMに保存され、スクリプトが停止するとデータが消失します。- 大文字・小文字の区別: ChromaDBは 'My_Docs' と 'my_docs' を完全に別のエンティティとして扱います。大文字が1文字混じるだけで NotFoundError が発生します。## ステップ別の修正方法### 1. 絶対パスの使用を徹底するPythonにおいて相対パスは危険です。/home/user/project からスクリプトを実行する場合、パス ./chroma_data は機能します。しかし、/src フォルダに移動して再度実行すると、Pythonは空の /home/user/project/src/chroma_data を探しに行きます。 os モジュールを使用して、データの正確な場所を固定してください。
import os
import chromadb

# データの固定場所を定義
current_dir = os.path.dirname(os.path.abspath(__file__))
db_path = os.path.join(current_dir, "vector_storage")

# RAGアプリでは常にPersistentClientを使用する
client = chromadb.PersistentClient(path=db_path)

try:
    collection = client.get_collection(name="my_docs")
    print(f"接続に成功しました。コレクション内のアイテム数: {collection.count()}")
except Exception as e:
    print(f"コレクションが見つかりませんでした: {e}")

2. LangChainの永続化設定を修正するLangChainを使用している場合、統合部分が不透明になることがあります。persist_directory を明示的に定義しないと、LangChainはプロセス終了後に消滅する一時的なデータベースを初期化してしまう可能性があります。

誤った方法:

# これは多くの場合、一時的なインメモリ保存がデフォルトになります
vectorstore = Chroma(collection_name="my_docs", embedding_function=embeddings)

正しい方法:

from langchain_chroma import Chroma

vectorstore = Chroma(
    collection_name="my_docs",
    embedding_function=embeddings,
    persist_directory="./chroma_db_storage" # これはインジェクション時のパスと完全に一致させる必要があります
)

3. list_collections() でデバッグするコレクション名で頭を抱える前に、クライアントが実際に何を認識しているかを確認しましょう。このシンプルなスクリプトは、データベース接続を検証するための診断ツールとして機能します。

client = chromadb.PersistentClient(path="./chroma_db")

# 現在ディスク上にあるすべてのコレクションを表示
existing_collections = client.list_collections()
print(f"{len(existing_collections)} 個のコレクションが見つかりました:")
for col in existing_collections:
    print(f" - {col.name}")

# ロジカルチェック
if "my_docs" not in [c.name for c in existing_collections]:
    print("重要: 'my_docs' が見つかりません。インジェクションスクリプトのロジックを確認してください。")

修正の検証ファイルシステムを手動で確認してください。正常な ChromaDB ディレクトリには、chroma.sqlite3 ファイル(通常100KB〜数MB)と、UUID名のバイナリファイルを含むフォルダが含まれているはずです。persist_directory に小さなファイルが1つしかない、あるいは空である場合は、インジェクションプロセスでデータがディスクにコミットされていません。

プロのヒント- Dockerボリューム: Docker コンテナで ChromaDB を実行している場合、ボリュームのマウント(例: -v ./data:/chroma/data)が Python コード内のパスと一致していることを確認してください。ボリュームの不一致は、本番環境でこのエラーが発生する最大の原因です。- 「Get or Create」セーフティネット: アプリの耐障害性を高めるには、client.get_or_create_collection(name="my_docs") を使用してください。これにより、元のコレクションが見つからない場合に空のコレクションを返すことで、クラッシュを防ぐことができます。- SQLiteの検査: 標準的な SQLite ブラウザで chroma.sqlite3 を開くことができます。collections テーブルを確認して、インジェクション段階でデータがどのように命名されたかを正確に把握してください。

Related Error Notes