New Update: Baekjoonが消えた...
Baekjoonが消えたあと、アルゴリズムRAGプロジェクトの方向性を考え直すことになりました
Baekjoonが消えたあと、既存プロジェクトをどう持っていくべきか、かなり悩みました。
もともとこのプロジェクトは、単純な「問題推薦機」に近いものでした。
私がBaekjoonで問題を解き、学んだ内容を個人ブログのMDXに整理すると、GitHub Actionsが自動でトリガーされます。 その後、あらかじめ構築しておいたLeetCode問題ベクトルインデックス、つまりRAGを基に、OpenAI APIが類似問題を検索し、最も似ている問題3件を個人Slackへ送る形でした。
全体の流れは次の通りでした。
Baekjoon問題を解く
→ ブログ(MDX)アップロード
→ GitHub Actions実行
→ OpenAI Embedding生成
→ NumPyベースLeetCode RAG検索
→ GPT-4o-miniで推薦理由生成
→ Slack個人通知送信
当時は「韓国語のBaekjoon解説記録を基に英語のLeetCode問題を推薦する」という点が、かなり面白い個人プロジェクトだと思っていました。
実際に:
- GitHub Actions自動化
- Docker heavy/light分離
- NumPyベースのベクトル検索
- Slack自動通知
- OpenAI EmbeddingベースRetrieval
- LangSmith追跡
など、いろいろな要素を実験できましたし、個人的にもアルゴリズム復習にかなり役立ちました。
Baekjoonのサービス終了
Baekjoonが消えてからは、もう「Baekjoon -> LeetCode」へつながる学習フローが存在しなくなりました。
現在はLeetCodeで直接問題を解いているため、単純に「類似したLeetCode問題を推薦する」こと自体は以前ほど意味がなくなりました。
以前は:
- Baekjoonで特定のアルゴリズムパターンを学習し
- LeetCodeスタイルの問題へ拡張学習する
という流れが自然でした。
しかし今は最初からLeetCodeで問題を解いているため:
「すでにLeetCodeを解いている人に、またLeetCode問題を推薦すること」 は学習面でのインパクトが大きくありませんでした。
そのため、プロジェクトの方向自体を考え直すことになりました。
アルゴリズム学習で重要なこと
考えてみると、アルゴリズム学習で最も難しい部分は、単純に「次の問題を探すこと」ではありませんでした。
むしろ難しかったのは:
- 自分がどのアルゴリズムパターンに弱いのか
- なぜこの問題を間違えたのか
- 似ているが少し違う問題をもう一度解けるのか
- 数日後にも同じパターンを覚えているのか
- 本当に理解したのか、それとも単に暗記しただけなのか
といった部分でした。
つまり、単純推薦より重要なのは、**「個人化された復習と弱点分析」**だと感じました。
新しい方向性
そこでプロジェクトの方向を完全に変えることにしました。
個人的には「CodeTree」がアルゴリズム練習にとても良いプラットフォームだと思いました。
単に問題を提供するだけでなく、カリキュラムと復習フロー自体がかなりよく設計されていたからです。
ただ、提携大学の学生でもなく、個人が使うには価格がかなり負担でした。
そうして自然に次の悩みが生まれました。
「アルゴリズム学習で本当に重要なことは何だろう?」
考えてみると、アルゴリズム問題を解くときの核心は、単に正解コードを書くことではありません。
簡単な問題でも難しい問題でも、結局重要な過程は:
問題を読む
→ どのデータ構造やアルゴリズムパターンが必要か考える
→ 自分でテストケースを作る
→ 反例を考える
→ 時間計算量を計算する
→ 解法を実装する
だと思います。
しかし最近はAIが非常に強力になり、問題について十分に考える前にすぐAIへ解法を聞いたり、正解コードをコピーして理解せずに進んだりするケースもかなり増えました。
私自身もAIをかなり頻繁に使いますが、だからこそ逆に危険だと感じる瞬間がありました。
特にアルゴリズム学習では:
* 「なぜこのアルゴリズムを思いつくべきなのか」
* 「なぜこのデータ構造を使うべきなのか」
* 「どんな反例が存在するのか」
* 「どこで時間超過が起きるのか」
のような思考過程が非常に重要ですが、この過程そのものを飛ばしてしまうことが多くなります。
そして、問題をたくさん解くことと、実際に実力が伸びることは別の話だと感じました。
たとえば:
* 似たタイプなのに数日後にまた解けない場合
* DP問題をたくさん解いたのに漸化式を自分で立てられない場合
* グラフ問題を解いたのにBFS/DFSの選択基準が明確でない場合
などを何度も経験しました。
結局不足していたのは:
* 問題数
* 正解コード
* 解法暗記
というより、
「個人がどの概念に弱いのかを分析し、 適切なタイミングでもう一度復習させるシステム」
だと思いました。
そこで既存プロジェクトも、単純な「問題推薦機」から、もう少し個人化された方向へ変えたくなりました。
今後は:
- どのアルゴリズムパターンに弱いのか
- どのタイプの反例をよく見逃すのか
- どの難易度で詰まるのか
- ヒントを早く見すぎていないか
- 概念を実際に理解したのか
といった部分を追跡しながら、AIを単純な正解生成機ではなく:
「学習を補助する道具」
として使う方向を考えています。
たとえば:
- 問題を完全に理解したなら、似た派生問題を生成する。
- 特定概念を長く間違えるなら、再び復習させる。
- 早すぎる段階で正解を見るなら、masteryを低く反映する。
- 繰り返し弱いパターンを追跡する。
まだ小規模な個人プロジェクト段階ですが、単純なオンラインジャッジより:
「個人化されたアルゴリズム訓練システム」
に近い方向へ発展させたいです。
1. 個人別アルゴリズム弱点分析
ユーザーの解答記録を基に:
- Prefix Sum
- Graph
- DP
- Binary Search
- Greedy
のような概念別熟練度を追跡します。
単純なsolved/unsolvedではなく:
- 解答時間
- ヒント使用有無
- 失敗回数
- 復習間隔
- 画面離脱
なども一緒に反映する予定です。
2. オンラインジャッジ + リアルタイムコード実行
既存では推薦だけでしたが、今後は直接問題を解ける環境も作る予定です。
ただし、最初から巨大なオンラインジャッジを作ることが目標ではありません。
まずは:
- Python/C++実行
- Sandboxベースのコード実行
- Hidden Test
- Time Limit / Memory Limit
程度だけを含む小規模なJudgeシステムから実装しようと思います。
3. AIベースの派生問題生成
おそらくアルゴリズムに特化したAIモデルを使う必要があると思いますが、これは今後の開発過程で扱います。
今後の目標
まずは自分で使いながら、学科の友人2〜3人程度をベータテスターとして募集してみるつもりです。
Ralph写真がある理由
https://x.com/ryancarson/status/2008548371712135632: Step-by-step guide to get Ralph working and shipping code
今回はプロジェクトを実装するとき、Ralph Loopを導入してみようと思っているので入れておきました。
次の記事で初期ドキュメントと実装過程を共有します。
댓글