ChatGPTによる検索改善の考察

# これは何

ChatGPTの結果を利用した、よりよい検索結果を返す検索APIの作り方についての考察です。

ChatGPTでは文章入力が可能なため、「文章で検索」を試したくなりますが、ここでは既存のサービスの検索入力フォームと検索結果一覧画面を大きく変えることなく、中身のアルゴリズムだけの改善することを焦点に置いています。ユーザが慣れ親しんだUIをいきなり大きく変更することなく、ChatGPTを使ったシステムの改善が可能だ！が本記事の主眼です。（今回挙げた要素が間も無く検索エンジンの内部実装に取り込まれていくものだと予想しています）

手元で簡単に試した結果、以下の3要素でChatGPTを適切に利用することで検索改善ができそうだったため、その内容について共有します。（この先、まだまだ改善できそうなコンポーネントが増える気もしてます）

- クエリ解釈
- クエリ拡張
- 検索結果の成形

本記事のために[Recruit Web Service](https://webservice.recruit.co.jp/doc/hotpepper/reference.html)のグルメサーチAPIとそのレスポンスを参照しました。

# 検証結果と考察

「東京都　新宿駅周辺　イタリアン　お子様連れOK」というクエリが与えられたとします。
このうち、お子様連れOKは、グルメサーチAPIのchildというパラメータ名からとりました。

このクエリをもとにChatGPTを用いた検索結果を改善するアイデアについて述べます。なお、ChatGPTのレスポンスは、前後の文脈依存かつランダム性があるため本記事と全く同じ結果が出力される保証はありません。商用のAPI利用可能になったらこの辺もクライアントから制御できる仕組みが欲しいものです。

# クエリ解釈
まず、この「東京都　新宿駅周辺　イタリアン　お子様連れOK」クエリの解釈をChatGPTに聞いてしょう

まず、キーワードの種別の分類を頼んでみます。

Q
```
飲食店探しをするさいに「東京都　新宿駅周辺　イタリアン　お子様連れOK」というキーワードで検索します
このキーワードのうち、料理のジャンルを指す言葉はどれかとその確信度をテーブル形式で教えてください。もし駅名やランドマークがそのキーワードに含まれているなら、その単語とその種類（駅名かランドマークか）もテーブル形式で教えてください
```

A
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108572/c01d8b7d-3a38-9b7d-be7b-c5e7fa63dce7.png)

「料理ジャンル」「駅名」「地名」「制限」と分類されました。完璧ですね。
グルメAPIではこれらの項目はキーワード検索ではなくコード値での検索が可能ですので

生のクエリ→ChatGPT→種類　にした後、辞書的にコード値に変換して、そのコード値で検索をすれば、より適合率の高い検索結果が得られると考えられます。

