「JSONだけ返して」と頼んだら、AIは調べるのをやめて出典を作った — 6回中1回しか検索しなかった日の記録 — 制作日誌 #34
制作日誌

「JSONだけ返して」と頼んだら、AIは調べるのをやめて出典を作った — 6回中1回しか検索しなかった日の記録 — 制作日誌 #34

推しの出演情報をAIに調べさせる機能を作った。返ってきたのは、それらしい形をした実在しない出典URLだった。原因は鍵でもお金でもなく、こちらの頼み方にあった。言い方とAIの種類を変えて、検索した回数を数えた記録。

KIYODO
#個人開発#生成AI#アプリ開発#失敗の記録#制作日誌

図書館で司書に「この作家の新刊を調べて、カード1枚に書いて渡して」と頼む。カードの書式をあまりに細かく指定すると、司書は書庫に行かず、覚えている範囲でカードを埋めて返してくる。棚番号の欄も、それらしい番号で埋まっている。

自作の「推しの出演情報を集めるアプリ」で起きたのは、これだった。

例え実際
司書文章を作るAI(Google の Gemini)
書庫に行くAIが Google 検索を使って調べる
カードの書式「JSON という決まった形だけで返せ」という指示
それらしい棚番号実在しない出典URL

この例えにも外れる所がある。司書は手を抜いているが、AIに手を抜く意図はない。検索するかどうかを、AI自身がその都度決める作りになっていて、その判断が形の指示に引っ張られていた。

何を作ろうとしていたか

アプリは、好きな芸能人やグループを登録すると、出演する番組やイベントを日付順に並べて見せる。出演情報は、サーバーがAIに「この人の今後の出演予定を調べて」と頼み、返ってきた結果を画面に出す。

最初は、Google 側の利用枠が0になっていて、検索つきの呼び出しが全部はねられていた。検索なしの呼び出しは通るのに、検索をつけた途端に「上限に達しました」と返る。鍵が生きているので、検索も通ると思い込みやすい所だった。別の鍵を用意して、この壁は越えた。

ところが、壁を越えても、画面に出る出演情報は1件も本物にならなかった。

返ってきたもの

出典欄に並んでいたのは、プレスリリース配信サイトの住所の形をしたURLだった。番号の部分が 000000000.000000000 のように0で埋まっている。開くと何も無い。

サイト名は実在する。住所の形も、そのサイトの本物と同じだ。番号だけが作り物だった。ぱっと見では本物と区別がつかないので、画面に出していたら、利用者は存在しないページへ飛ばされていた。

頼み方を変えて、検索した回数を数えた

まず、こちらの頼み方を疑った。当時の指示はこうだった。「出力は JSON だけ。前後に文章を書かないこと」。アプリが機械的に読み取れるよう、形を固めたかった。

ここから、1つずつ条件を変えて試した。

試したこと検索したか
「JSONだけ返せ」(言い方を3通り)3通りとも、しない
「必ず Google 検索を使え」と念押ししない
AIが考える量の上限を外す変化なし
普通の文章で「調べてください。日付と出典を添えて」する

形の指示を外して、人に頼むような文章にした途端に、検索するようになった。念押しは効かなかった。「検索しろ」と書くより、「形を決めすぎない」方が効いた。

AIの種類で、検索する割合が違った

次に、AIの種類を変えた。Gemini には、軽くて安いものと、上位のものがある。同じ文章の頼み方で、何回検索したかを数えた。

AIの種類6回中、検索した回数
最初に使っていた軽いもの1回
一段新しい軽いもの5回
上位のもの(2種類)どちらも5回

軽いものに変えれば十分かと思った。ところが、ある有名な野球選手の名前で試すと、一段新しい軽いものでも4回中1回しか検索しなかった。問い方を3通り変えても上がらなかった。同じ問いを上位のAIに投げると4回中4回検索し、他の5人でも全員で検索した。

人によって当たり外れがある、というのが一番困る。テストで使った名前では動いても、利用者が登録した誰かで黙って作り話が返る。調べる係は、上位のAIに決めた。

1回あたりの原価は0.3円から0.9円になった。軽いAIの数倍だが、検索しなかった時のやり直しが消えるので、差は小さい。検索そのものは月5,000回まで無料で、超えると1,000回あたり14ドルかかる。

検索した証拠の欄が、検索していても空だった

もう1つ引っかかった。AIの返事には、本来「どのページを見たか」の記録欄が付く。これを見れば、検索したかどうかを判定できるはずだった。

実際には、検索していても、この欄が欠けることがあった。3回中2回、欠けていた。欄だけを信じると、ちゃんと調べた答えまで捨ててしまう。

本文の方を見ると、検索した時だけ現れる Google の中継用のURLが混ざっていた。そこで、記録欄と、この中継URLの2つのどちらかがあれば「検索した」と判定することにした。

作り直した形

最終的に、1回で済ませていた呼び出しを2回に分けた。

段頼む内容検索形の指示
1段目普通の文章で「調べて」ありしない
2段目1段目の文章を JSON に直すなし厳しくする

2段目は検索しないので、形を厳しく縛っても困らない。むしろ、決まった形で返させる仕組みが使えるので、形が崩れる事故も一緒に消えた。この仕組みは、検索つきの呼び出しとは同時に使えない。分けたことで、両方の良い所が取れた。

加えて、決めごとを2つ入れた。

1つ目。検索した証拠が無い返事は捨てる。3回まで試して、それでも検索しなければ「取れませんでした」として落とす。作り話を黙って画面に出すより、空の方がましだ。

2つ目。出典URLは、AIの自己申告をそのまま使わない。実際に検索で踏んだサイトの住所と一致するもの、または中継URLだけを残す。

結果

軽いAIで2段にした時点で、4人中3人で実際の出演情報が取れた。アイドルグループが11件、お笑いコンビが9件、歌手が6件。残る1人は、例の野球選手で、2回とも検索せずに落ちた。落ちたこと自体は、決めごとどおりの動きだった。作り話は画面に出ていない。

その後、調べる係を上位のAIへ替えて、この1人でも検索するようになった。

残ったこと

AIに頼む時、出力の形を固めたくなる。アプリが読み取りやすいからだ。ただ、検索を使うかどうかをAIが自分で決める作りの場合、形の指示が強いほど、調べる手間を省いた答えが返りやすかった。しかも、その答えは形が正しいので、エラーにならない。

壊れ方が静かだった、というのが一番の教訓になった。形の崩れたJSONなら、すぐ気づく。形の整った作り話は、出典欄まで埋まって、何事もなかったように届く。

コメント (0)

まだコメントはありません。最初の一言を残しませんか?