生成AIで実装を進める機会が増えてきました。
簡単なCRUDだけでなく、管理画面やフロント画面までAIに作らせることも珍しくありません。
そんな中、実際に遭遇した「AIらしい」不具合を紹介します。
今回の構成
今回のシステムはシンプルです。
- バックオフィスで記事を作成する
- フロント画面でユーザーが記事を閲覧する
- ユーザーは「いいね!」や「お問い合わせ」ができる
- 管理画面では記事一覧を更新日時順で表示する
また、記事には次の情報を保持しています。
- 閲覧数
- いいね数
- お問い合わせ数
これらはユーザー操作に応じてカウントアップされる仕様でした。
発生した不具合
テスト中に次の操作を行いました。
- 数日前に投稿した記事を開く
- フロント画面から「いいね!」を押す
- 管理画面の記事一覧を確認する
すると、その記事が一覧の一番上へ移動していました。
理由は単純です。
updated_at が更新されていたからです。
なぜ起きたのか
AIから見ると、この実装は自然です。
いいね数が変わる
↓
DBをUPDATEする
↓
updated_atも更新される
Laravel や Rails、Prisma などのORMでも、通常のUPDATEを実行すれば updated_at は更新されます。
つまりAIは、
データが更新された
という事実だけを見ています。
でも業務上は違う
今回更新されたのは、
- いいね数
だけです。
記事本文を更新したわけではありません。
- タイトル
- 本文
- 公開状態
- カテゴリ
- タグ
これらは何一つ変わっていません。
つまり、
記事の更新
ではなく、
リアクション情報の更新
です。
この「属性の違い」をAIは判断できません。
原因は仕様不足
仕様書には、
いいね数を更新する
とは書かれていました。
しかし、
いいね数・閲覧数・お問い合わせ数の更新では記事の更新日時は変更しない
とは書かれていませんでした。
人間同士なら、
「いや、それ記事更新じゃないよね」
という会話になります。
しかしAIは、その暗黙知を持っていません。
テストで見るべきだったこと
最初は、
- いいね数が1増えること
だけを確認していました。
しかし、本来確認すべきだったのは次の内容です。
-
updated_atが変わらないこと - 管理画面の並び順が変わらないこと
- 「最近更新した記事」に表示されないこと
- 更新通知の対象にならないこと
正常系だけを確認すると、この不具合は見逃します。
AI開発では「更新してはいけないもの」を仕様に書く
最近感じるのは、
AIは
何を更新するか
は非常に得意です。
一方で、
何を更新してはいけないか
は、仕様に書かなければ判断できません。
最近は仕様を書くときに、次のようなルールを明記するようにしています。
・記事本文を更新した場合のみ updated_at を更新する
・閲覧数
・いいね数
・お問い合わせ数
これらの変更では updated_at を変更しない
この一文があるだけで、防げる不具合は意外と多いです。
まとめ
今回の不具合は派手ではありません。
画面は正常に動きます。
いいね数も増えます。
しかし業務として見ると、記事一覧の並び順が変わり、管理画面の意味そのものが変わってしまいます。
生成AIで実装する場合は、
「何を更新するか」だけではなく、「何を更新してはいけないか」まで仕様に書く。
この視点を持つだけで、AIが生み出す不具合はかなり減らせると感じています。
