G-gen 又吉です。Google Cloud (旧称 GCP) の生成 AI (Generative AI) である PaLM 2 を用いて、Cloud Run 上に社内 LLM Web アプリを構築してみました。
はじめに
今回は、Google Cloud の生成 AI である Vertex AI PaLM API を用いて、社内向け LLM Web アプリを Cloud Run 上にデプロイします。
また、Cloud Run サービスの認証には Identity-Aware Proxy (IAP) を用いることで、社内ユーザーのみがアクセスできる状態を構成できます。
尚、コンシューマ向け LLM サービスの Bard と比べ、Vertex AI PaLM API を用いることで LLM モデルへの入出力データを自社内に閉じることができ、データガバナンスを維持することが出来ます。
先日、当社ブログで Vertex AI PaLM API を Slack と連携した記事も公開されてますので、ご興味ある方はこちらもご覧下さい。
前提知識
Vertex AI PaLM API
PaLM 2 は Google の生成 AI モデルであり、Bard の裏側でも使われています。Vertex AI では、PaLM 2 のエンドポイントを Vertex AI PaLM API として公開しています。
開発者は Vertex AI PaLM API を使用することで、自社のアプリケーションで生成 AI を組み込むことが可能となります。
今回は、 Vertex AI PaLM API の中でも会話に特化した chat-bison を利用します。
その他、Vertex AI PaLM API の詳細については、以下のブログをご覧ください。
Gradio
Gradio とは、Python で機械学習 Web アプリを容易に構築できるフレームワークです。
今回は、簡易的な LLM Webアプリを構築するために以下のコンポーネントを使用しました。
No | コンポーネント | 説明 |
---|---|---|
1 | Chatbot | LLM との会話履歴を表示する部分 |
2 | Textbox | ユーザーがプロンプトを入力するテキストボックス |
3 | ClearButton | ユーザーが入力したプロンプトを削除するボタン |
参考:How to Create a Chatbot with Gradio
Cloud Runサービスへのアクセス制御
Cloud Run サービスへのアクセス制御は、Identity-Aware Proxy (IAP) を用いることで IAP を利用できる IAM ロール がアタッチされた組織内 Google アカウント / グループ に制限することができます。
準備
ディレクトリ構成
開発環境は Cloud Shell を用いて行います。ディレクトリ構成は以下のとおりです。
llm_app ディレクトリ配下は、以下のとおりです。
llm_app |-- app | |-- app.py | `-- requirements.txt `-- Dockerfile
app.py
app.py には、以下の Python コードを記述します。
import os import logging import gradio as gr import google.cloud.logging import vertexai from vertexai.language_models import ChatModel, ChatMessage, InputOutputTextPair # Cloud Logging ハンドラを logger に接続 logger = logging.getLogger() logging_client = google.cloud.logging.Client() logging_client.setup_logging() # 定数の定義 PROJECT_ID = os.environ.get("PROJECT_ID") LOCATION = os.environ.get("LOCATION") # vertexai インスタンスの初期化 vertexai.init(project=PROJECT_ID, location="us-central1") def llm_chat(message, chat_history): # 基盤モデルを設定 chat_model = ChatModel.from_pretrained("chat-bison@001") # パラメータを指定 parameters = { "max_output_tokens": 1024, "temperature": 0.2, "top_p": 0.8, "top_k": 40 } # 会話履歴のリストを初期化 message_history = [] # 会話履歴のフォーマットを整形 for row in chat_history: input_from_user = row[0] output_from_llm = row[1] q_message = ChatMessage(author="user", content=input_from_user) message_history.append(q_message) a_message = ChatMessage(author="llm", content=output_from_llm) message_history.append(a_message) # 基盤モデルに会話履歴をインプット chat = chat_model.start_chat(message_history=message_history) # 基盤モデルにプロンプトリクエストを送信 response = chat.send_message(message, **parameters) return response.text def respond(message, chat_history): # llm で回答を生成 bot_message = llm_chat(message, chat_history) # Cloud Logging 書き込み用 logger.info(f"message: {message}") logger.info(f"chat_history: {chat_history}") logger.info(f"bot_message: {bot_message}") chat_history.append((message, bot_message)) return "", chat_history # gradio の設定 with gr.Blocks() as llm_web_app: chatbot = gr.Chatbot() msg = gr.Textbox() clear = gr.ClearButton([msg, chatbot]) msg.submit(respond, [msg, chatbot], [msg, chatbot]) clear.click(lambda: None, None, chatbot, queue=False) # Gradio の立ち上げ llm_web_app.launch(server_name="0.0.0.0", server_port=7860)
requirements.txt
gradio==3.41.2 google-cloud-aiplatform==1.31.1 google-cloud-logging==3.6.0
Dockerfile
FROM python:3.9-slim COPY ./app /app WORKDIR /app RUN pip install --no-cache-dir -r requirements.txt EXPOSE 7860 CMD ["python", "app.py"]
デプロイ
Cloud Shell にて、現在のディレクトリが llm_app ディレクトリであることを確認し、以下 gcloud コマンドを順次実行します。
# 環境変数の設定 PROJECT_ID={プロジェクト ID} BILLING_ACCOUNT_ID={請求先アカウント ID} REGION=asia-northeast1 AR_REPO={Artifact Repogitory のレポジトリ名} SERVICE_NAME={Cloud Run サービス名} SA_NAME={サービスアカウント名} # プロジェクト作成 gcloud projects create ${PROJECT_ID} --name=${PROJECT_NAME} # プロジェクト設定の変更 gcloud config set project ${PROJECT_ID} # 請求先アカウントの紐づけ gcloud beta billing projects link ${PROJECT_ID} \ --billing-account=${BILLING_ACCOUNT_ID} # API の有効化 gcloud services enable --project=$PROJECT_ID run.googleapis.com \ artifactregistry.googleapis.com \ cloudbuild.googleapis.com \ compute.googleapis.com \ aiplatform.googleapis.com \ iap.googleapis.com # サービスアカウント作成 gcloud iam service-accounts create $SA_NAME # サービスアカウントへ権限付与 gcloud projects add-iam-policy-binding $PROJECT_ID \ --member="serviceAccount:$SA_NAME@$PROJECT_ID.iam.gserviceaccount.com" \ --role="roles/aiplatform.user" # Artifacts repositories 作成 gcloud artifacts repositories create $AR_REPO \ --location=$REGION \ --repository-format=Docker \ --project=$PROJECT_ID # イメージの作成&更新 gcloud builds submit --tag $REGION-docker.pkg.dev/$PROJECT_ID/$AR_REPO/$SERVICE_NAME \ --project=$PROJECT_ID # Cloud Run デプロイ gcloud run deploy $SERVICE_NAME --port 7860 \ --image $REGION-docker.pkg.dev/$PROJECT_ID/$AR_REPO/$SERVICE_NAME \ --no-allow-unauthenticated \ --service-account=$SA_NAME@$PROJECT_ID.iam.gserviceaccount.com \ --ingress=internal-and-cloud-load-balancing \ --region=$REGION \ --set-env-vars=PROJECT_ID=$PROJECT_ID,LOCATION=$REGION \ --project=$PROJECT_ID
Cloud Run サービスと IAP の連携は、以下ブログの手順をご参照下さい。
動作検証
LLM Web アプリの URL にアクセスすると、まず最初に IAP による認証画面が現れます。
許可された Google アカウントでログインすると LLM Web アプリの画面に遷移します。
試しに、「BigQuery の特徴」を聞いてみてます。また、会話形式もサポートできているか併せて確認してみます。
LLM が前の会話を記憶して、回答を生成してくれました。
このように、Vertex AI PaLM API を利用することで、入出力データは学習に使われることなく、企業のデータガバナンスを維持しながら社内 LLM Web アプリを構築することができます。
又吉 佑樹(記事一覧)
クラウドソリューション部
はいさい、沖縄出身のクラウドエンジニア!
セールスからエンジニアへ転身。Google Cloud 全 11 資格保有。Google Cloud Champion Innovator (AI/ML)。Google Cloud Partner Top Engineer 2024。Google Cloud 公式ユーザー会 Jagu'e'r でエバンジェリスト。好きな分野は生成 AI。
Follow @matayuuuu