💬

Firebase Extensions で PaLM2 を使ったチャットアプリを作る

2023/12/03に公開

この記事は Google Cloud Advent Calendar 2023 (通常版) の 12/3 の記事です。

3日目は2日目に続き、Firebase Extensions をテーマにしたブログをお送りします。

先日開催された Google Cloud Next Tokyo '23 では、Expo ブースで「Firebase Extensions で構築する生成 AI チャットボット アプリ体験」を展示しました。実際の展示では、お越しくださった方々から「このアプリはどうやって作るの?」や「このサンプルを参考に作ってみたい」といったようなお言葉をいただきました(ありがとうございます!)。

Firebase Extensions は Firebase と Google Cloud の各サービスを組み合わせたパッケージを Firebase プロジェクト内にかんたんにデプロイすることができるサービスです。2023年12月現在、プレビューで提供しています。

Firebase Extensions

Firebase Extensions では PaLM2 を使ったチャットアプリを作るための Extension 「Chatbot with PaLM API」を Google Cloud 公式で提供しています。

https://extensions.dev/extensions/googlecloud/firestore-palm-chatbot

この記事では Chatbot with PaLM API を使ったチャットアプリの作り方を解説します。

構成

この記事では次のようなアーキテクチャを構成します。

アーキテクチャ

次のような流れで PaLM2 を使ったチャットを実現します。

  1. Firebase Hosting でホストしている Web アプリから Firestore にプロンプトを直接書き込む
  2. Firestore のイベントトリガーCloud Functions の関数が実行される
  3. Cloud Functions の関数が Vertex AI PaLM API を呼び出し、レスポンスを得る
  4. Cloud Functions の関数が 3 のレスポンスを Firestore に書き込む
  5. リアルタイムリスナーによって Web アプリにレスポンスが表示される

Extension では 2-4 の振る舞いを実行する Cloud Functions をデプロイします。この Cloud Functions は Firestore のイベントトリガーで実行される前提で、PaLM API を呼び出し、Firestore にレスポンスを書き込む処理が実装されています。

Firebase Extensions を使う場合は Cloud Functions の関数内のコードを意識する必要なく利用することができます。どのような処理が行われているか詳しく確認したい場合は、リポジトリを直接確認してみてください。

https://github.com/GoogleCloudPlatform/firebase-extensions/tree/main/firestore-palm-chatbot

Extension をインストールする

この記事では Firebase プロジェクトが予め作成され、課金が設定されている前提で進めます。Firebase プロジェクトがまだ用意できていない場合は、次のドキュメントを参考にしてください。

まずは Extension をインストールします。次のページを開きます。

https://extensions.dev/extensions/googlecloud/firestore-palm-chatbot

[Install in Firebase console] をクリックします。

Extension のインストール

ウィザードで4つのステップを順番に確認していきます。まず初めに ❶ ではこの Extension で使うサービスで課金が発生する旨のお知らせが表示されますので、確認後 [次へ] をクリックします。

手順❶

❷ では、API と作成されるリソースの確認を行います。

Vertex AI PaLM API を利用するには Vertex AI API を有効化する必要があります。

手順❷

リソースは Cloud Functions と Secret Manager のシークレットが作成されます。Secret Manager には、Extension のインストール時に行う設定値が保存され、Cloud Functions の関数内で参照されます。API を有効化していないサービスがある場合は [有効にする] をクリックするとこの画面から有効化できます。

作成されるリソースの確認

❸ では、Extension に付与する権限の確認と許可を行います。Firebase Extensions サービスエージェントに、ここで表示されている権限を付与します。

手順❸

どのような権限が付与されるか確認し [付与] をクリックします。

権限の付与

❹ では、Extension への各設定を行います。この設定項目は Extension によって異なりますが、Chatbot with PaLM API では「Firestore のどの Collection に保存するか」や「プロンプトとレスポンスのフィールド名は何にするか」などといった項目が設定できます。

手順❹

設定項目の設定値と説明は次の通りです。

設定項目 必須 設定値 説明
PaLM API Provider ✅Vertex AI Google Cloud の Vertex AI PaLM API か Generative AI for Developers PaLM API のどちらを使うか設定できます。
API Key - Generative AI for Developers PaLM API を使う場合は API Key を設定します。
Collection Path threads/{threadId}/messages プロンプト・レスポンスを格納する Firestore の Collection のパスです。サンプルアプリではユーザーごとにスレッドを分けないのでユーザーごとにパスを分けないようにしています。
Prompt Field prompt プロンプトを格納するフィールド名です。
Response Field response レスポンスを格納するフィールド名です。
Order Field createTime 指定したフィールドの降順で取得します。
Cloud Functions location asia-northeast1 Cloud Functions をデプロイするリージョンです。
Language model text-bison LLM モデルを指定します。Vertex AI の場合はコーディング用の codechat-bison が選択できます。
Context - PaLM API に指定するコンテキストです。自然言語でコンテキストを書いておくと、この情報を前提にレスポンスを回答するようになります。
Temperature - PaLM API に指定するレスポンスのランダム性の設定です。0.0 ~ 1.0 の数値を設定します。0 に近いほど確実性の高いレスポンスになり 1 に近いほど自由度が高くなります。
Nucleus sampling probability - PaLM API に指定する Top P のパラメータで、次のトークンを選択するストラテジーを設定します。0.0 ~ 1.0 の数値を設定します。0 に近いほどランダムなレスポンスが減り 1 に近いほどランダムなレスポンスが多くなります。
Sampling strategy parameter - PaLM API に指定する Top K のパラメータで、次のトークンを選択するストラテジーを設定します。1 ~ 40 の数値を設定します。1 に近いほどランダムなレスポンスが減り 40 に近いほどランダムなレスポンスが多くなります。
Candidate count - PaLM API のレスポンスの候補数を設定します。候補は Candidates field に指定したフィールド内に格納されます。
Candidates field candidates PaLM API のレスポンスの候補を格納するフィールド名です。
Enable per document overrides. No PaLM API の実行用のパラメータをスレッド(話題)ごとに上書きするかどうかを設定します。No に指定するとここで設定した項目が常に使用されます。

