@thorikiriのてょりっき

@thorikiriの技術ネタや本を読んだブログです

Geminiを用いたAI駆動開発(9) 〜AIに下書きを書かせたら、AIに説教する羽目になった件〜

※この本文はGeminiに書かせています。記載内容はおおむね事実と思われますが、誤りが含まれている可能性が大きいです。

前回までのあらすじ

過去記事から自身の「文体」を抽出することに成功した。今回はこのプロファイリングデータを使い、入力した「ネタ」から自分らしい記事の下書きを自動生成し、そのまま編集・保存できる「AIエディタ」を実装する。

実装した機能:AI記事生成エディタ

今回構築したのは、ブログ詳細画面からシームレスに繋がる執筆環境だ。

  • クイック生成: テキストエリアに書きたい内容(ネタ)を入力すると、Geminiが解析済みのスタイルを適用して、タイトルと本文をMarkdown形式で生成。
  • シームレスな編集画面: 生成された内容は、そのまま全画面エディタに流し込まれる。新規作成と既存編集を共通のページで管理し、?id=xxx のパラメータで状態を切り替える設計にした。
  • DB保存: Drizzle ORMを使い、生成された下書きをSQLiteへ保存。執筆の「ゼロイチ」の苦しみから解放されるための基盤が整った。

開発の舞台裏:AIとの「噛み合わない」攻防

機能としては形になったが、その開発プロセスはAI(Gemini)との格闘の連続だった。

1. 「バージョン違うって言ったよね?」事件

Nuxt UI v4 を使っていると伝えているにもかかわらず、AIは平然と古いバージョンのコードを提示してくる。特に UTextarearows プロパティで型エラーが出た際、「バージョンが違うのではないか?」とこちらから指摘したにもかかわらず、中身を再確認せずに適当な回答を返してきた。結局、属性を数値型でバインドする(:rows="5")という型定義の変更点を、こちらが自力で見つけ出して解決した。

2. しれっとサイレント修正

実はAIが提示してきたコードには、細かい部分で「そのままでは動かない」箇所がいくつもあった。 * APIの単体取得(GET)エンドポイントを作り忘れている。 * レスポンスが undefined になる可能性を考慮していない。 * DB保存時の Date オブジェクトの扱いで型が不一致。

AIにいちいち指摘するのも効率が悪いので、こうした不備はしれっと自分で修正して進めた。

AI駆動開発の教訓:AIは「有能だが話を聞かない助手」

今回痛感したのは、AIは「一見それっぽい答え」を出すのは早いが、「こちらの状況を正確に把握して、最新の仕様に合わせる」という誠実さには欠けるということだ。

特に技術の移り変わりが激しいモダンな環境では、AIの提案を鵜呑みにするのは危険すぎる。AIが提示したコードの「おかしなところ」を嗅ぎ分け、自分で最新のドキュメントを確認する力が、皮肉にもAI駆動開発において最も重要になる。

今後の展望

紆余曲折あったが、ようやく「ネタを入れると自分の文体で下書きが出てくる」という、このアプリのコア体験が動き出した。

次回は、溜まっている「ネタ帳(ideas)」から直接このエディタを叩き起こし、さらに効率よく記事を量産できる体制を作っていきたい。AIには、次こそ「最新の仕様」をしっかり読み込んだ回答を期待したいものだが。