社会人になって個人開発に割く時間がかなり減ったのを痛感している。
そんな中、最近は開発時間を圧縮できないかとAIコーディングを試しているので、その際得られた知見をメモしていた。
本当はZennに上げたいけど、体裁を整えると時間がかかるのでとりあえず個人ブログに残すことにした。
前提
モデル
Geminiを使っている。理由は安いから。 課金もしているけど、Tier1の現状で今まで100円を超えたことがない。
最近はすぐレートリミットに到達してしまうので、ドキュメントを見てレートについて調べてたんだけど、開発に影響が出ない150RPM以上のレートでGeminiを使えるようにするにはTier1(いわゆる通常の課金)を行う必要があるらしい。
Geminiは性能がイマイチな印象が結構あると思うけど、実際触ってみるとOpanAIのモデル程じゃないにしてもそこそこ使えるなという感触がある。
Flashはとにかく応答が速いけど、かなりアホの子なのでweak-model
として使うと良さそう。
エディタ
Emacsを使っている。理由は便利だから。 後述するけど、aiderとEmacsを連携させるためのパッケージとしてaider.elを使っている。
エディタで使う
aider --watch-files
で起動する。 コードにAI
やAI!
、AI?
で終わるコメントを記述する。 コメントの内容に応じてaiderがコードを編集する。
AI!
はコードを編集AI?
はコメントの質問に回答AI
はaiderに注目させるために使う。最後にAI!
を付けるとまとめて適用できる。 また、AI
コメントは/add
コマンドでファイルを追加する操作と同等。 これらのキーワードはai
やai!
、ai?
など小文字でも認識する。
これらのキーワードは一行コメントの末尾でしか認識しないので注意。
コマンド
チャット内でコマンドを使うことでエージェントに的確な指事を行える。 コマンドは/
から始まる。
/chat チャットモード
/archtect アーキテクトモード
/run コマンド実行
みたいな感じ。
使用できるコマンドは In-chat commands に書いてある。
設定
yamlを用いてaiderの設定ができる。(.aider.conf.yml) -> 書くの面倒なのでNixで書いてyamlを生成したい
FAQ
clinerulesみたいな事がしたい
.aider.conf.yml
に以下の設定を書くと読み取り専用ファイルとしてコンテキストに追加される。
read:
- .aiderrules
- README.md
ここに.aiderrules
を追加することで疑似的にclineっぽい挙動が可能。 これについてはissueにも書いてある。
プロジェクト構造を変更した後に更新し忘れる事がままあるので、「.aiderrulesの内容と現在のプロジェクトを比較し、異なっている箇所を列挙してください」 みたいなプロンプトを定期的に実行したほうが良いかもしれない。
プロンプトについて
一般的にここに書く文章は英語の方が良いらしい。
僕はプロジェクトで使用するツールについての情報や、実行する指事について書いている。 例えば、aiderはPythonプロジェクトだとデフォルトでlintにflake8
を使うのだけど、僕は専らruffを使っているので それに関する指事を書いたりしている。
aiderは自動的にlint, format, コードのデバッグ実行を行うので、それに関する情報を盛り込んでおくとかなり捗る。 Comamoca/tourmas-datarepo
にはこんな感じのルールを書いている
回答は必ず日本語でお願いします。
このプロジェクトではuvを採用しています。 Pythonスクリプトを実行する際は
./validators/
配下にてuv run
コマンドを先頭に付けてpythonを実行してください。また、新たにPythonパッケージをインストールする際は
./validators/pyproject.toml
のdependencies
を編集した後、./validators/
ディレクトリにてuv sync
を実行してください。このプロジェクトではlinterにflake8ではなくruffを採用しています。 lintを実行する際は
ruff check
コマンドを実行してください。
プロンプトに関してはmizchiさんの.clinerules
がかなり良い感じなのでここで紹介する。
Tips
ドキュメントに書いてあるTipsについて。
目標を段階的に分割する
一度に 1 つずつ実行しる。作業を進めるにつれて、チャットに追加するファイルを調整しる。変更が不要になったファイルは /drop
で削除し、次のステップで変更が必要なファイルは /add
で追加。
複雑な変更については、最初に計画を立てる
/ask
コマンドを使用して、aider と計画を立てる。アプローチに満足したら、/ask
プレフィックスなしで「go ahead」と言うだけで実行できる。
aiderが行き詰まった場合
/clear
を使用してチャット履歴を破棄し、再起動する。- 不要なファイルがあれば
/drop
で削除する。 - コード編集を開始する前に、
/ask
を使用して計画を話し合う。 /model
コマンドを使用して別のモデルに切り替え、再度試行。GPT-4o と Sonnet の切り替えが良いらしい。- 完全に動かなくなった場合は、自分でコードを書いた後再度やらせる。
新しいファイルを作成する
/add <ファイル>
で追加できる。
バグとエラーを修正する
エラーが起こったら/run
コマンドを使用してエラー出力をaiderに送る。 テストが失敗する場合は、/test
コマンドを使用してテストを実行し、エラー出力を aider と共有する。
ドキュメントを提供する
URLを貼り付けると自動でサイトを読み込みコンテキストに追加する。 /read
を使うとローカルのファイルを読み込める。
通知
--notifications
オプションをつけるとLLMが応答を待っている時に通知が送信される。
macOSではterminal-notifier
Linuxではnotify-send
とzenify
WindowsではPowerShell
がそれぞれ使われる。
ブラウザ
--browser
オプションを指定すると実験的なブラウザUIが起動する。
クリップボード
コンテキストのコピー
/copy-context <instructions>
でaiderが保持しているコンテキストをコピーできる。
貼り付け
/paste
でクリップボードのテキストをaiderへと貼り付けられる。
自動読み取り
--copy-paste
オプションを指定するとクリップボードにテキストがコピーされた時に自動的にaiderのチャットへと貼り付けられる。 他のLLMとやり取りをするのが多い際に便利。
モデルの設定
トークンの制限
.aider.model.metadata.json
をホームディレクトリかプロジェクトルートに作成するとトークン数の制限などが可能になる。 設定は以下のように行う。 該当ドキュメント
{
"deepseek/deepseek-chat": {
"max_tokens": 4096,
"max_input_tokens": 32000,
"max_output_tokens": 4096,
"input_cost_per_token": 0.00000014,
"output_cost_per_token": 0.00000028,
"litellm_provider": "deepseek",
"mode": "chat"
}
}
weak-model
aidreはコードを編集する際に自動的にcommitを行う。 この時コミットメッセージを生成するのに使われるのがweak-model。 commitメッセージの生成は比較的コードの生成より求められる能力が低いので、そこに 廉価なモデルを割り当てることでコストの削減が期待できる。
Emacsで使う
ここではEmacs固有の設定などを解説する。
どのプラグインを使うべきなのか
aider.elとaidermacsがある。 どちらも機能に大差はないが、aider.elの方が勢いがあるように見える。 また、aider.elはaiderとの対話にcomint-modeを使用するが、aidermacsはオプションでvtermが使える。 ファンシーな見た目で対話したかったらaidermacsの方がいいかもしれない。
僕は以前までaidermacsを使っていたけど今はaider.elを使っている。 後述する--watch-files等の問題が解決しているように見えるのと、
認証情報について
Emacsでは組み込みでauth-infoという認証情報を管理する仕組みが備わっている。 aidermacsではこのauth-infoを用いて認証情報を取得する。
auth-infoは~/.emacs.d/auth-info
ファイルにnetrc形式でパスワードを書いて利用する。 もしPGP鍵を持っているのなら、暗号化を有効にできるので暗号化を行うのを強く推奨する。
--watch-filesオプションが有効にならない場合
aidermacsなどaiderをEmacsから使用している際に--watch-files
オプションが効かない事がある。該当issue これはTERM=DUMB
に関連する設定が影響している。
aiderを起動する際にTERM=dumb aider --watch-files
のようにして起動するか、comint-terminfo-terminal
にeterm-color
を指定する。 またはaiderの起動コマンドに--no-pretty
と--no-fancy-input
を追加すると解消できる可能性がある。
編集形式
aiderがコードを編集する際に使う形式について。
- whole
- diff
- diff-fenced
- udiff
- editor-diff
- editor-whole
の形式がある。 aiderは自動で最適な編集形式を選択するが、--editor-edit-format
オプションで変更可能。
whole
最も単純な編集形式。 ファイルの内容の全てをコピーし、変更した結果を返す形式。 比較的高い精度が出やすい形式だがファイルが大きいと時間がかかるようになる。
diff
git mergeと同じ形式を使ってファイルを変更する部分のみを返す形式。 変更した箇所のみ返すので効率的。
diff-fenced
主にGeminiで使用される形式。 ファイルパスがコードブロックの中に入る。 diff形式との互換性はない。
udiff
広く使われているdiff形式である統合diff形式を使用している。(いわゆる普通のdiff) シンプルなのが特徴。 GPT-4o Turboが使っていた。
editor-diffとeditor-whole
architect modeで使われる形式。 どのファイルを変更するべきかに集中したプロンプトを使用する。
ドキュメントを読んでいて面白そうだと思った機能
Scripting aider
shellやPythonからaiderを呼び出す方法が載っている。該当ページ
--message
オプション 対話型ではなく一度の指示で一つの動作をさせるというもの。シェル芸でやっていた雑用がちょっと楽になりそう。Pythonライブラリ aiderの機能をPythonから呼び出せる。aiderベースのエディタを作る時とかに良さそう?
archtect mode
推論と編集でモデルを分けて使用するモードらしい。 モデルを複数使用するため料金はかさむがより良い結果が得られるとか。