【LINEBot制作シリーズ2】GeminiとGASで作るAI LINE Bot編

date
Dec 19, 2023
slug
create-line-bot-of-gemini
status
Published
tags
Tutorial
summary
part2では、AIに返答を作成してもらいます。言語モデルはGoogle謹製のGemini APIを利用します。
type
Post
📄
本記事についての注意書き
  • 応答を作成させるAIには「Gemini Pro」を使用します。
  • Gemini Proは無料で利用可能ですが、規約上、18歳未満は使用できません。
  • 章立ての構成です。各章の中身は▶︎をクリックで展開できます
  • 極力専門用語は避けていますが、よくわからない言葉に出くわした際は都度調べること

Chap.0 成果物について


今回は無料枠を超過するリスクがあるため、QRコードの公開は控えます。
こんな感じに動きます
notion image

Google謹製の大規模言語モデル 「Gemini」

notion image
OpenAI謹製の言語モデルであるGPTに対抗する形でGoogleリリースされたのが、「Gemini」です。
Geminiのモデルサイズとその役割は次のようになっています。
⚠️
Geminiのモデルサイズ
  • Gemini Ultra - GPT4を上回る高性能な大型モデル
  • Gemini Pro - ULtraとNanoの中間的な立ち位置
  • Gemini Nano - スマホに搭載できる軽量モデル
今回はGemini Proが搭載されたLINE Botを制作します。

Gemini Proの特徴

性能面はGPT-4を上回るとされています(諸説あり)。その他にGemini Pro特徴としては以下の通りです。
  • 2024年1月現在、一般公開はされておらず、開発者向けにAPIとして提供
  • (無料枠を超過しない限り)無料で使用可能
  • 英語版のGoogle Bardで利用可能
Gemini Proが搭載されたLINE Botを制作します。

Chap.1 前提知識


notion image
この図は日常的に利用されるスマホアプリに代表されるClientAPIサーバーの関係を表したものです。そして両者はこのような関係です。
ClientAPIサーバーの関係
1️⃣ClientAPIサーバーに対し、リクエストを送ります
2️⃣リクエストを受け取ったAPIサーバーClientに対してレスポンスを返します。

リクエストとレスポンス

ここで突如出てきた、リクエストとレスポンスについて説明します。これを日本語に直すと「要求と応答」となります。
方向
含まれる情報
リクエスト
Client→APIサーバー
特定のデータの要求 何らかの処理の要求
レスポンス
APIサーバー→Client
要求されたデータそのもの 要求された処理の実行結果(うまくいったorいかなかった)
もう少しわかりやすくするため、具体例で説明します。

具体例1. Twitterアプリの例

🐦
Twitterでタイムラインを見るときのClient(スマホ)APIサーバーの働き
1️⃣ユーザーがツイッターアプリを開く
2️⃣タイムラインフィードを取得するリクエストがスマホからAPIサーバーに送られる
3️⃣リクエストを受けたAPIサーバーからタイムラインフィードのデータがスマホに送られる
4️⃣タイムラインフィードがスマホに表示される

今回作成するGASスクリプトの例

では今回作成するアプリケーションではどうでしょうか?
作成するGASアプリケーションの働き
1️⃣ メッセージの受取: doPost()でユーザーからのLINEメッセージイベントを受け取る
2️⃣応答の生成: API(Gemini Pro)にリクエストを送る
3️⃣生成された応答の受け取り: Gemini Proからのレスポンスを受け取けとる
4️⃣メッセージの送信: LineMessagingAPIにユーザーへのメッセージ送信を要求するリクエストを送る
GASアプリケーションは、前回と同様にClientの役割を果たします。part.1にない点としてLine Messaging APIに加えて、Gemini ProのAPIの両方にアクセスしています。
一般的に馴染みがないAPIサーバーの働きについて解説してます。

Chap.2 Gemini Proのセットアップ


Google AI Studioにアクセス。利用規約に同意し、進みます。
notion image

API Keyの作成

Create API key in new projectを選択します。 キーが発行されるので、これをクリップボードにコピーしておきます。
キーが追加されていることを確認してください。
notion image
これでGemini Proが使えるようになりました。
Google AI Studioというツールで簡単にセットアップできます。

Chap.3 Gemini ProのAPIを叩く


コードが載っているのが確認できます。
notion image
これはGemini ProのAPIを叩くためのcURLコマンドです。
curlについての解説
cURLとは
https://apidog.com/jp/blog/curl-user-guide/より

curlを試す

ということで、実際に試してみましょう。以下のサイトでcurlコマンドを実行することができます。
こんな感じで実行すると、geminiからのレスポンスが確認できます。
notion image
⚠️
注意点
  • ハイライト部分がプロンプト(Geminiに与える命令)に相当します。適当な日本語で試してみるのがおすすめ
  • 末尾の YOUR_API_KEYの部分は、先ほど発行したキーに置き換える必要があります
手始めに手軽なブラウザで、Gemini ProのAPIを叩いてみましょう

Chap.4 GASでGemini ProのAPIを叩く

完成版のコードを見る

1/ apiKeyとAPIを叩くメソッドの定義

Gemini ProのAPIを叩くための雛形を用意します。
やることは2つです。
  1. Chap.1で取得したapiKeyを定義
  1. APIを叩くためのメソッドを定義 名前はcallGeminiAPIとしています。

2/ Gemini ProのAPIを叩く

実際にGemini ProのAPIを叩きます。chap.2で使用したcurlコマンドをGASコードにしていきます。

リクエストの定義

  • リクエスト先のurl
    • curlにおける -Xの箇所に相当する箇所です。
  • リクエストボディ
    • curlにおける -dに相当する箇所になります。
各種パラメータをparamsとしてまとめておきます。
APIに必要なパラメーター準備はこれで完了です。

Gemini ProのAPIを叩く

実際にGemini ProのAPIを叩きます。 GASにおけるインターネットアクセスはUrlFetchApp.fetch()で行えます。
生のJSONデータは扱えないので JSON.parse()で取り扱えるようにしておきます。
でGeminiから返ってきたデータを確かめてみましょう。
notion image
カードのようなマークをクリックして保存してからcallGeminiAPIを選択し、実行します。
長いですが、ログを見るとgeminiからの応答文が含まれていることが確認できます。
与えたプロンプトは「パオーン」にした。回答は結構でたらめ
与えたプロンプトは「パオーン」にした。回答は結構でたらめ

dataからgeminiの応答を抽出する

geminiから受け取った dataから応答文にあたるプロパティのみを抽出します。
レスポンスとして帰ってきたJSONを整形し、目視で頑張ってもよいですが、こんな感じでChatGPTに聞いてしまうのが手っ取り早いです。
今度はGASでGemini ProのAPIを叩いてみましょう

Chap.4 GeminiにLINE応答させる

完成版のコードを見る


1/ ユーザーからのメッセージをGeminiに渡す

Chap.3と同じ容量でユーザーからのメッセージをそのままGeminiにプロンプトとして与えると応答が得れます

メッセージを取得する

メッセージをGeminiに渡す

ユーザーからのメッセージをGeminiにプロンプトとして与えます。

2/ Geminiからの応答をユーザーに返信する

各種プロパティの定義

LineMessagingAPIからメッセージを送るために必要な各種プロパティを定義します。
  • lineAccessToken
  • lineEndpoint
具体的なやり方はpart.1の説明を参照してください

メッセージを送信するメソッドの定義

part1で定義したメソッドsendLineMessage()をそのまま流用します。
いよいよGeminiに応答してもらいます。

Chap.5 Geminiをチューニングする


後日執筆予定です
より望ましい対応をさせるようにGeminiの応答をカスタマイズします。

© Yusuke Sugino 2023 - 2024