目次

はじめに
サンプルコード
第1章 Firebaseプロジェクトを設定する
1.1 Firebaseプロジェクトを作成する
1.2 Webアプリを追加する
1.3 Blazeプランにアップグレードする
第2章 Remixアプリ(SPAモード)をFirebase Hostingにデプロイする
2.1 開発環境を準備する
2.2 ワークスペースルートを作成する
2.3 Firebaseを初期化する
2.4 Remixアプリを作成する
2.5 パッケージをインストールする
2.6 開発環境のポート番号を変更する
2.7 Firebase Hostingにデプロイする
第3章 開発環境を整える
3.1 Node.jsのバージョンを固定する
3.2 ESLintの設定を追加する
3.3 Prettierを設定する
3.4 Stylelintを設定する
3.5 lint、formatコマンドを追加する
3.6 デプロイする
第4章 Cloud Functionsの開発環境を整える
4.1 Cloud Functionsを有効化する
4.2 Cloud Functionsを初期化する
4.3 functionsをワークスペースに追加する
4.4 Cloud Functionsのパッケージをインストールする
4.5 TypeScriptの設定を更新する
4.6 ESLintの設定を更新する
4.7 Prettierを設定する
4.8 lint、formatコマンドを追加する
4.9 デプロイする
第5章 ローカルパッケージを作成する
5.1 ローカルパッケージのディレクトリーを作成する
5.2 package.jsonを作成する
5.3 TypeScriptを設定する
5.4 ESLintとPrettierを設定する
5.5 lint/formatコマンドを追加する
5.6 VSCodeの設定を追加する
5.7 ローカルパッケージをインストールする
5.8 デプロイできるようにする
第6章 アプリにデフォルトレイアウトを適用する
6.1 UIライブラリー(Mantine)を設定する
6.2 デフォルトレイアウトを作成する
6.3 デプロイする
第7章 認証機能をつける
7.1 Firebase Authenticationを有効化する
7.2 Firebaseアプリを初期化する
7.3 認証ページのレイアウトを追加する
7.4 サインインページを作成する
7.5 認証前はサインインページにリダイレクトするように
7.6 サインインできるように
7.7 サインアウトできるように
7.8 デプロイする
第8章 Cloud Firestoreのデータ設計をする
8.1 Cloud Firestoreを有効化する
8.2 Cloud Firestoreを初期化する
8.3 ReactFireのFirestoreProviderを設定する
8.4 モデルの型を作成する
8.5 セキュリティールールを設定する
8.6 デプロイする
第9章 UIを作成する
9.1 メインコンテンツにチャット画面を作成する
9.2 チャットメッセージのデザインを調整する
9.3 データアクセス用のユーティリティ関数を作成する
9.4 チャット画面でチャットデータを取得する
9.5 チャットフォームでチャットデータを作成/更新する
9.6 チャットメッセージ更新時に自動スクロールするように
9.7 固定メニューにNew Chatボタンを追加する
9.8 ナビメニューに過去のスレッド履歴を表示する
9.9 デプロイする
第10章 Gemini Proと連携する
10.1 Vertex AI APIを有効化する
10.2 Gemini Proと連携する関数を作成する
10.3 Gemini Proとチャットできるようにする
10.4 デプロイする
10.5 参考
第11章 UXを改善する
11.1 Firestoreの更新頻度を減らす
11.2 生成AIの回答中はローダを表示する
11.3 メッセージ送信のショートカットを追加する
11.4 スレッド履歴を無限スクロールにする
11.5 スレッドを削除できるようにする
11.6 デプロイする
第12章 GPTと連携する
12.1 OpenAIのAPIキーをSecret Managerに登録する
12.2 OpenAIのOrganizationIDを環境変数に設定する
12.3 生成AIモデルにGPTを追加する
12.4 OpenAIと連携する関数を作成する
12.5 GPTとチャットできるようにする
12.6 デプロイする
第13章 RAG
13.1 Firebase Admin SDKをアップグレードする
13.2 ベクトルデータモデルThreadVectorの型を作成する
13.3 ThreadVectorモデルのユーティリティ関数を作成する
13.4 ベクトルデータを更新するタスクキュー関数を作成する
13.5 タスクキュー関数にキューイングする
13.6 類似スレッドと指示を生成AIに伝える
13.7 ベクトルデータを削除する
13.8 ベクトル検索用のインデックスを作成する
13.9 デプロイする
終わりに

