最新情報や独自データを使って回答するGPTsのつくりかた

# はじめに
BitStar CPOの出水です。

[BitStar Advent Calender](https://qiita.com/advent-calendar/2023/bitstar)2日目です。
前回はCTOの@y2yさんによる[ChatGPTを使って自動FAQ回答Chatbotを作ってみた](https://qiita.com/y2y/items/9368109206319d2da154)でした。

今回は、ChatGPTが提供するGPTsでGPTがそのままでは答えられない最新の情報や社内で保持している独自データを意図通りに使用して回答してくれるGPTsを作成してみました。

基礎から順に作り方を解説する形を取りましたので、GPTsを活用して手軽に自サービス独自のチャットボットを作ってみたいと思っている方の参考になれば幸いです。

## BitStarとは
[BitStar](https://bitstar.tokyo/corp/)はインフルエンサーマーケティング・インフルエンサー事務所・動画制作・商品開発などを中心にクリエイターエコノミーと企業や消費者をつなぐサービスを提供している企業です。

その中でも筆者が管掌している[BitStar Match](https://bitstar.tokyo/match/)では、SNSプラットフォームのデータとBitStarが蓄積してきた取引データを元に企業が簡単にインフルエンサーマーケティングを実施できるオンラインプラットフォームを提供しています。

# GPTsのキホン

## GPTsとは
[GPTs](https://openai.com/blog/introducing-gpts)はChatGPTを展開するOpenAIが2023年11月に開始したサービスで、月額20ドル(記事執筆時点)のChat GPT Plusに登録して利用できる、チャットベースで簡単に自分独自のチャットボットを作成できるサービスです。

2024年の早い時期にはこのGPTsを公開してマネタイズできる「GPT Store」をリリースすることも予告されており、プログラミング不要で様々なアプリケーションを作成・公開できるAI時代のApp Storeになりうるのではないかと筆者も期待しています。

![Generative AI.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15280/21c62907-1577-e487-d906-6a5c5188e767.png)
▲ ChatGPT登場当初に社内で共有した資料

## GPTsの仕組み
GPTsの使い方についてはWebやYouTube上にたくさんの情報があるので割愛し、ここではGPTsの本質的な仕組みについてのみ紹介します。

### GPT Builderがやっていること

GPTsは作成画面の左側でGPT Builderというボットの質問に答えていくとその通りのチャットボットがリアルタイムに作成され、右側のプレビューウィンドウですぐに試すことができる、という形になっています。

![ChatGPT (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15280/c24a2e13-791f-664b-0cb8-06859ccbb72a.png)

GPT Builderの質問に答えると「Updating GPT...」という表示が出て、ボットが数秒で生成されたり、応答がすぐに変わったり、アイコンが付いたりするのでさぞすごいことを裏でやっている風ですが、実際に行われているのは、「Configure」タブで確認できるGPTの設定を埋めているだけに過ぎません。

なので、逆にConfigureタブの内容を自分で埋めてしまえばGPT Builderの質問に回答する必要はないので、作る内容が明確に決まっている場合はそうしてしまうのも手かと思います。

### Configureタブの内容

Configureタブの内容も見れば直感的にわかるくらいシンプルですが、一応一通り説明を記載しておきます。

![スクリーンショット 2023-12-04 0.42.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15280/375abdd3-7779-0b8d-ee11-d0241e1d3a82.png)

| 項目 | 設定内容 |
|---|---|
| Name | 作成するチャットボットの名前 (表示にのみ使用) |
| Description | どんなチャットボットかの説明 (表示にのみ使用) |
| Instructions | チャットボットに与える命令。ここに記述した内容に沿ってチャットボットはツールを使用したり回答を生成したりする |
| Conversation starters | チャットに入った際に表示される最初の質問の選択肢。質問の例や最初に必ずしてほしい投稿として使用できる |
| Knowledge | チャットボットに利用させるデータ。画像やTXT、CSVなどのファイルをアップロードすると、Code Interpreter機能を使ってPythonプログラムを通して利用される |
| Capabilities | チャットボットに使用を許可するツール。執筆時点ではWeb検索、画像生成、プログラム実行が利用可能 |
| Actions | チャットボットに使用させるAPI。Open API形式で記述する |

結局はInstructionsをどう記述するかがチャットボットのほとんどすべてを決定づけるわけですが、最新情報や独自データを利用させたい場合には、それらをWeb検索・ファイル・APIのどれで渡すのかという選択が割と重要になってきます。

# GPTsの構築

## 作成するチャットボット

冒頭で紹介したBitStarのサービスであるBitStar Matchでは、各SNS上のインフルエンサーを検索してタイアップを打診することができるのですが、現状だと、そもそも自社の商品やサービスに合った最初のインフルエンサー候補を見つけるのが難しいという課題を抱えています。

そこで、今回はWeb上の情報などを元にPRしたい商品やサービスに合ったYouTube上のインフルエンサーを見つけ、BitStar Match上の詳細情報ページへのリンクを提供してタイアップ打診の検討を始められるチャットボットを作成してみたいと思います。

## Web検索機能の搭載

まずはGPT Builderの質問に答える形で商品にあったYouTuberをWeb検索して教えてくれる機能を作ります。

| 質問 | 回答 |
|---|---|
| What would you like to make? | 宣伝したい商品に合った日本のYouTuberを探しておすすめしてくれるエージェント |
| What specific aspects should be emphasized or avoided in its responses when recommending | 日本語で回答すること。Web検索を行い、実在する日本のYouTuberのみを回答すること |
| How would you like it to communicate with you? | プロフェッショナルとしてクリアに会話してください |

上記回答後、生成されたInstructionsを見ると以下のようになっていました。

> As "Promo Matchmaker," your role is to professionally and clearly recommend Japanese YouTubers suitable for promoting specific products, responding exclusively in Japanese. Conduct web searches to suggest only real YouTubers, considering their content theme, audience demographics, and past brand partnerships. Avoid recommending YouTubers who don't align with the product's values or target audience. If product information is lacking, request more details. Provide informative, rationale-based responses in a professional manner, personalized to the user's needs. Refrain from suggestions not grounded in actual YouTuber profiles or data.

テーマや視聴者のデモグラ、ブランドとのパートナーシップを考慮して...となっているあたりはWeb検索だけだと無理がありそうですが、いったんこれだけでも十分そうなので実行してみます。

![スクリーンショット 2023-12-03 16.39.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15280/e1f80e5b-bfcb-376d-f066-80d447e6aaa5.png)

うん、全然問題ないですね。
ちょっと回答内容が汎用的な感じはありますが、ちゃんと参考になりそうなWebページを参照して実在するインフルエンサーを引っ張ってきてくれました。

このレベルのチャットボットがノーコードで一瞬でできるのは本当にすごい。

## BitStar Match URL回答機能の搭載

次にBitStar Matchの詳細ページのURLを回答してもらう機能を追加します。

方法としては、インフルエンサーの名前からBitStar MatchのURLを検索できるAPIを提供するか、名前とURLの対応関係を示したCSVファイルを提供するかの2つの手段が考えられますが、今回はより簡単な後者にしました。

GPT Builderとの会話でファイルを添付して指示を与えれば、そのファイルがKnowledgeとしてアップロードされます。

![スクリーンショット 2023-12-03 17.19.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15280/cf283255-5daf-23ca-24b5-263c4ae45844.png)

ただ、これだけでは、最初にファイル解析して失敗してしまったり、表示されているリンクが違うインフルエンサーのものになっているような回答を出してきたりとうまく行かなかったので、ここからいくつかの改善を施しました。

![スクリーンショット 2023-12-03 17.43.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15280/f637816a-8a1c-9eb2-093a-d11b2be8bbfb.png)

![スクリーンショット 2023-12-03 17.46.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15280/1f37a996-f2b6-2eb9-eb77-047296e1c030.png)

### 対話による精度改善

エラーとなったCode Interpreterの実行コードは「Error Analyzing」のエクスパンドを展開することで確認することができます。
今回の場合、これを見てみると最初から存在しない `search` という関数を使ってWeb検索もPythonで行おうとしてしまっていたことがわかったので、プロンプトの修正を追加しました。

> いきなりCSVファイルからYouTuberを探すのではなく、まずWebブラウジングして候補となるYouTuberを見つけてから、見つけたYouTuberの名前を与えられたCSVファイルから探すようにしてください。

また、CSVファイルの検索時に完全一致での検索をしてしまっているようだったので、部分一致で検索するようにプロンプトを修正しました。

> CSVファイルからYouTuberの名前に一致する行を探す際には正規表現を使用して、完全一致でなくとも一致とみなすようにしてください

ここまでするとまだエラーは一部出てしまっているものの、当初の目的のインフルエンサーをBitStar MatchのURLと一緒に推薦する、というところまではなんとかできるようになりました。

![スクリーンショット 2023-12-03 17.54.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15280/bf808368-7063-5cee-217a-7775c0ec0456.png)

ちなみに、CSVファイルを取り扱うのが難しいのかと思い、以下の記事を参考にAPI化したバージョンも作成してみましたが、GETリクエストでAPIを作成しようとするとクエリパラメータのURLエンコードをうまく行ってくれなかったり、POSTにしてもCSVファイルの場合と利用してくれる可能性はあまり変わらずで面倒なだけなので、筆者はファイルを利用する形のまま精度改善していく方針としました。

[独自性の強いGPTsを作る方法(GoogleSpreadSheet連携)](https://qiita.com/ishitoki47259/items/842c801a3c7b12b53c28)

### プロンプトエンジニアリングによる精度改善

この時点でConfigureのInstructionsを見ると以下のようになっていました。

> As "Promo Matchmaker," your primary role is to recommend Japanese YouTubers suitable for product promotion. Begin by using web searches to find potential YouTubers, considering their content theme, audience demographics, and past brand partnerships. Avoid recommending YouTubers who don't align with the product's values or target audience. After identifying suitable YouTubers, use regular expressions to cross-reference their name, channel ID, or handle with the provided CSV file, allowing for partial matches. If a match is found, include the URL from the second column of the corresponding row as a reference in your response. Respond in Japanese, providing informative, rationale-based suggestions. If product information is lacking, request more details. Maintain a professional tone, tailored to the user's needs, and avoid suggestions not grounded in actual YouTuber profiles or data.

読んでみると、悪くはなさそうなのですが、余計な指示も含まれていそうです。

また、たまに発生するエラーの内容を確認すると、どうもCSVの解析にpandasなどの外部ライブラリを使用するコードを生成して実行しようとしてしまうことでエラーとなっているようでした。

そこで、ここからはGPT Builderから離れ、Instructionsを直接書き換えることで精度を改善します。

具体的には、先程も取り上げさせていただいた以下の記事などを参考に、行う手続きを明示する形に書き換えました。

[独自性の強いGPTsを作る方法(GoogleSpreadSheet連携)](https://qiita.com/ishitoki47259/items/842c801a3c7b12b53c28)

また、以下の記事にあるような広く認知されているプロンプトエンジニアリング手法を見ると、例示を与えるパターンかステップを区切って途中の思考をアウトプットさせる形が良さそうだったので、できるだけ思考の途中でアウトプットしやすいようなプロンプトに変更しました。

[LLMのプロンプト技術まとめ](https://qiita.com/fuyu_quant/items/157086987bd1b4e52e80)

プロンプトは英語で書いたほうが伝わりやすいため、1文づつDeepLで翻訳 → ChatGPTに聞いて簡潔化という手順で書き直しました。

▼ 最終的なプロンプト
```
Your main task is to recommend Japanese YouTubers who are appropriate for product promotion, including their profile URLs.
Ensure to adhere to the following procedures when formulating your response.
Please response in Japanese.

# Procedure
Step 1: Use Bing Web Browsing to identify and show suitable YouTubers based on their content theme and audience demographics. Ensure to exclude those who do not match the product's target audience or image.

Step 2: Using a Python program with only the standard library, search for the YouTuber's name in the provided CSV file using partial matches. Find the name in the first column and show the URL for their detailed information from the second column.

# Supplementation
If product information is lacking, request more details before starting steps.
Maintain a professional tone, tailored to the user's needs, and avoid suggestions not grounded in actual YouTuber profiles or data.
```

結果としては、かなり安定してインターネット検索とURL提供ができるようになったのではないかと思います。

まだまだサービスとして組み込む上では失敗することもあったり、そもそもサジェストしてくるインフルエンサーが適切でなかったりと改善する余地もありますが、1日くらい取り組んだだけの成果としてはコスパは良かったように思います。

![スクリーンショット 2023-12-04 12.43.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15280/e1146d12-f0ce-d8bf-b706-8c8fc7c50b67.png)
![スクリーンショット 2023-12-04 12.44.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15280/58798ba0-e856-1868-ac0e-a9c1ccff7ec8.png)

実際に作成したGPTsは以下のURLからお試しいただけます。
[Promo Influencer Matcher](https://chat.openai.com/g/g-vYm6dc8A9-promo-influencer-matchmaker)

# おわりに

今回の記事ではGPTsの基礎から実際に構築して精度改善するところまでを紹介しました。

外部データを使用する場合はPythonプログラムの実行可能性やAPIレスポンスの取り扱いがまだまだだったり、複数のステップがある処理などは正しく毎回実行させるのが難しかったりと困難なところもありましたが、1~2年前にはこれほど簡単に独自データを使ったチャットボットが作れるようになるとは想像もつかなかったので、本当に直近のAI技術の進歩は凄まじいなと思うところです。

BitStarではChatGPTなどの最新技術も活用しながら先述のBitStar Matchの開発に携わっていただけるエンジニアを積極募集中です!

ご興味のある方はぜひ以下の募集情報をご確認いただければと思います。

[![スクリーンショット 2023-12-04 13.19.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15280/7887d3ac-51f0-22a0-f7b2-32093ffe5399.png)](https://www.wantedly.com/projects/1508637)

[BitStar Advent Calender](https://qiita.com/advent-calendar/2023/bitstar)、次回12/5の記事は@mokioさんの[【OpenAI】RailsでChat GPTを導入しよう](https://qiita.com/mokio/items/6e65ff8572f303c18750)です。
最後までご覧くださりありがとうございました!