LEDへのRGB 値をJSON データで返答するChatGPT APIの仕組みをブラッシュアップ

田中正吾氏:では、さらにブラッシュアップしたものがこちらです。こちらも文献があります。はい、さらにブラッシュアップしました。前回ちょっとうまくいかなかった分、もっといけないかというところで、このようなかたちにしました。じゃかじゃん!

かなり厳密に決めています。しかもちょっとMarkdownで、もうこれは指示書ですね。はい、このルールがベースにあります。result、trueとか、type、ledとか、r、g、bにメッセージ説明。

このようなかたちで色が認識されます。「trueで返して」とか「RGB値はこういうふうに入れてください。赤だとこのように返します。うまくいかなかった時、わからなかった時はfalseで返してね。認識されなかった時は説明をメッセージに入れてね。このルールにおいてさらに例外があったら例外と言ってね」とすると、ちょっと確率が上がるんです。「JSONデータで返して」とお願いすると、けっこうしっかりします。まぁもはや指示書ですね。

色の質問デモver.2のポイント

実際にデモをしてみますね。ちょっとver.1、2がブレちゃいましたが、実際にこれに1と書いてあるのが2です。ガッツリこういうふうに入れて、指定を決めて、最後にやった文言もなんですか? と聞きます。

ではいきます。これはほぼ完璧に返します。こういうふうに「赤です」というメッセージ。きちんと赤で、しかもメッセージに赤の説明が返って来る。藤色もきちんと返してくれる。がんばれ。ほらちゃんとね、藤色はこの色ですと返してくれます。

「ほげほげ」というかたちで返します。認識されない例外です。ああ、わかっている。どどめ色。はい、こちらも認識されないと返してくれます。すばらしい。

これはどういうところがよかったか。実際はけっこうがんばりました。どういうことかというと、ここに書いてあるのですが。説明を加えがちなのを逆手に取ったんですね。「正解時に説明するならmessage値に入れて」とお願いしました。

そうしたら、正解型はメッセージの前にいろいろうんちくを入れてくれて誘導できました。不正解型……なかった場合も言い訳をするんですよ。僕がしなくていいんだよって言っても(言い訳を)するので、かわいいなって思います。わかったわかった、じゃあmessage値に入れてねと言ったら、なぜ出なかったか、その理由をきちんと返してくれました。これもメチャクチャ効きました。ということで、発注の例外型がけっこう重要というところが見えてきました。

ver.2、色の質問の問題のもう1つです。ルール、返答するJSONデータ、返答前にチェック! などの見出しでお願いするとわかりやすくなって、より通じます。例外処理は明確にお願いすることで、説明文に加えないように誘導できます。

説明を入れる、値を入れると、お願いがだいたいそこに誘導されるという、非常に人間的なことをします。質問をチューニングすると、きちんとJSONで回答してくれる仕組みができるということを言っています。

回答精度をアップさせて、しっかりJSON回答ができるように、このようにブラッシュアップすることができました。他のシステムになじませる、調整をしたというところです。

ChatGPT自体は、回答できるジャンルも万能で、ルールを決めて回答しやすくするというところに特化させました。JSONデータに加工して返答してもらい、他のシステムにつながりやすくする。もはや人間同士の対話、あるいは発注のような感じになります。

人間の言葉を理解して、回答のジャンルは万能で、人間の言葉で回答する。(スライドを示して)それをこういうふうになじませました。人間の言葉を理解するところを活かして、ルールを決めて回答しやすく特化、JSONデータを加工して回答というふうに、ブラッシュアップをしてうまくなじませました。

ChatGPTでもIoT LEDをチカチカさせてみたい!

でもやはりIoTですからね。ChatGPTもまたLチカしないとね! というところ。LEDチカチカ、略してLチカなんですが、やってみようということでやらせていただきたいなと思っています。

obnizでこのJSONデータを受け取ったらこの色に変えるという、RGBを受け取ったら変えるという仕組みをすでに作っています。ChatGPT経由で、点灯命令を色付きでしてみます。ということで、先ほどの仕組みの後半にobnizの点灯の仕組みを加えました。

それではやってみたいと思います。ちょっと手元で動作チェックをしつつ、やっていきます。

実際にON/OFFできちんと動きますね。こんなかたちで、obnizデバイスがあります。ちょっと白く飛んじゃっている部分もありますが、こちらを軸にやっていこうかなと思っています。

こんなかたちでステップアップというところでいきます。色の質問、IoTをやっていきます。では、赤を押します。じゃかじゃん! あ、きた。よし。はい、赤く光りました。じゃあちょっと藤色をいってみます。じゃかじゃん! ちょっと白く飛ぶんですけどね、でも今は白く飛んだりして余韻がちょっと青になっているのがわかりますか? 藤色でも濃い色が出ましたね。藤色でも濃い色ってなんだって感じ。

もう1回押してみます。うまくいくかな。けっこう似たような色を出しましたね。今回は大丈夫です。もうちょっと白くなる場合もあります。「ほげほげ」とやった場合は、当然nocolorなので変わりません。

じゃあちょっと黄色をひらがなでやってみましょう。これでもいけるかというと、いけます。黄色です。こう真っ黄色。漢字でやってもいけます。こんなかたちで光るよーというところですね。

