AIがニュースサイトでハルシネーションを起こしていた話
自分が作ったアプリが、毎朝嘘のニュースを量産していました。
2026年3月3日にリリースした「未来のニュース」というニュースアプリがあります。AI・核融合エネルギー・量子コンピュータ・自動運転・フィンテックの5カテゴリで、Gemini APIが毎朝6時にニュースを収集・翻訳・要約してサイトに掲載する仕組みです。個人開発のアプリとしては、なかなか本格的な仕掛けを作ったつもりでした。
ワクワクと、じわじわ積もる違和感
リリース後しばらく、毎朝サイトを確認するのが楽しみでした。
「量子コンピュータが室温動作に成功」「核融合炉の商用稼働が2年以内に」――毎日、世界を変えるようなニュースが並びます。個人開発者として、自分が作ったアプリが自動でコンテンツを更新し続けている光景は、素直に気持ちよかったです。
ただ、ふとした瞬間に違和感を覚えるようになりました。
「この記事、すごい内容だな。元の記事も読んでみよう」とリンクをクリックすると、404 Not Found。別の記事を試します。また404。もう一本。また404。
最初は「URLが古くなったのかな」と流していました。けれど何度繰り返しても同じで、しかもニュースの内容が毎回「大ニュース級」すぎるのも気になり始めました。これだけすごいニュースが毎日出るなら、普通のメジャーなニュースサイトにも載っているはずです。ところがどこにも見当たりません。
Claudeに診断を依頼する
サイトのURLを貼って、挙動がおかしいこと、記事の引用元リンクを開くと404が頻発することをClaudeに伝え、検証を依頼しました。
返ってきた診断は、予想以上にはっきりしていました。
「このアプリのニュースデータ(data/news-ai.json等)は、AIが生成した架空のニュース記事です。LLMが『もっともらしい』が実在しないニュース・URL・日付・数値を生成した(ハルシネーション)と考えられます」
ハルシネーションとは、AIが知らないことを「知らない」と言えず、もっともらしい嘘を自信満々に作り出してしまう現象です。悪意があるわけではありません。ただ「答えを出さなければならない」という性質上、知識の空白を埋めるように、流暢な文章で、それらしいURLまで添えて、架空の情報を生成してしまうのです。
修正前のcronは、Gemini APIに google_search ツールを持たせた上で「〇〇の最新ニュースを5件、タイトル・URL・要約つきのJSON形式で返して」と依頼していました。GoogleでAIが検索してくれるのだから信頼できる――そう思っていましたが、落とし穴がありました。
Geminiは確かにGoogleで検索します。ただし返ってくるJSONのフィールド、特に source_url(記事の直接URL)は、AIが「こういうURLがありそう」と推測して生成していたのです。検索で読んだ内容はもっともらしく要約されますが、URLはフィクションでした。毎朝5カテゴリ × 5件 = 25記事が量産されていましたが、全25件のURLが存在しませんでした。
ひとことで言うと「Googleで調べてはいるが、URLはAIの作り話」という構造です。まるで、毎朝ニュースキャスターの格好をした作家が、取材はしているのに出典を全部でっちあげていたようなものです。
個人開発のニュースサイトとはいえ、ありもしないニュースを毎朝創作して掲載していたと思うと、背筋が冷たくなりました。自分が初めて経験した「大きなハルシネーション」でした。動いているから正しい、と無意識に信じていた自分にも驚きました。
修正方針:AIに「素材」を渡す
「嘘をつかないようにしてください」とAIにお願いしても意味がありません。AIに任せる範囲を変えるしかないのです。
修正の方針はシンプルです。
修正前: Geminiに google_search ツールを持たせて「ニュースを探して」→ 要約は事実ベースだがURLをAIが捏造(ハルシネーション発生)
修正後: Google News RSSで実際の記事URLとタイトルを取得 → 本文をスクレイピング → Geminiは「要約と翻訳だけ」担当
ClaudeにClaude Code用のプロンプトを作成してもらい、実装を進めました。方針はシンプルでしたが、実装は想像以上に泥臭い作業の連続でした。
まず、Google NewsのリンクURLが厄介でした。/rss/articles/CBMi... という形式で、Base64エンコードされたバイナリの中に実際のURLが埋め込まれている特殊な構造です。これを解読するために、3段構えの処理を組みました。
Base64デコードしてバイナリ列から http を探してURLを抽出
失敗したらcURLでリダイレクトを追跡して実URLを取得
それでもダメならHTML内の og:url メタタグなどから正規表現で探す
すべて失敗した場合は、Google NewsのURLをそのまま保存します(クリックすればリダイレクトされるので、最低限は使えます)。
記事本文の取得にも壁がありました。ニュースサイトによってHTML構造がバラバラなので、<article> → <main> → role="main" → <body> と優先順位をつけて本文を探す4段階のフォールバックを組んでいます。ナビゲーションやボタンのテキストが混入しないよう、20文字未満の段落は除外し、取得した本文は3,000文字に切り詰めてGeminiに渡します。また、記事が3件以上取得できない日はその日の更新をスキップする安全弁も追加しました。
そしてもうひとつ、地味に厄介だったのがGeminiの出力形式の問題です。「JSON配列のみ返してください。マークダウン記法は不要です」と明記しても、Geminiはしばしば ```json ``` でラップして返してきます。そのまま json_decode() するとパース失敗になるため、正規表現でマークダウンの囲みを剥がす処理を入れました。「素材を渡す」設計にしても、AIは別のところで指示を守らないことがある――これもまた、AI開発のリアルな一面です。
AIはシェフではなく、優秀な調理人です。素材(事実)は人間側が用意しなければなりません。
まとめ
ハルシネーションの怖さは「自信満々である」点にあります。フォーマットは整っていて、文章は流暢で、URLまで添えてくれます。一見すると完璧なアウトプットに見えます。だから気づくのが遅れました。
個人開発だと誰かがチェックしてくれるわけでもありません。「動いた=正しく動いている」ではないと、身をもって実感した出来事でした。
AIを活用してサービスを作るなら、「AIが嘘をつく可能性がある処理」を設計の段階から意識することが大切だと思います。特に、外部情報を取得してきたかのように見せる処理は要注意です。事実の部分と生成の部分を明確に分ける設計が、信頼できるサービスの土台になります。
早期に発見して修正できたことは不幸中の幸いでした。今後も自分のアプリはちゃんと自分で使い込んで、変な動きをしていないか確認し続けようと思います。それが一番のデバッグです。
この記事は筆者が下書きを作成し、文章の肉付け・構成の調整はClaude(claude.ai)、技術的な補足情報の提供はClaude Codeが担当しました。
#個人開発 #AIハルシネーション #Gemini #個人開発日記 #プログラミング
▼ 今回紹介したアプリはこちら
未来のニュース:https://nuko-apps.com/mirai-news/
▼ 他のアプリも公開中
📱 無料WEBアプリ一覧:https://nuko-apps.com/
おまけ
どんなとんでもハルシネーションだったのか、面白い内容だったのでスクリーンショットを掲載しておきます。これが実現したら素晴らしい社会になるんですどけね(笑)

