ChromaDBとStreamlitで作るドキュメント管理システム
はじめに
ChromaDBを使用してMarkdownファイルを管理し、Streamlitで簡単に操作できるUIを提供するシステムを作成しました。FastAPIをバックエンドに使用し、効率的なドキュメント管理を実現します。
環境
- Python 3.9
- ChromaDB 0.6.0
- FastAPI
- Streamlit
- その他の依存関係は
requirements.txt
に記載
ディレクトリ構成
chroma-test-project/
├── data/
│ └── chroma_db/ # ChromaDBのデータ保存ディレクトリ
│ ├── chroma.sqlite3 # メタデータ保存用SQLite
│ └── {collection_id}/# 各コレクションのデータ
│ ├── data_level0.bin
│ ├── header.bin
│ ├── length.bin
│ └── link_lists.bin
├── src/
│ ├── api/ # バックエンド
│ │ └── app.py # FastAPI アプリケーション
│ └── ui/ # フロントエンド
│ └── streamlit_app.py# Streamlit UI
└── requirements.txt # 依存パッケージ
主な機能
-
コレクション管理
- コレクション一覧表示
- コレクションの削除(確認ダイアログ付き)
-
ドキュメント管理
- Markdownファイルのアップロード(複数ファイル対応)
- ドキュメントの検索
- ページネーション付き一覧表示
- CSVエクスポート
-
システム情報
- APIサーバーの状態表示
- 接続情報の表示
実装で苦労したポイント
1. ChromaDBのバージョン対応
- v0.6.0での仕様変更への対応
- コレクション操作のAPIの変更
- エラーハンドリングの改善
2. Streamlitの状態管理
- 削除確認ダイアログの実装
- セッション状態の適切な管理
- ページのリロードタイミング
3. ファイル処理
- 複数ファイルのアップロード処理
- エンコーディング対応
- メタデータの適切な管理
4. エラーハンドリング
- FastAPI側でのエラー捕捉
- Streamlit側でのエラー表示
- ユーザーフレンドリーなメッセージ
学んだこと
1. アーキテクチャ設計
- バックエンド(FastAPI)とフロントエンド(Streamlit)の分離
- データ永続化(ChromaDB)の適切な設計
- ディレクトリ構造の重要性
2. ChromaDBの特性
- コレクション名の制約(英数字のみ)
- データの永続化の仕組み
- 埋め込みベクトルの扱い
3. Streamlitのベストプラクティス
- セッション状態の効果的な使用
- UIコンポーネントの適切な配置
- ユーザー体験の向上テクニック
4. エラー処理の重要性
- 適切なエラーメッセージの設計
- エラーの階層的な処理
- ユーザーへのフィードバック
使い方
- 環境のセットアップ
python -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
pip install -r requirements.txt
- サーバーの起動
# FastAPIサーバー(ローカルホストのみ)
uvicorn src.api.app:app --reload --host localhost
# Streamlit UI(別ターミナルで)
streamlit run src/ui/streamlit_app.py --server.address localhost
今後の改善点
- 認証機能の追加
- ドキュメントのバージョン管理
- より高度な検索機能
- バッチ処理の最適化
- UIのカスタマイズ機能
まとめ
ChromaDBとStreamlitを組み合わせることで、使いやすいドキュメント管理システムを構築できました。特にStreamlitの柔軟なUI構築能力とChromaDBの効率的なデータ管理機能の組み合わせが効果的でした。