StreamlitとRAGで作る 実用的なAIチャットボット(10) DockerとStreamlit Cloudを使ったデプロイ

Streamlit
この記事は約12分で読めます。

こんにちはJS2IIUです。
連載「StreamlitとRAGで作る:実用的なAIチャットボット開発ガイド」、今回が最終回となります。

LangChainによるLLMの制御、独自データの取り込み、ベクトル検索の構築、そして高度なリトリーバル戦略や非同期処理の実装と、長い旅を続けてきました。

最終回となる今回は、このアプリケーションを「コンテナ化」し、「クラウド上に公開(デプロイ)」する手順を解説します。「自分のPCでは動いたのに、サーバーでは動かない」というエンジニア最大の悪夢を回避する技術、Docker。そして、Streamlitアプリを世界で最も簡単に公開できる Streamlit Community Cloud。これらを使いこなし、あなたの作ったAIアプリを世界へ解き放ちましょう。今回もよろしくお願いします。

1. はじめに:「動く」と「使える」の大きな壁

アプリケーション開発において、ローカルでコードが動くことと、それを本番環境で安定稼働させることの間には、大きな隔たりがあります。

  • OSの違い: あなたはMacやWindowsを使っているかもしれませんが、サーバーの多くはLinuxです。
  • Pythonバージョンの違い: 3.13で開発したのに、サーバーには3.11しか入っていないかもしれません。
  • ライブラリの依存関係: pip install した大量のライブラリ、サーバーで一つ一つ入れ直すのは大変です。

これらを解決するのが Docker(ドッカー) です。
Dockerは、アプリケーションと、それを動かすために必要な「OS、Python、ライブラリ、設定ファイル」をすべてひとまとめにした「コンテナ(箱)」を作ります。この箱さえあれば、AWSだろうがGCPだろうが、自分のPCだろうが、全く同じ環境でアプリを動かすことができます。

今回は、以下の2つのアプローチを紹介します。

  1. Streamlit Community Cloud: 最も手軽。Dockerを使わずにGit連携だけで公開可能。
  2. Dockerコンテナ化: 本格的。あらゆるクラウド環境(Render, Heroku, AWS App Runner等)へ移植可能。

Streamlit Community Cloud • Streamlit
https://streamlit.io/cloud

Docker: コンテナー アプリケーション開発の加速
https://www.docker.com/ja-jp/

2. 公開前の準備:依存関係の整理

どちらの方法をとるにせよ、まずは「このアプリを動かすにはどのライブラリが必要か」を明確にする必要があります。Pythonでは通常、requirements.txt というファイルで管理します。

プロジェクトのルートディレクトリで以下のコマンドを実行し、ファイルを作成します。

# 現在の環境に入っているライブラリをリストアップする場合(簡易的)
pip freeze > requirements.txt

ただし、pip freeze は環境に入っている不要なライブラリまで全て書き出してしまうため、本番環境をクリーンに保つためには、必要なものだけを手動で記述することを推奨します。

今回のRAGアプリに必要な最小限の構成例(requirements.txt)は以下のようになります。

Plaintext
streamlit
langchain
langchain-openai
langchain-community
faiss-cpu
python-dotenv
tiktoken
openai
pypdf

注意: 本番環境(サーバー)ではGPUが使えないケースが多いため、faiss-gpu ではなく faiss-cpu を指定するのが安全です。

3. アプローチA:Streamlit Community Cloudへのデプロイ

これが、最も簡単にStreamlitアプリを公開する方法です。Streamlit社が提供している無料のホスティングサービスを利用します。

手順1:GitHubへのプッシュ

まず、作成したソースコード一式をGitHubのリポジトリにプッシュします。
【重要】 .env ファイルや faiss_index フォルダ(特に機密データを含む場合)は、絶対にGitHubにアップロードしないでください。 .gitignore ファイルを作成し、除外設定を行います。

Plaintext
# .gitignore
.env
__pycache__/
faiss_index/
.venv/

参考:こちらのリポジトリで.gitignoreのテンプレートを入手できます
gitignore/Python.gitignore at main · github/gitignore · GitHub
https://github.com/github/gitignore/blob/main/Python.gitignore

手順2:Streamlit Cloudとの連携

  1. Streamlit Community Cloud (streamlit.io) にアクセスし、サインアップします(GitHubアカウントでログイン)。
  2. 「New app」ボタンをクリックします。
  3. 「Use existing repo」を選び、先ほどプッシュしたリポジトリ、ブランチ(main)、メインファイルパス(app.py)を選択します。

手順3:環境変数の設定(Secrets)

ここが最重要ポイントです。GitHubにはAPIキー(.env)を上げていないため、このままではアプリが動きません。Streamlit Cloudの管理画面でキーを設定します。

  1. デプロイ設定画面の「Advanced settings」をクリックします。
  2. 「Secrets」欄に、.env の中身をTOML形式で記述します。
Plaintext
OPENAI_API_KEY = "sk-xxxxxxxxxxxxxxxxxxxxxxxx"

