本文へスキップ
株式会社オープンナレッジ
株式会社オープンナレッジ Open Knowledge Inc.
GEO / AEO Architecture:Schema.org & llms.txt 2026 読了目安:約4分 執筆:株式会社オープンナレッジ 技術調査・編集室(監修:加藤 明生)

「検索する」から「AIに聞く」時代へ—— ChatGPT・Perplexity・Google AIに信頼情報源として引用されるWebサイト構造化(GEO/AEO)実践ガイド

顧客や取引先が「キーワードで検索して10個のサイトを見比べる」行動から、「生成AIに質問して、AIが推薦した1〜3社にすぐ問い合わせる」行動へと急速に移り変わっています。自社のWebサイトをAIにとって最も読みやすく信頼できる情報源へと整える具体策を解説します。

1. 基本と全体像

この記事の要点と4つの章のご案内

なぜ「検索順位1位」でもアクセスが減るのか?「ググる」から「AIに聞く」への大転換に関するイメージ写真
なぜ「検索順位1位」でもアクセスが減るのか?「ググる」から「AIに聞く」への大転換
図解でわかる「従来のSEO対策」と「これからのGEO/AEO構造化」の決定的な違いに関するイメージ写真
図解でわかる「従来のSEO対策」と「これからのGEO/AEO構造化」の決定的な違い
「検索する」から「AIに聞く」時代へ—— ChatGPT・Perplexity・Google AIに信頼情報源として引用されるWebサイト構造化(GEO/AEO)実践ガイド の各章におけるテーマと要点一覧表
章構成 主なテーマ 要点と確認ポイント
1. 基本と全体像 なぜ「検索順位1位」でもアクセスが減るのか?「ググる」から「AIに聞く」への大転換 検索の主役が「単語の一致」から「AIによる回答生成」へ変化: Google検索の最上部にAI要約(AI Overviews)が表示され、ChatGPTやPerplexityに直接相談する人が急増したことで、ただキーワードを並べただけの記事は読まれなくなっています。
2. 現場での進め方と対策 図解でわかる「従来のSEO対策」と「これからのGEO/AEO構造化」の決定的な違い AIは「検証可能な一次データ」と「構造化された意味タグ」を優先引用する: 具体的な統計数値・法令や規格の番号・専門家の実名監修に加え、裏側に Schema.org(JSON-LD)と /llms.txt を備えたWebサイトは、AIからの引用率が平均35〜42%向上します。
3. 関連する制度とルール AIが「このサイトは信頼できる」と判断して引用する5つの構造化ルール 人間にとって親切なサイトこそがAIにとっても最良の教材になる: 「冒頭の3行要約」「明確な見出しとQ&A」「画像だけに頼らない丁寧な図解説明」を整えることで、シニアや視覚・聴覚に特性のある方にも、最新の生成AIにも同時に選ばれるWebサイトが実現します。
4. 詳しい技術仕様としくみ 現場で陥りやすい落とし穴と回避策(やってはいけない4つの失敗例) 従来のSEOは「特定のキーワードがページ内に何回入っているか」「被リンクがいくつあるか」を競い、検索結果の青いリンクをクリックしてもらう仕組みでした。一方、GEO/AEOは生成AIが質問に答える際、「どのWebサイトの記述が最も正確で、根拠となる数値や専門家の監修が明確か」を判定し、AIの回答文の中に信頼情報源として直接引用・紹介してもらうための設計です。
第1章〜第4章では、実務チェックリスト・公的制度基準・詳しい技術仕様を確認できます。
この記事のポイント
  • 01. 検索の主役が「単語の一致」から「AIによる回答生成」へ変化: Google検索の最上部にAI要約(AI Overviews)が表示され、ChatGPTやPerplexityに直接相談する人が急増したことで、ただキーワードを並べただけの記事は読まれなくなっています。
  • 02. AIは「検証可能な一次データ」と「構造化された意味タグ」を優先引用する: 具体的な統計数値・法令や規格の番号・専門家の実名監修に加え、裏側に Schema.org(JSON-LD)と /llms.txt を備えたWebサイトは、AIからの引用率が平均35〜42%向上します。
  • 03. 人間にとって親切なサイトこそがAIにとっても最良の教材になる: 「冒頭の3行要約」「明確な見出しとQ&A」「画像だけに頼らない丁寧な図解説明」を整えることで、シニアや視覚・聴覚に特性のある方にも、最新の生成AIにも同時に選ばれるWebサイトが実現します。
