AIエージェントがRust製QRコードエンコーダ/デコーダをゼロから自律構築するデモ。
ローカルLLM(Ollama)がRustコードを生成し、Podmanコンテナ内(--network=none)でビルド・テスト。テスト結果をフィードバックして反復改善する「ラルフループ」パターンで、外部ライブラリなしの純粋なQRコード実装を目指す。
Anthropicの Cコンパイラ事例 と Ralph Wiggum パターンを ローカルOllama に適用。
┌──────────────────────────────────────────────┐
│ ralph_loop.sh │
│ ┌────────┐ ┌──────────┐ ┌───────┐ │
│ │ Coder │──→│ Reviewer │──→│ Fixer │ │
│ └────────┘ └──────────┘ └───────┘ │
│ ↑ │ │
│ └──────── feedback ────────┘ │
├──────────────────────────────────────────────┤
│ Ollama API │ Podman (no network) │
│ (localhost:11434) │ Rust build & test │
└──────────────────────────────────────────────┘
- Iteration 1: Coder が初期実装を生成
- Iteration 2+: Reviewer がテスト失敗を分析 → Fixer が修正パッチを適用
- 各イテレーション:
--network=noneコンテナ内で5フェーズテスト → フィードバック - 回帰ガード: フェーズ数が減少した場合、自動リバート
| ツール | バージョン | 用途 |
|---|---|---|
| macOS (Apple Silicon) | M1/M2/M3/M4 | ホスト |
| Ollama | v0.16+ | LLMランタイム |
| Podman | v5.0+ | コンテナ実行 |
| Python3 | 3.9+ | JSON/コード処理 |
| Git | 2.0+ | 進捗管理 |
# Ollama起動(別ターミナル)
ollama serve
# モデルダウンロード(初回のみ)
ollama pull qwen3-coder:latestgit clone https://github.com/tnk4on/ai-qr-coder.git
cd ai-qr-coder
./setup.sh# デフォルト(L1, 最大20イテレーション)
./run.sh
# モデル指定
./run.sh --model qwen3-coder:latest
# カスタム設定
./run.sh --hint-level 3 --max-iterations 10
./run.sh --model qwen2.5-coder:14b --max-iterations 30
# ワークスペース削除確認をスキップ
./run.sh --forceconfig.env を編集:
TARGET_URL="gihyo.jp" # QRコードに変換するURL
OLLAMA_MODEL="qwen3-coder:latest" # 使用モデル
HINT_LEVEL=1 # ヒントレベル (0-5)
MAX_ITERATIONS=20 # 最大イテレーション数| Level | スケルトンの内容 | 難易度 |
|---|---|---|
| L5 | L4 + 小型モデル向け専用プロンプト | ★☆☆☆☆☆ 最も簡単 |
| L4 | 全ヘルパー + encode/decode実装済み | ★★☆☆☆☆ |
| L3 | 全ヘルパー + 詳細レシピ | ★★★☆☆☆ |
| L2 | 全ヘルパー + 簡易TODO | ★★★★☆☆ |
| L1 | データエンコーディング系をTODO | ★★★★★☆ 推奨 |
| L0 | グリッド/マスク等もTODO | ★★★★★★ 最も難しい |
| Phase | テスト内容 |
|---|---|
| 1 | cargo build — コンパイル |
| 2 | cargo test — ユニットテスト |
| 3 | エンコード — PBM出力検証 |
| 4 | ラウンドトリップ — encode → decode → 一致 |
| 5 | 外部スキャン — zbarimg で読み取り |
M1 Max (64GB)、ヒントレベル L1 でのテスト:
| モデル | サイズ | 結果 | イテレーション数 | 時間 |
|---|---|---|---|---|
| qwen3-coder | 18 GB | 5/5 ✅ | 1 | 50–78s |
| qwen3.5 | 17 GB | 5/5 ✅ | 1 | 760s |
| qwen2.5-coder:14b | 9.0 GB | 5/5 ✅ | 3 | 702s |
| qwen2.5-coder:7b | 4.7 GB | 3/5 ❌ | 10+ | — |
| codellama | 3.8 GB | 0/5 ❌ | 3 | — |
注意: LLMの出力は非決定的です。実行ごとに結果が異なる場合があります。
# 特定のモデルでベンチマークを実行
./bench_run.sh <モデル名> <ラベル> [ヒントレベル]
# 例:
./bench_run.sh qwen3-coder:latest qwen3_L1 1
./bench_run.sh qwen2.5-coder:14b qwen25_14b_L3 3結果は agent_logs/<ラベル>_full.log に保存されます。
ai-qr-coder/
├── run.sh # エントリーポイント
├── setup.sh # 環境セットアップ
├── bench_run.sh # ベンチマーク実行
├── config.env # 設定
├── Containerfile # Rust開発コンテナ
├── scripts/
│ ├── ralph_loop.sh # メインループ (Coder/Reviewer/Fixer)
│ ├── generate_skeleton.sh # ヒントレベル別スケルトン生成
│ ├── test_harness.sh # 5フェーズテストスイート
│ ├── extract_code.py # LLM出力 → ソースファイル抽出
│ ├── stream_ollama.py # Ollama APIストリーミング
│ └── pbm_to_png.py # PBM → PNG変換
├── prompts/
│ ├── coder_L[0-5].md # コーダープロンプト (レベル別)
│ ├── coder_review.md # レビュアープロンプト
│ └── coder_fix.md # フィクサープロンプト
└── skeleton/ # 初期Rustプロジェクトテンプレート
├── Cargo.toml
└── src/
├── main.rs # CLIインターフェース(固定)
└── qrcode.rs # GFテーブル + ヘルパー + TODOスタブ
# 各イテレーションのログ
ls agent_logs/coder_iter_*.log
# ワークスペースのgit履歴
cd workspace && git log --oneline- Building a C compiler with a team of parallel Claudes
- Ralph Wiggum Plugin
- Ollama
- QR Code Specification (ISO 18004)
このプロジェクトは Apache License 2.0 でライセンスされています。