Docker と Streamlit で LangChain 搭載チャット アプリをビルドしてデプロイ

コミュニティから共有できる別の素晴らしいAI / MLストーリーを嬉しく思います。 このブログ投稿では、MA Raza博士が、DockerとStreamlitを使用してLangChainを利用したチャットアプリを構築およびデプロイするためのガイドを提供します。

この記事では、デプロイのスピードと一貫性、一度ビルドすればどこでも実行できる機能、開発ワークフロー全体を加速する Docker Desktop で利用できる時間節約ツールなど、Docker が AI/ML プロジェクトにもたらす価値について説明します。

この記事では、LangChain、OpenAI API、およびStreamlitフレームワークを使用してチャットアプリを作成するプロセスについて説明します。 Docker と Docker Compose を使用して、社内サーバーまたはクラウド サーバーにアプリを簡単にデプロイする方法を示します。

青の背景に白いボックスにラングチェーン、openai、およびストリームライトのロゴを示すグラフィックと、Dockerロゴと「チャットアプリの構築」というテキスト。

デモ アプリ (図 1) を作成して Streamlit Public Cloud と Google App Engine にデプロイし、簡単にプレビューできるようにしました。

チャットアプリの構成ページの1つであるlangchainデモを示すスクリーンショット。 この画面では、openai APIキーを提供します。
図1: チャットアプリのスクリーンショット:ラングチェーンデモ。

包括的な手順と LangChain で実行されるデモ チャット アプリを含む GitHub プロジェクト (図 2) を開発しました。 また、Python 環境マネージャー用の Poetry フレームワーク も構成しました。

githubでのプロジェクトの詳細を示す画像。 openai API で構成された基本的なスケルトン アプリ。 ラングチェーン、ストリームライト、ドッカーを使用したチャットボット。
図2: GitHub 上のプロジェクトに関する情報。

チャットアプリのコンポーネントとテクノロジー

テンプレート アプリの作成に使用されるアプリのコンポーネントとフレームワークについて簡単に説明します。

LangChain Python フレームワーク

LangChain フレームワークを使用すると、開発者は強力な大規模言語モデル(LLM)を使用してアプリケーションを作成できます。デモチャットアプリは、OpenAIモデルをデフォルトのオプションとして、Pythonベースのフレームワーク上に構築されています。 ただし、ユーザーは好みのLLMを柔軟に選択できます。

LongChainフレームワークは、入力プロンプトを簡単に管理し、LLMs APIから生成された応答間の接続を確立します。

OpenAI モデル

デモンストレーションの目的で、OpenAI API を使用して、プロンプトの送信時に応答を生成しています。

フロントエンドの合理化されたUI

Streamlit は、データ アプリを構築および共有するための軽量で高速な方法です。 Streamlitフレームワークを備えたシンプルなUIは、チャットアプリと対話するために開発されています。

ドッカーを使用したデプロイ

Docker は、依存関係や環境を気にせずにアプリを開発して任意のサーバーにデプロイするのに役立ちます。 デモ アプリが開発され、ローカルで正常に動作した後、Docker サポートが追加されました。

FROM python:3.10-slim-bullseye

ENV HOST=0.0.0.0

ENV LISTEN_PORT 8080

EXPOSE 8080

RUN apt-get update && apt-get install -y git

COPY ./requirements.txt /app/requirements.txt

RUN pip install --no-cache-dir --upgrade -r /app/requirements.txt

WORKDIR app/

COPY ./demo_app /app/demo_app
COPY ./.streamlit /app/.streamlit

CMD ["streamlit", "run", "demo_app/main.py", "--server.port", "8080"]

前のコードは、デモ アプリの Docker イメージを生成するために使用される Dockerfile の内容を示しています。 イメージをビルドするには、次を使用します。

docker build -t langchain-chat-app .

軽量で高速なビルドのためのDockerの最適化

エンタープライズアプリケーション用のアプリケーションをデプロイするときは、利用されるリソースと実行/デプロイのライフサイクル計算に注意する必要があります。

また、Dockerビルドプロセスを最適化してイメージサイズの問題を解決し、ソースの変更などのすべての反復で高速にビルドする方法に関する懸念にも対処しました。Docker を最適化するためのさまざまなトリックの詳細については、「Poetry で超高速の Python Docker ビルド」の記事を参照してください。

# The builder image, used to build the virtual environment
FROM python:3.11-buster as builder

RUN apt-get update && apt-get install -y git

RUN pip install poetry==1.4.2

ENV POETRY_NO_INTERACTION=1 \
POETRY_VIRTUALENVS_IN_PROJECT=1 \
POETRY_VIRTUALENVS_CREATE=1 \
POETRY_CACHE_DIR=/tmp/poetry_cache

ENV HOST=0.0.0.0
ENV LISTEN_PORT 8080
EXPOSE 8080

WORKDIR /app

#COPY pyproject.toml ./app/pyproject.toml
#COPY poetry.lock ./app/poetry.lock
COPY pyproject.toml poetry.lock ./

RUN poetry install --without dev --no-root && rm -rf $POETRY_CACHE_DIR

# The runtime image, used to just run the code provided its virtual environment
FROM python:3.11-slim-buster as runtime

ENV VIRTUAL_ENV=/app/.venv \
PATH="/app/.venv/bin:$PATH"

COPY --from=builder ${VIRTUAL_ENV} ${VIRTUAL_ENV}

COPY ./demo_app ./demo_app
COPY ./.streamlit ./.streamlit

CMD ["streamlit", "run", "demo_app/main.py", "--server.port", "8080"]

この Dockerfile には、2 つのランタイム イメージ タグがあります。 最初のものでは、仮想環境を形成するための詩の環境を作成します。 アプリは 2 番目のランタイム イメージで実行されますが、アプリケーションは最初の手順で作成した仮想環境をアクティブ化した後に実行されます。