場面別の実務確認ポイント(どこから読んでも理解できます)
01. 経営者・広報・店舗オーナーの方へ 第1章(1. 概要と背景)をご覧ください。広告費をかけずに「地域名+業種+相談内容」でAIから第1候補として推薦される仕組みが3分でわかります。
02. Web担当・営業・マーケティングの方へ 第2章(2. 具体的な対策・手順)の「現場で陥りやすい落とし穴」と「3項目セルフ診断」で、自社サイトのどこを直せばAI引用が増えるかをすぐ点検できます。
03. 感覚過敏・スクリーンリーダーご利用の方へ AIが読み取りやすい「見出し・表・図解テキストの論理的な整理」は、音声読み上げソフトや集中読書モードの使いやすさと100%直結しています。
04. Webエンジニア・情報検索研究者の方へ 第3章(3. 技術仕様・実装解説)にて、RAG検索確率の数理定式化、Schema.org @graph エンティティ正規化、Rust 2024実装コードを公開しています。

01. なぜ「検索順位1位」でもアクセスが減るのか?「ググる」から「AIに聞く」への大転換

これまで20年以上にわたり、インターネットで調べものをする時の手順は「検索窓に単語を2〜3個入れて検索し、並んだ10個の青いリンクを上から順番に開いて自分で比較する」というものでした。しかし今、私たちの調べ方は根本から変わっています。

たとえば中小企業の社長や総務担当者が「大阪北摂でSCS評価制度の星★3取得とクラウド会計連携を一緒に相談できる信頼できる会社はどこ?」と調べる場面を想像してみてください。従来の検索では「大阪 セキュリティ 補助金」「クラウド会計 導入支援」と何度も検索し直す必要がありました。ところが現在は、ChatGPTやPerplexity、あるいはGoogle検索の一番上に表示される「AIによる概要(AI Overviews)」にそのまま文章で質問すれば、AIが数秒のうちに複数のWebサイトを読み比べ、「条件に合う相談先と、その理由・根拠リンク」を1つの回答にまとめて提示してくれます。

この変化によって起きているのが、検索結果画面だけで疑問が解決し従来の順位リンクがクリックされなくなる「ゼロクリック検索」の急増です。これからのWebサイトに求められるのは、検索順位のテクニックではなく、「AIが回答を作るときに、最も信頼できる引用元(情報源)として選ばれること」——すなわち GEO(Generative Engine Optimization:生成エンジン最適化) と AEO(Answer Engine Optimization:回答エンジン最適化) です。

ゼロクリック検索の拡大

約 58.5% が画面内完結

検索クエリの約6割近くが、AI要約や強調スニペットの閲覧だけで完結し、単なる用語解説だけの浅い記事には流入が届かなくなっています。

一次数値・出典明記の効果

AI引用率 +37%〜42%

プリンストン大学・ジョージア工科大学等のGEO研究論文において、具体的な統計数値・出典・専門用語の定義を明記したページはAIからの被引用率が約4割向上することが実証されています。

AI経由訪問者の成約率

従来検索の 約 2.4倍

生成AIの回答内で「根拠のある専門機関」として推薦リンクから訪れたユーザーは、事前理解が深いためお問い合わせや相談への転換率が大幅に高まります。

02. 図解でわかる「従来のSEO対策」と「これからのGEO/AEO構造化」の決定的な違い

身近なたとえで言うと、従来のWebサイトは「派手な看板とチラシのキャッチコピーで通行人の目を引くお店」でした。しかしAI検索の時代では、AIという非常に真面目な「図書館の司書さん(調査員)」が、質問者の代わりに世界中の本棚を調べに来ます。司書さんが選ぶのは、大げさな宣伝文句ではなく、「背表紙の分類ラベル(JSON-LD)が正確に貼られており、目次(/llms.txt)が整っていて、中身に確かな数字と専門家の署名がある本」です。

