【ChatGPT x LINEBot】PythonでChatGPTのLINEBotを作ってみた

# 目次
１.はじめに
２.実行環境
３.OpenAPI作成
４.Line Developer登録
５.Git hub登録
６.Git bash登録
７.Render登録
８.スクリプト&関連ファイルの準備
９.Line Developer設定変更・トーク画面起動
10.最後に

# １.はじめに
私がこのLINEBotを作成しようと思ったきっかけは、カスタマーサービス等で使用していることが多いLINEBotですが、決まった質問・返答がメインのためもっと自由に質問できればより疑問が解決されると思ったからです。
ChatGPTを使用することで、データセットなしで自然な会話が可能なLINEBotが作れるのでは？と考え作成してみることにしました。

目標として、自然な会話ができるChatGPTを使用し、事前のデータセットをすることなくLINEBotを作成したいと思います。
また、最近ChatGPTの返答内容が不正確という話もニュースで話題になっています。
返答内容についてどの程度正解しているのかも気になるので今回検証できたらと思います。

今回PythonでChatGPTのLINEBotを作成するため大まかに、各サイトへの登録～公開されているファイルの用意～Lineへの実装という流れで構築します。

そもそもOpenAPI、Line Developer、Git hub、Git bash、Renderとは何なのか、どんな目的のために登録が必要なのかを説明します。

##### 【OpenAPI　オープンエーピーアイ】
APIとは、アプリケーション・プログラミング・インターフェースの略で、機能や管理するデータを他のアプリケーションから呼び出して利用する為の接続仕様・仕組みです。それを公開することをオープンAPIといいます。
テキスト生成などの要求を送信することができるため登録、API KEYの取得が必要です。

##### 【Line Developer　ラインディベロッパー】
Line Developerとは、LINEのサービスと連携できるプロダクトを開発できるサイトです。
今回はLINEBotを作成するのでChatGPTと連携させるために使用します。

##### 【Git hub　ギットハブ】
Git hubとは、ソースプログラムなどのバージョン管理ができるWebサービスです。
 例えば、Git hubに各プログラマーがソースプログラムをアップすると、他のプログラマーにソースプログラムを共有したり、履歴を残しながら作業したり、変更を加えたりできます。
今回は、Git hubに公開されているPythonのデータを使用します。

##### 【Git bash　ギットバッシュ】
Git bashとは、命令を画面に打ち込みコンピュータが命令に従いファイルの操作やファイルの編集、削除といった操作ができるソフトウェアです。
Git bashを使用することで簡単なコマンドを入力するだけでGit hubにデータをアップロードすることができます。

##### 【Render　レンダー】
Renderとは、アプリケーションの実行ができるクラウドサービスです。
Git hubとの連携も簡単なため、Git hubにアップロードされているデータをRender上で実行することができます。

以上がこれから使用するサイトの説明になります。
現段階で一つ一つのサイトについてよく分からなくても、このLINEBotを作成することで各サイトの必要性が理解できるようになると思います。

# ２.実行環境
・Windows
・Python3
・Visual Studio Code

# ３.OpenAPI作成
https://auth0.openai.com/u/login/identifier?state=hKFo2SBnUWY5c3dhUXhYQWQ1OFlTMzFJZldsODdWM2U4TThzR6Fur3VuaXZlcnNhbC1sb2dpbqN0aWTZIGQ1MEZ4WUVqYlh5b3JWeHB6TTZIcl9WcmxPeUZubUkzo2NpZNkgRFJpdnNubTJNdTQyVDNLT3BxZHR3QjNOWXZpSFl6d0Q

Pythonで動かすためにAPIKeyを取得します。

![api1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3355091/41c9d52e-ce7c-cbb3-4037-a0c5d00d1437.jpeg)


登録後、①Personal、②View API Keys、③Create new seacret keysの順にクリック。
「NAME」は自分で名前を付け、保存すると「KEY」が自動生成されます。
<font color="Red">※KEYは他人に分からないように注意してください。</font>

# ４.Line developer登録
https://developers.line.biz/en/

LINEで動かすためにLine developerに登録します。

![line1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3355091/947b4cef-12ae-4adc-0dd1-4a29bcada5c9.jpeg)

ログイン後プロバイダーの横の「作成」から新規プロバイダー作成を行います。
プロバイダー名は自分で名前を付けます。

![line2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3355091/5e039437-ddfc-536b-792b-73197bb87c7d.jpeg)

チャネル基本設定からチャネルシークレットを発行します。
<font color="Red">※チャネルシークレットは他人に分からないように注意してください。</font>

![line3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3355091/08731910-ee19-aa38-172d-d53f4fcd8928.jpeg)

Messaging API設定からチャネルアクセストークンを発行します。
画像は既に発行済みのため「再発行」になっています。
<font color="Red">※チャネルアクセストークンは他人に分からないように注意してください。</font>

# ５.Git hub登録
https://github.com/Miyabi591208/dr_gpt

サインイン、または新規登録します。

# ６.Git bash登録
https://gitforwindows.org/

Windows用Git bashをインストールします。

# ７.Render登録
https://render.com/

DASHBOADをクリックし、GitHubでサインインします。

