このブログのすべての投稿でJSON-LDナレッジグラフを自動生成するシステムを構築した。5つの接続されたエンティティ:WebSite、Organization、Person、WebPage、BlogPosting。自動トピック検出、投稿間の関係、3言語の翻訳。すべてがページ読み込みごとに実行される1つのPHP関数で動作する。
それを読むAIモデルの視点からどれだけうまく機能するか知りたかった。公開済みの投稿からJSON-LDブロックをコピーし、3つのモデルに同じプロンプトを一字一句同じで送った。AI引用可視性の1から10のスコア、正しく実装されているもの、欠けているもの、変更すべきものを求めた。
Geminiは10点中9点。ChatGPTは10点中8.2点。Perplexityは10点中7.5点。
同じスキーマ。同じプロンプト。3つの異なる評価。
3つが一致したところ
3つすべてが、@idで接続されたエンティティによる@graphアーキテクチャが正しいことを確認した。ほとんどのJSON-LDチュートリアルが教えるアプローチ(識別子なしのネストされたオブジェクト)ではないが、ナレッジグラフシステムが好むアプローチだ。各エンティティにはサイトのすべてのページで再利用される永続的な@idがある。
aboutとmentionsの分離も全員が検証した。aboutは記事の主要トピックを宣言する。mentionsはコンテンツに登場するツールと参照を宣言する。この区別はAIモデルが正確に分類するのを助ける。
スペイン語、英語、日本語版を接続するworkTranslationプロパティも全会一致で承認された。ほとんどの多言語サイトは各言語を別々の島として扱う。接続された翻訳は権威を断片化する代わりに統合する。
3つすべてが問題として指摘したもの
4つの問題が3つの監査すべてに現れた。
第一に、headlineの汚染。タイトルの末尾に「| Shinobis」が含まれていた。サイト名はブラウザ用のHTMLタイトルタグに属し、スキーマのheadlineプロパティには属さない。AIモデルはheadlineをセマンティックマッチングに使用する。末尾のブランド名は情報なしにノイズを追加する。
第二に、PersonとOrganizationの混同。PersonエンティティのsameAsが個人プロフィールではなく会社のLinkedInページを指していた。PersonとOrganizationが同じLinkedInプロフィールを共有している場合、ナレッジグラフシステムは2つのエンティティを区別できない。
第三に、Personエンティティの名前。ChatGPTとPerplexityは名前の反転を提案した。nameに「Diego Sanchez」、alternateNameに「Shinobis」を使用する。理由:Organizationはすでに「Shinobis」という名前だ。Personも「Shinobis」という名前なら、ナレッジグラフは曖昧さを解決できない。
第四に、インタラクション統計。スキーマには2いいねのinteractionStatisticが含まれていた。低い数字は権威の低さを示す可能性がある。数字が意味のあるものになるまでプロパティを削除するのが推奨だった。
意見が分かれたところ
ここが興味深い。各モデルは異なる側面を優先した。
Geminiはaudienceプロパティと記事セクション用のhasPartに焦点を当てた。RAGシステムはユーザーが役割別の質問をするとき、コンテンツが誰向けかを知る必要がある。「UXデザイナーはGEOについて何をすべきか?」は「SEOはGEOについて何をすべきか?」とは異なるクエリだ。
ChatGPTはエンティティの型付けに焦点を当てた。最も強いフィードバックは匿名のThingオブジェクトについてだった。すべてのaboutとmentionsエンティティはnameだけの汎用Thingだった。ChatGPTはWikipediaへのsameAsを持つDefinedTermへの変更を提案した。ThingとしてのKnowledge Graphはテキスト文字列だ。WikipediaへのsameAsを持つDefinedTermとしてのKnowledge Graphは、モデルが自身の知識ベースに対して解決できる識別可能な概念だ。
Perplexityが最も詳細だった。PersonとOrganizationを接続する明示的なaffiliation、jobTitleだけでなく構造化されたhasOccupation、モデルがコンテンツの深さを評価するためのtimeRequired、BlogPosting内のauthorとpublisherはインラインオブジェクトではなく@id参照を使用すべきだと指摘した。
実装したもの
3つの監査を組み合わせて、6つの変更を実装した。
headlineから「| Shinobis」を削除してクリーンにした。sameAsプロフィールを分離した。名前を反転した。nameは「Diego Sanchez」、alternateNameは「Shinobis」。interactionStatisticを削除した。各投稿が参照するソースへのリンクを含むcitationプロパティを追加した。各投稿が関連する特定の役割を含むaudienceを追加した。
却下したもの
3つの提案は実装しなかった。
52の投稿すべてを接続するBlogエンティティ。技術的には正しいがPHPジェネレーターに大きな複雑さを追加する。毎週成長するブログでは、新しい投稿が公開されるたびにすべての既存投稿のスキーマを再生成することを意味する。
BreadcrumbList。ブログはフラットな構造だ。Home > Blog > Articleのパンくずリストは既存のスキーマにない情報を追加しない。
各概念の永続的@idを持つDefinedTerm。理論的には素晴らしいが、まだ持っていないエンティティ管理システムが必要だ。将来の改善であり、今ではない。
スコアの差が明らかにすること
Geminiは最高スコア(9/10)を付け、改善点の詳細は最も少なかった。ChatGPTは8.2/10で最もアーキテクチャ的なフィードバックを提供した。Perplexityは7.5/10で最も詳細で技術的なフィードバックを提供した。
違いは一方が他方より優れた監査者であることを意味しない。異なる基準で評価していることを意味する。Geminiは全体構造と高レベルの関係を優先する。ChatGPTはエンティティ解決とセマンティック型付けを優先する。Perplexityは個々のプロパティとスキーマの完全性を優先する。
Geminiだけに聞いていたら、ほぼ完璧だと思っていただろう。Perplexityだけなら、深刻な問題があると思っていただろう。現実はスキーマがアーキテクチャでは堅固だが粒度では弱かったということだ。3つの視点を合わせることで、どれか1つだけより完全な全体像が得られた。
これは技術構造に適用されたCogitare Debesだ。1つのAIに聞くのではない。3つに聞く。重複するものを実装する。分岐するものを評価する。複雑さを正当化しないものを却下する。
更新されたスキーマは本番で稼働中だ。このブログのすべての投稿が、実装された6つの変更を含むJSON-LDを自動生成する。自分のスキーマを監査したい場合は、任意のページからJSON-LDブロックをコピーし、ChatGPT、Gemini、Perplexityに同じプロンプトで貼り付けよ。3つとも異なるものを見つけるだろう。それがまさにポイントだ。