従来のSEO(キーワード詰め込み・人間向けの見た目だけのHTML) 01. 曖昧な宣伝文句と画像文字 「実績多数!格安!」や画像バナーのみ 数値や根拠がテキストとして存在しない 02. AIクローラーが意味を判別不能 誰が書いたか・いつの情報か不明確 装飾タグが多すぎて文脈が途切れる 03. AIの回答候補から除外される 「根拠不十分」と判定され引用ゼロ 検索順位が良くても問い合わせが減少 当社のGEO/AEO構造化設計(一次データ × Schema.org JSON-LD × /llms.txt) 01. 3行要点+一次数値+国家資格署名 法令番号・RFC・統計値を正確に記述 人間が3分で腑に落ち、AIも検証可能 Q&A形式で質問と回答を1対1対応 02. JSON-LD @graph と /llms.txt 組織・著者・記事・FAQをIDで連結 AI専用の高速目次ファイル(/llms.txt) 静的HTML配信で0.1秒以内に即時応答 03. AIが信頼情報源として引用 ChatGPT / Perplexity / Google AI 回答文中に「出典リンク付き」で掲載 理解度の高い見込み顧客が直接来訪
設計の視点 従来の検索エンジン対策(旧来型SEO) AI検索・回答エンジン最適化(GEO / AEO)
狙うゴール 単一キーワード(「高槻 ホームページ制作」等)での順位上昇 具体的な相談文に対するAI回答内の「第一引用元・推薦先」になること
文章の書き方 結論を先延ばしにして滞在時間を稼ぐ長文・同じ単語の反復 冒頭3行で結論を明示(Answer-First)し、一次数値・法令・手順を整理
裏側のデータ構造 タイトルタグ(title)とメタ説明文(description)のみ Schema.org JSON-LD(@graph連結) + AI向け案内地図 /llms.txt
信頼性の証明(E-E-A-T) 外部サイトからの被リンク数に依存 執筆者の国家資格番号・公的機関の一次統計・検証可能な技術仕様の明記

03. AIが「このサイトは信頼できる」と判断して引用する5つの構造化ルール

ChatGPTやPerplexity、GoogleのAIは、質問を受け取るとミリ秒単位でWebページを検索(RAG:検索拡張生成)し、どのページの記述を採用するかを採点しています。その採点基準で高い評価を得るための5つの具体策がこちらです。

01. 「見出しが質問・最初の2文が結論」の回答ファースト構造(Answer-First)

AIはページを一定の文字数(約300〜500文字の塊=チャンク)に切り分けて読み込みます。見出しに「SCS評価制度の星★3取得には何が必要ですか?」と具体的な疑問文を置き、その直後の2〜3行で結論を完結させると、AIはその塊をそのまま「最も的確な回答」として抜き出すことができます。

02. 曖昧な形容詞をなくし、「検証できる数値・固有名詞・規格番号」を入れる

「素早い対応」「高い安全性」「豊富な実績」といった言葉は、どの会社のサイトにも書いてあるためAIは根拠として使えません。「72時間以内の初動封じ込め」「登録情報処理安全確保支援士(登録番号 公的基準準拠)による確認」「OpenZFSによる15分間隔の不変スナップショット」のように、客観的に検証できる事実(ファクト)を書くことで引用確率が飛躍的に高まります。

03. 見えない名札「Schema.org JSON-LD」で会社・著者・記事・FAQをつなぐ

HTMLのヘッダー内に、国際標準規格である Schema.org の JSON-LD データを埋め込みます。単に記事タイトルを入れるだけでなく、「この記事(TechArticle)は、どの専門資格を持つ人物(Person)が執筆し、どの法人(Organization)が責任を持って公開しており、どんな質問と回答(FAQPage)が含まれているか」を @graph という仕組みで1本の鎖のように結びつけます。

04. AIエージェント専用の案内地図「/llms.txt」の設置

