kintone用ChatGPTプラグインでプログラマは路頭に迷えるか

こんにちは、[キン担ラボ](https://www.monosus.co.jp/service/kintanlab/)の本橋です。

https://www.monosus.co.jp/service/kintanlab/

ChatGPTをkintoneとつなげたらなにか面白いことできるんじゃないかなー、と思ってkintoneからChatGPTのAPI呼び出しをプラグイン化しました。

この週末に使い道を実験していたのでその成果を共有します。

# 実験してみた

## 西暦・和暦変換

さて、ChatGPTですが御存知の通りプロンプトを入力してあげればいろんな処理を実行してくれます。

まずはkintoneカスタマイズで頻出処理であるところの和暦変換です。

kintoneの日時フィールドから文字列化した「1979年8月2日 18時30分」というテキストを、「昭和54年8月2日」という文字列を出力します。

> **プロンプト**
> このあとに続く「YYYY年M月d日 H時m分」形式の日時表現から、西暦を和暦に変更して日付とともに出力してください。時刻は不要です。和暦は明治、大正、昭和、平成、令和のいずれかです。「令和WW年 M月d日」と出力してください。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13915/143eae49-58c6-2877-451b-fbc71edfbdb3.png)


先日『日時表現から日付だけを抽出したい』というご依頼を頂いてプラグイン化したことがありました。

ChatGPTを経由すればJavaScriptで処理を書かなくとも「こんな処理をお願いします！」と自然言語でプロンプトすれば叶えてくれるわけです。

あれ、もしかして僕の仕事が一つ消滅した？


## メールのスパム判定

届いたメールがスパムかそうではないかも判定してくれます。

> **プロンプト**
> 以下のメールが届きました。このメールがスパムであるか判定して、10をスパムとして10段階評価で判定した点数を1行目に「スパム度: xx点」と出力してください。その次に空行を一行挟んで、なぜそのように判定したかを説明してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13915/8bc6aade-03bd-42ab-ca4e-63f6563b6784.png)

スパム度を10点満点で判定して、なぜそのスコアになったかの説明をしてくれるプロンプトです。

Webフォームとkintoneを連携して使っている方も多いかと思いますが、これでメールの中身を読まなくてもお問い合わせの事前処理が可能になりました。単純に、お問い合わせの要約エンジンとしてChatGPTを使うのもありですね。まさにアルバイトを雇う感覚で扱えます。要約ができるなら、適切な担当者にフォワードすることもきっと朝飯前です。

Webフォームからの問い合わせをキーワードマッチで適切な担当者に振り分けるプラグインを作成したことがありましたが、今後はChatGPTにお願いすれば事足りますね。

おや……僕の仕事が……また一つ消えた……?!


## スパムフィルターAPI

ChatGPTはレスポンスをjsonで返すこともできます。やりかたはjsonで返してくれとプロンプトするだけ。

> **プロンプト**
> 以下のメールが届きました。このメールがスパムであるか判定して、10をスパムとして10段階評価で判定した点数と、なぜそのように判定したかを説明して、
> 
```
{
   "chatgptkintone": {
     "spam-score": N,
     "description": "スコアについての説明"
   }
}
```
> 
> というjsonを出力してください。
> 


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13915/a92784fe-c099-caf0-251e-31acded4f08d.png)

見事にjsonで返してくれました。

ChatGPTからのレスポンスがjsonであれば、それをjavascript側で受け取ってkintone上の適切なフィールドに振り分ける、みたいな処理につなげることもできそうです。

首の皮一枚繋がった……？


# githubでプラグインを公開しました

ここまでの実験で使ったkintoneプラグインはgithubで公開しています。すぐにお試しいただけるzipファイルもあるので、良かったら試してみてください。

https://github.com/motohasystem/KintoneChatGPTPlugin

ご利用の際はChatGPT APIの管理画面から使い捨て用のAPIキーを作ってプラグインに登録して、試し終えたらすぐにAPIキー自体を削除することをおすすめします。

このプラグイン自体は僕が作ったとは言え、素性の知れないプラグインにAPIキーを登録する場合はご注意ください。

# （追記）実験結果を順次追加

## 姓名分割と性別の推測

一つのフィールドに姓名をまとめて記入している場合に分割したい、という要望もよくあります。ChatGPTにお願いしてみました。

> **プロンプト**
> この後に続く名前の姓名を分割して、男性か女性か推測してください。推測結果は、「姓／名（性別）」の形で一行ごとに出力してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13915/f5b86789-63a7-b4a3-9643-e7b910066766.png)

きっちり分割してくれています。分かりにくそうな名前にも成功してますね。


## フィールドを直接書き換える

この実験は公開しているプラグインに手を加えて、kintone APIとダイレクトにお話するロジックに書き換えて行いました。

> **プロンプト**
> - "個別プロンプト"のvalueは書き換えないでください。
> - "入力テキスト"のvalueを"プロンプトで書き替えた値"としてください。
> - もし"value"を持たないキーがあれば値として"（空欄）"を設定してください。。
> 
> という処理を加えつつ、この後に続くjsonを整形して書き出してください。

<iframe width="560" height="315" src="https://youtube.com/shorts/lxmpFVYWz4s?feature=share" title="フィールドを直接書き換える" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

https://youtube.com/shorts/lxmpFVYWz4s?feature=share

できるかな？　と試してみたところレコードを直接書き換えることに成功しました。レコードのjsonをそのまま全部プロンプトとして渡しているため変換に時間がかかりました。動画は待ち時間を10秒ほどスキップしています。

内部的には kintone.app.record.get() で取得したjsonをChatGPTに渡して上記のプロンプトで変換させて、 戻ってきたjsonをそのままkintone.app.record.set() に渡しています。

全部渡すのは負荷が大きそうなのでここまでやらないでも良いと思いますが、jsonをプロンプトで編集できる、という結果は夢が広がります。


# kintoneに話しかけて入力する

> **プロンプト**
> 氏名をR田中一郎に、
> 居住地を埼玉県に、
> 生年月日を1999-01-23にしてください。

https://youtube.com/shorts/caXhfierqLY?feature=share

入力としては、フィールド名とそこに入る値を話しかける形でデータ入力ができるようになりました。これなら音声入力からkintoneに入力することもできますね。

プラグイン設定側にはこんな固定プロンプトを登録しています。

> **固定プロンプト**
> - "プロンプト"のvalueは書き換えないでください。
> - 「あかさたなフィールドをあいうえおにしてください」というプロンプトは、「この後に続く> jsonのあかさたなフィールドのvalueをあいうえおに書き換えてください」という意味です。
> - 「あかさたなフィールドをあいうえおに」というプロンプトも、「この後に続くjsonのあかさたなフィールドのvalueをあいうえおに書き換えてください」という意味です。
> - フィールドのvalueが空文字列のとき、そのフィールドを削除してください。
> 
> という処理を行います。出力としてjsonだけを返してください。このあとに空行をはさんで対象のプロンプト。そこからもう一度空行をはさんで編集対象のjsonが続きます。