見出し画像

ChatGPT APIによる会話蓄積・文脈理解型のチャットボットをPower Automateを使ってMicrosoft Teamsに実装した気づき

前回ChatGPT APIで試せなかった部分の検証を進めていきます。
gpt-3.5-turboでは、userとassistantの会話を積み重ねることができるような構造になっており、チャットボット開発を簡単にできるようにAPIが設計されています。

会話の内容を蓄積するロジック

リファレンスの通りmessages配列には以下の順にデータを格納してきます。

  1. systemへの命令文を格納する

  2. userの質問を格納する

  3. assistantの回答を格納する

  4. 新たなユーザーの質問を格納する

  5. 3~4を所定の回数繰り返す。

# 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?"}
    ]
)

机上では比較的簡単そうに見えますね。実装は今回もPower Automateでやっていきます。前回同様HTTP REQUESTを行うので有償扱いです。(試すなら開発環境・試用版でOK)

チャットボットのペルソナは英雄王に

チャットボットとして利活用されるには人格・愛着が必要です。今回も深津氏式の人格をお借りし、ウルクの王にご登場いただきます。

LinkedInに英雄王のプロフィールがあるらしい

キャラクターとして想像しやすいのはありがたいですね。今から目に浮かびます。

ワークフローの設計

以下のような感じで構成していきます。今回はTeamsを入力インターフェイスにするため、親メッセージに対して(アダプティブカードを使わないと)返信できないなど、使えるアクションが限定されます。また、投稿した質問内容がわかりません。

  • メンションすると質問に回答してくれる(Teamsのトリガーとする)

  • 会話内容を蓄積するため、質問と回答を配列変数に追加し、都度POSTする

  • 繰り返し回数に上限を設ける(Do Untilを使用する)

  • 上限になったら怒って質問を受け付けなくなる(終了時の処理を加える)

実際に質問してみる

開発内容はあとにして、実現した結果はこんな感じです。

メンションするとギル様が回答してくれる
アダプティブカードなので質問内容が確認できない。。。
アイコンのせいでエルキドゥの存在感がなくなってしまった。。。
蓄積した質問を確認しようとしたらループの上限に加えて怒られた。。。
改めて蓄積を確認
きっちり覚えていてくれる
改めて蓄積を確認しようとしたら
やっぱりループの上限の時だと回答してくれない。。。

解説

まず全体の流れをご覧ください。変数でゴリゴリ初期値を作っていきます。

長い。。。

初期化するもの

繰り返し使う値を初期化していきます。

  • API Key

  • TeamID

  • ChannelID

  • ChatGPTのモデル(gpt-3.5-turbo)

  • systemのcontent(ギルガメッシュの人格注入)

  • message配列に格納するsystem用のobject

  • userのcontent(ユーザーの質問文)※初回のみHTMLをテキストに変換

  • message配列に格納するuser用のobject

  • message配列に格納する各objectの入れ物のarray

  • ループの初期値

スコープの中身

まず、HTTP REQUESTでAPIに質問を投げます。arrMessageにはsystemとuserのオブジェクトが格納されています。assistantの回答は同じようにmessage配列にobjectとして格納されていますので、1行のみ抽出してarrMessage配列に追加します。

first(body('HTTP_2')?['choices'])?['message']

続いてギルガメッシュの回答をチャンネルに投稿します。回答内容は上記objectのcontentに格納されています。

first(body('HTTP_2')?['choices'])?['message']?['content']

続いてアダプティブカードでユーザーの質問を受け付けます。回答内容はmyTextに格納されるようにします。カードはエディターで作成できますので、任意形式で作成ください。

エディターで作れます

変数に順番に格納していきます。

  1. アダプティブカードからのmyTextをuserのcontentに格納する

  2. userのobjectに質問を格納する

  3. arrMesageにuserのobjectを追加する

  4. ループをカウントアップする

1の際にループ終了時の処理を加えておきます。

ループ終了時のプロンプト。こっそりユーザーの質問文に混ぜている
質問を配列に追加

ループを抜けた後のスコープでは、HTTP REQUEST後、RESPONSEをTeamsに投稿するのみ行います。

作ってわかったこと

Power Automateで実装するメリット

  • Microsoft 365のインターフェイスを使えるのでバックエンドだけでほぼOK

デメリット

  • 自動トリガーの待機時間が発生するため、チャットボットらしくない

  • ロジックが長くなると作業しづらい

  • 文脈理解型の入力方法に制約がある(カードかアプリが必要)

アダプティブカードを使ったらエルキドゥの存在感が薄れてしまいましたが、履歴を蓄積していることの確認は取れました。ギルガメッシュの人格が強すぎて文脈理解した回答かは、ちょっと判断つきませんが、乱立するAIチャットの裏側がわかってきました。プロンプトインジェクション対策や蓄積のリセット機能は共通化してきそうですね。

この記事が気に入ったらサポートをしてみませんか?