# ８.スクリプト&関連ファイルの準備
https://github.com/Miyabi591208/dr_gpt

![github1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3355091/caab1b34-9316-5a8b-4268-e51049629977.jpeg)

サインイン、または新規登録後Git上に公開されているデータをダウンロードします。
ダウンロードしたデータ「main.py」をVisual Studio Codeで開きます。

この「main.py」には既にPythonでライブラリのインポートや応答設定についてのコードが記載されています。
その中で、コードを自分で書く部分がありますので下記のとおり編集が必要です。


```
# エラーを防ぐためにコメントアウトします。

#openai.organization = "****"
```
私が「openai.organization = " **** "」を入力した際、返答が返ってこないというエラーが発生しました。
コメントアウトすることでエラーを解消できました。

```
# API KEYの設定します。

openai.api_key      = "****"
```
「openai.api_key      = " **** "」にOpenAPIで作成したKEYを貼り付けます。

```
#LINEのMessaging APIに記載してあるLINE Access Tokenと　CHANNEL SECRETを設定します。

LINE_CHANNEL_ACCESS_TOKEN = "****"
LINE_CHANNEL_SECRET = "****"
```
次に、「LINE_CHANNEL_ACCESS_TOKEN = " **** "」、「LINE_CHANNEL_SECRET      = " **** "」にLINE Developerで作成したチャネルアクセストークン、チャネルシークレットを貼り付けます。

Visual Studio Codeのターミナルに「git add .」「git commit -m “メッセージ”」「git push origin main」と入力しそれぞれEnterを押します。
この作業をすることで、「main.py」データがRenderで使用可能、または既にアップロードしている状態であればRender上のデータを上書きすることができます。

Renderで「main.py」を使用可能にします。

![render1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3355091/b27bf935-df6c-60fd-cc1b-113ec08f9d59.jpeg)

RenderのNewから、Web Serviceを選択します。

![render2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3355091/fe55c3f1-780d-4ce6-9ce7-7ea433215855.jpeg)

Git Hubのアカウントが選択できるので、Connectを押します。

![render3.1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3355091/8bc03373-cd66-7531-e3a7-973764503477.jpeg)

「main.py」の変更ができていれば問題ありません。

# ９.Line Developer設定変更・トーク画面起動

Line Developerの設定を変更します。

![line4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3355091/a28e8ae2-9c1b-6277-76dd-7db9c2f34a6b.jpeg)

![render3.2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3355091/0f809f09-ef65-c9f3-d7d9-ba342d1c06c4.jpeg)


Messaging API設定からWebhook設定を編集します。
Renderで画像赤枠のURLをコピーし、Webhookに貼り付けます。
その際、URLの後ろに「/callback」を追加します。

![line5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3355091/fdab86ad-07c6-93c2-8691-49cfccce2dfa.jpeg)

Messaging API設定からLINE公式アカウント機能を編集します。
応答メッセージの編集をクリックします。

![line6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3355091/d13248b6-75d5-898b-0825-d4dd1c78e774.jpeg)

Webhook以外の設定をオフにします。

LINEのトーク画面に移動し、メッセージを入力してみます。
![line7.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3355091/b0f53aa1-47a1-4f1f-1bef-c7cc4f53d608.jpeg)

質問に対する返答があればLINEBotの完成です！

カレーの作り方について聞いてみましたが、次にカレーとパスタの作り方を同時に質問してみるとどうでしょうか？

![line9.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3355091/c0892ea3-a982-1269-2f2c-88e84cba0fa1.jpeg)

カレーについてとパスタについてを１つの返答で返してくれました。
内容もこの通りに作れば料理ができます。

また、知らない間に主人がこんな質問をしていました。

![line10.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3355091/e47c7162-d6bf-885f-b0d5-c27db5545c49.jpeg)

ChatGPTを使用しているのでこのような質問にも返答が返ってきます。
実際に私はYouTuberではないので返答のようなステップでなれるのか分からないですが、YouTuberになるために必要なことは書いてあるのではないでしょうか。

# 10.最後に

![line8.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3355091/1d2d077a-e876-a0af-a734-a66ffcf2864d.jpeg)

画像のように前の質問について聞いてみたところ、過去の質問に対しては正しく返答がありませんでした。
返答内容から見て会話を記憶するコードが必要なのだと思います。

実際にはChatGPTとの会話のやり取りを全て保存しながら、それも併せて新しい質問をChatGPTに渡してあげると解決できそうです。

目標である、自然な会話ができるChatGPTを使用し、事前のデータセットをすることなくLINEBotを作成することに対してですが、１つの質問に対しては正しい返答が返ってきているので目標達成としたいと思います。
LINEBot作成のきっかけになった自由に質問をしてその疑問を解決することもChatGPTを使用しているからこそできたと思います。
返答内容の不正確さについては質問内容によると思いますが、今回私がした質問に対しては正確な回答が得られました。

もし欲しい回答が得られなかった場合にどのように対処すべきかという点において、プロンプトエンジニアリングという考え方があるようなので、そのような事態に陥った場合はその考え方を取り入れてみようと思います。
また、会話を記憶するということは今後の課題としたいと思います！