実際にもう1回赤やってみよっかな。赤で押すと赤く光りました。ちゃんと色が来ます。色が設定できるという仕組みまでIoTがつながって、ChatGPTでLチカできましたというところまでいけました。これは、JSONで変えていることでうまく橋渡しできているところが大きいですね。

仕組みを変えて、さらにステップアップ

では今からスライドを元に戻します。ちょっとスライドで発展させた例をお見せしたいなというところで、あと10分ぐらい。バッチリですね。

さらにステップアップしたものというところで、これの仕組みをちょっと変えたものです。「3回点滅して」とか「OFFにして/ONにして」という言葉に対して反応する仕組みを作りました。

こんな機能ですね。"type":"on"ってJSONが飛ぶのはLEDが点く命令なんですけど、セリフは「オンにして」と言えば大丈夫です。あと"type":"off"は、LEDが消える。「オフにして」。一番難しいのでうまくいくかちょっと怪しい部分もありますが、たぶんうまくいきます。

もちろんこういうふうに定義しているのですが、「3回点滅して」と言うと、"type":"blink"でintervalは1秒ですね。今はこれが固定値です。countは3が3回点滅といって、これは例文の段階では「5回点滅して」という例ですが、「何回点滅して、と来たら柔軟にやってください」ということを書いています。

ということで、簡単に中身を説明しながらやっていこうかなと思っています。先ほどと同じような仕組みで、「3回点滅して」などの命令が来るようになっています。ONとかOFFとか、こんなかたちです。これがちょっとミソです。

このように中に言葉が入っています。実際に中を見てみましょうね。(スライドを示して)ここがすみません、ちょっと行無しで書いちゃっているので保存せずに改行しておこうかな。こんなかたちになっています。

これぐらいシンプルですね。これはシンプルにできたんです。JSONデータでください、ルールは4点です。ONの時、あるいはONにする時は"type":"on"。OFFの時、あるいはOFFにする時は"type":"off"。1秒間隔で5回点滅してほしい時は、blink、"interval":"5"で表現します。だからこういう命令なんですね。実は、あえていじわるをして例文を出しませんでした。それ以外のルールはelseとやっています。

じゃあ先ほどの問題形式ですね。このルールでどうなりますか? と聞いて、しつこいぐらいにJSONの願いということにします。これは、けっこう奇跡的に短く済んだものですが、このようにうまくいきました。ということで、このようなものが入って、ちょっと中の内容を変えて1回リロードします。お待ちください。はい、内容は大丈夫です。

デモ

ではやっていきましょう。いったんOFFにしますね。最初に「ONにして」を押します。じゃかじゃん! 点きました、きちんと点いています。では次、「OFFにしてほしい」。じゃかじゃん! はい、今ちょうどOFFになりました。うまくいきました。

「おはよう」と打つと、elseになったのでなんにも起きません。これは無視するようにobnizで組んでいます。では最後ですね、「3回点滅して」というところで押していきましょう。うまくいってほしい。

このように、obniz側でうまくループが追いついちゃうと、2回点滅しているように見える可能性はありますが、とりあえずやっていきます。エイヤッ、すぐに見せたい。はい、切るよ。1、2、3、おおー、ちゃんと点いた。イェーイということで、きちんとJSONで送られているせいなのですが、このようなかたちでうまく動くことができました。このような命令も作れます。よかった、動いて。うれしいですね。だいたい37分が経ちましたので、あと7分ぐらいしゃべれるということで、ちょうどいい感じです。

じゃかじゃん! ということで、ChatGPT APIをうまく組み込めました。ルールを決めて、JSONデータに加工して回答というブラッシュアップをしたものにIoT制御をうまく加えました。これはやはり、JSONにするというところが肝かなと思っています。なので、これがわかるChatGPTが偉いというところもあります。

入り口に音声認識を加えてみた

では、さらなるステップアップで、ここはそのままデモはちょっと難しいので動画やサンプルをお見せします。入り口に音声認識を加えると、より可能性が広がりました。なんらかの音声認識をこのような仕組みに通すと、実際にIoTに対して音声命令がしやすくなります。

今回何をしたかというと、Hololens2の音声認識がメチャメチャ正確なので、この言葉を抽出した後に先ほどの仕組みに流し込んで、ChatGPT経由のobnizへの自然な呼びかけで指示しています。

ちょっと動画をお見せします。このスタートボタンを押すと録音が始まって、実際に文字が決定して送られて、先ほどの仕組みから返ってくると目の前のobnizのLEDが動く。これはONにしている指示です。今日はこれを動画でお見せします。

これは音声がないので僕が補足していきます。こんなかたちでポチリと。「ONにしてくれますか」と言うと、ONにしてくれます。これぐらいの揺れはぜんぜん平気です。すごいですね。

では、もう少しきちんといろいろ動かしていきますね。発言待ちです。これは「ONにして」と言いました。認識しました。飛びました。動きました。早い。そして「OFFにして」。言いましたね、はい。これはカタカナになっているのに、きちんと解釈します。

最後に、「3回点滅して」。これは漢字なんですよ。先ほどの質問は英数字で言っていましたよね。これを理解するんです。この揺れはぜんぜん大丈夫。すごいです。

またスライドに戻ります。すごいですね。というところで、(スライドを示して)こちらから動画が見られます。ちょうど2023年3月13日に成功して、今回の登壇のきっかけにもなったのですが、このように動くものもできます。

(次回へつづく)