この記事について
シリーズ目次
- プロジェクト概要と環境構築
- Phase 1: ドキュメントローダーとチャンキング実装
- Phase 2&3: 検索と回答生成の実装
- Phase 4: パフォーマンスチューニング
- Phase 5: デプロイと運用、総括(本記事)
この記事で学べること
- Streamlit Community Cloudへのデプロイ手順
- 環境変数とシークレットの適切な管理方法
- 運用上の課題と対策
- RAGシステム構築を通じて得られた知見
前回までで、パフォーマンスチューニング機能を含む完全なRAGチャットボットが完成しました。最終回となる今回は、アプリケーションをクラウドにデプロイし、実際に公開する手順を解説します。
Phase 5の目標
Phase 5では以下を達成します:
- デプロイ準備: コードの整理とGitHubリポジトリの作成
- Streamlit Community Cloudへのデプロイ: 実際の公開手順
- 運用上の課題の理解: API制限やデータ永続化の問題
- プロジェクトの総括: 学んだことと今後の方向性
1. デプロイ準備
1.1 デプロイ前のチェックリスト
デプロイ前に、以下の点を確認します。
- すべてのファイルが正しく配置されている
-
.env
ファイルが.gitignore
に含まれている -
requirements.txt
が最新の状態である -
サンプルドキュメントが
data/raw/
に配置されている - エラーハンドリングが適切に実装されている
1.2 .gitignore
の設定
機密情報や不要なファイルをGitから除外します。
# Python
__pycache__/
*.py[cod]
venv/
env/
# Environment Variables
.env
.env.local
# Streamlit
.streamlit/secrets.toml
# ChromaDB
chroma_db/
# IDE
.vscode/
.idea/
# OS
.DS_Store
重要なポイント
-
.env
ファイルは絶対にコミットしない: APIキーなどの機密情報が含まれるため、必ず.gitignore
に追加 - ChromaDBディレクトリも除外: Streamlit Community Cloudではデータ永続化に制約があるため
1.3 requirements.txt
の最終版
デプロイ時に必要なパッケージを明記します。
# Streamlit
streamlit>=1.31.0
# LangChain
langchain>=0.3.0
langchain-google-genai>=2.0.0
langchain-community>=0.3.0
# Vector Database
chromadb>=0.4.22
# Google AI
google-generativeai>=0.8.0
# Document Processing
pypdf>=3.17.0
python-docx>=1.1.0
# Utilities
tenacity>=8.2.0
python-dotenv>=1.0.0
バージョン指定のポイント
-
>=
を使用することで、互換性のある新しいバージョンも許容 - 本番環境では
==
での固定を推奨
1.4 README.mdの整備
デプロイ後に他の人が理解しやすいよう、README.mdを充実させます。
# RAG チャットボット
社内文書を活用したセマンティック検索チャットボット
## 概要
RAG (Retrieval-Augmented Generation) を使用した質問応答システムです。
PDF、Word、テキストファイルをインデックス化し、自然言語での質問に対して
関連情報を検索して回答します。
## 主な機能
- 複数形式のドキュメント読み込み(PDF、DOCX、TXT、MD)
- セマンティック検索による関連情報の取得
- Google Gemini を使用した自然言語での回答
- チャンクサイズ、オーバーラップの調整機能
- パフォーマンス計測と結果表示
## 技術スタック
- **LLM**: Google Gemini 2.0 Flash
- **Embedding**: Google text-embedding-004
- **フレームワーク**: LangChain
- **ベクトルDB**: ChromaDB
- **UI**: Streamlit
## セットアップ
### 1. 依存パッケージのインストール
\`\`\`bash
pip install -r requirements.txt
\`\`\`
### 2. Google AI Studio API キーの取得
1. [Google AI Studio](https://aistudio.google.com/) にアクセス
2. 「Get API Key」をクリックしてAPIキーを取得
### 3. 環境変数の設定
\`.env\` ファイルを作成しAPIキーを設定
\`\`\`bash
GOOGLE_API_KEY=your-api-key-here
\`\`\`
### 4. アプリケーションの起動
\`\`\`bash
streamlit run app.py
\`\`\`
## API制限
Google AI Studio APIの無料枠:
- 1日あたり: 1,500リクエスト
- 1分あたり: 15リクエスト
## ライセンス
MIT License
2. GitHubリポジトリの作成
2.1 ローカルリポジトリの初期化
# プロジェクトルートで実行
git init
git add .
git commit -m "Initial commit: RAG chatbot implementation"
2.2 GitHubでのリポジトリ作成
- GitHubにログイン
- 右上の「+」→「New repository」をクリック
- リポジトリ名を入力(例:
rag-chatbot
) - 「Public」を選択(Streamlit Community Cloudは公開リポジトリのみ対応)
- 「Create repository」をクリック
2.3 リモートリポジトリへのプッシュ
# リモートリポジトリを追加
git remote add origin https://github.com/your-username/rag-chatbot.git
# ブランチ名をmainに変更
git branch -M main
# プッシュ
git push -u origin main
2.4 リポジトリの確認
GitHubでリポジトリを開き、以下が正しくアップロードされていることを確認:
アップロードされているべきもの
- すべてのソースコード
requirements.txt
README.md
.gitignore
- サンプルドキュメント(
data/raw/
)
アップロードされていてはいけないもの
-
.env
ファイル(機密情報) -
chroma_db/
ディレクトリ -
__pycache__/
ディレクトリ
3. Streamlit Community Cloudへのデプロイ
3.1 Streamlit Community Cloudとは
Streamlitアプリを無料でホスティングできるサービスです。
特徴
- 無料で利用可能
- GitHubと連携
- 自動デプロイ
- HTTPS対応
制約事項
- publicリポジトリのみ対応
- メモリ: 1GB
- ストレージ: 永続化に制限あり
- スリープモード: アクセスがないとスリープ
3.2 アカウントの作成
- Streamlit Community Cloudにアクセス
- 「Sign up」をクリック
- GitHubアカウントでサインイン
- GitHubとの連携を許可
3.3 アプリのデプロイ手順
Step 1: 新規アプリの作成
Streamlit Community Cloudダッシュボードで「New app」をクリック
Step 2: リポジトリの選択
- Repository:
your-username/rag-chatbot
- Branch:
main
- Main file path:
app.py
Step 3: App URLの設定
- デフォルト:
your-app-name.streamlit.app
- カスタムURL設定も可能
Step 4: デプロイ実行
「Deploy!」をクリック
3.4 環境変数(Secrets)の設定
APIキーなどの機密情報を設定します。
手順
- デプロイ中のアプリのダッシュボードで「Settings」をクリック
- 左メニューから「Secrets」を選択
- 以下の形式で入力:
GOOGLE_API_KEY = "your-actual-api-key-here"
- 「Save」をクリック
重要な注意点
- シークレットは暗号化されて保存される
- コードからは
os.getenv("GOOGLE_API_KEY")
でアクセス可能 - リポジトリには含まれない
3.5 デプロイの完了確認
デプロイが完了すると、以下のようなURLでアプリにアクセスできます:
https://your-app-name.streamlit.app
初回起動時の動作
- 依存パッケージのインストール(2-3分)
- アプリの起動
- 自動でブラウザが開く
4. デプロイ後の動作確認
4.1 基本機能のテスト
デプロイ後、以下の機能をテストします:
- アプリが正常に起動する
- サイドバーが表示される
- インデックス作成ボタンが機能する
- 質問を入力して回答が返ってくる
- パフォーマンス情報が表示される
- ソース情報が表示される
4.2 エラーの確認方法
エラーが発生した場合、Streamlit Community Cloudのログで確認します。
ログの確認手順
- アプリのダッシュボードで「Manage app」をクリック
- 右下の「Logs」タブを開く
- エラーメッセージを確認
よくあるエラーと対処法
# APIキーが設定されていない
ValueError: Google API Key が設定されていません
→ Secretsの設定を確認
# パッケージのインストールエラー
ERROR: Could not find a version that satisfies the requirement ...
→ requirements.txtのバージョン指定を確認
# メモリ不足
MemoryError: ...
→ ドキュメント数を減らす、chunk_sizeを小さくする
4.3 ChromaDBのデータ永続化対策
Streamlit Community Cloudでは、アプリの再起動時にchroma_db/
ディレクトリの内容が消えます。
対策: 起動時の自動インデックス作成
app.py
のinitialize_system
関数を修正し、インデックスが存在しない場合は自動作成します。
def initialize_system():
"""システムの初期化"""
try:
# API Keyの確認
api_key = os.getenv("GOOGLE_API_KEY")
if not api_key:
st.error("⚠️ Google API Keyが設定されていません")
return False
# Embeddingジェネレータの初期化
embedding_gen = EmbeddingGenerator(api_key=api_key)
embedding_function = embedding_gen.get_embedding_function()
# ベクトルストアの初期化
vector_store = VectorStore(embedding_function)
# 既存のベクトルストアを読み込み
if vector_store.load_existing():
st.session_state.vector_store = vector_store
st.session_state.indexed_files = ["既存のインデックスを読み込みました"]
# Retrieverの初期化
retriever = Retriever(vector_store)
# QAチェーンの初期化
qa_chain = QAChain(retriever, api_key=api_key)
st.session_state.qa_chain = qa_chain
return True
else:
# インデックスが存在しない場合、自動作成
st.info("インデックスが存在しないため、自動作成します...")
st.session_state.vector_store = vector_store
# デフォルトディレクトリからインデックス作成
if os.path.exists("./data/raw"):
build_index("./data/raw", 500, 50)
st.success("インデックスの自動作成が完了しました")
else:
st.warning("data/raw/ディレクトリが見つかりません")
return True
except Exception as e:
st.error(f"エラー: {str(e)}")
return False
メリット・デメリット
メリット:
- ユーザーが手動でインデックスを作成する必要がない
- アプリ起動後すぐに使用可能
デメリット:
- 起動時間が長くなる(2-3分程度)
- 初回起動時にAPI制限に注意が必要
5. 運用上の課題と対策
5.1 Google AI Studio APIの制限
制限内容
- 1日あたり: 1,500リクエスト
- 1分あたり: 15リクエスト
対策1: リトライ機能(既に実装済み)
from tenacity import retry, stop_after_attempt, wait_exponential
@retry(
stop=stop_after_attempt(3),
wait=wait_exponential(multiplier=1, min=4, max=10)
)
def call_api():
# API呼び出し
pass
対策2: エラーメッセージの改善
except Exception as e:
if "429" in str(e):
st.error("⚠️ APIレート制限に達しました。1分後に再試行してください。")
elif "quota" in str(e).lower():
st.error("⚠️ 1日のAPI使用量上限に達しました。明日再試行してください。")
else:
st.error(f"エラーが発生しました: {str(e)}")
対策3: 使用状況の監視
Google AI Studioのダッシュボードで使用状況を定期的に確認します。
5.2 ChromaDBのデータ永続化
問題点
- Streamlit Community Cloudではファイルシステムの永続化に制限がある
- アプリの再起動(スリープ解除、再デプロイ等)で
chroma_db/
が消える
対策オプション
オプション1: 起動時の自動インデックス作成(実装済み)
- メリット: 実装が簡単
- デメリット: 起動時間が長い
オプション2: 外部ベクトルDBの使用
PineconeなどのマネージドベクトルDBを使用:
from langchain.vectorstores import Pinecone
import pinecone
pinecone.init(
api_key=os.getenv("PINECONE_API_KEY"),
environment=os.getenv("PINECONE_ENV")
)
vector_store = Pinecone.from_documents(
documents,
embedding_function,
index_name="your-index"
)
- メリット: 完全な永続化、高速
- デメリット: 追加コスト(無料枠あり)、セットアップが複雑
オプション3: Google Cloud Storageへのバックアップ
定期的にChromaDBをクラウドストレージにバックアップ:
- メリット: 低コスト
- デメリット: 実装が複雑
5.3 メモリ制限への対応
Streamlit Community Cloudのメモリ制限は1GBです。
対策
-
ドキュメント数の制限
- 数百〜数千ドキュメント程度に制限
-
chunk_sizeの調整
- 小さめのchunk_size(300-500)を推奨
-
バッチ処理の最適化
# config/settings.py
BATCH_SIZE = 50 # 一度に処理するドキュメント数を制限
6. プロジェクトの総括
6.1 達成できたこと
3時間で実装した機能
Phase 1: 基本実装
- 複数形式のドキュメントローダー(PDF、DOCX、TXT、MD)
- テキスト分割(チャンキング)
- ChromaDBへのインデックス作成
- Google Embedding APIの統合
Phase 2&3: 検索と回答生成
- セマンティック検索機能
- Google Geminiによる自然言語での回答生成
- Streamlit UIの実装
- ソース表示機能
Phase 4: パフォーマンスチューニング
- 処理時間の計測機能
- パラメータ調整UI
- チューニング手法の確立
Phase 5: デプロイ
- Streamlit Community Cloudへのデプロイ
- 環境変数の適切な管理
- 運用上の課題の特定と対策
6.2 学んだこと
RAGの基本概念
- RAG = Retrieval(検索)+ Augmented(拡張)+ Generation(生成)
- ドキュメントをチャンクに分割してベクトル化
- クエリと類似したチャンクを検索
- 検索結果をコンテキストとしてLLMに渡す
チャンキング戦略の重要性
- chunk_sizeは「情報の粒度」と「文脈の広さ」のトレードオフ
- chunk_overlapで情報の分断を防ぐ
- ユースケースに応じた最適値が異なる
LangChainの使い方
- Document Loaders、Text Splitters、Vector Stores、Chainsの抽象化
- 異なるLLM・ベクトルDBへの切り替えが容易
- エコシステムの豊富さ
Google Geminiの特性
- 高速な応答(Flash モデル)
- 大きなコンテキストウィンドウ(最大100万トークン)
- 無料枠が充実(1日1,500リクエスト)
- レート制限への対応が必要(1分15リクエスト)
StreamlitによるUI開発
- Pythonのみで完結するWebアプリ開発
- セッション状態の管理
- リアルタイムなパラメータ調整UI
6.3 このプロジェクトの意義
実践的な学習
- 理論だけでなく、実際に動くシステムを構築
- トラブルシューティングを通じた深い理解
- パフォーマンスチューニングの実践
ポートフォリオとして
- GitHubで公開可能なコード
- デプロイ済みアプリのURL
- 技術ブログ記事(この記事)
今後の発展の基盤
- より高度なRAGシステムへの拡張が可能
- エンタープライズ向けの機能追加
- 他のプロジェクトへの応用
6.4 課題と今後の改善点
技術的な課題
- データ永続化: Streamlit Community Cloudの制約により、完全な解決には至らなかった
- スケーラビリティ: 大規模データには対応できない
- セキュリティ: 基本的な対策のみで、本番環境には不十分
今後の改善方向
- リランキング機能の実装
- 会話履歴の活用
- 外部ベクトルDBへの移行
- 認証機能の追加
7. 参考資料
7.1 公式ドキュメント
LangChain
Google AI Studio
Streamlit
ChromaDB
7.2 関連記事
RAGの基礎
まとめ
Phase 5では、完成したRAGチャットボットをStreamlit Community Cloudにデプロイし、実際に公開するまでの手順を解説しました。
重要なポイント
-
.env
ファイルは絶対にGitにコミットしない - Streamlit Community CloudではSecretsで環境変数を管理
- ChromaDBのデータ永続化には制約があるため、起動時の自動インデックス作成で対応
- Google AI Studio APIのレート制限に注意
プロジェクトを通じて
1週間で、RAGの基本概念から実装、最適化、デプロイまでを経験しました。このプロジェクトで構築したシステムは、さらなる拡張の基盤として活用できます。
ご質問やフィードバックは、コメント欄またはGitHubのIssueでお気軽にどうぞ。
GitHubリポジトリ
コード全体は以下のリポジトリで公開しています: