KotlinLLMの核心:スマートマクロとランタイムコード生成

KotlinLLMは、Kotlin/JVMプロジェクトに「スマートマクロ」という新しい言語機能を追加するIntelliJ IDEAプラグインです。スマートマクロとは、通常のKotlin関数呼び出しでありながら、そのボディがLLMによって生成されたKotlinコードで構成されるものです。開発者はLLMにコード生成を委ねることで、定型的な処理や複雑なロジックの実装を効率化できます。

スマートマクロは、LLMが生成したKotlinコードをランタイムで動的に組み込むことで、開発プロセスに新たな柔軟性をもたらします。

具体的なAPIとしては、主に以下の2つが提供されています。 (出典)

  • asLlm<F, T>(from, hint): 型 F の入力を、データクラス、Enum、リスト、プリミティブなどの型 T の値に変換します。例えば、自然言語のヒントからGitHub APIのURLを生成したり、レスポンスから特定のイシューを抽出したりする際に利用されます。 kotlin val issuesApiUrl: String = asLlm(repoInput, hint = "GitHub API URL: get all issues, including closed") val issues: List<Issue> = asLlm(response, hint = "Return all beginner-friendly issues for this repository")
  • mockLlm<T>(): インターフェース T のステートフルな実装を生成します。その振る舞いは、呼び出されるメソッドに依存します。

これは開発者にとって非常に魅力的な機能だと感じます。特に asLlm のような、自然言語に近いヒントでコードの一部を生成できる機能は、ボイラープレートの削減やプロトタイピングの高速化に貢献するのではないでしょうか。

JVMクラス再定義を核としたランタイムループ

KotlinLLMの最大の特徴は、コードがランタイムで進化する「ランタイムループ」です。KotlinLLMの実行構成でプロジェクトを起動すると、プラグインはasLlmやmockLlmの呼び出しをスキャンし、生成されたコードファイルを更新します。そして、JDI(Java Debug Interface)の下で実行構成を起動し、生成された再生フックにブレークポイントを登録します。

もし生成されたロジックがランタイムのシナリオと合致しない場合、実行はフックに到達します。プラグインは停止したフレームからランタイムの値と型情報をキャプチャし、LLMエージェントがコードの更新を提出。

プラグインはそれをコンパイルし、ロードされたクラスを再定義してから元の呼び出しをリトライします。 (出典)

プロセス段階 説明
1. スキャン asLlm/mockLlm呼び出しを検出し、コードファイルを更新
2. 起動 JDI下で実行構成を起動、再生フックにブレークポイント登録
3. 実行 生成ロジックが不一致の場合、フックに到達
4. 情報収集 停止フレームからランタイム値と型情報をキャプチャ
5. 更新提出 LLMエージェントがコード更新を提出
6. 再定義 プラグインがコンパイルし、ロードクラスを再定義
7. リトライ 元の呼び出しを再試行

このランタイムループは、JVMクラスの再定義に依存しているため、Kotlin/JVMに特化しています。AIエージェントがコードを生成し、それを即座に実行環境に反映できるのは、開発サイクルを劇的に短縮する可能性を秘めています。個人的には、Claude Code との組み合わせで、より高速なバイブコーディングを実現できるのではないかと期待が膨らみます。

検証結果と導入要件

JetBrains Researchの報告によると、適応されたSpring Petclinic Kotlinプロジェクトで18箇所のasLlm呼び出しサイトを用いたテストでは、24のアプリケーションシナリオすべてがスマートマクロの進化後に完了しました。ホットリロードの成功率は100%で、コンパイルと再定義によるランタイムオーバーヘッドは約1%と報告されています。 (出典)

また、「GitHub Beginner Issue Radar」という合成プロジェクトでは、20のリポジトリと3万件以上のイシューデータから、初級者向けイシューを解析し、0.89の再現率を達成したとのことです。これは、LLMが実用的なコード生成とデータ解析能力を持っていることを示唆しています。

導入には以下の要件があります。 (出典)

  • IntelliJ IDEA 2025.2.x
  • JDK 21
  • OpenAI APIキー:ターゲットプロジェクトの.kotlinllmファイルに保存(Tools > KotlinLLM Settingsから設定)

ローカルLLMを動かすのが趣味の自分としては、OpenAI APIキーだけでなく、ローカルLLMとの連携もサポートしてくれると嬉しいところです。例えば、Llama.cpp などで手軽に動かせるモデルと連携できれば、より多くの開発者が試せるようになるのではないでしょうか。