先日、VstoneMagic用にChatGPTを利用した対話ブロックがアップデート配信されました。
これを使えば、ややこしいHTTP通信処理をJavaでコーディングすることなく、GPTのAPIキーを作成するだけで簡単に対話を組み込めるようになります。

Sota取扱説明書のブロックの説明は以下になります。
https://www.vstone.co.jp/sotamanual/index.php?VstoneMagic%2F%E5%91%BD%E4%BB%A4%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF#r0f58f8c

また、このブロックを利用するためには外部jarファイルが必要です。
jarファイルのダウンロード・設定方法は同じくSota取扱説明書の以下で説明しています。
https://www.vstone.co.jp/sotamanual/index.php?VstoneMagic%2F%E5%91%BD%E4%BB%A4%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF#z4c31748

今回はこのブロックを使って簡単に対話機能の実装を説明します。

ユーザ登録とAPIキーの取得

まずは、openAIのページにユーザ登録してAPIキーを取得します。
具体的な手順については、過去の「SotaをChat-GPTで会話できるようにする」の内容とほぼ同じになります。
https://vstone.co.jp/robotshop/blog/archives/7814

この記事を参考に、アカウントを作成して「sk-」から始まるAPIキーを取得してください。
今回のブロックでは組織キーは不要です。

VstoneMagicのアップデート

続いて、VstoneMagic側のアップデートを行います。VstoneMagicを起動し、メニューの「ヘルプ」→「アップデート」→「VstoneMagicのアップデート」をクリックして、アップデートを適用します。
適用したら一度VstoneMagicを再起動します。

再起動してプロジェクトを開くと、ブロックの中に「GPT対話」というカテゴリが追加され、その中に以下の3つのブロックが追加されます。

  • GPTを利用した対話の初期化処理
  • GPTを利用した対話の初期化処理(シンプル)
  • GPTを利用した対話

jarファイルの追加

GPT関連のブロックを使うには、「gptdialogue.jar」という外部jarファイルの追加が必要です。
こちらをダウンロードしてプロジェクトに組み込む手順は、先ほども紹介したSota取扱説明書の以下のページを参考に、プロジェクトにjarファイルを追加してください。
https://www.vstone.co.jp/sotamanual/index.php?VstoneMagic%2F%E5%91%BD%E4%BB%A4%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF#z4c31748

実際にプログラムを作成してみる

それでは、実際に対話するプログラムを作ってみます。

使い方は実にシンプルで、初期化を行うブロックを最初に配置し、あとは通常の音声ベースで行う対話のように、認識した文字列からGPTの対話ブロックでGPTからの返答を取得し、発話ブロックでその返答を発話させます。
これに沿ってブロックをくみ上げた状態は以下のようになります。

GPTの初期化は二種類のブロックがありますが、「シンプル」の方はプロンプト(対話の初期設定)がほぼSota向けにチューニングされているので、これを使うのが便利です。APIキーのみ設定を行ってください。

あとは、「音声認識して文字列で取得」→「GPTを利用した対話」→「発話」の三つのブロックをつなげます。このブロックを無限ループで囲めば対話を続けられます。

音声認識の結果の文字列は変数「speechRecogResult」に格納されるので、「GPTを利用した対話」ブロックの「text」にはそれを設定してください。

GPTの対話の結果は変数「gdpDialogueContent」に格納されるので、「発話」ブロックの「say_words」にはそれを設定してください。

プログラムができたら実行してみましょう。GPTからの応答に若干時間がかかる傾向がありますが、設定が正しければ問題なく対話できるようになります。

単純な受け答えの改善以外に、過去の対話を引き継いだ返答もできる点にご注目ください。

ただし、過去の対話はプログラムを終了する(またはGPTの初期化が再度行われる)とリセットされます。

プロンプトについて

GPTに与えるプロンプト(対話の前提などの情報をまとめた文字列)は、プログラム実行中のコンソール画面で確認できます。GPTの初期化(シンプル)のブロックを使っていると、その内容がSota向けにチューニングされた内容であることがよくわかります。

プロンプトの全文を抜粋すると以下の内容です。

あなたの名前はSota、年齢は5歳です。一人称は僕にしてください。8歳くらいの男の子がわかる内容で、8歳くらいの男の子が話す言葉で、返答は2文で、1文あたり15文字くらいにしてください。返答の最後は、次の質問をしてください

このブロックで設定できるのは自分の名前や一人称のみで、他の細かい前提条件は変更できません。そのような条件を指定したい場合はシンプルではない方のGPTの初期化ブロックを使います。

こちらのブロックでは、プロンプトを示す文章をそのまま「systemMess」に代入します。

先ほどのシンプル版のプロンプトを参考に、Sotaではなくくるみちゃん向けに以下のようなプロンプトを考えてみました。元々の見た目上キャラクター設定は似通った感じになりましたが、年齢や口調・地域情報や性格などを考えて盛り込むと、キャラクター性を持った応答ができそうです。

あなたの名前はくるみちゃんで、一人称は「私」です。子供位の知能で、ぬいぐるみのかわいい外見をしています。大阪に住んでいてこの地域が大好きです。返答は短めに30文字以内で返して下さい。

注意としては、返答を短めに指定している点です。一般的にGPTの対話はテキストベースで行われるので多少長い文章でも対話に支障をきたすことはありませんが、今回は音声対話のため、音声合成処理の時間や発話そのものの長さが関係するため、対話が間延びしてしまう可能性があるので、返答を短めにするように指定しています。

その他注意点

GPTを利用した対話を行うとトークンによる従量課金が発生します。テキストではなく音声ベースのプログラムの場合、雑音や時間によるタイムアウトによって、放置するとどんどんGPTが呼び出されてしまう可能性があるので、無駄にトークンを消耗しないように運用には十分ご注意ください。