Junieの調教をJunieにまかせる

前の記事でJetbrainsIDE専用AIエージェント、Junieが強いというお話をしましたが、ふわっとプロンプトを投げているとしょっちゅう固まってしまいます。それで「小分けに作業させる」が有効だ、ということを書きましたがそれも結構手間。でもこれもJunie自体に作業お願いしちゃうことができます。

今回の記事は少し突っ込んだ内容です。あっさりした前回の記事はこちら。

小分けに作業させることの意味

そもそもなんで小分けにするのかという話ですが、AIも「考える能力」は有限です。大量に考える必要がある内容を投げると、キャパオーバーして固まることが少なくありません。

たとえば人力でソフト設計する場合でも

  • 要件定義
  • 既存システムとの競合調査
  • 基本設計
  • 個別要件を機能に分解
  • 機能設計
  • 実装
  • テスト

みたいな段階を踏むと思いますが、AIエージェントも、特に前情報無しで機能作成依頼のプロンプトを受け取ると、内部で毎回こんなフローを行っています。

開発で一番時間がかかるのって上から3つの「要件定義・既存システムとの競合調査・基本設計」だと思います。そしてAIエージェントにとっても同じで、これらが重い処理になります。

つまり個別要件でプロンプトを投げたほうが、早くクォータ消費も少なく生成できるというわけですね。というかシステム全部だとフリーズしてしまって進まなくなります。

小分けにするデメリット

Junieでは、AIはチャットごとに「別人」として振る舞います。別なチャットで過去に指示したプロンプトの内容は一切把握していません。なので基本設計や他にどんな要件・機能があるのかを知らされないまま現場に放り込まれたSESみたいになります。想像するだけで胃が痛いですね。

そしてこれがどんな問題を起こすかというと、

  • 同じような機能の関数・クラスがいっぱい作られる
  • それぞれにクラスをインスタンス化してメモリ効率が悪い
  • 似たような処理なのに引数などインターフェースがまちまち

想像するだけで胃に穴が空きそうですね。

予防策

これも人間がコーディングする場合と同じなんですが、「ドキュメントや仕様書を整える」です。これで大幅にコードの品質が上がります。

とはいえドキュメントは、作成も維持もめんどくさいですよね。

なのでこれもJunieにやらせようというお話です。

Askモードの真価

前回記事ではサラッとしか触れてないASKモード、これを使います。プロンプトのインプットフィールドの左下にあります。

Askモードは直接コードを編集や操作をしませんが、そのかわり処理能力を分析に全振りする事ができます。プロジェクト全体のセキュリティ監査や不足しているテスト内容などを書き出しするような作業に向いています。

Junieに作業手順書を書いてもらう

そんなAskモードを使って、既存システムの概要と要件を伝えて、システム変更の作業手順書を書いてもらいましょう。入力するプロンプトはこんな感じで。

このシステムは〇〇の機能があり、クラス□□でその機能を実装しています。この機能を△△ライブラリを使ったシステムに置き換える変更をしたいです。
プロジェクト全体を見渡して、どこから修正すべきか考えてください。

プロジェクトの規模にもよりますが、関連するソースファイルすべてを走査しますので、数分はかかると思います。スクラッチフォルダに以下のようなMarkdownファイルが書き出されます。

修正すべき箇所と変更方針

現在の〇〇システムを△△ベースのシステムに変更するための修正箇所と方針を以下に示します。

1. コア修正箇所
A. □□の拡張 (src/core/****)
pub trait SomeTrait {
// 既存のメソッド...

// 新規追加:新機能を登録するメソッド
fn register_feature<S>(&mut self, feature: F) -> Result<(), Box<dyn std::error::Error>>
where
F: feat::Feature<Frame = f32> + Send + 'static;

// 新規追加:登録された機能をクリア
fn clear_feature(&mut self) -> Result<(), Box<dyn std::error::Error>>;
}
B. 〇〇の実装変更 (src/core/*****)
  • 内部でVec<Box<dyn feat::Feature<Frame = f32> + Send>>を保持
  • リアルタイムで△△からデータを取得して書き込み
2. □□システムの変更
A. ▽▽トレイトの拡張 (src/item/******)
pub trait Triangle: Send + Sync {
// 既存のメソッド...

// 新規追加:feat::Featureとして取得
fn as_feature(&self, frequency: f32) -> Box<dyn feat::Feature<Frame = f32> + Send>;
}

.
.
.
.
5. 修正の優先順位
  1. 第1段階□□トレイトの拡張とFeature登録機能の実装
  2. 第2段階: 単純な▽▽(Triangle)でのas_feature実装
  3. 第3段階: …….
  4. 第4段階: …….
  5. 第5段階: 他のタイプでのas_feature実装
  6. 第6段階: 既存のシステムの段階的廃止
6. 利点
  • リアルタイム性の向上: バッファの事前生成が不要
  • メモリ効率: 大きなバッファを保持する必要がない
  • 柔軟性ライブラリの豊富な機能を活用可能
  • パフォーマンス: Featureチェーンの最適化によるCPU効率の向上
7. 注意点
  • 後方互換性: 既存ベースのシステムとの共存期間が必要
  • テスト: 各段階で十分なテストを実施
  • エラーハンドリング: リアルタイム処理でのエラー処理の慎重な設計

この変更により、より効率的でリアルタイムなシステムが実現できます。

ところどころ端折っていますが、実際は各段階で具体的なコードが記載されています。

ここで大事なのは5の「修正の優先順位」です。ざっと見た感じでも人力コーディングだとそこそこ工数がかかりそう。貧弱SEワイだと2日くらい欲しいところです。

では、このMarkdownファイルをプロンプトに添付して使っていきます。

Junieが書いた作業手順書でJunieにコーディングしてもらう

ではプロンプトをCodeモードに戻して、フィールド左下にある「+」ボタンで、先程生成されたMarkdownファイルを選択します。今回のプロンプトはシンプルです。

添付のMarkdownの第1段階の修正を行ってください。

今回の手順書は第6段階までありますので、数字を増やしていってこれを6回行います。1回毎に新しいチャットでプロンプトを投げたほうが処理速度は速いような気がします。(小規模プロジェクトなら「優先順位に従って修正を行ってください」とかでもいいかもですが。)


手順書を指定してあげることで、Junieのチャットそれぞれが

  • 全体の流れ
  • どのファイルを修正したらいいのか
  • 前工程で何をしているか
  • 後工程用に準備できるものがあるか

この辺を予め理解してコードを書いてくれるので、ソースファイルごとの矛盾や重複が起こりにくくなる方法です。

かかる時間は修正内容にもよりますが、各段階それぞれ5~10分程度。終わったタイミングで手動でプロンプトを打ち直す必要がありますので放置はできないですが、今回の場合は1時間程度で終わりました。

結論:Junieやばい

というかAIエージェントやばい。来年くらいにはこれが常識になってるかと思うと末端SEとしては怖いですけど、今のうちに無双して自分のプロダクトを作っちゃうのも投資としてアリじゃないかなと。

JetBrains AllProduct pack + AI Ultimate 個人だと年7.5万、法人だと年15万くらいかかっちゃいますけどね😇💸💸💸💸

でも作業効率5倍以上になってるので、元は取れてるように感じます。


CursorとかClaude Codeでも同じようなことは出来るんですかね?そちらはさっぱり触っていないので、お詳しい方はコメントいただけると嬉しいです。


追記:ClaudeCodeは定額制のプランは月100ドルだそうで。JetBrainsが思ったよりリーズナブルでした。

コメント

1件のフィードバック

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です