ChatGPTをベースに、専門性のあるチャットボットを30分でプログラミングせずに作る

:::note info
上手く動作しない場合は、[動作しない時のTips](#動作しない時のtips)を確認してみてください。
[Twitter](https://twitter.com/daigo_3_8)にて質問承ります！
:::

最近話題のChatGPT。
3月1日に公開されたAPIを用いたサービスが続々と登場し、最近はGPT-4が公開され、ワクワクが止まりません。

それを踏まえ[前回](https://qiita.com/daigo_38/items/f5b329364e177a340bbb)、AIチャットくんのようなChatGPTのLINEボットを作りました。
今回は、文脈を理解し、独自の知識を学習させることで**専門性のある**GPTベースのチャットボットを**無料で、30分で、プログラミングせずに**作ってみましょう！

独自の知識を学習させることができれば、例えば社内Slack上のすべての会話を学習させて、「A社のCTOって誰だっけ？」と聞くと「**Xさんです。2022年3月8日に#randomに投稿されたスレッドによると、Xさんは廃墟巡りが趣味だそうです。**」と回答するようなボットを作ることができます。
これはChatGPTにはできない所業です。
嫌いな上司に「まだそんなこともわからないのか」といびられる心配がなくなりますね😇

:::note warn
この記事ではLINEボットを作るため、社内Slackボットの作成は範囲外です。
:::


より多くの人にこの技術を応用してより良いサービスを作っていただたいので、反響次第では開発者向けの記事も公開したいと考えています。

前置きはこの辺にして、30分ディベロッピング、スタートです。

# 前提
この記事の対象は「**開発の経験は少ないけど、とりあえず動くものを作ってみたい方**」です。
詳細な説明はなく、正確性よりも簡潔さを優先していることをご了承ください。
[前回](https://qiita.com/daigo_38/items/f5b329364e177a340bbb)の続きなので、LINEボットの作成やOpenAIアクセストークンの取得は完了しているものとします。

今回のやり方で、岸田総理の発言を学習させるとこのようになります。
文脈を理解しているのが見て取れます。
![F09D0950-95F3-45EA-B12D-231429935753_1_201_a.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697512/c1003706-8215-31a1-1c19-ad23528b37f5.jpeg)

### 方針
今回紹介するのは、Googleスプレッドシートをデータベースとして利用する方法です。
文脈を理解させるには、会話履歴を保存しておく必要があります。会話履歴などのデータを保存しておくファイルのことをデータベースと言ったりするのですが、今回はGoogleスプレッドシートをデータベースとして利用します。

### 料金
料金は3ヶ月間ほぼ0円です。
OpenAIのAPIには最初の3ヶ月間有効な18ドルの無料枠があります。かなり良心的な価格設定なので、無茶な使い方をしない限り18ドルを超過することはないと考えていただいて結構です。


# 流れ
1. スプレッドシートを用意
1. 学習データの用意
1. LINEボットと連携

# スプレッドシートを用意
### スプレッドシートのコピー
まずは以下の手順で、私が用意したGoogleスプレッドシートを自分のドライブにコピーしてください。
1. スプレッドシートを開く
    [こちら](https://docs.google.com/spreadsheets/d/12v47mR4i35Cira135Qv4Mxo7mSx38WH7H9NwUJVO0DU/edit?usp=sharing)から開けます。

2. 「ファイル」>「コピーを作成」をクリック
![スクリーンショット 2023-03-21 1.24.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697512/990eee47-c763-fdeb-b3ff-aba60edbfa51.png)
3. 「コピーを作成」をクリック
![スクリーンショット 2023-03-21 1.23.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697512/a4d7cfaa-9832-c035-d02f-9c87c74a5e7a.png)





### APIキーとアクセストークンの設定
コピーしたスプレッドシートで「拡張機能」>「Apps Script」をクリックし、GASプロジェクトを開いてください。
![スクリーンショット 2023-03-21 1.23.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697512/dc8b7640-11ad-db19-9a9b-63c00d14abf9.png)


Apps Scriptの画面が開かれたら、2, 3行目のOPEN_AI_KEYとLINE_ACCESS_TOKENに[前回](https://qiita.com/daigo_38/items/f5b329364e177a340bbb)の記事で取得したものを設定してください。
**絶対に第三者に公開しないよう注意してください。**
![スクリーンショット 2023-03-21 1.27.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697512/2167d42f-bf5f-11b2-ec91-a05166fb5b00.png)
ちなみにこのプログラムは「会話履歴」シートからデータを取得したり、「学習データ」シートを参照してプロンプトにデータを挿入したりしています。





# 学習データの用意
### 「学習データ」シートの用意
今回紹介するのは、Googleスプレッドシートをデータベースとして利用する方法です。
サンプルデータとして、コピーしていただいたスプレッドシートの「学習データ」シートには今回岸田総理の発言を格納しています。
このシートには自社サイトのFAQなり社内Slackのスレッドなり、ご自身の学習させたい内容を格納してください。
この時、一つのセルに含まれる文章量に比例してコストが高くなるため、話題ごとに行を分けるのがおすすめです。（FAQなら質問ごと、社内Slackならスレッドごとなど）

### 「学習データベクトル表現」シートの用意
スプレッドシートの「学習データベクトル表現」シートを開き、以下の5ステップを行ってください。

1. 「ベクトル表現を取得」ボタンをクリック
![スクリーンショット 2023-03-21 1.08.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697512/6a6b6a89-e6f6-7829-a1ed-94007551761d.png)

2. 「続行」をクリック
![スクリーンショット 2023-03-21 1.08.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697512/4d36a7df-7217-ad45-5f04-9ab468ddf4c8.png)

3. 自分のGoogleアカウント（スプレッドシートを保存したアカウント）をクリック
![スクリーンショット 2023-03-21 1.08.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697512/85eb78e1-66ee-6883-4d9a-752f4259f896.png)

4. 「詳細を表示」をクリックし、「〜〜〜（安全ではないページ）に移動」をクリック
![スクリーンショット 2023-03-21 1.09.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697512/b8e3f59b-37ea-9d36-4063-d8acd7523e92.png)

5. 下までスクロールし、「許可」をクリック
![スクリーンショット 2023-03-21 1.10.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697512/c3540d10-b088-32ce-3453-f6eda8071c99.png)


承認が完了しボタンが作動すると、学習データベクトル表現シートに数字がたくさん書き込まれるはずです。
これにより、コンピュータが学習データを理解できるようになりました。
「学習データ」と「学習データベクトル表現」シートの行数が同じであることを確認してください。
![スクリーンショット 2023-03-21 1.20.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697512/8f8f1453-4881-cbe7-3bd7-f392448cd950.png)



# LINEボットと連携

[前回](https://qiita.com/daigo_38/items/f5b329364e177a340bbb)と同じ要領で、GASプロジェクトをデプロイし、前回作ったLINEボットアカウントのwebhookにURLを設定してください。
こちらの記事が参考になると思います。
**デプロイした瞬間からセキュリティ的に危険な状態になるので、取得したURLは公開しないことをお勧めします。**

https://auto-worker.com/blog/?p=5141

### 動作確認
自分が作ったLINEボットにメッセージを送ってみてください。
数秒後に返信が来るはずです。
スプレッドシートの「会話履歴」と「ログ」のシートが更新されていれば完成です。


# 動作しない時のTips

### テスト関数の実行
今回はtest関数を用意しました。LINEは介さず、本番同様にリクエストを送りデータベースを更新するような関数です。
GASプロジェクトを開き、test関数を実行すれば、エラーを確認することができます。
「会話履歴」と「ログ」のシートが更新されていればOpenAIに関する挙動には問題がなく、LINEの方に問題があると推察されます。

![スクリーンショット 2023-03-21 1.38.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697512/5dfec767-6825-d6fc-6401-d9cc0b935cde.png)



### OpenAIの初期設定を確認する
OpenAIのAPIを使うには、クレジットカード登録と使用上限の設定が必要です。
意外といろんなメディアで触れられていない部分でもあります。

https://cocomiru.com/openai-register/

https://qiita.com/kotattsu3/items/d6533adc785ee8509e2c

これらの記事を参考に、設定を行ってください。
**なお、これらの設定によって無料枠が使われなくなるという報告があります。**
これについては情報が混在しており、現時点で断言はできません。
少なくとも私のアカウントでは課金されていませんが、心配な方は控えるのが得策かと思います。


### アクセストークンやURLを確認
以下の項目を確認してください。
* OpenAI APIキーやLINEのアクセストークンが正しく設定されているか
* webhookに設定しているURLが最新のデプロイURLになっているか
    * GASでは修正した時に、デプロイを**上書き**する必要があります。
    * 新しいURLを発行していたり、上書きされていなかったりすると修正は適用されません。（参考：[GoogleAppsScriptの新しいエディタで更新デプロイする方法](https://ymt43.com/gas-new-editor-deploy/)）
* 誤字脱字がないか
    * 意図せずどこかを変更してしまったのかもしれません。
    * 一度全体をコピペし直して、デプロイを上書きしてみてください。

### OpenAIサーバのパンクを疑う
リクエスト過多により、OpenAIのサーバからエラーが返されるトラブルが稀に発生します。
私たちにできることはないので、気長に待ちましょう。だいたい数十分で解決する気がしています。

### ログを確認する
本記事は初学者向けなので、小難しいことはしたくないのですが、どうしても解決しない場合はGASのログを確認する必要があります。

https://zenn.dev/uma1100/articles/2695d1d93e238a

この記事を参考にログを確認してみてください。
エラーメッセージがわかったら、ググるかChatGPTに聞けば十中八九解決します。

[Twitter](https://twitter.com/daigo_3_8)にて質問を承りますので、お気軽にお問い合わせください！

# まとめ
いかがでしょうか？
今回は文脈を理解し、大量の独自データを学習させた専門性のあるチャットボットを作りました。

実際に使ってみて、レスポンスが遅いと感じましたか？
そうです。今回紹介した方法は、外部に公開するサービスとしてはパフォーマンス的にもセキュリティ的にも問題だらけです。
回答の精度が低いと感じた方もいるでしょう。
精度向上には学習データやリクエストの投げ方に工夫が必要なのですが、適切な設計は少々高度な技術になります。

そこで私たちは、より高速で安全なチャットボット製作サービスの提供を開始しました。
高速で安全なチャットボットを用意するだけでなく、回答の精度を高めたり、学習データの用意をサポートしたりすることも可能です。

:::note info
冒頭に紹介した、「A社のCTOって誰だっけ？」と聞くと、「**Xさんです。2022年3月8日に#randomに投稿されたスレッドによると、Xさんは廃墟巡りが趣味だそうです。**」と回答するような社内Slackボットも提供しています。
:::

すでにいくつかの企業さんからお声をいただき、試験的に導入を開始しています。
実用を検討されている方は、baaang.tech@gmail.comまでお問い合わせください。

最後までお読みいただきありがとうございました！