運動不足のアナタ！“無料”の専属パーソナルトレーナーを紹介しますよ！(ChatGPT API× LINEBot)

# 運動の習慣化にチャレンジ！！
こんにちは！！はっちゃんです！！
こちらの記事の通り、小売企業の本社スタッフとして働いています。
本社勤務になったら太っちゃいましたっていう人多いですよねー
[私の自己紹介](https://note.com/yuuki_1009/n/n5e5e034ea013)
　　
そこで、デジタル初心者がの私が作成した、
LineBotのパーソナルトレーナーを紹介します！！　
その名も **“Muscle Boost”** 
筋トレ初心者が億劫になりがちなトレーニングを
「<font color="Red">**いかにして継続できるか**</font>」という点に注力して作成しました。
　　
ポイントは、
**・自宅でトレーニングできる“気軽さ”
・トレーニングしたい“時間に合わせたメニュー提案”
・毎日変わる“豊富なメニュー”でマンネリ化の防止**　です。
![243E023B-F9CB-428F-B6CF-DE74E377990A.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822788/6152038d-751f-6ed0-c32e-139f4610fc5f.jpeg)

# ChatGPT使ったBot作成に決定！！
## Muscle Boost　要件定義
私の求める機能要件は、
・**ユーザーの希望時間に合わせてメニュー提案をしてくれること**
・**ランダムでメニュー提案をしてくれること**　の２つです。
　　
その要件を満たせるのがChatGPTだと思い、
身近で使っているLINEと組み合わせればより便利になるのではないかと考えました。

## “優しい女性トレーナー”がいい！！
どうやらChatGPTには人格の設定までできるらしい・・・
　　
せっかく頑張るのだから、
トレーナーはゴリゴリ系の男性よりも女性の方がいいですよね！  
さらに褒めてくれれば、テンションアップ！！明日も頑張ろうとなります！！
　　
女性トレーナーがそばで優しく励ましてくれる、そんな夢のBot完成を目指しました！

# Muscle Boost　完成形
![a7ad486baf284abf510ecc293704df8a.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822788/704f8782-5b20-05a2-a2e7-1bde88d68149.gif)


# 開発環境
* Make
* LINE Messasing API
* ChatGPT API
* LINE Official Account Manager

# シナリオ
私が作成したシナリオはこちらです。
ユーザーの送信した言葉と同じ言葉を返してくれる「オウム返しのLineBot」を作成し、
その間にChatGPT APIのモジュールを連携させました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822788/f728e63c-5b3a-eb5c-2fc4-c7ea16b5bb99.png)

　　
そのChatGPTのモジュールに以下の内容でプロンプトを入力し、
“女性トレーナーが希望時間に合わせて、ランダムでメニュー提案”できるようにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822788/9ac1ff8c-8387-586e-d31f-d862d302f477.png)



# 作成手順
## Ⅰ．ChatGPTの設定
ChatGPT APIを使用する為には、事前にAPIキーを取得し、
有料アカウントに登録する必要があります。
[設定手順はこちら参照してください](https://excelcamp.jp/ai-bot/media/howto/23133/)

:::note alert
有料アカウントに登録しないと、MakeでChatGPTのモジュールが使えません。
:::


## Ⅱ．ChatGPTとLINEBotの連携
本題の連携を行なっていきます。

`LINE Watch Events`の設定
LINE公式アカウントのメッセージの受け手を設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822788/30118436-63c1-af11-d3f7-f6b097d58004.png)


`OpenAI(ChatGPT、Whisper、DALL-E)`の設定
次にChatGPTを使用するための設定になります。
まずはConnectionの設定をします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822788/a55aefcf-9fba-e0bd-c162-aeb12ed6cde6.png)


次に下記の設定を行います。
・**Select Method**
　`Create a Chat Completion(GPT Models)`を選択してください。
・**Model**
　`gpt-3.5-turbo`を選択してください。
![81da9f902e4f87aeaf1b74986b2f3d0b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822788/6cd15521-2935-c0e1-0d18-32afc9e2d748.png)

最後にプロンプトの設定を行います。
・**Messages▸Message1▸Role**
　`System`を選択してください。
・**Message Content**
　プロンプトを入力します。(以下、プロンプト入力イメージ)
![80ead3862bf7850c66290e0b1fac6a07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822788/4946a2c6-ea40-3eb3-6f5a-a311b8277cfe.png)

・**Messages▸Message2▸Role**
　`User`を選択してください。
・**Message Content**
　`1.Events[`　`]：Message.Text`を選択してください。
・**Max Token**
　`0`を入力してください。
![d6291ebc82d0843a36d39162f65bb8d5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822788/0d01288d-d6a4-fbbe-21ad-9fe38bd98b60.png)

`LINE Send a Reply Message`の設定
最後に公式アカウントが返す値を設定します。

・まずは`Add`で`Watch Events`同様の設定を行います。
・**Reply Token**
　`1. Events[`　`]: Reply Token`を設定してください。
・**Message**
　◦Type
　 `Text`を選択してください。
　◦Text
　`3. Choices[` `]: Text`を設定してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822788/651ee0fd-7fb1-9b25-f6d7-4705eede8d9c.png)
以上で設定は完了です。

:::note info
このままの設定だとLINEBot上でユーザーが言葉を選ばず送信できてしまう為、
意図した返答が来ない場合があります。
`Set up a filter`を追加し、
指定したの文字列のみ受け入れることができる設定にします。
(指定した文字列以外を送信すると返答は来ない)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822788/aa9aa7b7-53f0-9e26-1c43-85f574784239.png)
:::

# リッチメニューの作成
デザインに詳しくない方でも、
LINE公式アカウントの機能を利用すれば、リッチメニューを簡単に作成する事ができます。

まず、[LINE Official Account Managerの管理画面にログイン](https://manager.line.biz/account/@384jhihc)し、
「ホーム」> 「メッセージアイテム」 > 「リッチメッセージ」 >「作成」
をクリックします。

その後はテンプレートが用意されているので、画像や文字などを自由に挿入するだけです。

:::note info
LINE公式アカウントの機能でリッチメニューを作成すると、
テンプレートの枠数やサイズが固定されて変更はできません。
:::
![23C92225-9A44-4C41-A573-3C89324D7EB0.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822788/1da8835e-6914-a304-90e2-bbcca5292232.jpeg)



# 記事の作成を終えて
要件定義に沿ったシナリオは完成させることができました。
プロンプトの内容によって、意図していた返答内容と異なる場合が発生し、
その修正作業に最も苦慮しました。

できなかったこと2点
・フィルターに設定した以外の文字列がユーザーから送信された時、
　Botから何かしらの返答をさせること(現状は返答なし)
・Data Stores, Data structuresを活用して会話ログを残すこと
先生方や先輩方に質問をして、この2点は解決していきます。

ハードなスケジュールの中で過酷を極めましたが、
新しいことにチャレンジできたことに対する達成感は凄まじいです！
初めてのQitta記事作成を通じ、記事作成のコツも理解できました。
この反省を生かし、さらにブラッシュアップをしていきたいです！