kintone ChatGPTフィールド評価プラグイン

# こんな感じのプラグインができました
1. チェック対象のフィールドを選択して命令文に沿ってAIに処理してもらう。
2. 処理してもらった結果をセットするフィールドを設定でき、エラーの条件を命令しておけば、
フィールドのエラーとしてセットできる。

## 設定例
複数設定できます。
|対象フィールド|セットフィールド|命令文|
|---|---|---|
|郵便番号|郵便番号|入力された文字列が「xxx-xxxx」の形式であるかどうかを確認してください。ここで、「x」は半角数字で3桁または4桁の数値を表します。桁数が異なる場合はエラーになります。入力文字列に全角文字や漢数字が含まれている場合は、それらを半角数字に変換してください。例えば、全角数字を半角数字に変換してください。例えば、'１２３４'を'1234'に変換してください。変換後の入力文字列を返答として出力してください。|

## 実際の動作画面

上記の内容で郵便番号のバリデーションを実装した様子です。
漢数字も対応できました。
![ChatGPT x kintone.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/511519/a35cb841-1506-b1a4-c1b9-7281c2599bfb.gif)

## 設定画面
![ChatGPT x kintone setting.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/511519/ff1185b3-fbba-78b7-1440-61f25e257669.png)


# とりあえず使ってみたい方へ
まだまだ精度が出ていないので、個別で受け付けます。
[Twitter](https://twitter.com/okakou07151)までご連絡ください〜

# 機能
## 設定画面
### 命令文の評価
AIへの指示に慣れていない人は精度が高い命令文を一発で設定することは困難です。
評価をAIに行ってもらい、問題点、改善点と修正した命令文を提示してくれます。
これもまだ精度は低めですが、多少は期待できます。10秒くらいかかります。

![chatgpt評価.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/511519/57079881-b114-b192-d411-3d5d97cbe8c0.png)

### 1回の実行あたりのトークン数確認
プラグインはOpenAI APIを使用しています。これは従量課金制のAPIなので、使う分だけ料金が追加されます。
トークン数と呼ばれる単位で計算されていて、単語数みたいなものです。正確には文脈を解釈するために分割され、
その分割された最小単位を指すようですが、だいたい単語量みたいな感覚でいいと思います。

本プラグインは**gpt-3.5-turbo**を使用しています。
現在のレートでいくと、1000トークンあたり0.26円になります。

|Model|Usage|
|---|----|
|gpt-3.5-turbo|	$0.002 / 1K tokens|

ちなみに郵便番号のバリデーションの一回のリクエストは。。
0.13円ですね。これも毎度返答の量に変動があるので、毎回差があります。
![一回のリクエストトークン.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/511519/7f798296-b3d3-ada5-72a9-3a05b50a644c.png)

実際のサーバーからのレスポンス内のtotal_tokensから参照しています。
命令とその答えにかかった数という認識でOKです。
```js:responce
{
 'id': 'chatcmpl-6p9XYPYSTTRi0xEviKjjilqrWU2Ve',
 'object': 'chat.completion',
 'created': 1677649420,
 'model': 'gpt-3.5-turbo',
 'usage': {'prompt_tokens': 56, 'completion_tokens': 31, 'total_tokens': 87}, //ここ！
 'choices': [
   {
    'message': {
      'role': 'assistant',
      'content': 'The 2020 World Series was played in Arlington, Texas at the Globe Life Field, which was the new home stadium for the Texas Rangers.'},
    'finish_reason': 'stop',
    'index': 0
   }
  ]
}
```

## 動作画面
### 変更イベントでのレコード値set
kintoneのフィールド変更イベントでは同期処理ができないため、
非同期の関数でkintone.app.record.set()する必要があります。
（サーバー処理を待ってeventをreturnするなと怒られます。）
これにより、本プラグインをRPAの途中で使用するのはお勧めできません。

[参考:Qiita フィールド値変更イベントで気を付けること](https://qiita.com/t_numata/items/bc6f302fc2664b47385f)

### フィールドエラーを設定する
命令文にどんな場合にエラーを起こすか明記するとエラー内容とメッセージを返してくれます。
プログラム的には下記のようになります。
正常なレスポンスがエラー後に帰ってきた場合はもちろんエラー表示は消えます。
```js:error
    event.record["サンプル"].error = "〜〜が記載されていません";
```

# 機密管理
[データの利用について](https://openai.com/policies/api-data-usage-policies)
## ChatGPTによる翻訳
2023年3月1日より、OpenAIは2つのデータ利用と保持ポリシーに変更を加えます。APIを通じて顧客が提出したデータは、明示的に共有する場合を除き、OpenAIのモデルのトレーニングや改善には使用しません。データ共有にはオプトインが必要です。また、APIを通じて送信されたデータは最大30日間保持され、その後削除されます（法律上の要件がある場合を除く）。APIデータは、ユーザープロンプト、コンプリーション、Filesエンドポイントを通じて送信されたトレーニングデータを含みます。OpenAIは、顧客が提供したデータをモデルの改善に使用することはありませんが、オプトインすることでモデルパフォーマンスの改善に役立てることができます。APIデータは、認証されたOpenAI社員や、機密保持とセキュリティの義務を負う専門の第三者請負業者によって濫用や不正利用の監視の目的で30日間保持されます。ただし、Filesエンドポイントを通じて送信されたデータは、ユーザーがファイルを削除するまで保持されます。

## つまり
API経由のデータは30日間OpenAIのサーバーに保管され、その後削除されます。
法律観点上送らない方がいいフィールドは設定しない方がいいですね。
OpenAIの人は見ることができるみたいです。

# これから実装したい部分とkintone x AIの期待
## 機能：一覧画面での一括処理
精度がまちまちなので、もう少し精度を上げて試してみます。
これができると、問い合わせメールの要約や、内容のカテゴライズなどが自動化できるかと思います。
フォームブリッジで登録された問い合わせが溜まった一覧で実行するような感じですね。

## ChatGPTプラグインのkintoneプラグインは可能か。
企業の基幹システムを外部システムから自由にやりとりできてしまうのはどうかと考える人が多いというか、
普通に怖いのでChatGPT側のプラグインでは、
特定のワークフローをzapier経由で自動化したりとかそういう感じになるかと思いました。
「部下の日報まとめて報告書見せて〜」とか、「あのグラフの結果から何をよみとれる〜？」などでしょうか。

## 感想
まだまだ活用パターンがあるかと思います。
是非使っていただいてフィードバックが欲しいです。