次に、を使用して DOCKER_BUILDKITDocker イメージを構築し、Docker イメージをすばやく安全に作成するための最新のツールを提供します。

DOCKER_BUILDKIT=1 docker build --target=runtime . -t langchain-chat-app:latest

Docker-compose.yaml ファイル

アプリを実行するために、次の内容も含まれています docker-compose.yml

version: '3'
services:
langchain-chat-app:
image: langchain-chat-app:latest
build: ./app
command: streamlit run demo_app/main.py --server.port 8080
volumes:
- ./demo_app/:/app/demo_app
ports:
- 8080:8080

ローカル サーバーでアプリを実行するには、次のコマンドを使用します。

docker-compose up

インフラストラクチャ

Docker のサポートにより、基本的なガイドに従ってアプリを任意のクラウド インフラストラクチャにデプロイできます。 次のインフラストラクチャにアプリをデプロイしました。

合理化されたパブリッククラウド

パブリッククラウドへのStreamlitアプリのデプロイは、GitHubアカウントとリポジトリを使用すると非常に簡単です。 デプロイされたアプリには、 LangChainデモからアクセスできます。

グーグルアプリエンジン

Docker を使用して Google App Engine にアプリをデプロイしてみました。 リポジトリには、 app.yaml 次の内容をデプロイするための構成ファイルが含まれています。

# With Dockerfile
runtime: custom
env: flex
# This sample incurs costs to run on the App Engine flexible environment.
# The settings below are to reduce costs during testing and are not appropriate
# for production use. For more information, see:
# https://cloud.google.com/appengine/docs/flexible/python/configuring-your-app-with-app-yaml

manual_scaling:
instances: 1
resources:
cpu: 1
memory_gb: 0.5
disk_size_gb: 10

Google App Engine にチャット アプリをデプロイするには、gcloud Python SDK をインストールした後に次のコマンドを使用しました。

gcloud app create --project=[YOUR_PROJECT_ID]
gcloud config set project [YOUR_PROJECT_ID]
gcloud app deploy app.yaml

Google App Engine にデプロイされたサンプル アプリ (図 3) には、次の方法でアクセスできます。

Google アプリ エンジンにデプロイされた合理化されたサンプル アプリの URL を示す画像。
図3: Google アプリ エンジンにデプロイされたサンプル アプリにリンクします。

Google Cloud Run を使用したアプリのデプロイ

また、GCP の Cloud Run Service を使用して Google Cloud にアプリをデプロイすることもできます。 Cloud Run を使用したアプリのデプロイは、Google App Engine よりも高速です。

この方法を採用することに関連する機能は次のとおりです。

  • アプリケーションをコンテナーにパッケージ化します。
  • コンテナーを成果物レジストリにプッシュします。
  • プッシュされたコンテナーからサービスをデプロイします。

Google Cloud Run を使用してアプリをデプロイするための手順を見ていきましょう。 プロジェクトがすでに Google Cloud で作成されていることを前提としています。

1. サービスを有効にします。
以下を使用して gcloud sdkサービスを有効にできます。

gcloud services enable cloudbuild.googleapis.com
gcloud services enable run.googleapis.com

2. ロールを作成してサービス アカウントに追加します。
次のコマンド セットを使用して、サービス アカウントを作成し、適切なアクセス許可を設定します。 サービス SERVICE_ACCOUNT and PROJECT_IDを変更します。

gcloud iam service-accounts create langchain-app-cr \
--display-name="langchain-app-cr"

gcloud projects add-iam-policy-binding langchain-chat \
--member="serviceAccount:[email protected]" \
--role="roles/run.invoker"

gcloud projects add-iam-policy-binding langchain-chat \
--member="serviceAccount:[email protected]" \
--role="roles/serviceusage.serviceUsageConsumer"

gcloud projects add-iam-policy-binding langchain-chat \
--member="serviceAccount:[email protected]" \
--role="roles/run.admin"

3. Docker イメージを生成してプッシュします。
次のコマンドを使用して、イメージを生成し、アーティファクト レジストリにプッシュできます。 ただし、これが初めての場合は、Dockerプレースホルダーのアクセス許可を持つリポジトリを作成する必要があります。

DOCKER_BUILDKIT=1 docker build --target=runtime . -t australia-southeast1-docker.pkg.dev/langchain-chat/app/langchain-chat-app:latest
docker push australia-southeast1-docker.pkg.dev/langchain-chat/app/langchain-chat-app:latest

アーティファクトリポジトリを生成し、権限を割り当てるために必要なコマンドは次のとおりです。

gcloud auth configure-docker australia-southeast1-docker.pkg.dev

gcloud artifacts repositories create app \
--repository-format=docker \
--location=australia-southeast1 \
--description="A Langachain Streamlit App" \
--async

これでアプリがデプロイされます。

結論

この記事では、LangChain、OpenAI API、および Streamlit を利用したチャット アプリの開発とデプロイに必要なさまざまなツールとテクノロジについて詳しく説明します。 このプロセスでは、Dockerフレームワークも利用されます。

アプリケーションのデモは、Streamlit Public Cloud と Google App Engine の両方で利用できます。 Dockerのサポートのおかげで、開発者は好みのクラウドプラットフォームにデプロイできます。

このプロジェクトは、LLMの機能を利用するアプリを迅速に開発するための基本的なテンプレートとして機能します。 Razaのプロジェクトの詳細は、彼の GitHubページにあります。

AI / MLワークフローにおけるDockerに関する興味深いユースケースやストーリーはありますか? 私たちはあなた から聞いて 、多分あなたの話を共有したいです。

この投稿は 初版発行 レベルアップコーディングで、許可を得て転載されています。

さらに詳しく