[RAG]最近読んだ本を教えてくれるLINE botをGemini Proを使って作成してみた
はじめに
最近読んだ本を教えてくれるLINE botを作成してみましたので作り方をメモしておきます。
※以下のイベントでハンズオンを実施しました。
Google Cloud×Gemini×LINEハンズオン【BOT AWARDS2024】
https://www.youtube.com/watch?v=liy_cHXf5qg
動作イメージ
YouTubeより
作成手順の概要
LINE Developers Consoleの操作から入ります。
なお、LINE Messaging APIが利用できるアカウントの作成手順については説明しません。
今回のハンズオンでやることは主に2つです。
- LINE Developers Consoleの操作
- LINE Bot SDK for Pythonを使ったWebhookの作成
LINE Developers Consoleの操作では、以下の手順を行います。
- プロバイダー作成
- チャネルの作成
- チャネルの設定
- Webhookの設定
チャネルの設定では、channel secretとchannel access tokenを取得します。
Webhookの設定では、Webhook URLを設定する項目があります。URLは後で作成します。
LINE Bot SDK for Pythonを使ったWebhookの作成では、以下の手順を行います。
なお、環境構築のために今回はGoogle Cloudを利用します。利用には請求情報が設定済のGoogleアカウントが必要です。
- Dockerイメージの作成
- Artifact RegistryへのDockerイメージのアップロード
- BigQueryでデータセットの作成
- Secret Managerの設定
- CloudRunの設定とデプロイ
今回使う技術
- LINE Messaging API
- LINE Bot SDK for Python
- Python3.10
- Flaskとguniconを利用
- Google Cloud
- CloudRun
- Artifact Registry
- BigQuery
- Secret Manager
- VertexAI
- VertexAI Notebooks
構成図
以下の構成図の通りに作成します。

※Cloud MonitoringはCloudRun利用時に自動で設定されます。
LINE Developers Consoleの操作
では取り掛かっていきましょう。
LINEアカウントにログイン
まずはLINE Developers Consoleにログインします。
トップページの右上にあるコンソールにログインをクリックします。

ログイン画面が表示されますので、LINEアカウントでログインをクリックします。

※すでにログインしている場合は、以下の画面が表示されます。(筆者の場合)

プロバイダー作成
ログインが完了するとLINEコンソールが表示されます。プロバイダーの右にある作成をクリックします。

ダイアログが表示されるので、プロバイダ名をgemini-proと入力して作成をクリックします。