これらの設定のほか [詳細パラメータの構成] では Cloud Functions のタイムアウト時間やメモリなど、より細かい設定が行えます。この記事では割愛します。

詳細パラメータの構成

設定が終わったら、最後に [拡張機能をインストール] をクリックします。

拡張機能のインストール

Cloud Functions のデプロイが含まれるので、完了までには数分かかります。

拡張機能のインストール中

Firestore データベースの作成

チャットの履歴は Firestore に保存するため、Firestore データベースも事前に作成しておきます。

Firestore

セキュリティルールはテストモードで作成します。Collection はアプリから作成するため、事前に準備する必要はありません。

Firebase Hosting にチャットアプリをデプロイする

次に、チャットボットのクライアントアプリを Firebase Hosting にデプロイします。

デモアプリのソースコードをクローンし、ライブラリをインストールしておきます。

$ git clone git@github.com:suwa-yuki/palm-chatbot-demo.git
$ cd palm-chatbot-demo
$ npm install

サンプルアプリには Firebase プロジェクトを自由に指定できるようになっています。page.tsx を開き、

const firebaseConfig = {
  projectId: "<Firebase Project ID>",
  apiKey: "<API Key>",
}

<Firebase Project ID><API Key> は Firebase コンソールの Firebase プロジェクト設定画面から確認できます。

Firebase プロジェクトの設定

Firebase CLI が未インストールの場合は、まずは下記を参考にインストールしておきます。

https://firebase.google.com/docs/cli?hl=ja

Firebase Hosting へのデプロイの準備を行います。Firebase プロジェクトの初期設定を行います。

$ firebase init

対話形式で初期設定ウィザードを進めることができます。はじめにどの機能を使うか設定を行います。Hosting: Configure files for Firebase Hosting and (optionally) set up GitHub Action deploys を選択します。

? Which Firebase features do you want to set up for this directory? Press Space to select features, then Enter to confirm your 
choices. (Press <space> to select, <a> to toggle all, <i> to invert selection, and <enter> to proceed)
 ◯ Realtime Database: Configure a security rules file for Realtime Database and (optionally) provision default instance
 ◯ Firestore: Configure security rules and indexes files for Firestore
 ◯ Functions: Configure a Cloud Functions directory and its files
❯◉ Hosting: Configure files for Firebase Hosting and (optionally) set up GitHub Action deploys
 ◯ Hosting: Set up GitHub Action deploys
 ◯ Storage: Configure a security rules file for Cloud Storage
 ◯ Emulators: Set up local emulators for Firebase products

Firebase プロジェクトの指定です。すでに Extension をインストールしている Firebase プロジェクトを使いたいので Use an existing project を選びます。

? Please select an option: (Use arrow keys)
❯ Use an existing project 
  Create a new project 
  Add Firebase to an existing Google Cloud Platform project 
  Don't set up a default project

使用する Firebase プロジェクトを選択します。

? Select a default Firebase project for this directory: 
❯ xxx (xxx)

続いて Firebase Hosting のセットアップです。Next.js のプロジェクトであることが判別されたので、そのまま Y で進みます。

=== Hosting Setup
? Detected an existing Next.js codebase in the current directory, should we use this? (Y/n) 

Firebase Hosting の SSR の機能は限定されたリージョンでしか利用できません。今回は us-west1 (Oregon) を選択します。

? In which region would you like to host server-side content, if applicable? 
  us-central1 (Iowa) 
❯ us-west1 (Oregon) 
  us-east1 (South Carolina) 
  europe-west1 (Belgium) 
  asia-east1 (Taiwan) 

CI/CD については割愛するので N のままで進みます。

? Set up automatic builds and deploys with GitHub? (y/N) 

以上で Firebase プロジェクトのセットアップは終わりです。

最後にデプロイを行います。Firebase Hosting のみを指定するデプロイコマンドを実行します。

$ firebase deploy --only hosting

特に何らかの設定を行う必要はありません。デプロイが進み、問題がなければ数分後に完了します。

   We'd love to learn from you. Express your interest in helping us shape the future of Firebase Hosting: https://goo.gle/41enW5X

   ▲ Next.js 14.0.1

   - Environments: .env

   Creating an optimized production build ...

 ✓ Compiled successfully

   Linting and checking validity of types ...

--- 省略 ---

i  functions: cleaning up build files...
i  hosting[<project>]: finalizing version...
✔  hosting[<project>]: version finalized
i  hosting[<project>]: releasing new version...
✔  hosting[<project>]: release complete

✔  Deploy complete!

Project Console: https://console.firebase.google.com/project/<project>/overview
Hosting URL: https://<project>.web.app

デプロイ後、Firebase Hosting の URL にアクセスするとデモアプリを開くことができるはずです。左側のペインでスレッドを作成し、スレッド内で PaLM2 との会話が楽しめます。

チャットアプリ

まとめ

Firebase Extensions を活用することで、バックエンド アーキテクチャをソースコード付きでかんたんに構築することができます。

生成 AI 関連のサービスは今年出たばかりですが、今回ご紹介した Extension もすでに提供されていることから分かる通り、Extension は続々と追加されていっています。他の Extension は Firebase Extension Hub から探すことができるので、ぜひご確認ください。

https://extensions.dev/extensions

明日のアドベントカレンダーもお楽しみに!

Google Cloud Japan

Discussion