コンテンツにスキップ

LLMOFramework Score v0.1 — Draft Specification

Status: Draft. v0.1、最初の公開版。重み、チェック一覧、JSON 出力 shape は v0.2 で後方互換なしに変わる可能性がある。JSON shape に依存するなら checker のバージョンを固定すること。

LLMOFramework Score は、URL の AI 可視性を 1 つの数値(0–100)に要約したもの。v0.1 は substrate シグナルだけ を測る。1 回の HTTP fetch で AI クローラーが取得できる静的シグナル、JavaScript を実行せず、LLM を呼ばず、retrieval をシミュレートしない範囲。

リファレンス実装は OSS CLI llmo-checker。Open LLMO Research Initiative がメンテナンスする。

  1. Behavior より前に substrate。v0.1 は単一 HTTP fetch から取れるシグナルだけを測る。behavioral シグナル(引用、retrieval stability、LLM の読解)は v0.2 以降に先送り
  2. 再現可能であること。各チェックは fetch した HTML / robots.txt / llms.txt の純関数。それ以上のネットワーク呼び出しなし、AI 呼び出しなし、時刻依存なし
  3. 反証可能なスコアリング。各チェックはスコアリングルールを公開する。ルールに同意しないなら、checker と spec を並べて、どこが食い違うかを示せる
  4. Honest な重み。v0.1 の重みは著者が設定したデフォルトであり、outcome データから導出したものではない。v0.2 では 引用相関パイロット を使って再キャリブレーションする

スコアは 5 つのチェックの重み付き平均:

ID重み測るもの
llms-txt20/llms.txt の存在と構造
robots-ai15/robots.txt における既知 AI クローラーへの明示的な posture
canonical15<link rel="canonical"> の妥当性と hreflang alternate
jsonld20JSON-LD 構造化データの存在、parse 可能性、認識される @type
meta15<title><meta name="description">、OpenGraph、<h1><html lang>

v0.1 の総重み: 85。スコアは重み付き平均で 0–100 に正規化する。

スコア解釈
85–100AI retrieval に対してよく根づいている
65–84要改善 — いくつかのシグナルが欠落 or 弱い
40–64不良 — substrate に大きな穴
0–39致命的 — AI クローラーからほぼ見えない

取得対象: GET {origin}/llms.txt

スコアリング:

条件スコア影響
HTTP 404 または 5xx0
Body が空10
Body が空でない(base)60
トップレベルの # Title 行あり+15
## Section 見出しが最低 1 つ+10
^- \[ にマッチするリンクエントリ 3 個以上+15
リンクエントリ 1–2 個+8
リンクエントリ 0 個+5

Status: 85 以上 pass、60 以上 warn、それ以下 fail

参照 spec: llmstxt.org

取得対象: GET {origin}/robots.txt

認識する AI user-agent(v0.1): GPTBotChatGPT-UserOAI-SearchBotClaudeBotClaude-Webanthropic-aiCCBotGoogle-ExtendedPerplexityBotApplebot-Extendedcohere-ai

スコアリング:

条件スコア影響
HTTP 40460(warn — 明示的な posture 推奨)
HTTP 5xx0
Body が parse 可能(base)70
認識される AI bot を 3 個以上明示+20
認識される AI bot を 1–2 個明示+10
ワイルドカード User-agent: * グループ あり+10

Status: 85 以上 pass、60 以上 warn、それ以下 fail。スコアは 100 でクランプ。

ルールが AllowDisallow かは判定に影響しない(言及自体がカウントされる)。v0.1 では disallowedBots を JSON 出力に記録するが、Disallow を減点しない。AI クローラーを opt-out するのも valid な posture とする。

ソース: fetch した HTML。

スコアリング:

条件スコア影響
<link rel="canonical"> なし0(fail)
href が valid な URL でない20(fail)
canonical が異なる origin を指す60(warn)
canonical が同一 origin を指す(base)90(pass)
<link rel="alternate" hreflang> あり+10

Status: canonical あり + 同一 origin で pass、cross-origin で warn、それ以外 fail。スコアは 100 でクランプ。

Cross-origin canonical は republished mirror として意図されることもあるが、デフォルトでは減点する。設定ミスのほうが多いため。

ソース: fetch した HTML 内のすべての <script type="application/ld+json"> ブロック。

認識する schema.org エンティティタイプ(v0.1): OrganizationPersonArticleBlogPostingTechArticleBookWebSiteWebPageBreadcrumbListFAQPageHowToProductSoftwareApplication

スコアリング:

条件スコア影響
JSON-LD ブロックなし0(fail)
parse 可能なブロックが最低 1 つ(base)50
認識される @type あたり(3 個まで)+12
Organization または Person あり+8
いずれかのブロックが parse 失敗−20

@graph 配列は再帰的に走査して type を集める。

Status: 85 以上 pass、50 以上 warn、それ以下 fail。スコアは 0–100 でクランプ。

ソース: fetch した HTML の <head> および body 先頭。

スコアリング:

シグナルスコア影響
<title> 長さ 20–70+20
<title> あり、ただし 20–70 外+10
<meta name="description"> 長さ 80–200+20
description あり、ただし 80–200 外+10
OpenGraph title + description 両方あり+20
OpenGraph type あり+10
<h1> がちょうど 1 個+20
<html lang> 属性あり+10

Status: 85 以上 pass、60 以上 warn、それ以下 fail。スコアは 100 でクランプ。

CLI の --json 出力およびプログラマブル API の戻り値:

interface CheckerReport {
url: string; // 解決後の入力 URL
origin: string; // ページの URL.origin
timestamp: string; // ISO 8601
checkerVersion: string; // CLI の semver
scoreVersion: "0.1"; // この仕様のバージョン
score: number; // 重み付き平均、0-100
checks: CheckResult[];
}
interface CheckResult {
id: string; // 安定したチェック識別子(例: "llms-txt")
name: string; // 人間向け表示名
status: "pass" | "warn" | "fail" | "skip";
score: number; // 0-100
weight: number; // 全体スコアへの寄与
details: Record<string, unknown>; // チェック固有データ
notes: string[]; // 人間向けの対処可能な notes
}

v0.1 における安定性保証:

  • トップレベルフィールド名(url / origin / timestamp / checkerVersion / scoreVersion / score / checks)は 0.1.x 全リリースで安定
  • 各チェックの id / weight / 全体 statusscore の shape は安定
  • details の shape は 0.1.x の中で 非安定。patch リリースで新フィールドが追加される可能性あり
  • checks 内の id セットは 0.1.x で安定(新チェックは v0.2 リリースなしには追加しない)
Code意味
0スコア 50 以上(最低ラインを通過)
1スコア 50 未満(最低ライン以下)
2Fetch エラー(network、DNS、非 2xx レスポンス)

これにより CLI を CI の smoke check として使える — 落ちたサイトが pipeline を落とす。

ソース: open-llmo/llmo-checker

Terminal window
npx llmo-checker https://example.com
npx llmo-checker https://example.com --json

Node.js 20+ が必要。

リファレンス実装とこの spec が食い違う場合、spec が intent として正しく、実装を修正する。Issue を出してほしい

LLMO として妥当な懸念だが v0.1 に含めていないものと、その理由:

指標先送りした理由
Citation VisibilityAI アシスタントへのプロービングが必要。純粋な静的チェックの範囲外。v0.2 で optional な opt-in チェックとして予定
Chunk Readabilitychunking 戦略の選択が必要。v0.2 ではドキュメント化されたデフォルト chunker を使って再現性を確保
Markdown QualityMarkdown ソースを公開している場合のみ適用。v0.2 で /index.md 形式の endpoint を検出する予定
Content quality / accuracyスコープ外。スコアは substrate を測るもので、編集品質ではない
Retrieval stability over time経時プロービングが必要。Benchmark プロジェクトの担当範囲、per-URL Score の担当ではない

スコアバージョンはリファレンス実装のバージョンと独立。Score v0.1 は llmo-checker@0.1.x(patch 任意)で実装される。Score v0.2 には llmo-checker@0.2.x が必要。

Draft フェーズの間は、minor バージョン間(0.1 → 0.2)の破壊的変更を想定している。1.0 仕様の公開は Phase 2(Community)終了後 — つまり引用相関パイロットの outcome データを得て、外部実装が存在して、重みを再キャリブレーションした後になる。

Spec の変更は llmo-guide repo(このサイトのソース)の issue で受ける。

新チェック or 重み変更を提案するとき:

  1. シグナル名と何を測るかを 1 文で
  2. スコアリングルール(v0.2 以降でなければ 1 回の HTTP fetch から deterministic に求まること)
  3. 重みの根拠(論文、公開実験、または Lighthouse 流の議論)
  4. 再現器(提案ルール下で高スコアになる URL と低スコアになる URL)

実装の変更は open-llmo/llmo-checker 側で受ける。

スコア構造は Lighthouse(Google)と llms.txt proposal(Jeremy Howard)から強く影響を受けている。両方とも well-designed で opinionated で反証可能 — 私たちが保ちたいと思っている性質。