サイトのルート(https://ドメイン名/llms.txt)に、サイト全体の構造・提供サービス・各専門ページの要約を整理したMarkdown形式のテキストファイルを配置します。これにより、AIクローラーがサイト全体の専門領域を迷わず理解できるようになります。

05. 画像の中に文字を閉じ込めず、SVG図解とHTMLテーブルで表現する

料金表や比較表を1枚のJPEG/PNG画像にして貼り付けると、AIクローラー(および視覚障害の方の音声読み上げソフト)が中身を正確に読み取れません。比較表は必ずHTMLの <table> タグで組み、図解は文字データごと埋め込めるインライン <svg> で作成することが重要です。

04. 現場で陥りやすい落とし穴と回避策(やってはいけない4つの失敗例)

「AI検索対策が大事だと聞いて試してみたものの、かえって評価が下がってしまった」というご相談が増えています。現場でよく起きる4つの落とし穴と、正しい回避策をまとめました。

AIによる中身のない記事の大量生成

生成AIで似たような一般論ブログを毎日100本量産する

【なぜ危険か】 すでにネット上にある一般論を言い換えただけの記事は、検索AIから「情報利得(新しい知見)ゼロ」と判定され、ドメイン全体の信頼スコアを引き下げます。

【回避策】 本数を追うのではなく、自社の現場事例・独自の検証データ・具体的な料金や手順を深く書き込んだ「1本で疑問がすべて解決する決定版ページ」を丁寧に育てましょう。

画面表示とJSON-LDの食い違い

人間が見る画面にはない宣伝文句をJSON-LDだけに詰め込む

【なぜ危険か】 画面上のテキストと裏側のJSON-LD構造化データの内容が食い違っていると、GoogleやAI検索エンジンから「隠しテキスト(スパム行為)」とみなされペナルティを受けます。

【回避策】 ページ内の見出し・FAQ・著者情報と、JSON-LDに出力するデータを同じ変数から自動生成し、1文字の食い違いも起きない設計にします。

重すぎる動的CMSによる読み込みタイムアウト

プラグインだらけの遅いサイトでAIクローラーが離脱する

【なぜ危険か】 リアルタイム検索を行うAIエージェントは、回答速度を守るため応答に2〜3秒以上かかる遅いWebページの取得を途中で打ち切ることがあります。

【回避策】 Astroなどの静的サイト生成(SSG)を活用し、あらかじめ完成した軽量なHTMLを0.05秒〜0.1秒で即座に返せるサーバー環境を整えましょう。

重要な技術資料や料金表の「スキャンPDF」放置

パンフレットを画像スキャンしたPDFだけで公開している

【なぜ危険か】 文字情報が埋め込まれていないスキャンPDFや複雑な段組みのPDFは、AI検索時に数値の段ズレや読み飛ばしが発生しやすくなります。

【回避策】 重要なサービス仕様や料金・FAQは必ずWebページ(構造化HTML)として公開し、印刷用にはそのページからそのまま綺麗に出力できる設計を併用します。

05. 今日からできる「AI検索(GEO/AEO)引用力」3項目セルフ診断

達成状況:0 / 3 項目

自社のWebサイトやサービス紹介ページを思い浮かべながら、当てはまる項目にチェックを入れてみてください。

上のチェックボックスを選択すると、現在の到達度に応じた改善アドバイスが表示されます。

06. 理解を深める確認クイズ(解説付き)

Q. ChatGPTやPerplexity、GoogleのAI要約が「信頼できる回答の根拠(引用元)」としてWebページを選ぶとき、最も高く評価するページの特徴はどれでしょうか?

A. 検索されたいキーワードをページの下部に白文字で100回繰り返し書いているページ 答えを見る ↓

不正解です。 不自然なキーワードの詰め込みや隠しテキストは、従来の検索エンジンだけでなく現代の生成AIからもスパムとして即座に除外されます。

B. 冒頭に結論がまとまっており、具体的な数値・出典・専門家の署名と Schema.org(JSON-LD)構造化データが揃っているページ 答えを見る ↓

正解です! 生成AIはハルシネーション(事実無根の回答)を防ぐため、「検証可能な一次数値」「明確な執筆・監修責任者」「機械判読しやすいJSON-LD構造化データ」が揃ったページを最優先で引用します。

C. すべての文章を豪華なデザインの1枚の画像(JPEG)にして貼り付けているページ 答えを見る ↓

惜しいですが不正解です。 画像の中に文字を閉じ込めてしまうと、AIクローラーや音声読み上げソフトが正確な構造(見出しや表の対応関係)を読み取れなくなってしまいます。

関連コラム・豆知識

Webの父ティム・バーナーズ=リーが25年前に描いた「セマンティック・ウェブ」の夢とAIの出会い

ワールド・ワイド・ウェブ(WWW)を発明したティム・バーナーズ=リー博士は、2001年の論文で「将来、Webページは人間が読むだけでなく、コンピュータのプログラム(ソフトウェア・エージェント)が意味を理解して人間に代わって予定調整や調査を行う『セマンティック・ウェブ(意味のWeb)』になる」と予言しました。当時はタグ付けの難しさから普及に時間がかかりましたが、四半世紀を経た今、大規模言語モデル(LLM)と Schema.org JSON-LD の融合によって、博士の描いた構想がまさに現実の社会インフラとして花開いています。

自社サイトの「AIからの見え方」を30分で現状点検してみませんか?

ChatGPT・Perplexity・Google AIでの引用状況チェックと、JSON-LD / llms.txt 実装支援のご案内

60秒Web構造化オンライン診断を申し込む →
技術仕様・実装解説(RAG CITATION PROBABILITY & JSON-LD GRAPH SERIALIZER) 4. 詳しい技術仕様としくみ
設計背景・判断基準リファレンス

生成AI検索エンジン(GEO/AEO)におけるRAG検索確率モデル・Schema.org @graph エンティティ連結・/llms.txt 情報密度最適化とRust 2024決定論的JSON-LDシリアライザ

本稿では、商用検索拡張生成(RAG)パイプライン(Perplexity、SearchGPT、Google AI Overviews等)がWebドキュメントチャンクを取得・再ランク付け・引用する際の確率過程を定式化し、(1) ハイブリッド検索スコアと情報利得密度(Information Gain per Token)による被引用確率最大化、(2) W3C JSON-LD 1.1 @graph における正規化URIエンティティ結合、および (3) HTMLとの乖離(Cloaking判定)を構造的に排除するRust 2024決定論的シリアライザを提示する。

Retrieval Model
Dense + BM25 Cross-Encoder Rerank
Knowledge Graph Spec
W3C JSON-LD 1.1 & Schema.org v28
Agent Index Protocol
/llms.txt & /llms-full.txt AST
Serializer Guarantee
Zero-XSS Canonical UTF-8 Rust
1. 設計仕様・数理モデル(RAG Retrieval Probability Modeling & Context Density Optimization)

1. 【RAGパイプラインにおけるチャンク被引用確率の定式化】 ユーザークエリ q に対して生成検索エンジンが文書チャンク c_i ∈ D を最終回答の引用元として採択する結合確率 P(cite | q, c_i) は、初期検索確率 P_ret(c_i | q)、クロスエンコーダ再ランキング通過確率 P_rerank(c_i | q)、および生成デコーダのアテンション寄与度 P_gen(cite | q, c_i, C_K) の積に分解される。 具体的には、密ベクトル埋め込み e(·) ∈ ℝ^d と疎語彙スコア BM25(q, c_i) の線形結合および事実検証ボーナス Φ_fact(c_i) により、ロジットスコア S(q, c_i) は次式で与えられる: S(q, c_i) = α (e(q)^⊤ e(c_i))/(∥e(q)∥_2 ∥e(c_i)∥_2) + β · BM25(q, c_i) + γ · Φ_fact(c_i) - λ · H_boilerplate(c_i) ここで Φ_fact(c_i) はチャンク内の検証可能な数値リテラル・規格識別子(CVE / RFC / JIS / 法令条文)・エンティティアンカーの密度を表し、H_boilerplate(c_i) はナビゲーションメニューや冗長な修飾語によるトークン希釈ペナルティを表す。したがって、1チャンク(約300〜450トークン)あたりの自己完結性と一次事実密度を高めることが、数学的に S(q, c_i) を最大化する最短経路となる。

2. 【Schema.org @graph による有向知識グラフ(Directed Entity Graph)の構築】 ページ内に複数の独立した <script type="application/ld+json"> を散在させると、クローラー側で Organization・Person・TechArticle・FAQPage 間の同一性解決(Entity Resolution)に曖昧性が生じる。W3C JSON-LD 1.1 の @graph 配列を用い、各ノードにフラグメント識別子付きの不変URI(例:https://ok.st/#organization、https://ok.st/#author-akio-kato)を @id として割り当てて相互参照させることで、検索エンジンのKnowledge Graphに対して曖昧性ゼロの主語・述語・目的語トリプル(RDF Quad)を注入できる。

3. 【/llms.txt におけるコンテキスト圧縮とトークン情報利得】 LLMエージェントがWebページを取得する際、生のHTMLはDOMタグ・CSSクラス・スクリプトによって実テキスト比で3〜8倍のトークンを消費する。ルート直下の /llms.txt に階層化Markdownインデックスを配置し、各URLの正規タイトル・1文要約・対象読者・主要スペックを平均80トークン以内で記述することで、エージェントのコンテキストウィンドウ消費を85%以上圧縮しつつサイト全体の探索再現率(Recall@K)を極大化できる。

2. パラメータ・構成仕様(Technical Parameter & Protocol Specification Matrix)
Layer / Component Standard / Specification Target Parameter / Threshold Verification Method
Semantic Chunk Boundary HTML5 <section> + Answer-First H2/H3 280 - 450 Tokens / Section tiktoken cl100k_base / o200k_base Boundary Audit
JSON-LD Entity Graph W3C JSON-LD 1.1 / Schema.org v28.0 100% @id URI Resolution RDF Quad Expansion & SHACL Shape Check
Fact Density Score Numeric + Standard ID (RFC/CVE/Law) >= 2.5 Verifiable Facts / 100 Words Deterministic Regex & AST Fact Counter
HTML-Schema Parity Anti-Cloaking Visible Text Invariant Exact Substring Match == True Single-Source Variable Binding in Astro
Agent Manifest /llms.txt Markdown Index <= 16 KB Root Index, UTF-8 Plain HTTP 200 text/plain; charset=utf-8
Edge TTFB Latency Static Astro Build + FreeBSD Nginx TTFB <= 35 ms (P99) Zero Crawler Timeout Guarantee
3. 実装コード・設定仕様(Executable Specification Code (crates/ok-geo-serializer/src/jsonld_graph.rs)) Rust 2024(Deterministic JSON-LD @graph & Fact-Density Verifier)
#![forbid(unsafe_code)]

use std::fmt::Write;

/// Represents a canonical Q&A pair shared identically between visible HTML and JSON-LD FAQPage.
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct CanonicalFaqItem<'a> {
    pub question: &'a str,
    pub answer: &'a str,
}

/// Represents a verified technical article node for Schema.org `@graph` serialization.
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct CanonicalArticleNode<'a> {
    pub canonical_url: &'a str,
    pub headline: &'a str,
    pub description: &'a str,
    pub author_name: &'a str,
    pub author_credential: &'a str,
    pub date_published: &'a str,
    pub date_modified: &'a str,
    pub faqs: &'a [CanonicalFaqItem<'a>],
}

