推薦システムをChatGPTで
本記事は、Fusicアドベントカレンダーの8日目の記事です。
これ使えるじゃんとなったGPT-3がでて、プロンプト作成のテクニックもかなり広まりました。
その中で、ここのところ自分が一番やってる使い方として、「検索していいものを抽出すること」かなと思います。
出たばかりの時は、存在しないリンクを出してきたり、全く内容の違う記事内容を解説したりとお世辞にも使えるものではなかったです。
ブラウジングで検索することと、アイディアを出すGPTとで棲み分けがされてたのに、今ではこれだけで完結してしまうことも多いのかなと思います。
なので、意外と需要あんのかもなーっていうところで、誰かの役に立てばってのはありますが、ワンチャンこういうことすればいいよみたいなのくればいいなっていうので公開です。
ちなみに技術的な要素はほぼないです。
プロンプトテクニック
ただ使うだけではもったいないので、自分がよくやっていることとして
情報を与える → 検索させる → スコアリングさせる → ランキングさせるの流れです。
プロンプトテクニックの代表的なものととして、段階的に考えさせることや再考させること、比較することなどがあります。
- https://www.promptingguide.ai/jp/techniques
- https://qiita.com/CodingDane/items/56fa73a5250e79376cb4
- https://business.ntt-east.co.jp/content/cloudsolution/municipality/b_column-05.html#section-5
分かりやすいものとして、CoTやFew-shotなどがあります。
一気に考えさせるってよりかは思考を一つ一つ処理させるってのが大事という話です。
このようなテクニックについて、自分も全てを把握しているわけではないですが、とりあえず入れるだけ入れておけばいい結果を教えてくれるだろうという感じでプロンプトを作りました。
いわゆるぼくが考えるさいきょうのなんとやらってやつです。
ぼくが考える最強のインストラクション
俗っぽいですが、名前なんてものはなんでもいいです。
存分に改善の余地はあるかと思いますが、現状結構役に立ってるのでそれを紹介しておきます。
自分がよく使ってるのは論文検索なのですが、イメージしやすいように今回はそれをOSS検索用にいじって紹介します。
OSS検索GPT
自分はこれをMyGPTのインストラクションに突っ込んで使っています。
あなたはOSS(オープンソースソフトウェア)検索の専門家です。
以下のステップごとに従って、一つずつ処理していってください。
各ステップごとに必要な疑問があれば質問をしてください。
特になければ、そのまま進めてください。
**検索対象となるOSSはGithub上のものを対象とします。**
---
## ステップ1:
最初にOSS検索に関するキーワードや関心ごとを簡単に提供するので、ユーザーの検索内容を明確化してください。
### 明確化について
必要に応じて、ユーザーと対話して決定してください。
明確化された段階で、ステップ2へと移ってください。
1. **調査概要**
- 調査内容を要約
- 例: 「Railsで利用できる権限管理ができるライブラリの検索」
2. **調査範囲**
さまざまな視点により調査範囲を拡大してください。
- 直接表現: ユーザー指定の技術を直接表現 (例: 権限管理)
- 関連検索: より広いカテゴリ、関連技術を検索 (例: ログイン)
- 利用場面: 技術利用想定を検索(例: アプリケーション、管理画面)
- 非機能要件(性能・セキュリティ・スケーラビリティなど)
3. **除外・優先条件**
メンテナンスされていないことや商用利用可能かどうかなどから除外・優先条件を決めてください。
必要に応じてユーザーの意見を聞いてください。
## ステップ2:
ステップ1の内容をもとに、キーワードを生成し、検索を実施してください。
具体的には、
1. 調査内容から調査範囲に基づく検索キーワードを生成
2. 検索を実行
3. 検索結果が調査範囲に適合しているかの評価を行う
4. 調査範囲を修正
5. 1~4をフィードバックループ
## ステップ3:
ステップ2で生成されたキーワードを使用して検索を実行し、候補となるOSSを収集して、ステップ1の要望に従って評価を実施してください。
### スコア算出方法
以下の要件の加重平均で0〜100点のスコアリング
- Githubのスター数
- Githubのフォーク数
- Githubの未解決Issue数
- ドキュメントの充実さ
- 必要に応じて、コアモジュールのメンテナンス期間やスポンサー数などを考慮
スコア結果をランキング
---
最終出力としては、ランキングされた上位10件を以下の形で出力してください。
- 形式: テーブル形式
- カラム: リポジトリ名,URL, スター数, 最新メンテナンス, スコア
去年のちょうど今くらいから内容を編集することもしていませんが、割といい感じに出してくれます。
普段使いしているものとしては、個々の内容を論文検索用に切り替えてやっています。
たとえば、どこの学会誌かや引用数など評価に加えるなどです。
どんな中身なのかも概要と合わせてChat上だと出してくれるので捗ります。
応用方法
多分この辺りをいじれば意外と何にでも応用できるかなと思ってます。
実際自分も他のを作る時はこの辺をいじってるだけです。
例えば、人材検索とかしたい場合、
**検索対象**
- Wantedly
- bizreach
- dota
など。。
### スコア算出方法
以下の要件の加重平均で0〜100点のスコアリング
(検索対象ごとに重みを決定するなど)
ChatGPTからこれらのサイト内検索できるかは知らないですが、もしできないとかであれば、別途APIを実施するとかですかね?
ちょっとした実験
試しに「Railsで権限管理が可能なライブラリ」というプロンプトを与えた結果が以下です。
上位5件のみを表示させてみます。
| 順位 | リポジトリ名 | URL | スター数(目安) | 最新メンテナンスの目安 | スコア |
|---|---|---|---|---|---|
| 1 | varvet/pundit | https://github.com/varvet/pundit | 約 8,455★ (Ruby Toolbox) | 最新リリース 2.5.2 (2025-09-24)、直近50コミット平均日付 2025-04-11 で非常に活発 (Ruby Toolbox) | 96 |
| 2 | CanCanCommunity/cancancan | https://github.com/CanCanCommunity/cancancan | 約 5,669★ (Ruby Toolbox) | 最新リリース 3.6.1 (2024-05-28)、平均コミット日 2023-01-29 (Ruby Toolbox) | 93 |
| 3 | palkan/action_policy | https://github.com/palkan/action_policy | 約 1,512★ (Ruby Toolbox) | 最新リリース 0.7.5 (2025-05-09)、平均コミット日 2024-08-26 と新しめ (Ruby Toolbox) | 90 |
| 4 | RolifyCommunity/rolify | https://github.com/RolifyCommunity/rolify | 約 3,181★(Ruby Toolbox値)(Ruby Toolbox) | 最新リリース 6.0.1 (2023-02-02)、ここ数年はやや低頻度 (Ruby Toolbox) | 82 |
| 5 | chaps-io/access-granted | https://github.com/chaps-io/access-granted | 約 778★ (GitHub) | RubyGems最新バージョン 1.3.3 (2021-08-19) (RubyGems) | 80 |
ちゃんと取れていますね。要件として的確ってのもあるかもですが。
スター数が多くても、メンテナンスの有無で3位と4位は順位が逆転して取れてます。
いい傾向かなと思います!
他にもたとえば、件数が少なそうなものとして「Rubyで数理最適化が実行可能なライブラリ」の結果をみてみましょう。
| 順位 | リポジトリ名 | URL | スター数 | 最新メンテナンス(主に最新リリース日) | スコア |
|---|---|---|---|---|---|
| 1 | ankane/or-tools-ruby | https://github.com/ankane/or-tools-ruby | 204 | 2025-10-26(v0.16.1, OR-Tools 9.14 対応)(GitHub) | 96 |
| 2 | ankane/opt | https://github.com/ankane/opt | 37 | 2025-04-26(v0.2.1, OSQP Ruby 0.4 対応)(GitHub) | 91 |
| 3 | ankane/highs-ruby | https://github.com/ankane/highs-ruby | 19 | 2025-06-07(v0.2.6, HiGHS 1.11.0)(GitHub) | 86 |
| 4 | ankane/glpk-ruby | https://github.com/ankane/glpk-ruby | 16 | 2025-05-04(v0.3.2)(GitHub) | 84 |
| 5 | ankane/nlopt-ruby | https://github.com/ankane/nlopt-ruby | 11 | 2025-05-04(v0.1.3)(GitHub) | 82 |
メンテナンスは意外とされているんですね。使うことがないのでこれがいいのかは分かりません。
ちなみに、ChatGPT上の思考時間のところをクリックすると思考過程が見れるんですが、そこを見るときちんと順を追ってくれてるのがわかります。
ちょっとした性能比較
テクニックを盛りに持ってるので、いいの出ているだろうということで、あんまり調査はしていませんでしたが、性能がでているのか、何かベンチマークを使ってみた方が良さそうですが、あんまり時間がないので、適当に作らせて比較してみました。
比較として、単純なインストラクションと今回のインストラクションを合わせてどういった結果が出るのか調査してみます。
- 「Python Webフレームワーク」
- 「Rails 権限管理 gem」
- 「リアルタイム通信ライブラリ JavaScript」
- 「機械学習モデルのバージョン管理」
- 「高速な全文検索エンジン」
- 「Kubernetes マニフェスト管理ツール」
- 「セキュアなシークレット管理 Go言語」
- 「軽量なコンテナイメージビルダー」
- 「GraphQL スキーマ管理とコード生成 TypeScript」
- 「分散システムの障害注入テストツール」
上記ベンチマークは適当にClaudeで作らせて、ちょっとだけ書き換えました。
実験モデルはGPT-4oでやっています。
今回は、
- 今回の題の指示書
- スター数だけでとってきたもの
- 指示を何も与えないもの
一応精度確認だけ。
| プロンプトタイプ | 平均精度 | 平均再現率 | 平均F1 | 平均応答時間(秒) |
|---|---|---|---|---|
| 題の指示書 | 0.380 | 0.860 | 0.422 | 20.22 |
| スター数だけでとってきたもの | 0.280 | 0.805 | 0.422 | 11.45 |
| 指示を何も与えないもの | 0.252 | 0.775 | 0.380 | 11.86 |
ちゃんとベンチを作っていないし、あまり時間もかけてないので評価しづらいですが取り合えあえず、いい感じの結果にはなっています笑 まああくまで参考までに。
先ほどのRailsのやつを見てみます。
指示を何も与えないもの
| リポジトリ名 | URL | スター数 | 最新メンテナンス | スコア |
|---|---|---|---|---|
| CanCanCommunity/cancancan | https://github.com/CanCanCommunity/cancancan | 5,500+ | アクティブ | 9.5/10 |
| varvet/pundit | https://github.com/varvet/pundit | 8,200+ | アクティブ | 9.8/10 |
| RolifyCommunity/rolify | https://github.com/RolifyCommunity/rolify | 3,100+ | 中程度 | 8.5/10 |
| CanCan/cancan | https://github.com/ryanb/cancan | 6,300+ | 停滞 | 7.0/10 |
| Sage/action_policy | https://github.com/palkan/action_policy | 1,400+ | アクティブ | 8.8/10 |
スター数だけでとってきたもの
| リポジトリ名 | URL | スター数 | 最新メンテナンス | スコア |
|---|---|---|---|---|
| CanCanCan | https://github.com/CanCanCommunity/cancancan | 5,500+ | 2024年 | ⭐⭐⭐⭐⭐ |
| Pundit | https://github.com/varvet/pundit | 8,200+ | 2024年 | ⭐⭐⭐⭐⭐ |
| Rolify | https://github.com/RolifyCommunity/rolify | 3,100+ | 2024年 | ⭐⭐⭐⭐ |
| Authority | https://github.com/nathanl/authority | 1,200+ | 2023年 | ⭐⭐⭐ |
| Declarative Authorization | https://github.com/stffn/declarative_authorization | 1,400+ | 2022年 | ⭐⭐⭐ |
スター数でとっているのに、ランキングがごちゃごちゃですね。。。なんでだろ。
いずれにせよ、cancancanが上位に来ています。
どっちもスコアリングはわかりにくいかな?と
とはいえ、タスクが簡単すぎるので、こういう単純なものに利用するのはあんまり向いてないという感じです。
最後に
使ってるのは、上でも書きましたが、論文検索です。
こちらはかなり使いごごちがかなりいいです。
論文検索は
- こんな論文ないかな?
- 手法は〜
- ドメインとかは〜
など結構曖昧な状態から探すことになるんですが、これらを勝手に言語化してくれて、勝手にスコアリングしてくれるのでめっちゃ便利です。
特にTwitterで気になった論文みて、その周辺技術とかを調べるのにかなり重宝しています。
上の応用例でも書いたんですが、人材検索みたいな言語化が難しい曖昧な検索の利用に適していると思います。
これ系だと大体そうだと思いますが。
Discussion