Streamlit CloudのSecrets機能は、アプリ実行時に自動的に環境変数として注入してくれるため、コード側で os.environ["OPENAI_API_KEY"]dotenv を使っている部分は修正なしで動作します。

手順4:FAISSインデックスの扱い

ローカルで作った faiss_index をGitに上げていない場合、アプリ起動時にインデックスが存在しないことになります。
これには2つの解決策があります。

  1. 起動時に作成する: アプリ起動時にドキュメントを読み込み直してインデックスを作る(第9回の st.status を使った処理がここで活きます)。
  2. Gitに含める: 機密情報でないなら、faiss_index フォルダごとGitにプッシュしてしまう(ファイルサイズが巨大でなければこれが一番早いです)。

「Deploy!」ボタンを押せば、数分後にはあなただけのURLが発行され、アプリが世界中に公開されます。

4. アプローチB:Dockerによる完全なコンテナ化

Streamlit Cloudは手軽ですが、「社内ネットワークのみで公開したい」「もっとハイスペックなサーバーで動かしたい」といった場合には向きません。
そこで、どこでも動く Dockerイメージ の作成方法を解説します。

Dockerfileの作成

プロジェクトのルートディレクトリに Dockerfile (拡張子なし)という名前のファイルを作成し、以下の内容を記述します。

Dockerfile
# 1. ベースイメージの指定
# Python 3.9の軽量版(slim)を使用します
FROM python:3.9-slim

# 2. 作業ディレクトリの設定
# コンテナ内の /app という場所で作業します
WORKDIR /app

# 3. 必要なパッケージのインストール(OSレベル)
# pypdfなどが依存するビルドツールが必要な場合に備えます
RUN apt-get update && apt-get install -y \
    build-essential \
    curl \
    software-properties-common \
    && rm -rf /var/lib/apt/lists/*

# 4. 依存関係ファイルのコピーとインストール
# 先にrequirements.txtだけをコピーしてインストールすることで、
# Dockerのキャッシュ機能を有効活用し、再ビルドを高速化します
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# 5. アプリケーションコードのコピー
# 現在のフォルダの全てのファイルをコンテナの /app にコピーします
COPY . .

# 6. ポートの公開
# Streamlitのデフォルトポート
EXPOSE 8501

# 7. ヘルスチェック(オプション)
# コンテナが正常に動いているかを確認する設定
HEALTHCHECK CMD curl --fail http://localhost:8501/_stcore/health || exit 1

# 8. 起動コマンド
# 外部からアクセスできるように address=0.0.0.0 を指定するのがポイントです
ENTRYPOINT ["streamlit", "run", "app.py", "--server.port=8501", "--server.address=0.0.0.0"]

Dockerイメージのビルドと実行

Docker Desktopなどがインストールされている環境で、ターミナルから以下のコマンドを実行します。

Bash
# イメージのビルド(rag-appという名前を付ける)
docker build -t rag-app .

# コンテナの実行
# -p 8501:8501 : ローカルの8501ポートをコンテナに繋ぐ
# --env-file .env : 手元の.envファイルを環境変数として渡す
docker run -p 8501:8501 --env-file .env rag-app

これで、ローカルの http://localhost:8501 にアクセスしてアプリが動けば成功です。
この rag-app というイメージさえあれば、AWS App Runner、Google Cloud Run、Render.com など、あらゆるコンテナ対応プラットフォームにそのままデプロイ可能です。

5. プロダクション運用のためのチェックリスト

公開する前に、以下の点を最終確認しましょう。

  • セキュリティ: GitHubにAPIキーが流出していないか?
  • コスト: OpenAI APIの利用上限(Usage Limit)を設定したか?(公開すると予期せぬアクセスで課金が増える可能性があります)
  • エラーハンドリング: ユーザーが想定外の入力をした時にアプリが落ちないか?(try-except は適切か?)
  • キャッシュ: st.cache_resource は適切に使われているか?(サーバーリソースの節約)

6. シリーズのまとめ:あなたが手に入れたもの

全10回、本当にお疲れ様でした。
このシリーズを通して、私たちはゼロから本格的なAIアプリケーションを作り上げました。

  1. UI構築: Streamlitで直感的なインターフェースを作る力。
  2. LLM制御: LangChainを使ってAIに意図した挙動をさせる力。
  3. データ処理: 独自のドキュメントをRAGとして組み込む技術。
  4. UX設計: ストリーミングや履歴管理でユーザーをもてなす工夫。
  5. デプロイ: アプリを世界に公開するエンジニアリングスキル。

これらは単なる知識ではなく、今後どのようなAIアプリを作る際にも通用する「実践的な武器」です。

RAGの世界は日進月歩です。
マルチモーダル(画像や音声)への対応、AIエージェントによる自律的なタスク実行、より高度な検索アルゴリズムなど、学ぶべきことはまだまだあります。しかし、この連載で築いた土台があれば、どんな新しい技術も恐れることはありません。

最後までお読みいただき、本当にありがとうございました。

連載記事一覧

コメント

タイトルとURLをコピーしました