概要
- CloudflareのAIによるNext.js再実装事例を参考に、Reco社がJSONata互換エンジン「gnata」をGoで開発。
- 7時間・$400のコストで1,778テストケースをパス、パフォーマンスを大幅改善。
- 年間$500Kのコスト削減、レイテンシー・リソース問題も解決。
- AIによるコード生成とレビューの実践事例。
- gnata導入とバッチ処理最適化による運用改善。
Cloudflare事例から着想を得たAI活用法
- CloudflareはAIとエンジニア1名でNext.js APIをVite上に再実装、$1,100のトークンコストで完了。
- 既存のNext.js仕様とテストスイートをAIに与え、全テストパスまで自動実装を繰り返す手法。
- Reco社も同様の課題(JSON変換パイプライン)を抱えていたため、同アプローチを採用。
JSONata運用上の課題
- Reco社ではポリシーエンジンが膨大なJSONata式をデータパイプライン上で評価。
- JSONataはJavaScript実装のみで、Goサービスとの間はKubernetes上のNode.js RPC経由で通信。
- イベントごとにシリアライズ・ネットワーク転送・評価・再シリアライズが発生、年間約$300Kの計算コストに加え、レイテンシー増大。
- シンプルなフィールド参照でもRPC往復のオーバーヘッドが顕著。
- 過去に式最適化・キャッシュ・V8組み込みなど試行したが根本解決には至らず。
gnata構築プロセス
- 週末にAIを活用し、開発を「ウェーブ」単位で計画。
- 公式jsonata-jsテストスイートをGoに移植し、全テストパスまで実装を進行。
- 7時間で13,000行のGoコード・1,778テストケース合格、トークンコスト$400。
- 月間$25Kかかっていたjsonata-js運用がgnata導入で0に。
gnataのアーキテクチャと高速化
- 二段階評価アーキテクチャを採用。
- コンパイル時に式を解析・分類。
- シンプルな式(フィールド参照や21種の組み込み関数)は生JSONバイトに直接適用、ヒープ割り当てゼロ。
- 複雑な式は必要な部分のみパース・評価。
- ストリーミング層(StreamEvaluator)で複数式を1回のスキャンで評価、キャッシュとロックフリー設計。
- キャッシュ容量は設定可能、古いエントリは自動削除。
- 正式テスト1,778件+本番統合テスト2,107件で正確性を担保。
- 単純な式はRPC廃止で1,000倍高速化、複雑な式でも25-90倍高速化。
導入・検証・本番化
- 初日でgnataライブラリ完成、PR提出。
- 2-6日目はコードレビュー・QA・プリプロダクションのシャドウモードで実運用式と比較検証。
- 7日目、3日連続で差異ゼロを確認しgnataを本番に昇格。
- jsonata-jsのバグもgnata導入で発見・修正。
AIコードレビュー体制の進化
- gnataはAI生成コードをAIエージェントがレビューする初の大規模PR事例。
- エージェントは本質的な並行性バグから表面的な指摘まで幅広く検出。
- この経験がAIコードレビュー体制の改善に寄与。
バッチ処理最適化による追加コスト削減
- gnata導入でRPCコスト$300K削減後、ルールエンジンのバッチ処理最適化にも着手。
- 以前はJSONataの制約で大量のgoroutine・高メモリ消費・CPU競合が発生。
- gnataはバッチ処理制約がないため、シンプルかつ高効率な実装に刷新。
- リクエストコアレッシング・短命キャッシュ・グループ化クエリなどを導入。
- 結果、月額$18K(年間約$200K)追加削減、合計$500K/年のコストダウン。
AI主導の開発と今後の展望
- AIによる完全自動コードが本番運用に適するか議論は続くが、gnataは有効事例となった。
- Andrej Karpathyの指摘通り、トップ層では技術力がAI活用のレバレッジをさらに高める時代に突入。
- 2026年は「サージカルリファクタリング」の年になると予想。
gnataの導入方法とリソース
- 導入例:
go get github.com/recolabs/gnataexpr, _ := gnata.Compile("user.role = \"admin\" and user.loginCount > 100")json := []byte("{ \"user\": { \"email\": \"admin@example.com\", \"role\": \"admin\", \"loginCount\": 247 } }")result, _ := expr.EvalBytes(ctx, json)fmt.Println(result) // true
- ドキュメント・ストリーミングAPI・WASMプレイグラウンド: