ノーコードで会話内容を踏まえた応答ができるChatGPTのLineBotを作成してみた
🤖できたもの
いやもう、何番煎じなんだって感じですが。。。作った人格に愛着を持って欲しいので、削除された時に、この世への未練を滲ませるような遺言と辞世の句を詠んでもらうことにしました。
🗒️概要
ChatGPTが世間を賑わせています。ノーコードツール「make」とGoogleスプレッドシートを使い、会話を記録し、会話内容に応じた返答ができるChatGPTのLineBotを作成しました。
ただ利用するだけじゃなくて、自分でもちょっとカスタマイズして使ってみたい、でもプログラミングは難しい、書きたくないって人向けです。
🎯対象読者
- LINEでChatGPTを使ってみたい方
- プログラミングは詳しくないけど、ChatGPTを少しカスタマイズして使ってみたい方
- ノーコードツールに興味がある方
📝全体フロー
出来上がった全体フローとしては以下の通りです。(何が何だかわからないと思いますが、雰囲気伝われば。下で細かく見ます。)
🛠使用技術
make:ノーコードツール。各サービスの連携を担う。
Googleスプレッドシート:データベースの代わりに使用。
ChatGPT API:みんな大好きAIチャットボットのAPI
Line Messaging API:LINEのメッセージAPI
🏁作成の下準備
各種アカウント作成
makeとLINE DeveloperとGoogleアカウント、OpenAIのアカウントは作成しておいてください。
makeとLINEの接続は公式のリファレンスが詳しいです。
こちらのリファレンスの「Send a Reply Message」の手前まで完了している前提で話を進めていきます。
日本語で解説してくれている動画もあります。非常に参考になりました。
spread sheetの作成
キャラクターとメッセージのデータを管理するためのスプレッドシートを用意しておきます。
スプレッドシート名は「ChatGPT」、シート名はそれぞれ「characters」「messages」としました。
characters
カラム名 | 内容 |
---|---|
name | キャラクター名 |
settings | キャラクター詳細 |
userId | LINEのUserID。暗号化されているので誰かはわかりません。 |
registerdAt | キャラクター登録日 |
role | キャラクターの役割 |
今回は処理の簡略化のために1ユーザーにつきキャラ1体までとします。userIdはその判別用です。
roleはChatGPT APIと連携するのに必要な値を保持します。
messages
カラム名 | 内容 |
---|---|
from | 誰からの送信か |
content | メッセージ本文 |
to | 誰への送信か |
registerdAt | メッセージ登録日 |
role | メッセージの役割 |
makeの使い方について
makeは馴染みが薄い方も多いので簡単に使い方について触れておきます。
アカウントを作成したら、画面右上の「Create a new scenario」をクリックしてください。
後は+ボタンを押して連携したいアプリを検索・選択したら、アプリのアイコンがぴょんと出てきます。そのアイコンの端をクリックしてアプリを検索・選択したら、次のアプリのアイコンが出てきて、アイコン間がつながります。これだけでアプリの連携ができます。実際には必要な値を入力する必要がありますが、簡単に視覚的にアプリの連携が行えることがお分かりいただけると思います。makeでは基本的にこの作業の繰り返しでアプリの連携・自動化のフローを作成します。
💻機能
このLINE Botは以下の機能を持っています。
- キャラクター作成機能
- チャット機能
- キャラクター削除機能
- ヘルプ
先ほどのせた全体フロー図を機能毎に分けたらこんな感じです。ヘルプはLINEの機能のみで完結しているので、make上には存在しません。
makeとChatGPT APIとスプレッドシートでどのように作成したか順に詳述します。
キャラクター作成機能
以下の順に作成していきます。
1. キャラクター作成開始システムメッセージ送信
以下の手順で作成します。
- FilterでLINEから送られてくる値のチェック
- システムメッセージをLINEに通知
1. FilterでLINEから送られてくる値のチェック
他の機能にも共通して言えるのですが、 LINEに特定の文字列を入力したら、それをトリガーにフローが動くようになっています。
キャラクター作成機能ではシステム:キャラ作成
という文字列でbotが反応し、LINEにユーザーへ特定の文字列の入力を促すシステムメッセージを送ります。
特定の条件の時に何か処理を行いたい時はFilterを利用します。 モジュール(makeではSaaSひとつひとつをモジュールと呼びます。)を結ぶラインをポチッと押すだけでFilterの設定画面が出ます。ここに条件を書いていきます。今回は以下のように設定しました。使用したい値もモジュールからポチポチと選んでいくだけです。
2. システムメッセージをLINEに通知
キャラクター名の登録を促すようにLINEにメッセージを返します。LINEにメッセージを返すにはLINEモジュールの「Send a Reply Message」を利用します。 設定は以下の通りです。
2. キャラクター名登録
以下の順序で処理を行います。
- FilterでLINEから送られてくる値のチェック
- Text parserで値の加工
- 加工された値でGoogleSheetを検索
- キャラクター登録
- GoogleSheetの更新が終わったことをLINEに通知
1. FilterでLINEから送られてくる値のチェック
「キャラ名:〇〇」
とLINEから送信されたときにキャラクター名登録処理が動くようにします。
再びFilterを利用します。設定は以下の通りにしました。
キャラ名:
の後ろは任意の入力を許すので、キャラ名:
で始まる文字列に反応するようにしています。
2. Text parserで値の加工
「キャラ名:」の部分は後続の処理に不要なので削除してしまいます。
こういった文字列の加工にはText parserモジュールを利用します。
Text parser
モジュールは以下のように設定しています。
詳細は省きますが、正規表現を用いて「キャラ名:〇〇」
の「〇〇」部分のみを抜き出しています。
3. 加工された値でGoogleSheetを検索
キャラクターの登録に進みますが、先ほど書いた通り、1ユーザー1キャラとしたいので、まずLINEからキャラを登録しようとしたユーザーが既にキャラクターを作成しているかどうかを確認します。
Google Sheets
モジュールのSearch Rows
アクションを選択し、先ほど作成したcharcterシートを設定していきます。
Google Sheets
モジュールの各項目は以下の通り設定します。
項目 | 値 | 説明 |
---|---|---|
Enter a Spreadsheet ID and Sheet Name | Select from My Drive |
スプレッドシートをどのdriveから選択するかを選びます。今回はマイドライブから選択します。 |
Spreadsheet | ChatGPT |
検索したいスプレッドシート名 |
Seet Name | characters |
検索したいシート名 |
Column range | A-Z |
検索したい列の範囲。格納するデータの数的にA-Zで十分です。 |
Table contains headers | Yes |
検索したいシートがヘッダーを持っているか。今回はあらかじめ記入しておいたのでYesにしておきます。 |
Filter |
userId (C) Text operartors: Equal to 1.Events[]: Source.User ID
|
見つけたい行の条件を指定します。今回はuserId列の値がLINEユーザーのIDと一致しているかを条件にしています。 |
Sort order | Asending |
ヒットした行を昇順にするか降順にするかの指定。今回はデフォルトの昇順を指定します。 |
Order by | 値なし | 何の列で昇順にするか降順にするかを指定します。今回は特に指定しません。 |
Maximum number of returned rows | 1 |
ヒットした行を最大何行までのデータを受け取るかを指定します。1人1キャラ想定なので1行しかヒットしないはずですが、念の為1行を指定します。 |
4. キャラクター登録
用意したスプレッドシートにデータを書き込んでいきます。
今回はRouterモジュールを使ってユーザーが既にスプレッドシート上に存在するか否かで処理を分けました。
ユーザーが存在しない場合(キャラクターが存在しない場合)はキャラクターの登録を行い、存在する場合はキャラクターの削除を促すメッセージをLINEに返信します。
ユーザーが存在しない場合のモジュールの設定は以下の通りです。
現在時刻など、よく使いそうな値はあらかじめmakeが用意してくれています。
5. GoogleSheetの更新が終わったことをLINEに通知
スプレッドシートに書き込んだら、キャラクター詳細の入力を促します。
ユーザーが存在する場合は以下の通りです。スプレッドシートへの書き込みは行わず、削除を促す旨をLINEに返信します。
3. キャラクター詳細登録
キャラクター名に続いて、詳細を登録します。基本的な処理の流れはキャラクター名登録処理と同じで
- FilterでLINEから送られてくる値のチェック
- Text parserで値の加工
- 加工された値でGoogleSheetを検索
- 対象行の更新
- GoogleSheetの更新が終わったことをLINEに通知
の流れです。各項目の詳細を見ていきます。
1. FilterでLINEから送られてくる値のチェック
「詳細:」で始まる文字列にマッチするように設定しています。
2. Text parserで値の加工
正規表現を用いて「詳細:〇〇」
の「〇〇」部分のみを抜き出しています。
3. 加工された値でGoogleSheetを検索
キャラクターが存在しているかどうかをチェックします。
4. 対象行の更新
3.で得られた対象行を更新します。Row number
には3.で得られた行番号(Row number)を、「settings
」列にはLINEから受け取った詳細を書き込みます。
渡されたテキストをそのまま書き込んでもいいのですが、よりキャラクターを演じることを明確にChatGPT APIに伝えるために、冒頭に「あなたは〇〇(〇〇はname列の値)です」と付け加えています。
キャラクターの演じさせ方はこちらの記事を参考にさせていただきました。
5. GoogleSheetの更新が終わったことをLINEに通知
最後にキャラクターが作成できたことをLINEに通知します。これでキャラクター登録処理は以上になります。
チャット機能
キャラクターを作成したら、このアプリの要となるチャット機能を作成していきましょう。
1. フィルター/テキスト加工
例の如く、特定の文字列だけ反応するように、filterを設定します。
Text parserモジュールで必要な部分だけを抜き出します。
正規表現の解説 by武田信玄
正規表現に馴染みのない方には、「なんじゃこりゃ」となってしまうかもしれません。せっかくなので武田信玄さんに聞いてみましょう。
解説ありがとうございます。
2. ユーザー送信メッセージ登録
以下の順序で行います。
- キャラクター存在確認
- メッセージ登録
-
キャラクター存在確認
「こんにちは、〇〇」の〇〇部分に合致するキャラクターが登録されているかを確認します。
キャラクターがいない場合は、キャラクター作成を促すLINEメッセージを送信します。
-
メッセージ登録
キャラクターがいた場合、以下の設定で行を登録します。roleは必ず「user」としてください。
3. 過去メッセージ取得・整形
過去のユーザーメッセージ、キャラクターメッセージ、そしてキャラクター詳細を取得して整形します。
なぜこの作業を行うかというと、ChatGPTで過去の文脈を捉えさせるには、これまでのメッセージ履歴をChatGPT APIに含めなければならないからです。
公式リファレンスで以下のように述べられています。
The system message helps set the behavior of the assistant. In the example above, the assistant was instructed with "You are a helpful assistant.
(出典:https://platform.openai.com/docs/guides/chat/introduction)
「In the example above」は下記のコードを指しています。
# Note: you need to be using OpenAI Python v0.27.0 for the code below to work
import openai
openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "Who won the world series in 2020?"},
{"role": "assistant", "content": "The Los Angeles Dodgers won the World Series in 2020."},
{"role": "user", "content": "Where was it played?"}
]
)
(出典:同上)
つまり、上記の形でChatGPT APIにデータを渡さなければなりません。 スプレッドシートにrole
を設けたのはこのためです。
この目的を果たすために、キャラクター詳細、過去のユーザーメッセージ、キャラクターメッセージを取得・整形してくる必要があります。
具体的には、以下のようにスプレッドシートにデータがあるとして...
それぞれ、赤網掛け(settings
、content)、青網掛け(registeredAt
)、緑網掛け(role
)をまとめ...
以下のように、registeredAt
の昇順に並び替えたデータを作っていきます。昇順に並び替えることで、会話の古い順に並べることができます。
キャラクター詳細整形
キャラクター詳細はすでに「a. キャラクター存在確認」で取得しているので、こちらを利用しましょう。
上記の図で示したように、こういった同じデータ構造を持つ集合体(=配列)に変換するにはArray aggregator
モジュール[1]を利用します。
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "Who won the world series in 2020?"},
{"role": "assistant", "content": "The Los Angeles Dodgers won the World Series in 2020."},
{"role": "user", "content": "Where was it played?"}
]
Array aggregator
には3つの設定項目があります。以下のように設定してください。
項目 | 設定値 | 説明・補足 |
---|---|---|
Source Module |
Google Sheets Search Rows [36] |
モジュール番号(36)はモジュールを設置した順番などで変化しますので、皆さんの環境でそれぞれ読み替えてください。 |
Target structure type | Custom |
整形後の構造を指定します。後続に続くモジュールをリストから選択できますが、ここでは柔軟に扱いたいのでCustom とします。 |
Aggregated fields |
settings (B)、registeredAt (D)、role (E)にチェック |
どの値を変換したいかを指定します。 |
少し見づらいかと思いますが、↓gif画像の一番左の「Google Sheets Search Rows
」モジュールは36番です。
この36番のモジュールで取得したキャラクター詳細を「Array aggregator
」を使って配列に変換します。
キャラクターメッセージ取得・整形
続いて、キャラクターメッセージ取得を取得します。
Filter条件として、from
がText perser
と等しい行を指定しています。また、Maximum number of returned rows
」10としています。これは最大何行のデータを取得するかを指定するものです。今回は10行としました[2]。
取得したデータを整形します。
Array aggregator
の設定は以下の通りです。キャラクター詳細整形の時と同様です。Google Sheets Search Rows
とSource ModuleとAggregated fieldsは間違えないように選択してください。(画像だと41。)
ユーザーメッセージ取得・整形
次は、ユーザーメッセージを取得します。
Filter
条件として、to
がText perser
と等しい行を指定しています。最大行数は10です。
こちらもGoogle Sheets Search Rows
とSource ModuleとAggregated fields
は間違えないように選択してください。(画像だと42。)
これで、キャラクター詳細、過去のユーザーメッセージ、キャラクターメッセージを取得・整形することができました。
4. データのマージとソート
上記の状態では、キャラクター詳細、過去のユーザーメッセージ、キャラクターメッセージがそれぞれ配列になっているので、一つの配列にします。
ここで注意しなければならないのが、過去にキャラクターとのやりとりがなかった場合(キャラを作った直後の初めてのチャットの場合)、キャラクターメッセージの配列を含めてはいけないので、rouerを使って処理を分岐させています。
過去にやりとりがあったかどうかは以下のように判定しています。キャラクターメッセージの配列にcontentが存在するかどうかです。
過去にやりとりがあった場合
Tools
のSet variable
を利用します。以下のように設定します。
Array aggregator
で作成した3つの配列をmerge関数を使って、1つの配列にします。Variable nameは好きな名前にしてくださって構いません。Variable lifetime
はOne cycle
としてください[3]。
最後に、マージされた配列を並び替えましょう。
再び、Tools
のSet variable
を利用します。設定は以下の通りです。
sort関数は第一引数に並び替えたい配列、第一引数にどの値で並び替えるかを指定します。
3
という値は何だ?と思われるかもしれませんが、配列のregisteredAtのkeyを指定しています。keyはregisteredAtじゃないのかと思われた方もいらっしゃるかもしれません。実際にどんな値が設定されているか確認できます。左下の「Run once」を実行すると、実際にどの処理を通って、どんな値が渡ってきているのか確認できます。
「Run once」を実行後、実行されたモジュールの右上に数字が表示されているので、それをクリックすると、具体的なInputとOutputが確認できます。3のところにregisteredAtの値が確認できるので、これでソートします。(この辺り結構ハマりました。。。何か解決策あれば。。。)
過去にやりとりがなかった場合
過去にキャラクターとのやりとりがなかった場合のTools
のSet variable
の設定は以下の通りです。キャラクターメッセージの配列を含めていません。
過去にやりとりがないということは、キャラクター詳細1件、ユーザーメッセージ1件のデータしか存在せず、それぞれ独立した配列として、ChatGPT API
に渡すので、こちらの配列は並び替える必要はありません。
5. ChatGPT APIにデータを渡す
ChatGPTとの連携
まずOpenAI (DALL-E & ChatGPT)
とmakeの連携を行います。OpenAI (DALL-E & ChatGPT)
モジュールを検索・選択したら、Create a Completion
アクションを選択。ConnectionはAddを押します。
その後、Connection name
とAPI Key
、Organization ID
の入力を求められます。Connection name
は任意のもので構いません。
API Key
は以下のURLで発行・確認できます。
Organization ID
は以下のURLで確認できます。
それぞれをURL先で確認し、API Key
とOrganization ID
の入力欄に貼り付けて、Saveを押してください。これでChatGPTとmakeの連携ができました。
データの渡し方
過去のやりとりの有無でChatGPTへのデータの渡し方が若干異なります。
過去にやりとりがある場合
目的の配列が完成し、連携もできたので、いよいよChatGPTにデータを渡します。
少し渡し方に工夫が必要です。
今、配列の要素1つ1つは以下のような構造を持ったデータです。これが会話の数だけ存在するイメージです。
key | 値 |
---|---|
1 | content |
3 | createdAt |
4 | role |
この配列の要素を1つずつ加工して、先ほど確認した以下の構造に合わせなければいけません。
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "Who won the world series in 2020?"},
{"role": "assistant", "content": "The Los Angeles Dodgers won the World Series in 2020."},
{"role": "user", "content": "Where was it played?"}
]
こういった配列の要素1つずつに対して操作を行って、別の構造に置き換える場合、以下のようにIterator
とArray aggregator
を組みあわせます。
Iterator
が配列の要素を1つずつ操作する場合に利用するモジュールで、Array aggregator
が
上述しましたが、同じデータ構造を持つ集合体(=配列)に変換する際に利用するモジュールです。
Iterator
の設定は以下の通りです。直前の配列を指定しています。忘れずMap
にチェックを入れてください。そうしないと配列を扱うことができません。 このMap
はmakeのいろんな設定値に出てきますが、使い所としてはデフォルトで指定された値よりもカスタマイズした値を使いたい時にチェックを入れるみたいな認識で大丈夫です。
Array aggregator
の設定は以下の通りです。
項目 | 設定値 | 説明・補足 |
---|---|---|
Source Module | Iterator[105] |
モジュール番号(105)はモジュールを設置した順番などで変化しますので、皆さんの環境でそれぞれ読み替えてください。他のモジュール番号も同様です。 |
Target structure type | OpenAI(DALL-E & ChatGPT) - Create a Completion |
整形後の構造を指定します。OpenAIモジュールを後ろに配置していないと選択できないので注意してください。 |
Aggregated fields |
Role にはIterator の4(=role) を、Message Content には1(=content) 指定 |
どの値を変換したいかを指定します。Mapにチェックを入れてください。 |
どの値がどのモジュールに対応しているか分かりにくいと思うので、以下にgifも用意したので参考にしてください。
最後に、OpenAI (DALL-E & ChatGPT)
モジュールに出来上がった配列を渡します。
さまざまな設定項目がありますが、基本的には以下画像の赤枠のように設定できていれば大丈夫です![4]Messages
には、直前で作成した配列を入れてください。
過去にやりとりがない場合
こちらで作成したキャラクターメッセージが含まれていない配列を利用します。設定は以下の通りです。こちらはMessagesのMapをoffにしたままで設定してください。 Item1
にはこちらで作成したキャラクター詳細の配列をItem2
にはLINEから送られたユーザーメッセージをそれぞれ指定してください。
スプレッドシートに書き込む
ChatGPTで生成されたメッセージをスプレッドシートに書き込みます。ここに書き込まれたメッセージを使って、ChatGPTに送信することで、ChatGPTは過去の文脈を捉えることができるようになります。
設定は以下の通りです。キャラクターのメッセージなので、by
にはキャラクター名、content
にはchatGPTで生成されたメッセージ、to
にはUserID、registeredAt
には現在時刻、role
にはassistant
を設定します。
LINEに返信
これまで通り、LINE
モジュールのSend Reply Message
を使ってChatGPTで生成されたメッセージをLINEに返信します。
下記画像赤枠のデータを使ってください。
これでチャット機能の実装は完了です。
キャラクター削除機能
以下の順に作成していきます。
1. キャラクター削除開始システムメッセージ送信
システム:キャラ削除
から始まる文章に対して、LINEのメッセージを返答します。
フィルターの設定は以下の通りです。
削除:キャラ:〇〇
で削除機能が使える旨をLINEに返答します。合わせて、削除したら元に戻せない旨も添えます。
2. フィルター/テキスト加工
削除:キャラ
から始まる文字列でのフローを通るようにFilter
を設定します。
削除:キャラ
の部分は必要ないので、Text Parser
で削除します。
3. 削除前メッセージ作成・送信
キャラがいない場合は削除はできないので、キャラの有無によって処理を分岐させます。
1. 存在しない場合
判定は以下の通りです。Text parser
で加工して取得したテキスト(=キャラ名)を利用します。
LINEにキャラが存在しない旨を返信するだけです。後続の処理はありません。
2. 存在する場合
判定は以下の通りです。Text parser
で加工して取得したテキスト(=キャラ名)を利用します。
削除前のメッセージを送ります。以下の設定です。正直これはなくてもいい遊び要素です。
武田信玄辞世の句
4. メッセージ削除
削除されるキャラクターのメッセージを削除します。
削除メッセージ検索
まず、削除するメッセージを検索します。以下の設定です。
条件しては、fromがキャラ名と一致、またはtoがキャラ名と一致、つまりキャラクターが送受信したメッセージとということになります。
ここで気をつけなければならないのが、Sort order
にDescending
、Order by
にRow number
を必ず指定してください。[5] この2つの設定がないとうまく条件に合致したメッセージが削除されません。
メッセージが存在した場合のみ「Delete Row」を実施します。
メッセージが存在するかどうかの条件は以下の通りです。
Total number of bundles
を利用します。これはSearch Rows
で何件取得できたかを表しています。
この値が0の場合はメッセージが存在しないことになります。
メッセージ削除
Delete Row
の設定は以下の通りです。
直前のSearch Rows
で取得したRow number
を利用してください。
うまく設定できていると、このように削除されていきます。
5. キャラクター削除
ここから「キャラが存在した場合」の2つ目のルート(真ん中のルート)になります。
削除キャラクター検索
削除するキャラクターを検索します。以下の設定です。LINEから送られてきたキャラ名と一致するキャラクターが存在するかどうかを検索します。
キャラクター削除
存在したら、その行を「Delete Row」に設定して削除します。直前のSearch Rows
で取得した行を設定してください。
6. 削除後メッセージ送信
ここまでで削除が終わっているので、最後に削除した旨をLINEに送信します。
このBotが友達としてやりとりしているのか、グループに存在しているのか、ルームに存在しているのかで送り先が変わるので、その3つに分岐しています。
それぞれの条件は以下の通りです。
sleep処理
LINEにメッセージを送信する前にToolsモジュールのsleepを3秒入れています。これは指定の秒数処理を待つというものです。削除前メッセージを送って、少し読んでもらってから削除通知を出したいので、このような処理を入れています。もちろんなくても良い処理です。
LINEに削除完了メッセージを送信
これまでと違って、LINE
モジュールのSend Reply Message
ではなく、Send a Push Message
を利用します。理由としては、reply Tokenの有効期限が約30秒[6]で、ユーザーからLINEのメッセージを送ってから30秒以内に返せないことが多く、Tokenの有効期限が切れてしまうからです。
設定は以下の通りです。
ヘルプ
コマンド等を忘れてしまった場合に、コマンドを確認できる機能です。
こちらは他のアプリに連携する必要等ないので、LINEBotの応答メッセージ機能を利用しました。
応答メッセージはLINE Official Account Managerにログインして設定できます。以下は設定画面です。
実際に送ってみたのが下記画像です。
ここまでで一通り完成です。お疲れ様でした!
📌その他
makeのフリープランは1000オペレーション/月[7]までしか利用できません。自分はbot作成中に上限が来ました。デバッグしてたらすぐやってきます。
😄終わりに
かなり「make」は使いやすかったです。 SaaSのアイコンを並べて、繋げて、連携したいデータを入力するだけで簡単に自動化ができます。条件分岐や値の加工なんかも本格的にできて、気づいたら結構作り込んでました。
ぶっちゃけこれだけ並べて作ってみると、コード書いたほうが速かったかもしれません。ただ、コードを書く環境構築もいらないし、手軽さは圧倒的にノーコードツールの方が上です。連携できるアプリも多く、普段のルーチンをサクッと自動化するにはかなり向いていそうです。気が向いたら、ぜひ皆さんもチャレンジしてみてください。もし、今回の構成で、もう少しこうしたら良いよーとかあったら気軽にコメントください!
🙏参考サイト・記事
以下の記事を参考にさせていただきました。先達の努力と知恵に感謝です。
-
Array aggregator
モジュールに関する公式の説明 ↩︎ -
会話履歴を全て送ろうとすると、すぐにChatGPT API側のトークン上限に到達してしまいます。
また会話内容を踏まえた応答のロジックはこちらの記事を参考にさせていただきました。今回のLINEBotを作ろうと思ったきっかけにもなりました。 ↩︎ -
One execution
もあるのですが、違いがよくわからず。。。もしご存知の方がいらっしゃったら教えてください! ↩︎ -
その他詳しい設定値に関しては公式リファレンスを参照してください。↩︎
-
公式でも述べられています。↩︎
-
こちらの記事を参考にさせていただきました。↩︎
-
公式のプラン比較表↩︎
Discussion