アルゴリズム学習自動化 + alpha: RAGベースの類似問題推薦システム
なぜ作ろうとしているのか?
以前作ったエビングハウスの忘却曲線ベースのSlack通知ボットは、すでに解いた問題をもう一度見るきっかけを作るという点では成功していました。 ただ、長期記憶として維持し、アルゴリズム力を伸ばすには、解いたタイプに対する派生問題や同じタイプの問題を解く必要があります。
復習するとき、私は復習対象の問題をAIに渡して「これと似た問題を探して」と頼み、その類似問題を解いていました。今回はその部分を自動化したいと思っています。
約1週間問題を解きながら勉強してみて、現在感じている課題は次の通りです。
プラットフォームと言語の違い: Baekjoonの問題を解いた後、似た論理を持つ海外サイト、たとえばLeetCodeやCodeforcesの問題を探すために、またAIに聞いて検索する必要があります。
検索ノイズ: 問題のタイトルや本文が似ているからといって、必ず同じアルゴリズムが必要になるわけではありません。 解法はいろいろありますが、自分が解いた内容を復習するには、できるだけ似た内容を探すべきだと考えています。
アルゴリズム問題を探す
アルゴリズム問題で照合すべきデータは次のようなものです。
- 不要な部分(ストーリー): 問題に付けられたストーリー、たとえば「チョルスがりんごを買う」のような部分です。検索時には除去すべきノイズです。
- アルゴリズム形式、タグ: 問題の核となるデータ構造とアルゴリズムの論理、たとえば2次元配列のPrefix Sumです。
- 制約条件: 時間計算量とメモリ制限です。
どんな技術を使うのか: RAGベースのアーキテクチャ
単純なキーワードマッチングではなく、意味的な類似性を判断するために RAG (Retrieval-Augmented Generation) システムを構築しようと思います。 RAGを活用できるプロジェクトを探していたところ、ちょうど良い機会ができました。
まずは次の流れで開発する予定です。
1. 知識ベース(Vector Database)
LeetCodeとCodeforcesの問題データセットを収集し、PineconeまたはChromaDBのようなベクトルデータベースに保存します。このとき問題本文全体ではなく、LLMが前処理したアルゴリズム要約を埋め込み、検索精度を高めます。
2. 3段階パイプライン
正確なマッチングのため、次のプロセスを通します。
Metadata Filtering: Baekjoonの難易度、たとえばGold/Silverなどとタグを基準に、候補を一次フィルタリングします。
Semantic Search: OpenAIのtext-embedding-3-smallモデルで、問題の骨格の類似度を計算します。
LLM Re-Ranking: 上位5件の候補をGPT-4o miniに渡し、制約条件まで一致する最適な1位問題を最終的に選定します。
費用と効率分析(GPT作成)
このシステムは個人ブログのインフラ、主にGitHub Actions上で動かすため、維持費はほとんど発生しない見込みだそうです。ただ、実際に回してみないとわかりません。 最近GitHub Actions関連で何かありましたが、もしActionsが使えないならJenkinsで回せばよいのではないかと思います。
| 項目 | 使用技術 | 費用(30問基準) |
|---|---|---|
| 保存先 | Pinecone Starter Plan | $0 (Free) |
| 埋め込み | text-embedding-3-small | 約 $0.0006 |
| 推論/検証 | GPT-4o mini | 約 $0.15 |
| コンピューティング | GitHub Actions | $0 (Public Repo) |
| 合計 | 約 $0.15(韓国ウォンで約200ウォン) |
今後の計画
単に「復習する時間です」という通知を受け取る段階を超えて、「昨日解いたBaekjoon問題に似たLeetCode Medium問題を推薦します」というメッセージを受け取れる環境を目指します。
この自動化が完成すれば、もう問題を探すためにリンクをコピーしてAIに投げる必要はありません。
Slackメッセージ1つで学習を続けられるようになります。システム構築が完了し次第、具体的なベクトルDBアップロードスクリプトとプロンプトエンジニアリングの過程を共有します。
댓글