はじめに

 本書はFireStarterの第四弾になります。


 第三段までは「持続可能なFirebaseプロジェクトを目指して」シリーズということで、Firebaseアプリ開発における私たちなりのノウハウを言語化した内容になっています。

 第四段は持続可能なFirebaseプロジェクト開発の流れは踏襲しつつも、新しい技術を積極的に採用し、かつ、より実用的なサンプルアプリ開発を通じてFirebase、さらには生成AIにまで入門してしまおうというチャレンジングな内容となっています。


 本書で開発するサンプルアプリは、複数の生成AIとWeb上でチャットできる生成AIチャットアプリです。

 サンプルアプリといっても、私が日々使用している自作の生成AIアプリをそのまま本書向けにサンプルアプリ化したものですので、本書を参考にアプリを作っていけば、実用的なマイ生成AIアプリが爆誕していると思います。

 本書で取り上げている生成AIはGoogleのGemini ProとOpenAIのGPTですが、AnthropicのClaude等、ほかの生成AIと連携する方法も基本的には同じです。また、LangChainを使って生成AIと連携する場合も基本的な考え方は同じですので、本書を足がかりによい生成AIライフを送っていただければ幸いです。


 なお、サンプルアプリのフレームワークとして、個人的にFirebase業界最注目のRemix SPAモードを採用しています。

 サンプルアプリを開発する中で、私自身あらためて、FirebaseとRemix SPAモードの相性のよさを実感できたので、本書を通じて読者の方にもぜひ相性のよさを実感していただきたいと考えています。

サンプルコード

 本書で作成するアプリのサンプルコードを以下のリポジトリーで公開しています。

 https://github.com/SonicGarden/ai-chat-sample


 章ごとのコードの差分をPRにしてありますので、読み進める際の参考にしていただければ幸いです。

第2章 Remixアプリ(SPAモード)をFirebase Hostingにデプロイする

 https://github.com/SonicGarden/ai-chat-sample/pull/1

第3章 開発環境を整える

 https://github.com/SonicGarden/ai-chat-sample/pull/2

第4章 Cloud Functionsの開発環境を整える

 https://github.com/SonicGarden/ai-chat-sample/pull/3

第5章 ローカルパッケージを作成する

 https://github.com/SonicGarden/ai-chat-sample/pull/4

第6章 アプリにデフォルトレイアウトを適用する

 https://github.com/SonicGarden/ai-chat-sample/pull/5

第7章 認証機能をつける

 https://github.com/SonicGarden/ai-chat-sample/pull/6

第8章 Cloud Firestoreのデータ設計をする

 https://github.com/SonicGarden/ai-chat-sample/pull/7

第9章 UIを作成する

 https://github.com/SonicGarden/ai-chat-sample/pull/8

第10章 Gemini Proと連携する

 https://github.com/SonicGarden/ai-chat-sample/pull/9

第11章 UXを改善する

 https://github.com/SonicGarden/ai-chat-sample/pull/10

第12章 GPTと連携する

 https://github.com/SonicGarden/ai-chat-sample/pull/11

第13章 RAG

 https://github.com/SonicGarden/ai-chat-sample/pull/12


 サンプルアプリの各ワークスペースで使用しているパッケージのバージョンは、以下の通りです。

 生成AI関連のライブラリーは非常に更新スピードが早く非互換も発生しやすいので、本書を参考にアプリを作成していく中でうまく動かないといった現象は、多々発生すると思います。

 本書執筆中にも新しいバージョンのライブラリーが公開されて、非互換で動かなくなって書き直すというつらい思いを何度も経験しました。

 アプリがうまく動かない場合は、パッケージのバージョンを合わせることで解決するかもしれませんので、参考にしていただければ幸いです。

Node.js

Node.js: 20.12.2

services/webで利用しているNPMパッケージ

"@local/shared": "workspace:^",
  "@mantine/core": "^7.8.0",
  "@mantine/form": "^7.8.0",
  "@mantine/hooks": "^7.8.0",
  "@mantine/modals": "^7.8.0",
  "@mantine/notifications": "^7.8.0",
  "@remix-run/node": "^2.8.1",
  "@remix-run/react": "^2.8.1",
  "@tabler/icons-react": "^3.2.0",
  "firebase": "^10.11.0",
  "react": "^18.2.0",
  "react-dom": "^18.2.0",
  "react-markdown": "^9.0.1",
  "react-use": "^17.5.0",
  "reactfire": "^4.2.3",
  "@remix-run/dev": "^2.8.1",
  "@types/react": "^18.2.20",
  "@types/react-dom": "^18.2.7",
  "@typescript-eslint/eslint-plugin": "^6.7.4",
  "@typescript-eslint/parser": "^6.7.4",
  "eslint": "^8.38.0",
  "eslint-config-prettier": "^9.1.0",
  "eslint-import-resolver-typescript": "^3.6.1",
  "eslint-plugin-import": "^2.28.1",
  "eslint-plugin-jsx-a11y": "^6.7.1",
  "eslint-plugin-react": "^7.33.2",
  "eslint-plugin-react-hooks": "^4.6.0",
  "postcss": "^8.4.38",
  "postcss-preset-mantine": "^1.14.4",
  "postcss-simple-vars": "^7.0.1",
  "prettier": "^3.2.5",
  "stylelint": "^16.3.1",
  "stylelint-config-recess-order": "^5.0.1",
  "stylelint-config-standard": "^36.0.0",
  "stylelint-order": "^6.0.4",
  "typescript": "^5.1.6",
  "vite": "^5.1.0",
  "vite-tsconfig-paths": "^4.2.1"

