🦁

Gemini 2.0 Flash のチャットアプリを Cloud Run で開発してみた

2024/12/23に公開

tl;dr

  • Gemini 2.0 Flash が登場、Gemini 1.5 Pro と同等か、1.5 Pro を超える性能と、Gemini 1.5 Flash と同等のスピードでレスポンスを返せる
  • Gemini 2.0 Flash を利用したチャットボットアプリを gradio というフレームワークを使って、Cloud Run でホスティングしてみた
  • Gemini 2.0 Flash は、動画、音声のストリーム入力が可能。Google AI Studio や、Vertex AI Studio で試すことができる
  • Gemini 2.0 Flash はまだ検証版であり、製品環境での利用は推奨されていません。
  • ソースコードはこちらにあります 🍵

はじめに

みなさん、こんにちは。Google Cloud パートナーエンジニアの Sho です。

この記事は Google Cloud Japan Advent Calendar 2024 通常版の 12/23 の記事です。本記事では、Google が提供する生成 AI モデルである Gemini に新たに登場したラインナップである Gemini 2.0 Flash を使ったチャットアプリを Cloud Run でホスティングしてみた記事です。

Gemini 2.0 Flash

2024/12/10 に、Google から Gemini の新たなバージョンである Gemini 2.0 Flash が登場しました。記事執筆当時(2024/12/23)では試験版であり、製品環境での利用は推奨されていません。

Gemini 2.0 Flash についておさえておいていただきたい点は以下の 2 点になります。

高いパフォーマンス

Gemini 2.0 Flash は、Flash という名称でありながら、Gemini 1.5 Pro と同等か、一部では Gemini 1.5 Pro を超える性能があると発表されています。

特に以下の点について高いパフォーマンスが報告されています。

  • Code の生成やベンチマーク
  • 数学の問題に対する回答
  • 画像の生成や説明
  • 動画の解釈

※ 一方で、Long Context については、現状では Gemini 1.5 Pro のほうが高い精度で回答が可能となっています。

Multimodal Live API

動画、音声のストリーミング入力が可能となりました。Gemini に動画を見せながら質問したりすることで、回答が得られるような仕組みが導入されています。
英語になりますが、デモは以下を御覧ください。

https://youtu.be/hIIlJt8JERI

Cloud Run で試してみる

Gemini 2.0 Flash の実験版 gemini-2.0-flash-exp は、Google AI Studio や、Vertex AI Studio で実際に試すことができます。この記事では、ただ試すだけではなく、Cloud Run 上から実行できることを確認してみましょう。

Cloud Run 上で Gemini 2.0 Flash を動かしてみた例

1. gradio をインストール

今回は gradio を利用します。Python コードだけで UI を記述できる便利なフレームワークです。

早速開発を始めていきましょう。Google Cloud 上の場合、Cloud Shell を利用いただくとスムーズです。


Cloud Shell はこちら

仮想環境を作成し、gradio をインストールします。

cd ~
python -m venv py3
source py3/bin/activate
mkdir advent-demo
cd advent-demo
pip install gradio

2. インターフェースの実装

Quickstart を参考に、コードを書いてみましょう。チャット形式のインターフェースの実装はHow to Create a Chatbot with Gradio にヒントがあります。

import gradio as gr
import random

def random_response(message, history):
    return random.choice(["Yes", "No"])

demo = gr.ChatInterface(
    fn=random_response, 
    type="messages"
).launch()

demo.launch()

上記を apps.py という名称で保存し、実行してみましょう。

  • gr.ChatInterface で、チャット風のインターフェースを設定
  • fn に、Yes or No を返す関数を設定
$ python apps.py
* Running on local URL:  http://127.0.0.1:7860

To create a public link, set `share=True` in `launch()`.

gradio はデフォルトポートが 7860 で起動するため、以下のボタンから起動ポートを変更して動作確認しましょう。


閲覧実行するポートを変更する

正しく起動できていると、以下のようになります。質問に対してランダムに Yes or No を回答するチャットボットができました。

3. Gemini 2.0 Flash を実行する部分を実装

