
私のAIと、お客さまのAIが、正反対の結論を出した話
こんにちは、DIVXの堀次です。
「AI で確認しました」——最近よく交わすこの一言が、正反対の意味でぶつかった出来事がありました。この記事では、AI を使った確認がなぜ食い違うのか、そして何を"正"とすれば決着するのかを、実体験からまとめます。データ移行・運用保守・検証フローに関わるエンジニアや PM の方に、とくに読んでほしい内容です。
あるデータ移行の突き合わせをしていたときのことです。移行対象のうち一群が「本番DBに登録されていない=対象から漏れている」という結果が出ました。私は生成 AI にも手伝ってもらいながら確認し、そのうえで自分でも本番DBを直接叩いて裏を取っていました。数字は動きません。無いものは無い。
念のため、お客さまに連絡しました。「この一群が本番DBに見当たりません。こちらでも AI で確認済みです」。返ってきたのは——「私の AI は、全件登録済みだと言っています」。
私の AI は「無い」。お客さまの AI は「ある」。同じ事実について、2つの AI が正反対の結論を出していたのです。
相手の言い分は、むしろ筋が通っていた
ここで大事なのは、お客さまが雑だったわけではない、ということです。それどころか、相手には整合した説明がありました。要約するとこうです。
- 対象は先日、一括で登録しました。登録処理の完了画面まで確認しています
- 管理画面(UI)上でも、件数の一致を目視で確認しています
- もし「分析用に同期している別のデータストア」で見ているなら、そちらは同期が数日前で止まっているので、未登録に"見える"だけではないでしょうか
相手は「本番DBを見れば、これだけの件数があるはずだ」と、期待値まで添えてきました。ただしそれは、**"登録したはず"という前提から逆算した予想**であって、実データを数えた結果ではありません。相手が確認していたのは、自分で手を動かした登録作業と、その完了画面・UI・AI の言葉であって、データそのものを測ってはいなかったのです。
ここに、この一件の非対称性があります。私はデータを測っていました。相手は、処理の"完了した"という申告を信じていました。
とはいえ、相手の説明はもっともらしいものです。完了画面が出て、UI の件数も合っていて、AI も「登録済み」と言います。しかも「未登録に見えるのは同期遅れのせい」という、こちらの観測を否定する仮説まで用意されています。普通に聞けば、「ああ、じゃあ自分の見ている場所が悪いのかな」と思ってもおかしくありません。
決着をつけたのは、本番DBそのものだった
それでも私は、もう一度本番DB(=正とすべき一次情報。もっとも信頼すべき大元の情報) を直接確認しました。分析用のレプリカ(本番DBをコピーした参照用の別ストア)でも、UI の表示でもなく、大元のデータを数えにいきます。
結果は変わりません。相手が「登録したはず」と言った一群は、本番DB にはほとんど存在しませんでした。 凝ったことは何もしていません。登録処理そのものが失敗していて、そもそもデータが書き込まれていないのですから、見る場所さえ正しければ、答えはひとつでした。
私はそれを、「私がそう思った」ではなく、相手が自分の環境で同じように再確認できる検証手順と、その結果の形で、エビデンスとして共有しました。
少しして、お客さまから連絡が来ました。本番DBに登録が残っていないという点で認識が揃い、お客さま側で原因の調査が始まりました。
最初は、同じ時間帯に起きていたインフラ側の不調(一時的なシステム障害)との関連が疑われましたが、突き止められた原因は登録処理そのものにありました。**"完了しました" という表示は出ていたのに、一括登録はデータを永続化しきれていなかった**のです(ここでの"永続化"とは、一時的な表示ではなく、DB に実際に保存されている状態のこと)。
勝った、という話ではありません。誰も怠けていません。相手はちゃんと手を動かして登録し、完了画面も UI も AI も確認していました。ただ、それらが揃って「登録済み」と言っているのに、実データは違った——というだけです。
なぜ、2つの AI は正反対だったのか
この一件がおもしろいのは、失敗が一箇所ではなく、三つの層で「登録済み」という誤りが積み重なっていたことです。
層1:AI は、渡された根拠に忠実
2つの AI の賢さの差ではありません。違ったのは「何を根拠に見ているか」です。私の AI が見ていたのは本番DBの照合結果、つまり実際に起きていること。相手の AI が見ていたのは、おそらく「登録したはず」という経緯。AI は確かな根拠(一次情報)を渡されないと、与えられた前提に沿った"それっぽい追認"を返します。
AI の結論は、AI の頭の良さではなく「どの一次情報に接続しているか」で決まります。
「AI で確認しました」という一言は、実は二通りの意味を持ちます。実データに当てにいった "確認" なのか、手元の前提をなぞらせた "追認" なのか。今回は、その二つが正面からぶつかりました。
層2:「完了しました」は「保存されている」ではない
完了画面も、UI の件数一致も、"処理がそう主張している" というシグナルにすぎません。実際に永続化された状態とは、別物です。今回の障害は、まさにこの隙間——「成功表示は出たが書き込まれていない」——で起きました。処理の自己申告ではなく、永続データそのものを見にいかないと、この手の食い違いは捕まえられません。
層3:どのデータストアを"正"とするか
分析用に同期しているレプリカは、遅延しえます。今回、それは「未登録に見えるのは同期遅れのせい」という、こちらの観測を否定するもっともらしい材料にもなりました。どこを正とするかを最初に握っていないと、二次情報の遅延に説明を持っていかれます。
AI 時代の検証の型
この一件を、そのまま手順に落とすとこうなります。特別なことは何もありませんが、AI と自動化が絡むと意外と抜けます。
- 正(一次情報)を先に決める — 「何をもって事実とするか」を握ります。今回なら本番DB。UI の表示でも、分析用レプリカでも、AI の弁でもありません。
- AI には根拠付きで当てさせる — 実データに接続させる、あるいは自分が実データを持ちます。根拠を渡さない AI の答えは "確認" ではなく "追認" になります。
- "成功表示" を信じず、永続データで裏を取る — 「完了しました」と「保存されている」は違います。障害はその隙間で起きます。
- どのデータストアを見ているかを疑う — 分析用のレプリカは同期が遅れることがあり、「未登録に見えるだけ」というもっともらしい説明の材料にもなります。正とすべき大元を見ているか、常に確認します。
- 再現可能な形で共有する — 「私の記憶では」でも「AI がそう言った」でもなく、相手の環境でも同じ結果が出るもの(検証手順と結果)で渡します。だから相手も自分で気づけて、角も立ちません。
この一件以降、私は AI を使った確認で二つのことを習慣にしています。作業を始める前に「何を正とするか(どのデータを一次情報とみなすか)」を決めておくこと。そして、根拠にしたデータと確認手段をセットで残すことです。AI を "判断者" ではなく、"根拠付きで検証を加速してくれる相棒" として扱う——そう位置づけるだけで、この種の食い違いはかなり防げます。
今回でいえば——2つの AI が正反対のことを言い、完了画面まで「登録済み」を指していたとき、最後に正解を教えてくれたのは、誰の AI でもなく、ただの実データでした。