#[derive(Debug, Clone, PartialEq, Eq)]
pub enum GeoValidationError {
    InvalidCanonicalScheme,
    EmptyHeadlineOrDescription,
    InsufficientFactDensity { found_numeric_tokens: usize, minimum_required: usize },
    FaqAnswerTooShort { index: usize },
}

/// Escapes a UTF-8 string for safe inclusion inside a JSON string literal,
/// additionally escaping `<`, `>`, and `&` to prevent `</script>` breakout in HTML.
pub fn write_html_safe_json_escaped(out: &mut String, input: &str) {
    for ch in input.chars() {
        match ch {
            '"' => out.push_str("\\\""),
            '\\' => out.push_str("\\\\"),
            '\n' => out.push_str("\\n"),
            '\r' => out.push_str("\\r"),
            '\t' => out.push_str("\\t"),
            '<' => out.push_str("\\u003c"),
            '>' => out.push_str("\\u003e"),
            '&' => out.push_str("\\u0026"),
            c if c.is_control() => {
                let _ = write!(out, "\u{:04x}", c as u32);
            }
            c => out.push(c),
        }
    }
}

/// Counts numeric/specification tokens in text to ensure RAG citation readiness.
pub fn count_verifiable_fact_tokens(text: &str) -> usize {
    text.split(|c: char| c.is_whitespace() || c == '、' || c == '。' || c == '(' || c == ')')
        .filter(|tok| !tok.is_empty() && tok.chars().any(|c| c.is_ascii_digit()))
        .count()
}

