0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

RAGチャットボットを3時間で作る - 第5回: デプロイと運用、総括

Last updated at Posted at 2025-10-10

この記事について

シリーズ目次

  1. プロジェクト概要と環境構築
  2. Phase 1: ドキュメントローダーとチャンキング実装
  3. Phase 2&3: 検索と回答生成の実装
  4. Phase 4: パフォーマンスチューニング
  5. Phase 5: デプロイと運用、総括(本記事)

この記事で学べること

  • Streamlit Community Cloudへのデプロイ手順
  • 環境変数とシークレットの適切な管理方法
  • 運用上の課題と対策
  • RAGシステム構築を通じて得られた知見

前回までで、パフォーマンスチューニング機能を含む完全なRAGチャットボットが完成しました。最終回となる今回は、アプリケーションをクラウドにデプロイし、実際に公開する手順を解説します。

Phase 5の目標

Phase 5では以下を達成します:

  1. デプロイ準備: コードの整理とGitHubリポジトリの作成
  2. Streamlit Community Cloudへのデプロイ: 実際の公開手順
  3. 運用上の課題の理解: API制限やデータ永続化の問題
  4. プロジェクトの総括: 学んだことと今後の方向性

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でのリポジトリ作成

  1. GitHubにログイン
  2. 右上の「+」→「New repository」をクリック
  3. リポジトリ名を入力(例:rag-chatbot
  4. 「Public」を選択(Streamlit Community Cloudは公開リポジトリのみ対応)
  5. 「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 アカウントの作成

  1. Streamlit Community Cloudにアクセス
  2. 「Sign up」をクリック
  3. GitHubアカウントでサインイン
  4. GitHubとの連携を許可

Streamlit Community Cloud サインアップ画面

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キーなどの機密情報を設定します。

手順

  1. デプロイ中のアプリのダッシュボードで「Settings」をクリック
  2. 左メニューから「Secrets」を選択
  3. 以下の形式で入力:
GOOGLE_API_KEY = "your-actual-api-key-here"
  1. 「Save」をクリック

重要な注意点

  • シークレットは暗号化されて保存される
  • コードからはos.getenv("GOOGLE_API_KEY")でアクセス可能
  • リポジトリには含まれない

3.5 デプロイの完了確認

デプロイが完了すると、以下のようなURLでアプリにアクセスできます:

https://your-app-name.streamlit.app

初回起動時の動作

  1. 依存パッケージのインストール(2-3分)
  2. アプリの起動
  3. 自動でブラウザが開く

4. デプロイ後の動作確認

4.1 基本機能のテスト

デプロイ後、以下の機能をテストします:

  • アプリが正常に起動する
  • サイドバーが表示される
  • インデックス作成ボタンが機能する
  • 質問を入力して回答が返ってくる
  • パフォーマンス情報が表示される
  • ソース情報が表示される

4.2 エラーの確認方法

エラーが発生した場合、Streamlit Community Cloudのログで確認します。

ログの確認手順

  1. アプリのダッシュボードで「Manage app」をクリック
  2. 右下の「Logs」タブを開く
  3. エラーメッセージを確認

よくあるエラーと対処法

# 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.pyinitialize_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です。

対策

  1. ドキュメント数の制限

    • 数百〜数千ドキュメント程度に制限
  2. chunk_sizeの調整

    • 小さめのchunk_size(300-500)を推奨
  3. バッチ処理の最適化

# 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 課題と今後の改善点

技術的な課題

  1. データ永続化: Streamlit Community Cloudの制約により、完全な解決には至らなかった
  2. スケーラビリティ: 大規模データには対応できない
  3. セキュリティ: 基本的な対策のみで、本番環境には不十分

今後の改善方向

  1. リランキング機能の実装
  2. 会話履歴の活用
  3. 外部ベクトルDBへの移行
  4. 認証機能の追加

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リポジトリ

コード全体は以下のリポジトリで公開しています:

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?