エラーの概要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' が見つかりません。インジェクションスクリプトのロジックを確認してください。")

