📕

[RAG]最近読んだ本を教えてくれるLINE botをGemini Proを使って作成してみた

2024/03/27に公開

はじめに

最近読んだ本を教えてくれるLINE botを作成してみましたので作り方をメモしておきます。

動作イメージ

https://youtu.be/x-G5q2hIwkI

YouTubeより

作成手順の概要

LINE Developers Consoleの操作から入ります。
なお、LINE Messaging APIが利用できるアカウントの作成手順については説明しません。

今回のハンズオンでやることは主に2つです。

  1. LINE Developers Consoleの操作
  2. LINE Bot SDK for Pythonを使ったWebhookの作成

LINE Developers Consoleの操作では、以下の手順を行います。

  1. プロバイダー作成
  2. チャネルの作成
  3. チャネルの設定
  4. Webhookの設定

チャネルの設定では、channel secretchannel access tokenを取得します。
Webhookの設定では、Webhook URLを設定する項目があります。URLは後で作成します。

LINE Bot SDK for Pythonを使ったWebhookの作成では、以下の手順を行います。
なお、環境構築のために今回はGoogle Cloudを利用します。利用には請求情報が設定済のGoogleアカウントが必要です。

  1. Dockerイメージの作成
  2. Artifact RegistryへのDockerイメージのアップロード
  3. BigQueryでデータセットの作成
  4. Secret Managerの設定
  5. CloudRunの設定とデプロイ

今回使う技術

  • LINE Messaging API
  • LINE Bot SDK for Python
  • Python3.10
    • Flaskとguniconを利用
  • Google Cloud
    • CloudRun
    • Artifact Registry
    • BigQuery
    • Secret Manager
    • VertexAI
    • VertexAI Notebooks

構成図

以下の構成図の通りに作成します。

linebot_google_cloud.png

※Cloud MonitoringはCloudRun利用時に自動で設定されます。

LINE Developers Consoleの操作

では取り掛かっていきましょう。

LINEアカウントにログイン

まずはLINE Developers Consoleにログインします。

トップページの右上にあるコンソールにログインをクリックします。

rrb1.png

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

rrb2.png

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

rrb3.png

プロバイダー作成

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

rrb4.png

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

rrb5.png

チャンネルの作成

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

rrb6.png

設定項目がいくつかあります。以下のように設定してください。

項目 入力するもの
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をクリックします。

rrb7.png

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

rrb8.png

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

rrb9.png

チャネルの設定

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

rrb10.png

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

rrb11.png

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

rrb12.png

このアクセストークンもCloudRunの設定で利用するため、コピーしておきます。

デフォルトの設定の無効化とWebhookの設定

応答メッセージとあいさつメッセージをそれぞれ無効にするために編集をクリックします。

rrb13.png

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

変更前

rrb14.png

変更後

rrb15.png

設定画面の修正が終わりましたら設定画面を閉じ、コンソールのホーム画面は開いたままにします。

Google Cloudの操作

Google Cloudの操作では、以下の操作を行います。

  1. Notebookインスタンスの起動
  2. Git Clone
  3. BigQueryにデータをセットする
  4. Artifact RegistryへのDockerイメージのアップロード
  5. Secret Managerの設定
  6. CloudRunの設定
  7. サービスアカウントの作成
  8. デプロイ

Notebooksの作成

まずはNotebooksを作成します。

Google Cloud Consoleにログインします。

検索バーにnotebookと入力してVertex AIをクリックします。

rrb16.png

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

rrb17.png

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

rrb18.png

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

rrb19.png

インスタンスを作成の画面が表示されます。
詳細では以下の設定を行います。

名前:linebot2-notebook
リージョン:asia-northeast(Tokyo)

rrb20.png

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

rrb21.png

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

rrb22.png

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

rrb23.png

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

rrb24.png

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

rrb25.png

作成をクリックします。

Notebookインスタンスの起動

Notebookインスタンスが起動するまで待ちます。

rrb26.png

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

rrb27.png

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

rrb28.png

環境をセットアップ

Notebookの画面が表示されたら、Notebookの設定を変更します。
SettingsAdvanced Setting Editorをクリックします。

rrb29.png

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

rrb30.png

Font FamilyをmonospaceからAndale MonoFont Size15に変更します。

変更前

rrb31.png

変更後

rrb32.png

Settingsを閉じます。

rrb33.png

ターミナル操作

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

rrb34.png

rrb35.png

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

rrb36.png

作業ディレクトリを確認します。

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

srctutorialsを削除します。それ以外は削除しないでください。

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 datasetTable 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を検索します。

rrb37.png

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

rrb38.png

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

rrb39.png

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

rrb40.png

設定で以下の項目を設定します。

  • サービス名: linebot2
  • リージョン: asia-northeast1

rrb41.png

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

rrb42.png

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

rrb43.png

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

rrb44.png

以下の環境変数を設定します。

  • PROJECT_ID
  • BIGQUERY_DATASET
  • BIGQUERY_TABLE
  • USE_CHAT_MODEL_NAME
  • USE_EMBEDDING_MODEL_NAME
  • CHANNEL_ACCESS_TOKEN
  • CHANNEL_SECRET

シークレットを参照をクリックします。

rrb45.png

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

rrb46.png

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

rrb47.png

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

rrb48.png

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

rrb49.png

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

rrb50.png

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

rrb51.png

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

rrb52.png

完了をクリックします。

rrb53.png

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

変更前

rrb54.png

変更後

rrb55.png

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

rrb56.png

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

rrb57.png

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

rrb58.png

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

rrb59.png

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

rrb60.png

新しいサービスアカウントを作成が右の枠に表示されますので、設定します。

  • サービスアカウント名: linebot
  • サービスアカウントID: linebot

作成をクリックします。

rrb61.png

このサービスアカウントにプロジェクトへのアクセスを許可するという項目が表示されます。
今回は2つのロールを追加します。

  • Vertex AIサービス エージェント
  • Secret Managerシークレットアクセサー

それぞれ別のロールを追加をクリックして追加します。
ロールの追加が完了したら完了をクリックします。

rrb62.png

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

rrb63.png

Webhookの設定

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

CloudRunの画面でURLをコピーします。

rrb64.png

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

rrb65.png

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

rrb66.png

更新をクリックします。

rrb67.png

検証をクリックします。

rrb68.png

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

rrb69.png

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

変更前
rrb70.png

変更後
rrb71.png

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

rrb72.png

以上でLINE botの設定が完了しました。

QRコードをスマートフォンで読みとり、LINE botを友達追加して動作確認を行います。
rrb73.png

まとめ

今回はLINEとGoogle Cloudを連携して、自分だけのAI LINE botを作成しました。
データセットを変えるだけで、AIの動きが変わるのでさまざまなLINE botを作成できます。

なお、Google Cloudのサービス解説やGemini Proを使った事例については
後日にはなりますが、YouTubeにて解説動画をアップロードしますので、ぜひご覧ください。

おわり

Discussion