ChatGPTでサンドウィッチマンのゼロカロリー理論をLINEで作ってみた

サンドウィッチマンの伊達さんが提唱する`ゼロカロリー理論`をChatGPTにもうまく提唱すれば答えられるのでは？と思い作ってみました。

## 1. ルールを決める
今回はLINEでサクッと返してほしいので、LINEで定義されている[FlexMessage](https://developers.line.biz/ja/docs/messaging-api/using-flex-messages/)を使って返答してもらいます。そのため、ChatGPTから返してもらう形式はJson形式で依頼します。

今回お願いしたルールは以下の通りです。

Jsonオブジェクト形式で返してもらうことを念押ししています。画像はUnsplash APIを使ってもらっています。`<返答>`部分に返してもらうことも明記しました。ただ、稀にうまく返ってこないこともありますが^^;

```text:ルール
これから私が食べ物を答えますので、ルールに従って理由を返してください。Jsonオブジェクトで出力をしてください。
余計な言葉は必要ありません。評論家らしく、なぜカロリーゼロなのか<返答>部分に置換してください。

- カロリーは中心に集まる性質がある。そのため、中心が空洞だとカロリーは無くなる。
- カロリー同士がぶつかり合うと、けんかして無くなる。
- 熱に弱く、110℃以上だと耐えられない。
- 凍ると無くなる。白いものは白紙に戻って無くなる。
- 烏龍茶を飲むと一切無くなる。
- 辛い食べ物はカロリーが無い。
- パン粉に包んで油で揚げると、カロリーが油へ逃げる。
- 昔からあるロングセラーのお菓子は太らない。
- 糖分を含んだ甘いものはすぐエネルギーに変わるので太らない。
- 甘いものとしょっぱいものを交互に食べればカロリーが無い。
- 新幹線などに持ち込んだ食材には速すぎてカロリーがついてこられず、カロリーがなくなる。
- 画像URLはUnsplash APIを使用してください（https://source.unsplash.com/960x640/?<英語キーワード>)

'''
{
  type: 'flex',
  altText: <キーワード>,
  contents: {
    "type": "bubble",
    "hero": {
      "type": "image",
      "url": https://source.unsplash.com/960x640/?<英語キーワード>,
      "size": "full",
      "aspectRatio": "20:13",
      "aspectMode": "cover"
    },
    "body": {
      "type": "box",
      "layout": "vertical",
      "contents": [
        {
          "type": "text",
          "text": カロリーゼロ！<返答>,
          "size": "xs",
          "wrap": true
        }
      ]
    }
  }
}
```

## 2. 実装
私が作成したNode-REDのフローを使って実装していきます。今回も[enebular]()をサクッと使っていきます。
詳細は下記ページをご確認ください。

https://qiita.com/h-takauma/items/963959e8bcc4e813303f

### 2-1. パレット追加
パレットの追加からLINEに関する[ノード](https://flows.nodered.org/node/node-red-contrib-line-messaging-api)を追加します。ノードを追加①タブから`node-red-contrib-line-messaging-api`を検索窓②から探してノードを追加③を行います。

![s100.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154355/04093abb-817f-08b6-1339-895076287f54.png)

同様に[node-red-contrib-simple-chatgpt](https://flows.nodered.org/node/node-red-contrib-simple-chatgpt)ノードを追加します。

![chatgpt](https://camo.qiitausercontent.com/e6fa4c4e6934f85ad6818c8d7e0f7804716a6e07/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3135343335352f30633237366239632d376339342d303130342d356365662d3331616330373730663461362e706e67)

### 2-2. Webhook設定
LINEからコールしてもらうWebhookの口を用意します。`Webhook`ノードをドラッグアンドドロップします。設定は下記の通りです。

|項目|値|
|:--|:--|
|Path|/bot<br>※スラッシュも含めてください|

![s101.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154355/2a51ccae-2f28-2fda-23b8-009280a56436.png)

### 2-3. ChatGPT設定
simple-chatgptノードをドラッグアンドドロップして、`Token`と`SystemSetting`を埋めていきます。

|項目|値|
|:--|:--|
|Token②|ChatGPTのトークン|
|SystemSetting③|1で定義したルール文字列|

![s102.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154355/345a9744-6fe3-6e9e-df99-6d0409c28b41.png)

### 2-4. Jsonオブジェクト化
ChatGPTからは、FlexMessageの文字列形式で返ってくるのでLINEで使えるJsonオブジェクト形式に変換します。`Json`ノードをドラッグアンドドロップして、変換を行います。

|項目|値|
|:--|:--|
|動作②|常にJavaScriptオブジェクトに変換|

![s103.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154355/09a670f0-e6ef-4977-bfc2-c1a9cddd57e5.png)

### 2-5. Reply対応
LINEに返信してもらう設定を行います。LINE Developerからチャネルシークレットキーとアクセストークンを取得してノードに反映します。

|項目|値|
|:--|:--|
|Secret②|LINE Developerチャネルに明記されているシークレットキー|
|AccessToken③|LINE Developerチャネルに明記されているアクセストークン|

![s104.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154355/5bd0c83d-1de7-d069-fbcb-b6fa6a6dab06.png)

### 2-6. デプロイ
全てのノードを繋いでいることを確認したら、右上の`保存`ボタンをクリックします。

![s105.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154355/2692e6b8-4bfc-b810-05a5-9c93e79e7928.png)

「i」マーク①にマウスカーソルを合わせると、デプロイURL②が表示されるので、メモしておきます。

![s106.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154355/0beb3318-08fa-d26c-b9e8-b421d333d908.png)

LINE DeveloperのMessaging APIのWebhook URLの設定画面で、コピーしたデプロイURLの末尾に2-2で設定したPathを付与します。

![s107.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154355/7f974601-1faf-1ef2-54cf-e29dede2bc85.png)

これでLINE公式アカウントと友だちになってから、好きな食べ物を入力するとChatGPTがルールに従ったゼロカロリー理論を返答してくれます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154355/61244fcb-7c9a-8a9a-bb48-da795261f266.png" width=300px>

## まとめ
ルールを厳格に決めることでこちらが意図した通りの動きをしてくれました。結構複雑なルールでもよしなに対応してくれたので驚きました。ChatGPT側からしたら、一体何をしているのか意味不明かもしれませんがｗ
ルール次第でルーチンワークなども減らせるような気もしますね。

システム化のご検討やご相談は弊社までお問い合わせください。

https://www.i-enter.co.jp