要点を3つ
- コードを読むのもLLMと一緒に行えるツールを作った
- LLMと読むことで達成できるのは、「LLMによる解説」「LLM主導の探索」「過去の経路の再探索」「経路の保存」「LLMによるバグ探索」「LLMによるレポート出力」
- もはや会社とかでコードを目で読むのも面倒
従来のLLMコードリーディングの課題
皆さんは、コードリーディングをしていますか?
大規模OSSのような難しい内容ほどでなくとも、エンジニアの皆さんであれば多少はコードリーディングをする機会は多いと思います。
そんなコードリーディングですが、LLMを使ったアプリケーション実装の決定版がないように思えませんか?
確かにCursorを使ったコードリーディングをする事例はあります。
ただどの事例を見ても、コード検索の方法がIndexingだったり、全コードをコンテキストに与えるようなもので、私から見たら限界があるように思えていました。
では何が正解か?
私はLSP(VSCodeとかでコードジャンプをしてくれる機能など)だと思いました。実際にSerenaなどはこのLSPを使っているのですが、
このLSPとLLMを使ってコードリーディングの可能性を広げよう!というのがこの記事の狙いです。
コードリーディングの課題
LLMのコードリーディングを考えるにあたって、現状のコードリーディングの課題を見つける必要があります。
私は現状のコードリーディングの課題は、3つあると思います。
- 初めてのコードだと勘所が分からず、ランダムウォーク的な探索をしてしまう
- 一度深くまでコードリーディングする(10関数先まで読むなど)と、元に戻るのだけで時間がかかってしまう
- コードリーディングはとても個人的で暗黙知的なので、形式知化されてこなかった
これらの問題を解決するべく、私はLLMを使ったコードリーディングツールの開発に取り組み始めました。
コードリーディングもLLMと一緒に行おう!
そういうことで、4月終わりゴールデンウィークから私はコードリーディングもLLMで効率化してみよう!という試みを行っています。
最初に始めたのは、Go言語専用のCLIツールで、以下の流れで再帰的にコードを読む仕掛けでした。
- コードのエントリーポイントを入力
- エントリーポイントの関数から、重要な次に読むべき関数候補をLLMが選んでくれる
- 2の次の関数候補から読みたい関数を選び、その関数をLLMが再探索
- 2〜3をユーザーがいいと思うまで続ける
- 4の探索中に、過去の経路に戻ったり、これまでの経路のレポートを出力できる
このLLMを使った関数があれば、以下の2点の利点があるのかなと思っています。
- 勘所がないOSSでも、LLMが周辺知識と読むべき箇所を教えてくれる
- いざ間違った探索をしても、元に戻れる
この関数探索をVSCode上でできるようにしたのが、以下のVSCode拡張たちです。
Linux用(C言語):
Go言語用:
Ruby言語用:
使い方は上記のCLIツールと似ていますが、上記の探索以外にもいくつか機能を追加しました
- 探索した経路を保存でき、新しいタブからその途中の経路から探索が可能
- 探索した経路にあるバグの候補を見つけてくれる(LLMのスペックに依存する)
- コード探索時に、該当のLLMが読んだコードの箇所を見せてくれる
- 現在見ている関数を、LLMがマーメイド図にしてくれる
これらの機能によって、上に書いた3つの課題には、それぞれ対処できるようになります。
- 初めてのコードだと勘所が分からず、ランダムウォーク的な探索をしてしまう
→LLMがOSSの該当箇所の解説をしながら、重要な関数を教えてくれ、その中から探索できる - 一度深くまでコードリーディングする(10関数先まで読むなど)と、元に戻るのだけで時間がかかってしまう
→過去の探索経路を木構造で表示でき、その木構造のいずれかのノードから再度探索できる - コードリーディングはとても個人的で暗黙知的なので、形式知化されてこなかった
→探索履歴をJSONとして保存でき、新しいタブからならその探索履歴から木構造を再現しそこから再度探索できる
抽象的な話が多くなってきたので、実際にどう使えるかを見てみましょう!
Kubernetes(Go言語)をLLMと一緒に読む
ここで見てみるのは、Kubernetesのkube-schedulerという機能です。詳細は下のリンクが詳しいです。
工程としては、以下の工程でコードリーディングをします。
- kubernetesなどコードリーディングしたいレポジトリをクローン
- ChatGPTなどに関数のエントリーポイントを聞く
- Go-Reader を開き、設定画面でLLM情報とGoplsの情報を入力
- Go-Readerで、エントリーポイント情報・コードリーディングの目的を入力
- 探索する
- 必要に応じて、追加機能を使う
では見てみましょう!
1:kubernetesなどコードリーディングしたいレポジトリをクローン
git clone https://github.com/kubernetes/kubernetes
2:ChatGPTなどに関数のエントリーポイントを聞く
コードのエントリーポイントだけGo-Readerに入力する必要があるので、調べましょう。
以下私が、kube-schedulerのエントリーポイントを調べた履歴です。
cmd/kube-scheduler/app/server.go のmain() にあるみたいですね。
この箇所をメモっておきましょう
3:Go-Readerを開き、設定画面でLLM情報とGoplsの情報を入力
まずは Go-ReaderをVSCodeにインストールしましょう
インストールができたら、Go-Readerは、VSCodeで「Control + Shift + P」のコマンドパレットで「Open Go-Reader tab」で開けます
開いたら、Setting Pageに行き、「goplsのパス」「レポートを保存するパス」「OpenAI / Anthropic / Gemini / PlamoのAPIキー情報とモデル名」を入力します。
※それぞれ入力したら、「Save Gopls Path」や「Save Report Path」などそれぞれで保存ボタンを押さないといけないので注意してください!
4:Go-Readerで、エントリーポイント情報・コードリーディングの目的を入力
ここまで来れば、ようやく探索を開始できます。
メインのChat画面に戻り、出てくる内容に答えます(見直したら英語の翻訳ざるですね・・・)
1つ目「検索したい関数の入ったファイルの絶対パス」
→ /path_to_kubernetes/cmd/kube-scheduler/app/server.go
2つ目「検索したい関数の1行目」
→ func main(){
3つ目は「目的」
→ kube-schedulerがどう実装されているか知りたい
そして最後に「Start Task」をクリックすると探索が開始します!
5:探索する
探索が開始されると、以下のような「0〜最大4」までの関数候補が出てきます。
ここで次に探索すべきなのを0だと思ったら、「0」を入力します。
すると、自分が選んだ関数の内容が選択され表示され、再度その関数の中から「0〜最大4」までの関数候補が出てきます。
これを自分が理解したと思うまで続けることで、探索進みます。
6:必要に応じて、追加機能を使う
機能は探索のみではありません。以下が他のコマンドです(これも毎回の探索で表示されます)。
例えば6を入力すると、下のように探索経路が木構造で表示されます。
この各探索ノードの下にある7文字のハッシュ値を入力することで、そこから再度探索できます。
効果
ここまででツールの使い方を説明しましたが、その効果はあるのでしょうか?
簡単に試算したところ、上で書いた課題にはそれぞれ以下の効果があります
- 初めてのコードだと勘所が分からず、ランダムウォーク的な探索をしてしまう
→1.5倍〜のスピードでコードを読める - 一度深くまでコードリーディングする(10関数先まで読むなど)と、元に戻るのだけで時間がかかってしまう
→戻るのに10分かかっていたのが1分で戻れるように - コードリーディングはとても個人的で暗黙知的なので、形式知化されてこなかった
→JSONで探索履歴を保存するようなことを、目で読むときはしない
詳しくは以下のスライドが詳しいです。
もはや自分なんかは、会社の仕事でLLMを使わずにコードリーディングをするのが面倒なくらいです。笑
最後に
今は Go, Ruby, Linux(C)用のものしか作っていませんが、ここら辺の言語で開発をするときは、LLMを活用したコードリーディングを使って、爆速でコードを読んでみてもいいかもしれません。
では、皆様も楽しい開発ライフを!
開発レポジトリ








