はい、まとめて記事を出力します。
ChromaDBを使って初めてのドキュメント管理アプリを作ってみた!
はじめに
こんにちは!今回は、ChromaDBとStreamlitを使って、マークダウンファイルを管理・検索できるアプリケーションを作ってみました。ベクトルデータベースの勉強を兼ねて、実践的なアプリケーションを作る過程で学んだことを共有したいと思います。
🌟 完成したもの
- マークダウンファイルのアップロード(単一/フォルダ一括)
- ドキュメントの全文検索
- コレクション管理
- 埋め込みベクトルの可視化
- SQLiteデータの直接閲覧
🔧 使用した技術
- Python 3.x
- ChromaDB:ベクトルデータベース
- Streamlit:Web UI作成
- Pandas:データ処理
- SQLite3:データベース操作
💡 アプリケーションの特徴
1. シンプルなUI
menu = st.sidebar.selectbox(
"メニュー",
["コレクション", "ドキュメント", "SQLite", "ベクトル"]
)
サイドバーで4つの主要機能に簡単にアクセスできます。
2. 柔軟なファイルアップロード
if upload_type == "フォルダ一括":
folder_path = st.text_input(
"マークダウンファイルが含まれるディレクトリのパスを入力",
placeholder="/path/to/markdown/files",
help="指定したディレクトリ内のすべての.mdファイルが処理されます"
)
フォルダ内の全マークダウンファイルを一括処理できます。
3. メタデータの自動付与
metadata = {
"category": "ドキュメント",
"file_name": filename,
"upload_date": pd.Timestamp.now().strftime("%Y-%m-%d %H:%M:%S")
}
ファイル名や日時を自動で記録します。
🎓 学んだこと
1. ChromaDBの基本
- PersistentClientを使用したデータの永続化
- コレクションによるドキュメント管理
- 埋め込みベクトルの扱い方
2. Streamlitのテクニック
- キャッシュを使用したデータベース接続
- 動的なUIの構築
- データフレームの表示とフィルタリング
3. エラーハンドリング
try:
with open(file_path, 'r', encoding='utf-8') as f:
content = f.read()
except Exception as e:
st.error(f"ファイル {file} の読み込みに失敗しました: {str(e)}")
適切なエラーメッセージで使いやすさを向上。
🔍 ハマったポイントと解決策
-
ChromaDBのバージョン対応
- v0.6.0で一部APIが変更
- ドキュメントを参照しながら最新の書き方に対応
-
大量ファイルの処理
- メモリ使用量に注意
- ファイル読み込みを逐次処理に変更
-
UIの使いやすさ
- フィードバックを明確に
- 処理状況の可視化
📝 今後の改善点
-
検索機能の強化
- 類似度検索の実装
- メタデータによるフィルタリング
-
パフォーマンスの最適化
- 大規模データセット対応
- 処理の非同期化
まとめ
ChromaDBとStreamlitを組み合わせることで、手軽にドキュメント管理システムを構築できました。ベクトルデータベースの基本的な使い方を学びながら、実用的なアプリケーションを作れたのは良い経験になりました。