services/functionsで利用しているNPMパッケージ

"@google-cloud/vertexai": "^1.1.0",
  "@local/shared": "workspace:^",
  "dedent": "^1.5.3",
  "firebase-admin": "^12.1.0",
  "firebase-functions": "^4.3.1",
  "lodash-es": "^4.17.21",
  "openai": "^4.38.2",
  "@types/lodash-es": "^4.17.12",
  "@typescript-eslint/eslint-plugin": "^5.12.0",
  "@typescript-eslint/parser": "^5.12.0",
  "eslint": "^8.9.0",
  "eslint-config-google": "^0.14.0",
  "eslint-config-prettier": "^9.1.0",
  "eslint-plugin-import": "^2.25.4",
  "firebase-functions-test": "^3.1.0",
  "prettier": "^3.2.5",
  "typescript": "^4.9.0"

packages/sharedで使用しているNPMパッケージ

"@typescript-eslint/eslint-plugin": "^7.7.0",
  "@typescript-eslint/parser": "^7.7.0",
  "eslint": "^8.57.0",
  "eslint-config-prettier": "^9.1.0",
  "eslint-plugin-import": "^2.29.1",
  "firebase": "^10.11.0",
  "firebase-admin": "^12.1.0",
  "prettier": "^3.2.5",
  "typescript": "^5.4.5"

第1章 Firebaseプロジェクトを設定する

 本章では、これから作成していくアプリをデプロイするためのFirebaseプロジェクトを設定していきます。

 参考として本書を執筆した時点でのFirebaseコンソールの画面を載せてありますが、読者の方が実際にFirebaseプロジェクトを設定するタイミングでは、手順や画面構成が変わっている可能性もありますので、ご注意ください。

1.1 Firebaseプロジェクトを作成する

 Firebaseコンソール(https://console.firebase.google.com)にアクセスし、Firebaseプロジェクトを作成します。

 まずはFirebaseプロジェクトを追加します。

図1.1: Firebaseプロジェクトを追加

 Firebaseプロジェクトのプロジェクト名を設定します。

図1.2: Firebaseプロジェクト名を設定

 FirebaseプロジェクトのGoogleアナリティクスを設定します。

 サンプルアプリではGoogleアナリティクスは必要ないので、無効にしています。Googleアナリティクスを試してみたい場合は、有効にしてください。

図1.3: Googleアナリティクスの設定

 しばらく待つと、Firebaseプロジェクトが完成します。

図1.4: Firebaseプロジェクト完成

1.2 Webアプリを追加する

 サンプルアプリはWebアプリなので、FirebaseプロジェクトにWebアプリを追加します。

図1.5: ウェブアプリを追加

 アプリを登録します。

 ニックネームは何でもいいです。こだわりがなければ、Firebaseプロジェクト名をそのまま設定します。

 「このアプリのFirebase Hostingも設定します」にチェックを入れます。

図1.6: アプリの登録

 以降は画面に従い、アプリを追加していきます。

 画面に表示されるコマンドは後ろの章で実行しますので、ここではFirebaseコンソール上の操作だけで問題ありません。

図1.7: Firebase SDKの追加
図1.8: Firebase CLIのインストール
図1.9: Firebase Hostingへのデプロイ

1.3 Blazeプランにアップグレードする

 サンプルアプリでは、Cloud Functionsを使用します。

 SparkプランではCloud Functionsを使用できないので、Blazeプランにアップグレードします。

図1.10: アップグレードをクリック

 Blazeプランを選択します。

図1.11: プランを選択

 請求先アカウントを選択します。請求先アカウントが存在しない場合は作成します。

図1.12: 請求先アカウントの選択

 「購入」ボタンをクリックして、アップグレードを確定します。

図1.13: 購入を確定

 これでBlazeプランにアップグレードされ、Cloud Functionsが利用できるようになりました。

図1.14: アップグレード完了
試し読みはここまでです。
この続きは、製品版でお楽しみください。