上記の例の fn に対して、Gemini 2.0 Flash にリクエストを送る関数を設定できれば、チャットボットが作れそうです。早速実装してみましょう!

必要なライブラリを導入します。以下を requirements.txt をして作成しましょう。

  • google-auth[pyopenssl] は、API を実行するために必要なトークンを取得するために利用するライブラリです

https://github.com/shonuma/advent-2024-demos/blob/main/requirements.txt

続いて app.py の、Gemini からデータを取得する部分を実装します。
まずは必要なライブラリをインポートします。

https://github.com/shonuma/advent-2024-demos/blob/main/app.py#L1-L20

ポイント
  • 環境変数からプロジェクトID、リージョンを読み込みます。

公式ドキュメントを参考に実装していきます。

https://github.com/shonuma/advent-2024-demos/blob/main/app.py#L26-L91

ポイント
  • 27-69 行目が、API のパラメータを示しています。
  • 33 行目に、ユーザから入力されたプロンプトを渡しています。
  • 41 行目に指定されている文字列は SystemInstruction で、プロンプトを渡す際に合わせて渡される命令です。
  • 71 行目で、API のエンドポイントを組み立てています。
  • 79 行目に、トークンを取得する処理があります。
  • 80-83 行目で、ヘッダを組み立てています。
  • 85 行目で API を実行し、取得したレスポンスを 91 行目でパースして返しています。
  • Footer を隠す実装は、github の issue を参考に実装しています。

API を実行するにはトークンが必要です。google-auth公式ドキュメント を参考に、トークンの取得処理を実装します。

https://github.com/shonuma/advent-2024-demos/blob/main/app.py#L94-L98

ポイント
  • 本実装の場合、毎回 Token の取得処理が走るので若干パフォーマンスに影響が出ます。
  • 上記の問題は、トークンを一定時間キャッシュする等で解消可能です。

上記で、メイン部分の実装が完了しました。
Cloud Shell で開発を行っていただいている場合、ローカル環境で実行確認が可能です。

プロジェクトIDを設定して、サーバーを起動してみましょう。

export PROJECT_ID=<%プロジェクトID%>
python app.py

今度は以下のように Gemini からのレスポンスが得られました。

Gemini 2.0 Flash が応答してくれる例

4.Cloud Run へのデプロイ

それでは、Cloud Run 上で実行してみましょう。以下の Dockerfile を同じディレクトリに作成します。プロジェクト ID の部分だけ、書き換えが必要です。

FROM python:3.12-slim

WORKDIR /app

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

ENV PROJECT_ID=<%PROJECT_ID%>
ENV REGION=us-central1

ENV GRADIO_SERVER_PORT=8080
ENV GRADIO_SERVER_NAME="0.0.0.0"

CMD ["python", "app.py"]
ポイント
  • GRADIO_SERVER_PORT を設定することで、起動時のポートを変更できます。

最終的に、以下の 3 ファイルが作成されていれば準備完了です。

$ ls
app.py  Dockerfile  requirements.txt

Cloud Run へデプロイを実行します。ソースコードからのデプロイとなるため、デプロイ時にソースのパスを指定しています。

gcloud run deploy gradio-chat --source . --region us-central1 --allow-unauthenticated

デプロイが完了したら、動作確認を行ってみましょう。無事応答が帰ってきたら成功です。
うまくいかなかった方、振り返りたい方向けに、上記のデモに利用したソースコードをこちらで公開しています。参考としていただけたらと思います。

お疲れ様でした🍵

まとめ

本日の記事では、Gemini 2.0 Flash を使ったチャットボットを Cloud Run にデプロイしてみて利用できることを確認しました。ローカル環境で試した内容がすぐにホスティングできるというのは Cloud Run の強みですね!Gemini 2.0 Flash はテキストデータ以外も扱うことができるため、音声の入力や動画の入力などの対応も実装可能でしょう。
最後までお読みいただきありがとうございました!良い Cloud Run ライフを!そして良い年をお迎えください🎍

さいごに


ELIZA っぽい返しをしている Gemini さん

Google Cloud Japan

Discussion