生成AIのコード生成に適したモジュール構成とワークフロー
tl;dr
- ディレクトリ構成と運用を先に考えた
- それに従ってコード生成を行うCLIツールを書いた
想定ディレクトリ構成
こういうディレクトリ構成を考えた。
xxx-module/
deps.ts
mod.ts
mod.test.ts
lib.ts
v0.ts
v1.ts
v*.ts
README.md
PROMPT.md
バージョニングするのは、 vercel/v0 を参考にしている。
deps.ts
依存を宣言するファイル。
例
export { tpl } from "jsr:@mizchi/tpl";
外部依存はすべてここで宣言しないと使えないとする。スコープを小さくすることで、精度を上げる。
v*.ts
バージョニングされたファイル。生成される度に、新しい v*.ts を生成する。都度コミットして git history から引っ張り出してもいいが、コマンド叩く単位で git に保存をしたくないので、こうした。
lib.ts
と deps.ts
から依存を import する。
複雑なコードを生成させる時、ある種のブラックボックスとして扱うことがあるので、どの時点で動いていたか確認しながらステップバイステップで進めたい。
ある段階で動作確認ができたら最新版以外は消す。
lib.ts
export されないが内部で使う関数を定義するファイル。
prompt として入力するが、生成対象にはならない。
v*.ts
は常に全文が生成される対象になるが、リファクタしてここに移動することで生成時間を大幅にスキップできる。
README.md
ここはユーザーに対してこのモジュールの使い方を説明するセクションになるはずなので、そのままプロンプトとしてぶち込む。
PROMPT.md
ここにユーザープロンプトを書く。---
で区切って、AIには最新版を参照するように指示する。
指示1
---
指示2
そのままAIにぶち込むので、雑にメモ帳兼スクラッチパッド的にも使っていい。
@mizchi/codegen
というわけで CLI ツールを作った。claude 3 を使ったので、環境変数に ANTHROPIC_API_KEY が必要。
$ deno install -Afg jsr:@mizchi/codegen --name codegen
$ codegen new mymod
$ cd mymod
# Edit PROMPT.md
$ codegen # generate v1.ts
$ codegen fix # テストを実行しつつ、落ちていたら自動修正を試みる
$ codegen dedupe # 最新版を v0.ts にし、インラインのテストコードを mod.test.ts に移動
想定しているワークフロー
- PROMPT.md に大雑把に仕様を記述
-
codegen
でv1を生成 - 変更不要な部分を
lib.ts
に移動するようにリファクタ - PROMPT.md に
---
で区切って、追加の変更意図を記述 -
codegen fix
でテストを実行して自動修正 - 動作確認が取れたら
codegen dedupe
で新しい v0.ts を生成しつつ他を破棄
codegen dedupe
コマンドではインラインテストを mod.test.ts に移動させつつ、現在の変更意図をファイルの冒頭に要約するように指示してある。
使用感
すごい雑に動くが、人間が細かく修正することが前提になる。
v*.ts
のコード量が増えると、露骨に再生成速度が遅くなる。なので、頻繁に lib.ts
にリファクタすることが前提になる。それ用のコマンドも用意したほうがよさそう。
ある程度仕様がドキュメント化されていて、かつ外部依存が少ない時には使えそうだが、複雑なケースに対応できるかは未知数。
もうちょい研究が必要。
Discussion