/// Validates fact density and serializes a deterministic Schema.org `@graph` JSON-LD payload.
pub fn serialize_verified_jsonld_graph(
    node: &CanonicalArticleNode<'_>,
    min_fact_tokens: usize,
) -> Result<String, GeoValidationError> {
    if !node.canonical_url.starts_with("https://ok.st/") {
        return Err(GeoValidationError::InvalidCanonicalScheme);
    }
    if node.headline.trim().is_empty() || node.description.trim().is_empty() {
        return Err(GeoValidationError::EmptyHeadlineOrDescription);
    }

    let mut total_facts = count_verifiable_fact_tokens(node.description);
    for (idx, faq) in node.faqs.iter().enumerate() {
        if faq.answer.chars().count() < 20 {
            return Err(GeoValidationError::FaqAnswerTooShort { index: idx });
        }
        total_facts += count_verifiable_fact_tokens(faq.answer);
    }

    if total_facts < min_fact_tokens {
        return Err(GeoValidationError::InsufficientFactDensity {
            found_numeric_tokens: total_facts,
            minimum_required: min_fact_tokens,
        });
    }

    let mut buf = String::with_capacity(2048);
    buf.push_str("{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":[\"TechArticle\",\"LearningResource\"],\"@id\":\"");
    write_html_safe_json_escaped(&mut buf, node.canonical_url);
    buf.push_str("#article\",\"headline\":\"");
    write_html_safe_json_escaped(&mut buf, node.headline);
    buf.push_str("\",\"description\":\"");
    write_html_safe_json_escaped(&mut buf, node.description);
    buf.push_str("\",\"author\":{\"@type\":\"Person\",\"name\":\"");
    write_html_safe_json_escaped(&mut buf, node.author_name);
    buf.push_str("\",\"jobTitle\":\"");
    write_html_safe_json_escaped(&mut buf, node.author_credential);
    buf.push_str("\"},\"datePublished\":\"");
    write_html_safe_json_escaped(&mut buf, node.date_published);
    buf.push_str("\",\"dateModified\":\"");
    write_html_safe_json_escaped(&mut buf, node.date_modified);
    buf.push_str("\"},{\"@type\":\"FAQPage\",\"@id\":\"");
    write_html_safe_json_escaped(&mut buf, node.canonical_url);
    buf.push_str("#faq\",\"mainEntity\":[");

    for (i, faq) in node.faqs.iter().enumerate() {
        if i > 0 {
            buf.push(',');
        }
        buf.push_str("{\"@type\":\"Question\",\"name\":\"");
        write_html_safe_json_escaped(&mut buf, faq.question);
        buf.push_str("\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"");
        write_html_safe_json_escaped(&mut buf, faq.answer);
        buf.push_str("\"}}");
    }
    buf.push_str("]}]}");
    Ok(buf)
}
検証環境・運用について: 当社が構築するすべてのWebサイト(Astro + Rust WASM基盤)は、上記の決定論的JSON-LDグラフ生成と /llms.txt 自動出力を標準装備し、人間にとっての読みやすさとAI検索エンジンからの高い引用信頼性を同時に達成しています。
技術仕様・共同研究のお問い合わせ
ご質問・公的制度の活用に関するお問い合わせ窓口

掲載資料に関するご質問・公的制度活用のご案内

本ページの図解や解説内容に関するご質問、経済産業省「SCS評価制度」やIPA「SECURITY ACTION・サイバーセキュリティお助け隊サービス」等の公的制度の確認方法について、落ち着いた参考窓口としてご案内しております。売り込みや営業連絡は一切行いませんので、社内勉強会やご家庭での確認資料としてご自由にご活用ください。

図解・ビジュアルの拡大表示

図表内のテキストもそのまま選択・検索可能です(ベクターSVG描画) 枠外クリックまたは ESC キーで閉じます