チャンネルの作成
プロバイダーが作成されると、チャンネルの作成画面が表示されます。`
Create a MessagingAPI Channelをクリックします。

設定項目がいくつかあります。以下のように設定してください。
| 項目 | 入力するもの |
|---|---|
| Channel type | Messaging API |
| Provider | gemini-pro |
| Company or owner's country or region | 日本 |
| Channel name | recently read books |
| Channel description | 最近読んだ本を教えてくれるLINE bot |
| Category | 個人 |
| Subcategory | 個人(その他) |
| Email address | デフォルト |
チェックボックスが2つありますのでチェックを入れます。
- LINE公式アカウント利用規約の内容に同意します
- LINE公式アカウントAPI利用規約の内容に同意します
※英語の場合は以下の表記です。
- I have read and agree to the LINE Official Account Terms of Use
- I have read and agree to the LINE Official Account API Terms of Use
OKをクリックします。

確認画面が表示されたらOKをクリックします。

再び、同意画面が表示されますので、同意して同意するをクリックします。

チャネルの設定
Messaging APIのシークレットキーをコピーします。このシークレットキーはCloudRunの設定で利用するため、コピーしておきます。

次にMessaging API設定を開いてチャネルアクセストークンを発行してコピーします。
Messaging API設定をクリックします。

チャネルアクセストークンの発行をクリックし、チャネルアクセストークンをコピーします。
コピーボタンをクリックするとコピーされます。

このアクセストークンもCloudRunの設定で利用するため、コピーしておきます。
デフォルトの設定の無効化とWebhookの設定
応答メッセージとあいさつメッセージをそれぞれ無効にするために編集をクリックします。

なお、ここでWebhookは有効にします。
変更前

変更後

設定画面の修正が終わりましたら設定画面を閉じ、コンソールのホーム画面は開いたままにします。
Google Cloudの操作
Google Cloudの操作では、以下の操作を行います。
- Notebookインスタンスの起動
- Git Clone
- BigQueryにデータをセットする
- Artifact RegistryへのDockerイメージのアップロード
- Secret Managerの設定
- CloudRunの設定
- サービスアカウントの作成
- デプロイ
Notebooksの作成
まずはNotebooksを作成します。
Google Cloud Consoleにログインします。
検索バーにnotebookと入力してVertex AIをクリックします。

ワークベンチをクリックします。

マネージドノートブックをクリックします。

新規作成をクリックします。

インスタンスを作成の画面が表示されます。
詳細では以下の設定を行います。
名前:linebot2-notebook
リージョン:asia-northeast(Tokyo)

環境設定では以下の設定を行います。インタプリタの設定を行います。
今回はPython3.10を選択して続行をクリックします。

マシンタイプはn1-standard-4を選択、シャットダウンまでのアイドル時間は180分に設定して続行をクリックします。
なお、このアイドル時間を短く設定しておくとつけっぱなしだったとしても短い時間で自動的にシャットダウンされるので安心で便利です。

ディスクはStandard Persistent Disk 100GBのままで続行をクリックします。

ネットワークはGoogleが管理するネットワークを選択して続行をクリックします。

IAMとセキュリティではサービスアカウントを利用します。

作成をクリックします。
Notebookインスタンスの起動
Notebookインスタンスが起動するまで待ちます。

起動が完了すると以下の画面のようにチェックマークが表示されます。

JUPYTERLAB を開くをクリックします。

環境をセットアップ
Notebookの画面が表示されたら、Notebookの設定を変更します。
SettingsのAdvanced Setting Editorをクリックします。

SettingsタブでTerminalを検索します。

Font FamilyをmonospaceからAndale Mono、Font Sizeを15に変更します。
変更前

変更後

Settingsを閉じます。

ターミナル操作
ターミナルを開いて作業ディレクトリを確認します。ターミナルを開く場合は画面をスクロールしてTerminalをクリックします。


Terminalの画面が表示されます。

作業ディレクトリを確認します。
pwd
実行結果
/home/jupyter
初期設定の/home/jupyterであることを確認します。
次に、ディレクトリの一覧を表示します。
ls -la
実行結果
total 52
drwxr-xr-x 11 jupyter jupyter 4096 Mar 27 03:39 .
drwxr-xr-x 1 root root 4096 Mar 14 15:15 ..
drwxr-xr-x 3 jupyter jupyter 4096 Mar 27 03:38 .R
-rw-r--r-- 1 jupyter jupyter 92 Mar 27 03:38 .Rprofile
-rw-r--r-- 1 jupyter jupyter 447 Mar 27 03:37 .bashrc
drwxr-xr-x 4 jupyter jupyter 4096 Mar 27 03:38 .cache
drwxr-xr-x 4 jupyter jupyter 4096 Mar 27 03:38 .config
drwxr-xr-x 2 jupyter jupyter 4096 Mar 27 03:37 .euc
drwxr-xr-x 3 jupyter jupyter 4096 Mar 27 03:37 .ipython
drwxr-xr-x 3 jupyter jupyter 4096 Mar 27 03:43 .jupyter
drwxr-xr-x 3 jupyter jupyter 4096 Mar 27 03:39 .local
drwxr-xr-x 3 jupyter jupyter 4096 Mar 27 03:37 src
drwxr-xr-x 4 jupyter jupyter 4096 Mar 27 03:37 tutorials
srcとtutorialsを削除します。それ以外は削除しないでください。
rm -rf src tutorials
削除が完了したらディレクトリの一覧を表示して削除されたことを確認します。
ls -la
実行結果
total 52
drwxr-xr-x 11 jupyter jupyter 4096 Mar 27 03:39 .
drwxr-xr-x 1 root root 4096 Mar 14 15:15 ..
drwxr-xr-x 3 jupyter jupyter 4096 Mar 27 03:38 .R
-rw-r--r-- 1 jupyter jupyter 92 Mar 27 03:38 .Rprofile
-rw-r--r-- 1 jupyter jupyter 447 Mar 27 03:37 .bashrc
drwxr-xr-x 4 jupyter jupyter 4096 Mar 27 03:38 .cache
drwxr-xr-x 4 jupyter jupyter 4096 Mar 27 03:38 .config
drwxr-xr-x 2 jupyter jupyter 4096 Mar 27 03:37 .euc
drwxr-xr-x 3 jupyter jupyter 4096 Mar 27 03:37 .ipython
drwxr-xr-x 3 jupyter jupyter 4096 Mar 27 03:43 .jupyter
drwxr-xr-x 3 jupyter jupyter 4096 Mar 27 03:39 .local
Git Cloneと作業ディレクトリの変更
環境構築は完了しましたので、GitHubからコードを取得します。以下のコマンドを実行します。
git clone https://github.com/ymd65536/books_search_linebot.git
作業ディレクトリを変更します。
cd books_search_linebot
BigQueryのデータセットを作成する
次にBigQueryにデータセットを作成します。以下のコマンドを実行してディレクトリを移動します。
cd setup_bigquery
ファイルの一覧を表示するため、以下のコマンドを実行します。
ls -la
実行結果
total 32
drwxr-xr-x 3 jupyter jupyter 4096 Mar 27 06:26 .
drwxr-xr-x 5 jupyter jupyter 4096 Mar 27 06:25 ..
drwxr-xr-x 2 jupyter jupyter 4096 Mar 27 06:26 .ipynb_checkpoints
-rw-r--r-- 1 jupyter jupyter 398 Mar 27 06:25 README.md
-rw-r--r-- 1 jupyter jupyter 478 Mar 27 06:25 create_dataset.py
-rw-r--r-- 1 jupyter jupyter 1580 Mar 27 06:25 invoke.py
-rw-r--r-- 1 jupyter jupyter 1902 Mar 27 06:25 migration.py
-rw-r--r-- 1 jupyter jupyter 108 Mar 27 06:25 requirements.txt
migration.pyはBigQueryにデータをセットするスクリプト、invoke.pyはAIに質問するスクリプトです。
これらのスクリプトを実行するためのパッケージをインストールします。
pip install --user --no-cache-dir --upgrade pip && pip install --user --no-cache-dir -r requirements.txt
次にデータセットとテーブルを作成します。create_dataset.pyを開いて、以下の箇所を修正します。
project_id="<project_id>"
project_idは以下のコマンドで取得します。取得したIDを<project_id>と置き換えます。
gcloud config get-value project
データセットとテーブルを作成するため、以下のスクリプトを実行します。
python create_dataset.py
実行結果にはCreated datasetとTable Nameが表示されます。※実行環境によって異なります。
BigQueryのデータセットにデータをセットする
次にBigQueryにデータをセットするため、環境変数をセットします。
export PROJECT_ID=`gcloud config get-value project`
export BIGQUERY_DATASET=linebot2
export BIGQUERY_TABLE=data-table
export USE_CHAT_MODEL_NAME=gemini-1.0-pro-001
export USE_EMBEDDING_MODEL_NAME=textembedding-gecko@latest
最後に以下のコマンドを実行します。
python migration.py
実行結果
OK
データがセットできました。
Geminiをテストする
データがセットできましたら、Geminiをテストするため、以下のコマンドを実行します。
python invoke.py
実行結果
質問内容:
タイトルにChatGPTが含まれる本を教えてください。
回答方法
番号で箇条書き
リンクや値段を含める
回答:
1. ChatGPT/LangChainによるチャットシステム構築[実践]入門
- リンク: https://gihyo.jp/book/2023/978-4-297-13839-4
- 本体価格: ¥3,000
2. Azure OpenAI ServiceではじめるChatGPT/LLMシステム構築入門
- リンク: https://gihyo.jp/book/2024/978-4-297-13929-2
- 本体価格: ¥3,200
※実行結果は実行環境によって変わる可能性があります。
LINE botのデプロイ
ひととおりの準備が完了しましたのでLINE botをデプロイします。
Dockerイメージの作成
まずはDockerイメージを作成します。image_nameという環境変数を作成し、値をlinebot2とします。
image_name=linebot2
Dockerの認証を設定します。Do you want to continue (Y/n)?と質問されのでYを入力します。
gcloud auth configure-docker asia-northeast1-docker.pkg.dev
ディレクトリを変更します。
cd ../docker
Dockerイメージを作成します。
docker build . -t $image_name --platform linux/amd64
Artifact RegistryへのDockerイメージのアップロード
プロジェクトIDを取得します。このIDはArtifact Registryの設定で利用します。
gcp_project=`gcloud config list --format 'value(core.project)'`
Artifact Registryにリポジトリを作成します。
gcloud artifacts repositories create $image_name --location=asia-northeast1 --repository-format=docker --project=$gcp_project
実行結果(一部)
Created repository [linebot2]
ビルドしたイメージにタグを付けてArtifact Registryにアップロードします。
docker tag $image_name asia-northeast1-docker.pkg.dev/$gcp_project/$image_name/$image_name
docker push asia-northeast1-docker.pkg.dev/$gcp_project/$image_name/$image_name":latest"
これでNotebook上で作成したスクリプトがDockerイメージとともにArtifact Registryにアップロードされました。
Secret Managerの設定
Secret ManagerにCloudRunに必要な環境変数を設定します。
export PROJECT_ID=`gcloud config get-value project`
export BIGQUERY_DATASET=linebot2
export BIGQUERY_TABLE=data-table
export USE_CHAT_MODEL_NAME=gemini-1.0-pro-001
export USE_EMBEDDING_MODEL_NAME=textembedding-gecko@latest
LINE botの設定に必要な環境変数を設定します。
YOUR_CHANNEL_ACCESS_TOKENにはLINE Developers Consoleで取得したチャネルアクセストークンを設定します。
YOUR_CHANNEL_SECRETにはLINE Developers Consoleで取得したチャネルシークレットを設定します。
export CHANNEL_ACCESS_TOKEN=YOUR_CHANNEL_ACCESS_TOKEN
export CHANNEL_SECRET=YOUR_CHANNEL_SECRET
作業ディレクトリを変更します。
cd ../setup_secretmanger
必要なパッケージをインストールします。
pip install --user --no-cache-dir google-cloud-secret-manager==2.19.0
スクリプトを実行してSecret Managerに環境変数を設定します。
python create_secret.py
実行結果
Created secret: projects/XXXXXXXXXXX/secrets/PROJECT_ID
Added secret version: projects/XXXXXXXXXXX/secrets/PROJECT_ID/versions/1
projects/XXXXXXXXXXX/secrets/PROJECT_ID/versions/1
Created secret: projects/XXXXXXXXXXX/secrets/BIGQUERY_DATASET
Added secret version: projects/XXXXXXXXXXX/secrets/BIGQUERY_DATASET/versions/1
projects/XXXXXXXXXXX/secrets/BIGQUERY_DATASET/versions/1
Created secret: projects/XXXXXXXXXXX/secrets/BIGQUERY_TABLE
Added secret version: projects/XXXXXXXXXXX/secrets/BIGQUERY_TABLE/versions/1
projects/XXXXXXXXXXX/secrets/BIGQUERY_TABLE/versions/1
Created secret: projects/XXXXXXXXXXX/secrets/USE_CHAT_MODEL_NAME
Added secret version: projects/XXXXXXXXXXX/secrets/USE_CHAT_MODEL_NAME/versions/1
projects/XXXXXXXXXXX/secrets/USE_CHAT_MODEL_NAME/versions/1
Created secret: projects/XXXXXXXXXXX/secrets/USE_EMBEDDING_MODEL_NAME
Added secret version: projects/XXXXXXXXXXX/secrets/USE_EMBEDDING_MODEL_NAME/versions/1
projects/XXXXXXXXXXX/secrets/USE_EMBEDDING_MODEL_NAME/versions/1
Created secret: projects/XXXXXXXXXXX/secrets/CHANNEL_ACCESS_TOKEN
Added secret version: projects/XXXXXXXXXXX/secrets/CHANNEL_ACCESS_TOKEN/versions/1
projects/XXXXXXXXXXX/secrets/CHANNEL_ACCESS_TOKEN/versions/1
Created secret: projects/XXXXXXXXXXX/secrets/CHANNEL_SECRET
Added secret version: projects/XXXXXXXXXXX/secrets/CHANNEL_SECRET/versions/1
projects/XXXXXXXXXXX/secrets/CHANNEL_SECRET/versions/1
上記のシークレットはCloudRunの環境変数で利用します。
CloudRunでDockerイメージをデプロイ
CloudRunでDockerイメージをデプロイします。
Google Cloud Consoleを開いて、CloudRunを検索します。

サービスの作成をクリックします。

サービスの作成画面が表示されます。既存のコンテナイメージから1つのリビジョンをデプロイします。

デプロイするコンテナイメージを選択します。Artifact Registryから選択します。選択をクリックします。

設定で以下の項目を設定します。
- サービス名: linebot2
- リージョン: asia-northeast1

Authenticationの項目で未認証の呼び出しを許可を選択します。
CPUの割り当てと料金はCPUを常に割り当てるを選択します。

上りの制御はすべてを選択します。

変数とシークレットをクリックします。

以下の環境変数を設定します。
- PROJECT_ID
- BIGQUERY_DATASET
- BIGQUERY_TABLE
- USE_CHAT_MODEL_NAME
- USE_EMBEDDING_MODEL_NAME
- CHANNEL_ACCESS_TOKEN
- CHANNEL_SECRET
シークレットを参照をクリックします。

PROJECT_IDをシークレットから参照します。

BIGQUERY_DATASETをシークレットから参照します。

BIGQUERY_TABLEをシークレットから参照します。

USE_CHAT_MODEL_NAMEをシークレットから参照します。

USE_EMBEDDING_MODEL_NAMEをシークレットから参照します。

CHANNEL_ACCESS_TOKENをシークレットから参照します。

CHANNEL_SECRETをシークレットから参照します。

完了をクリックします。

リソースではメモリとCPUを選択します。
メモリは2GiB、CPUは2を選択します。
変更前

変更後

リクエストタイムアウトは300秒、最大同時リクエストは80を入力します。

実行環境はデフォルトを選択します。

リビジョンの自動スケールは0~50に設定します。

コンテナの設定は完了です。作成を実行する前にセキュリティの項目を確認します。
セキュリティをクリックします。

サービスアカウントを設定するため、サービスアカウントの枠をクリックし、新しいサービスアカウントを作成をクリックします。

新しいサービスアカウントを作成が右の枠に表示されますので、設定します。
- サービスアカウント名: linebot
- サービスアカウントID: linebot
作成をクリックします。

このサービスアカウントにプロジェクトへのアクセスを許可するという項目が表示されます。
今回は2つのロールを追加します。
- Vertex AIサービス エージェント
- Secret Managerシークレットアクセサー
それぞれ別のロールを追加をクリックして追加します。
ロールの追加が完了したら完了をクリックします。

セキュリティの項目が設定できましたら、作成をクリックしてデプロイします。

Webhookの設定
LINE Developers ConsoleのWebhookの設定画面でWebhook URLを設定します。
CloudRunの画面でURLをコピーします。

コンソールのホーム画面でMessaging API設定をクリックします。

Webhookの設定にある編集をクリックしてCloudRunのURLを貼り付けます。このとき、URLの末尾に/callbackを付け加えます。

更新をクリックします。

検証をクリックします。

検証がうまくいくと、以下の画像のように完了が表示されます。

Webhookの設定が完了しましたのでWebhookの利用をオンにします。
変更前

変更後

それ以外の設定が表示されますが、今回は設定しませんのでオフのままにしておきます。

以上でLINE botの設定が完了しました。
QRコードをスマートフォンで読みとり、LINE botを友達追加して動作確認を行います。

まとめ
今回はLINEとGoogle Cloudを連携して、自分だけのAI LINE botを作成しました。
データセットを変えるだけで、AIの動きが変わるのでさまざまなLINE botを作成できます。
なお、Google Cloudのサービス解説やGemini Proを使った事例については
後日にはなりますが、YouTubeにて解説動画をアップロードしますので、ぜひご覧ください。
Discussion