49
46

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ChatGPT × LINE Bot × Make ノーコードで対話できるChatBotを作成する

Last updated at Posted at 2023-04-25

本資料はこちらの体験会で使用したハンズオン資料を改定したものになります。
LINE Developersのアカウント設定やOpenAIのAPI_keymake(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となります
  • 常に有効化(つまりデプロイされた状態に)するにはschedulingONにして、時計マークをクリックして出てくるRun scenarioimmediatelyにした状態で保存すれば良いです

スクリーンショット 2023-04-23 23.05.44.png

3. OpenAI モジュールの組み込み

OpenAIのAPI(gpt-3.5-turbo)を叩いて、返ってきたテキストをリプライするLINE Botを作成します。

3-1. 目標となる形

3-2. Create a Completion

  • ConnectionAddボタンをクリックしてAPIの設定をします
  • モジュールは画像の通り、Create a Completiongpt-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と単体の会話ができます。

スクリーンショット 2023-04-23 23.13.39.png

4. プロンプトの設定

ChatGPTに特定の役割を与え、自分の想定した返答を引き出す技術がプロンプトの調整となります。詳細は下記リンク先Prompt Engineering Guideを参考にしてみてください。

今回は料理研究家の役割を与えて、食材からメニュー提案をしてもらいます。

Create a Completion

  • MessagesのItem1はRoleをSystem、Message Contentにプロンプトを入力します
  • Item2は先ほどと同様、RoleをUserとし、Message ContentはLINEのテキストです

スクリーンショット 2023-04-23 23.26.40.png

通常のChat GPTの返答

プロンプトを与えた場合の返答

スクリーンショット 2023-04-23 23.26.26.png

応用 LINE Bot上で会話を行う

以下、Data Stores部分に関する動作は2024.05.09時点で確認しておりません。コメント欄にあるスプレッドシートを利用した方法を推奨しますが、Data Stores, Data structuresの紹介として記述自体は残しておきます

ここまでで作成したLINE Botは一問一答形式にのみ対応しており、会話ができません。それは、データベース上に会話を保存していないためであり、APIを叩いて得られるテキストに文脈を反映させるためには、これまでの会話ログと合わせて入力することが必要となります。

通常のChat GPTの返答

単純にAPIを叩いた場合の返答

スクリーンショット 2023-04-23 23.16.06.png

Data Stores, Data structuresの設定

  • 今回はデータベースとして、Makeの機能としてあるData Storesを利用します。
  • データベースの構造はData stuctureのメニューから画像の通り設定してください。userIdをtext、valueをcollection(参照配列)で設定します。

スクリーンショット 2023-04-23 23.34.06.png

スクリーンショット 2023-04-23 23.34.12.png

スクリーンショット 2023-04-23 23.34.37.png

gpt-3.5-turboのAPIは

[
    {"role": "system", "content": "role_sample"},
    {"role": "user", "content": "Hello!"},
]

のような形式でmessagesのデータを受け取りますので、データベースのvaluesはこの形式に合わせています。
さらに、ユーザーごとの会話ログを識別するために、NameにLINEのuserIdを保存していきます。

会話ログの保存

目標となる形

Add/replace a record(1つめ)

  • LINEから受け取ったuserIdとテキストデータをuserからの情報として保存します。
    スクリーンショット 2023-04-25 6.55.41.png

Add/replace a record(2つめ)

  • ChatGPTのAPIから受け取ったリプライをassistantからの情報として保存します。
  • LINEのuserIdも一緒に保存することで、利用者を識別します。
    スクリーンショット 2023-04-25 6.56.57.png

実際にLINEからメッセージを送ると、LINEのuserIdと一連の会話ログが保存されます。

スクリーンショット 2023-04-25 7.02.26.png

会話ログをデータベースから呼び出しAPIを叩く

目標となる形

search records

  • 今回は1往復分の会話を取得し、送信されたメッセージと合わせてChatGPTのAPIを叩きます
  • 受け取ったLINEのuserIdとData storeのuserIdが一致するデータを取得しますので、FilterをuserId, Events[];Source.User IDに設定します
  • 1往復分の会話、つまり会話ログ2つを取得するのでLimitに2を設定します
    スクリーンショット 2023-04-25 7.05.52.png

Array aggregator

  • Data storeは一致したデータをイテレーターとして返しますので、Array aggregatorで配列のデータに直します
    スクリーンショット 2023-04-25 7.07.01.png

Create Completion

  • 取得したデータを合わせて、ChatGPTのAPIを叩きます
  • Item 1が前提条件として設定するプロンプト
  • Item 2に前回Userが送信したメッセージとして、Array Aggregatorで生成した配列データの1つめ
  • Item 3に前回Assistantから受け取ったメッセージとして、Array Aggregatorで生成した配列データの2つめ
  • Item 4に今回LINEから受け取ったメッセージをそれぞれ設定します
  • Array[]の番号に注意してください

スクリーンショット 2023-04-25 7.15.15.png

スクリーンショット 2023-04-25 7.15.24.png

エラーハンドリング:初めてメッセージを送信する方への対応

目標となる形

  • 前回設定したものでは、初めてメッセージを送信する方からのデータを受け取った場合、エラーが発生してしまいます。ですので、APIを叩くところでエラーハンドリングを実行します

エラーハンドリングの設定

  • Array aggregatorが生成されない(初めて利用するため過去のデータがない)場合、分岐させてプロンプトとLINEのメッセージを用いてAPIを叩くように設定します
    スクリーンショット 2023-04-25 7.20.56.png

以上で、一通り会話できるChat Botの作成は完了です。

49
46
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
49
46

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?