Google Cloudの生成AI(PaLM2)で社内LLM Webアプリを爆速で作ってみた

記事タイトルとURLをコピーする

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 と連携した記事も公開されてますので、ご興味ある方はこちらもご覧下さい。

blog.g-gen.co.jp

前提知識

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 の詳細については、以下のブログをご覧ください。

blog.g-gen.co.jp

Gradio

Gradio とは、Python で機械学習 Web アプリを容易に構築できるフレームワークです。

今回は、簡易的な LLM Webアプリを構築するために以下のコンポーネントを使用しました。

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 アカウント / グループ に制限することができます。

参考:Enabling IAP for Cloud Run

準備

ディレクトリ構成

開発環境は 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)

参考:Gradio - Chatbot - Domos

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 の連携は、以下ブログの手順をご参照下さい。

blog.g-gen.co.jp

動作検証

LLM Web アプリの URL にアクセスすると、まず最初に IAP による認証画面が現れます。

IAP による認証画面

許可された Google アカウントでログインすると LLM Web アプリの画面に遷移します。

試しに、「BigQuery の特徴」を聞いてみてます。また、会話形式もサポートできているか併せて確認してみます。

LLM Web アプリ画面

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/ML。