地名や駅名は文字列完全一致でコード値へと辞書を使った変換でよさそうです。駅名の「周辺」の解釈はChatGPTよりも実際の駅名マスタなどから作った方が正確性・網羅性が高くなるため（ChatGPTの苦手分野です。以前書いた[この記事](https://qiita.com/naosugi1987/items/113fc785546accd9e16d)のような方法）、そちらがおすすめです。

料理ジャンルは、ジャンルマスタAPIによると、そのもの「イタリアン」ずばりが存在しませんでした。この手の課題はChatGPTが解けます。下記、ジャンルマスタAPIのレスポンスにあったジャンル名の中でどれが一番それっぽいかをChatGCPに聞いた結果です。

Q

```
以下の料理ジャンルの中で、「イタリアン」に近いものはありますか？あれば、その確信度と理由とともにテーブル形式で教えてください

居酒屋
ダイニングバー・バル
創作料理
和食
洋食
イタリアン・フレンチ
中華
焼肉・ホルモン
韓国料理
アジア・エスニック料理
各国料理
カラオケ・パーティ
バー・カクテル
ラーメン
お好み焼き・もんじゃ
カフェ・スイーツ
その他グルメ
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108572/b18d07ed-b12d-64d4-2cd5-e3dd68658e8a.png)

なんと、一般的な表現ではないと承知した上で、かなりそれっぽい理由が返ってきました。これには驚きです。

このジャンルマスタの内、確信度が0%以外の「イタリアン・フレンチ」「居酒屋」「創作料理」をフィルターに使う検索条件にし、確信度の違いはランキングアルゴリズムに反映させる（「イタリアン・フレンチ」だったら「創作料理」よりも加点されるなど）のがよさそうです。

# クエリ拡張

「お子様連れOK」という検索条件は2値での検索が可能ですが、実際のところは「お子様連れOK」の中でも濃淡があるはずです。そこで、たんに「お子様連れOK」としているだけでなく、それ以外にも「お子様連れOK」っぽい要素があるお店を探したいと考えました。そこでChatGPTに聞きました。

Q
```
飲食店探しをするさいに「お子様連れOK」というキーワードで検索する人は他にどのような制約や条件を求めそうかを、その理由と確信度と検索に使いそうなワードを、テーブル形式で教えてください
```

A
1.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108572/1ea2b5c0-40d4-cd3c-1dd4-4a94387c4c44.png)
2.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108572/11c45d6b-3808-2efc-979d-0bc76597b4a5.png)
3.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108572/5f77855b-24ef-e823-65f6-05fc550684f9.png)

聞くたびに答えがぶれますが、大まかにそれっぽいです。この「検索に使いそうなワード」を

1. システム側で暗にこのワードが含まれるアイテムのランキングスコアを増やす
1. 「もしかして検索」やクエリサジェスチョンのような、ユーザ側に追加入力を促す

といった使い方が考えられ、このどちらでも検索体験は改善する予感がします。

同じように、料理ジャンルでの検索も、もう少し解像度高く検索してもらった方がより正確な結果が返せるであろうと思い、そちらでもChatGPTに聞いてみました。

Q
```
日本で飲食店探しをするさいに「イタリアン」というキーワードで検索する人はどのような料理を求めそうでしょうか？その理由と確信度を、テーブル形式で教えてください
```

A
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108572/72b84fb4-bb12-e3e0-cb48-d16a82677834.png)

こちらも同じように使えそうです。ただ、メニューのような正確性・網羅性が多少求められる場合はまだChatGPTに聞くよりは独自に辞書を作った方がマシかもしれません。これは微妙なところです。


## 検索結果の成形

クエリ解釈・拡張により検索APIから得られるレスポンスが改善されたら、次は検索結果の成形です。これには下記の２通りの方法が特に有名です

1. 検索結果の要約
1. 検索結果でのハイライト表示

なかでも検索結果の要約はBingで想像をはるかに超えた改善効果があったとレポート（[カバ本](https://www.kadokawa.co.jp/product/302101000901/)の第１章）されていたため、有用性は高そうです。ChatGPTに聞いてみました。

グルメサーチAPIのレスポンスの中で適当なものを多少成形しました(さすがに元のJSONのままではChatGPTがエラーを起こしたため)

Q
```「イタリアン　お子様連れOK」というクエリに対し、以下のレスポンスが得られました。この中で強調表示（ハイライト）すべきなのはどこでしょうか？

"JR立川駅南口より徒歩1分「夜景も見えるイタリアンバル」プロジェクター完備でサプライズムービーも流せます！ 東京都立川市柴崎町３－６－２３\u3000LXビル 6F　バンド：不可　バリアフリー：なし ：当店にはご用意御座いませんが、ご不便な点が御座いましたら、お気軽にスタッフまでお声掛けください。　予算：平均約4500円 飲み放題付コース4000円(税込)～ご用意しております♪　予算メモ：席のみの場合、チャージ料・2オーダーを頂いております。60席　カード利用可,　お客様のお祝い事に◎ 本格イタリアン×肉バル　貸切可 ：80名までOK！パーティーや結婚式の二次会にも大活躍♪　お子様連れ歓迎 ：お子様連れ大歓迎です♪ご家族でのご利用も非常にご好評です！　2時間飲み放題コース4500円～ご用意！食事もお酒も思う存分お楽しみください♪　夜景の見えるイタリアンバル　全面禁煙　月～日、祝日、祝前日: 16:00～23:00 （料理L.O. 22:00 ドリンクL.O. 22:30）プロジェクターでサプライズムービー可。お気軽にご相談ください！駐車場なし ：近くにコインパーキングございます/お車でお越しの際はお気軽にお問合せ下さい　パーティ利用時：100人まで,　ペット：不可　席のみのご予約でも当日キャンセルの場合、キャンセル料を頂戴いたしますので必ず前日までにご連絡下さい。ショー：なし　ダイニングバー・バル　畳：なし　TVあり　結婚式二次会承ります。心を込めて最高のシーンを演出致します！　WiFi：あり"
```

A
1.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108572/1fb246f7-e1ab-997e-e149-d3af8f882514.png)
2.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108572/80de80ab-8308-aa42-90ff-cc9d19fcb941.png)

なんと1回目のレスポンスではそれっぽい感じの文章要約をしてきました。これはすごい。検索結果一覧画面での文字数を勝手に想像して魅力的なところを組み立ててるように見えます。検索結果成形でもChatGPTは威力を発揮しそうです。

# 終わりに
ChatGPTは正確性・網羅性が低いのが弱点ですが、それは検索エンジンと組み合わせれば解決します。私の今回の方法は、いわば既存の情報検索のコンポーネントの一部をChatGPTで置き換えられるのでは？といった類のものでしかなく、もしかしたら近い将来ものすごい技術革新が起きて、この考え方自体が古くなるかもしれません。なんだったら文章で検索も簡単に作れそうです（ChatGPTに文章からそれっぽい検索クエリを作ってもらう）。ただ、特定のWebサービス内部の検索エンジンは残り、それはしばらくはElasticsearchやSolrといった全文検索エンジンベースだと思うので、上記のような方法でChatGPTとの共存（もっというと既存検索エンジンの改良）は十分可能だと思ってます。

え？既存の情報検索のコンポーネントは何かって？ChatGPTに聞いてみましょう

Q
```
日本語のキーワード検索の再現率・適合率を改善する方法についてその詳細をテーブル形式で教えてください
```

A
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108572/a6711c58-b668-f7ca-40b7-7d20132c167c.png)

Q
```
検索のランキングを改善する方法についてその詳細をテーブル形式で教えてください
```

A
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108572/4e45bd88-db3a-e76b-90f9-de328ff76cfd.png)


うーん。自分のような自称検索エンジニア・データサイエンティストが廃業する日は想像よりも早いかもしれません。