Chat GPT と LINE WORKS で、にゃっとGPT つくってみた

Chat GPT の API が来たので LINE WORKS をつないでみました。

LINE WORKS の API 2.0 のトーク Bot API を使ってます。
OpneAI の gpt-3.5-turbo 言語モデルを使ってます。
Microsoft PowerAutomate を使ってます。

AI のふるまいを指示できるので、ネコ型アシスタントの人格を与え、にゃっとGPT にしてみてます。

以前のやり取りを保持して、関連した返答ができるようにもしています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/4780a37d-5775-c649-cc75-02d4a64d622e.png)

## LINE WORKS API 2.0

以下の LINE WORKS API を使っています。

メッセージ(Callback) 受信
https://developers.worksmobile.com/jp/reference/bot-callback?lang=ja

メッセージの送信 - ユーザー指定
https://developers.worksmobile.com/jp/reference/bot-user-message-send?lang=ja

Text
https://developers.worksmobile.com/jp/reference/bot-send-text?lang=ja

LINE WORKS の Developer Console での API 2.0 の設定や、Bot の設定については LINE WORKS Developers サイトの記載や、Qiita 内の LINEWORKSタグの記事が参考になります。

https://qiita.com/tags/lineworks

## Power Automate のクラウドフロー

Microsoft Power Automate でクラウド フローを作成します。
#### LINE WORKS の Bot でユーザーからのトークを受信

[HTTP 要求の受信時] をトリガーにします。

![l_147288799_4_6e84b4bf4e19593d724e841ac02b3791.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/37d3219e-1bdb-512d-1c21-5ecdb971d4cb.png)

"JSON スキーマ" は以下です。

```
{
    "type": "object",
    "properties": {
        "$content-type": {
            "type": "string"
        },
        "$content": {
            "type": "string"
        },
        "$formdata": {
            "type": "array",
            "items": {
                "type": "object",
                "properties": {
                    "key": {
                        "type": "string"
                    },
                    "value": {
                        "type": "string"
                    }
                },
                "required": [
                    "key",
                    "value"
                ]
            }
        }
    }
}
```
Chat completion では、以前のやり取りを踏まえた応答が可能になっています。やり取りを Excel Online のシートに一時的に保存して参照します。

![l_147288799_46_575fbe71b33221827322e457c133c4bc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/ada29d42-9d85-4687-d6d3-4b903a44ae62.png)

userId をキーに、ユーザーと Bot の発言をそれぞれ記録しています。

利用が初回のユーザーの行はシートに存在しないため、行の取得に失敗します。失敗した際の分岐で表に行を追加しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/3c45de17-5259-c582-4e10-4b83f82732e4.png)



#### OpenAI の API にリクエスト送信
[HTTP] コネクタで OpenAI にリクエストを送信します。
![l_147288799_47_199f31cdd4357e9aa177315202be0453.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/21c960c4-da80-2c5c-edd8-efc11e39a97c.png)

OpenAI のコンソールで取得した token の情報を含めます。

body は以下のようにしました。
![l_147288799_48_a83624ade9551e07860143131d975764.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/aed4429d-fa83-9c5b-2804-3bc121fadbe4.png)

AI のふるまい、以前の user と assistant の発言、今回のユーザーの発言を送信しています。

#### OpenAI からのレスポンスを解析
[JSON の解析コネクタ] でレスポンスを解析して返信を取り出します。
![l_1517737_2262_f3d7980b89235cbe4d4c79b1d6b3ff61.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/b37e7bd2-ee8d-717c-287d-4a90ed76fb7c.png)
"スキーマ" は以下です。
```
{
    "type": "object",
    "properties": {
        "id": {
            "type": "string"
        },
        "object": {
            "type": "string"
        },
        "created": {
            "type": "integer"
        },
        "choices": {
            "type": "array",
            "items": {
                "type": "object",
                "properties": {
                    "index": {
                        "type": "integer"
                    },
                    "message": {
                        "type": "object",
                        "properties": {
                            "role": {
                                "type": "string"
                            },
                            "content": {
                                "type": "string"
                            }
                        }
                    },
                    "finish_reason": {
                        "type": [
                            "string",
                            "null"
                        ]
                    }
                },
                "required": [
                    "index",
                    "message",
                    "finish_reason"
                ]
            }
        },
        "usage": {
            "type": "object",
            "properties": {
                "prompt_tokens": {
                    "type": "integer"
                },
                "completion_tokens": {
                    "type": "integer"
                },
                "total_tokens": {
                    "type": "integer"
                }
            }
        }
    }
}
```

### Bot からメッセージを返信
以下の記事のカスタム コネクタを用いて Bot からメッセージを返信しています。
https://qiita.com/iwaohig/items/4c47a2a1aabe2cb864a8

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/a417d151-c6d3-db62-131c-e97a6832d62c.png)

### ユーザーと Bot のメッセージで Excel の行を更新
次のやり取りの際に、今回のやり取りを参照するために Excel で保持します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/7c73b85a-2d1a-0884-4e89-67771558ab38.png)


フローは以上です。

## 動作確認
LINE WORKS からメッセージを送ると、AI から返信されます。