本資料はこちらの体験会で使用したハンズオン資料を改定したものになります。
LINE Developersのアカウント設定やOpenAIのAPI_key、make(integromat)のアカウント作成などは実施をお願いします。
本記事にはLINE Messaging APIのCHANNEL_ACCESS_TOKENなど記載されていますが、本来は悪用を防ぐために、漏洩には十分注意してください。
1. 今回の目標
- LINEを通じてChatGPTのAPIを叩いて、リプライが返ってくるLINE Botをつくる
- APIを叩くときのプロンプトを調整し、想定した返答を引き出す
以上、2点が実施できることを目標としています。
2. おうむ返しBotの作成
まずはリプライメッセージを送るLINE Botの基本となるおうむ返しBotを準備します。
2-1. 目標となる形
2-2. モジュールの設定
2-2-1. Watch Events
- 最初に表示されている⊕をクリックして表示されるモーダルで、
line
を検索。表示されるWatch Events
をクリックします
Watch Eventsを選択
- Webhookを設定します。
Create Webhook
ボタン、Create a connection
ボタンを順次クリックし、LINE Developersより取得したCHANNEL ACCESS TOKENを貼り付けてください
Create a webhook
をクリック
Create a connection
を選択
Channel Access Tokenの欄にLINE Developers側で取得したトークンを張り付けて
Save
ボタンを押す
Connectionの欄に新しい接続が表示されるので
Save
ボタンをクリック
- LINE Developers側には、下画像の
Copy address to clipboard
の部分からコピーしたWebhook_URLを貼り付けてください - Webhook_URLの有効化も忘れずにチェックしてください
Copy address to clipboard
ボタンをクリックしてURLをコピー
LINE Developersがわの画面でWebhook URLの欄にコピーしたURLを張り付け
2-2-2. Send a Reply Message
- LINEモジュールの横にある〇をクリックして別のモジュールを追加。同じくLINEをクリックして、出てくる
Send a Reply Message
をクリックします
マウスホバーして出てくるAdd another module をクリック
LINEモジュールを選択
Send a Reply Messageを選択
- Reply TokenとTextの部分を画像の通りに設定。利用者側からMessaging APIを通して送られてきた情報より、Reply Tokenとテキスト情報を抜き出すイメージです
Reply Tokenの欄は
1.Events[
]: Reply Token
。Textの欄は1.Events[
]: Message.Text
を選択
- Run onceを押した状態でメッセージを送ると全く同じメッセージが返ってくるおうむ返しBotとなります
- 常に有効化(つまりデプロイされた状態に)するには
scheduling
をON
にして、時計マークをクリックして出てくるRun scenario
をimmediately
にした状態で保存すれば良いです
3. OpenAI モジュールの組み込み
OpenAIのAPI(gpt-3.5-turbo)を叩いて、返ってきたテキストをリプライするLINE Botを作成します。
3-1. 目標となる形
3-2. Create a Completion
-
Connection
のAdd
ボタンをクリックしてAPIの設定をします - モジュールは画像の通り、
Create a Completion
、gpt-3.5-turbo
を選んでください - 発行したAPIキーとアカウントのOrganization IDを其々コピーペーストします
Organization IDはこちらURL
- MessagesはRoleを
User
、Message ContentのところにはEvents[]:Message.Text
を入力してください。これでLINEに入力した言葉でChatGPTのAPIを叩くことができます
Create a connection
ボタンをクリック
API keyと Organization IDをコピーペーストして
Save
Select MethodはCreate a Chat Completion、Modelはgpt-3.5-turbo、MessagesのRoleをUser、Message Contentを
1. Events[
]: Message.Text
Max Tokens に0を入力して
OK
ボタンをクリック
3-3. Send a Reply Message
- 先ほどはMessagesのTextのところに送られてきたテキストをそのまま返すようにしていましたが、今回は
Choices[]:Message.Content
を入力します。これが、ChatGPTのAPIから返ってきたメッセージとなります
Messages のTextを
Choices[
]:Message.Content
。これまでの設定が正しくできていればOpenAIの選択肢がSend a Reply Messageモジュールに表示されるようになります
実行するとChatGPTと単体の会話ができます。
4. プロンプトの設定
ChatGPTに特定の役割を与え、自分の想定した返答を引き出す技術がプロンプトの調整となります。詳細は下記リンク先Prompt Engineering Guideを参考にしてみてください。
今回は料理研究家の役割を与えて、食材からメニュー提案をしてもらいます。
Create a Completion
- MessagesのItem1はRoleを
System
、Message Contentにプロンプトを入力します - Item2は先ほどと同様、RoleをUserとし、Message ContentはLINEのテキストです
通常のChat GPTの返答
プロンプトを与えた場合の返答
応用 LINE Bot上で会話を行う
以下、Data Stores部分に関する動作は2024.05.09時点で確認しておりません。コメント欄にあるスプレッドシートを利用した方法を推奨しますが、Data Stores, Data structuresの紹介として記述自体は残しておきます
ここまでで作成したLINE Botは一問一答形式にのみ対応しており、会話ができません。それは、データベース上に会話を保存していないためであり、APIを叩いて得られるテキストに文脈を反映させるためには、これまでの会話ログと合わせて入力することが必要となります。
通常のChat GPTの返答
単純にAPIを叩いた場合の返答
Data Stores, Data structuresの設定
- 今回はデータベースとして、Makeの機能としてある
Data Stores
を利用します。 - データベースの構造は
Data stucture
のメニューから画像の通り設定してください。userIdをtext、valueをcollection(参照配列)で設定します。
gpt-3.5-turboのAPIは
[
{"role": "system", "content": "role_sample"},
{"role": "user", "content": "Hello!"},
]
のような形式でmessagesのデータを受け取りますので、データベースのvaluesはこの形式に合わせています。
さらに、ユーザーごとの会話ログを識別するために、NameにLINEのuserId
を保存していきます。
会話ログの保存
目標となる形
Add/replace a record(1つめ)
Add/replace a record(2つめ)
実際にLINEからメッセージを送ると、LINEのuserIdと一連の会話ログが保存されます。
会話ログをデータベースから呼び出しAPIを叩く
目標となる形
search records
- 今回は1往復分の会話を取得し、送信されたメッセージと合わせてChatGPTのAPIを叩きます
- 受け取ったLINEのuserIdとData storeの
userId
が一致するデータを取得しますので、FilterをuserId,Events[];Source.User ID
に設定します - 1往復分の会話、つまり会話ログ2つを取得するのでLimitに2を設定します
Array aggregator
Create Completion
- 取得したデータを合わせて、ChatGPTのAPIを叩きます
- Item 1が前提条件として設定するプロンプト
- Item 2に前回Userが送信したメッセージとして、Array Aggregatorで生成した配列データの1つめ
- Item 3に前回Assistantから受け取ったメッセージとして、Array Aggregatorで生成した配列データの2つめ
- Item 4に今回LINEから受け取ったメッセージをそれぞれ設定します
- Array[]の番号に注意してください
エラーハンドリング:初めてメッセージを送信する方への対応
目標となる形
- 前回設定したものでは、初めてメッセージを送信する方からのデータを受け取った場合、エラーが発生してしまいます。ですので、APIを叩くところでエラーハンドリングを実行します
エラーハンドリングの設定
以上で、一通り会話できるChat Botの作成は完了です。