Jev Recipe / コンテンツ品質

Jev で検知する AI slop:型付き品質ゲートの構築

公開前に量産型の低品質コンテンツ(AI slop)をふるいにかける。1 回の evaluate 呼び出しで is_slop 判定と 1〜5 の順序付き品質スコアを返し、較正済み信頼度が自動隔離・フラグ・人手レビューの 3 レーンを振り分けます。

slop 品質ゲート構築 6 ステップ

01検知の前に定義を固める。テンプレート文の繰り返し、書式の乱用、中身のないまとめ文、事実密度の低さといった「slop の特徴ファミリー」を選び、レビュー担当者が普段使う語彙で criteria に書き起こす。
02State は最小限に。本文と、判定に実際に影響するメタデータ(ソース、セクション、著者タイプ)だけを渡し、判定を変えない項目はすべて削る。
031 回の evaluate 呼び出しで 2 つの質問を投げる。二値ゲートの is_slop Noul と、1〜5 の順序付き尺度の quality Score。二値判定が争われたときもスコアは価値を保つ。
04ポリシーはアプリケーションコードに置く。信頼度 0.85 以上で自動隔離、0.60〜0.85 はレビュー向けにフラグ、0.60 未満は人が読む。モデルは事実を報告し、レーンの割り当てはコードが所有する。
05強制の前にシャドーモードで検証する。まずログ記録のみで実トラフィックを通し、予測信頼度と編集者の判定を較正曲線に重ね、「1 回間違えても許容できる」位置にカットオフを置く。
06定期的に再較正する。編集者の判定をラベル付きサンプルとして還流させ、判定が揺れやすいテキストにはヒステリシス帯を設け、四半期ごとにしきい値を再検証する。信頼度ゲート付きフォールバックチェーンと同じ規律である。
schema / slop 検知コントラクト
{
  "is_slop": {
    "type": "noul",
    "instructions": "このテキストは AI slop(テンプレート文の繰り返し、書式の乱用、事実密度の低い量産型フィラー)に読めますか?"
  },
  "quality": {
    "type": "score",
    "instructions": "このテキストの編集品質を評価する",
    "criteria": {
      "1": "純粋な slop:テンプレート句とフィラーのみ、独自の情報なし",
      "2": "フィラー主体:繰り返しが多く、出典が曖昧、具体的な事実が少ない",
      "3": "混合:読めるが平凡、出典が薄い",
      "4": "良好:具体的で出典があり、人間が書いたように読める",
      "5": "優秀:独自の洞察、高い事実密度、明確な声"
    }
  }
}
実際の原稿を State として送ると、is_slop と quality の 2 層判定を確認できます。

AI slop の判定基準:6 つの特徴ファミリー

slop は単一のシグナルではなく、特徴の「家族的類似」です。以下のチェックリストは繰り返し現れる tell を 6 つのファミリーに整理したもので、自社プロダクトの slop 定義を criteria 語彙に起こすときにそのまま使えます。よく引用される「35 の tell」という数字は madewithjev の AI slop checker の公開説明に由来するものであり、公式の仕様ではありません。具体的な数はあくまで一ツールの分類として扱ってください。

テンプレート文と繰り返し

定型句、使い古された書き出し、リズムのない均質な文体。

  • "今日のめまぐるしく変化する世界では" といった定型の書き出し
  • 同じ n-gram が段落をまたいで反復される
  • 定型の接続表現:「さらに」「そのうえ」「結論として」
  • 最初の段落でタイトルや質問をそのまま言い直す
  • 文長がほぼ均一でリズムに変化がない
  • "注目すべきは" といった中身のないヘッジ表現

リストと太字の乱用

本文が担うべき仕事を書式に押し付けている。

  • 1 文で済む内容を箇条書きに分割する
  • 文中の語を無意味に太字にして偽の強調を作る
  • 2 文ごとに見出しを付ける
  • 番号付き「ステップ」の中身が単なる話題の羅列
  • 誰も求めていない「初出太字」用語集

中身のないまとめ文

何も圧縮せず、何も加えない結論。

  • "結論として、X はあなたを助ける強力なツールです"
  • 動詞の積み重ね:「解放する」「高める」「強化する」「効率化する」
  • "X は単なる Y ではありません——Z です" 構文
  • 圧縮ではなく言い直しの TL;DR
  • "世界において""領域において" といった水増し表現

ダッシュと絵文字の痕跡

モデルやプロンプトをまたいで生存する句読点の癖。

  • ダッシュが既定の接続記号になり、1 段落に複数回登場する
  • 絵文字を箇条書きの記号や見出しに使う
  • 同じページでカーリー引用符とストレート引用符が混在する
  • 1 行で「パンチの効いた」段落が連続する

低い事実密度と曖昧な出典

検証可能なものが何もない。数字・名前・日付があるべき場所が空いている。

  • "研究によると" と書きながら研究名が一切ない
  • "多くの専門家が同意する" に専門家が一人も登場しない
  • 数値、バージョン、日付が自然に収まる場所がない
  • 具体例があるべき場所に抽象的な主張だけ
  • 「事実」が読者の質問の言い換えにすぎない

構造の対称性

全セクションが同じ寸法で加工されている——量産の幾何学。

  • すべての H2 セクションが同じ長さ
  • 完全に並行な見出し("5 つの利点… 5 つの課題…")
  • 記事自身が捏造した質問に答える FAQ
  • 最後にありきたりな主張を 1 つ足す「まとめ」ブロック
インタラクティブデモ / slop 検知

AI slop 検知 & 3 レーン判定シミュレーター

サンプルテキストを選んで 2 層判定を実行。信頼度が隔離・フラグ・人手のどのレーンへ振り分けるかを確認できます(フロントエンドのシミュレーションであり、実 API は呼びません):

is_slop + quality の 2 質問
is_slop / quality
めまぐるしく変化するデジタル時代において、適切なフレームワーク選びはかつてなく重要です。それは単なるツールではなく——マインドセットです。さらに、適切なフレームワークはチームの潜在能力を解放します。 - **速度** — かつてない速さで構築 - **スケール** — 無限の成長 - **セキュリティ** — 標準装備の安心感 結論として、適切なフレームワークはあなたの開発の旅を高める強力な味方となるでしょう。
source: cms / 下書き
Jev 判定出力
~118ms / $0.0000008

「Jev 検知を実行」を押すと、is_slop 判定・quality スコア・3 レーン判定の結果を表示します。

コード側のポリシー: is_slop = false → 公開 · true かつ confidence ≥ 0.85 → 自動隔離 · 0.60〜0.85 → フラグしてレビュー · < 0.60 → 人手レビュー

slop 検知比較:Jev 型付きゲート vs 生成系 LLM 検知器

METRIC
Jev
生成系 LLM 検知器
1,000 テキストあたりコスト
約 $0.0008

入力のみ課金、出力トークンゼロ

$0.30〜$1.20

入力+生成された判定テキストの双方課金

1 判定のレイテンシ (P50)
約 100〜500ms

単一フォワードパス、生成なし

1500〜3000ms

トークン単位の判定文生成

フォーマット安定性
0%

Noul / Score はネイティブ出力、解析不要

2〜8% が不正 JSON、パースリトライループが必要
説明可能な判定基準
criteria はバージョン管理されたコード——ポリシーは検査・diff 可能
ルーブリックはプロンプトの中に埋め込み、実行ごとにドリフト
しきい値の制御性
較正済み信頼度

1 つの数値が隔離 / フラグ / レビューのレーンを決定

自己申告の信頼度

未較正、logprob の追加実装が必要

実装コード:TypeScript / Python の slop ゲート

typescript / jev slop ゲートと 3 レーン判定
const JEV_ENDPOINT = "https://api.typesafe.ai/v1/jev/evaluate";

// ポリシーはアプリケーションコードに置く。モデルは事実を報告するだけ。
const AUTO_BLOCK_CONFIDENCE = 0.85; // 0.85 以上 → 隔離
const FLAG_MIN_CONFIDENCE = 0.6; // 0.60〜0.85 → フラグ、未満 → 人手

const QUESTIONS = {
  is_slop: {
    type: "noul",
    instructions:
      "このテキストは AI slop(テンプレート文の繰り返し、書式の乱用、事実密度の低い量産型フィラー)に読めますか?",
  },
  quality: {
    type: "score",
    instructions: "このテキストの編集品質を評価する",
    criteria: {
      "1": "純粋な slop:テンプレート句とフィラーのみ、独自の情報なし",
      "2": "フィラー主体:繰り返しが多く、出典が曖昧、具体的な事実が少ない",
      "3": "混合:読めるが平凡、出典が薄い",
      "4": "良好:具体的で出典があり、人間が書いたように読める",
      "5": "優秀:独自の洞察、高い事実密度、明確な声",
    },
  },
} as const;

export type SlopLane =
  | "auto_quarantine"
  | "flag_review"
  | "human_review"
  | "publish";

export async function checkSlop(
  text: string,
  metadata: Record<string, unknown>,
) {
  const response = await fetch(JEV_ENDPOINT, {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify({
      state: { text, ...metadata },
      questions: QUESTIONS,
    }),
  });
  if (!response.ok) throw new Error("Jev evaluate failed");
  const data = await response.json();

  const { is_slop, quality } = data;
  const lane: SlopLane = !is_slop.answer
    ? "publish"
    : is_slop.confidence >= AUTO_BLOCK_CONFIDENCE
      ? "auto_quarantine"
      : is_slop.confidence >= FLAG_MIN_CONFIDENCE
        ? "flag_review"
        : "human_review";

  return {
    lane,
    is_slop: is_slop.answer,
    slop_confidence: is_slop.confidence,
    quality: quality.answer,
    quality_confidence: quality.confidence,
  };
}

// 典型パス:1 テキストあたり約 100〜500ms、入力トークンのみ課金、スキーマエラー 0%
python / CMS 既存コンテンツの一括 slop スキャン
import requests

JEV_ENDPOINT = "https://api.typesafe.ai/v1/jev/evaluate"
AUTO_BLOCK_CONFIDENCE = 0.85  # 0.85 以上 → 隔離
FLAG_MIN_CONFIDENCE = 0.60    # 0.60〜0.85 → フラグ、未満 → 人手レビュー

QUESTIONS = {
    "is_slop": {
        "type": "noul",
        "instructions": "このテキストは AI slop(テンプレート文の繰り返し、書式の乱用、事実密度の低い量産型フィラー)に読めますか?",
    },
    "quality": {
        "type": "score",
        "instructions": "このテキストの編集品質を評価する",
        "criteria": {
            "1": "純粋な slop:テンプレート句とフィラーのみ、独自の情報なし",
            "2": "フィラー主体:繰り返しが多く、出典が曖昧、具体的な事実が少ない",
            "3": "混合:読めるが平凡、出典が薄い",
            "4": "良好:具体的で出典があり、人間が書いたように読める",
            "5": "優秀:独自の洞察、高い事実密度、明確な声",
        },
    },
}

def check_slop(text: str, source: str) -> dict:
    resp = requests.post(
        JEV_ENDPOINT,
        json={"state": {"text": text, "source": source}, "questions": QUESTIONS},
        timeout=5,
    )
    resp.raise_for_status()
    result = resp.json()
    slop, quality = result["is_slop"], result["quality"]

    if not slop["answer"]:
        lane = "publish"
    elif slop["confidence"] >= AUTO_BLOCK_CONFIDENCE:
        lane = "auto_quarantine"
    elif slop["confidence"] >= FLAG_MIN_CONFIDENCE:
        lane = "flag_review"
    else:
        lane = "human_review"

    return {
        "source": source,
        "lane": lane,
        "slop_confidence": slop["confidence"],
        "quality": quality["answer"],
    }

def scan_backlog(pages: list[dict]) -> dict:
    # 1 ページ約 100〜500ms:1 万ページの CMS 監査はシングルスレッドで
    # 約 1 時間、入力のみの課金で数セントで済みます。
    lanes: dict[str, int] = {}
    for page in pages:
        verdict = check_slop(page["text"], page["url"])
        lanes[verdict["lane"]] = lanes.get(verdict["lane"], 0) + 1
    return lanes

AI slop 検知のよくある質問

Jev で AI slop は信頼して検知できますか?

トリアージ用途としては信頼できます。断罪には使いません。slop は特徴の家族的類似——テンプレート文、書式の乱用、中身のないまとめ、低い事実密度——であり、型付きの 2 質問判定(is_slop Noul と 1〜5 の quality Score)は単一の約 100〜500ms フォワードパスでこれらの tell を捉え、フォーマットエラーは 0% です。自動化に耐える信頼性は較正済み信頼度から来ます。しきい値は精度との契約になり、しきい値未満や境界の判定はすべてレビューレーンに落ちるため、黙って削除されることはありません。

信頼度のしきい値はいくつにすべきですか?

まず 0.85 以上で自動隔離、0.60〜0.85 でフラグしてレビュー、0.60 未満で人手レビューから始め、その上でラベル付きサンプルから自社のカットオフを導出します。予測信頼度と編集者の判定を較正曲線に重ね、「1 回間違えても吸収できる」位置にそれぞれのカットオフを置いてください。強制の前にシャドーモード(ログのみ)で通し、判定が揺れやすいテキストは中間帯を広げ(ヒステリシス)、コンテンツ分布のドリフトに合わせて四半期ごとに再検証します。

生成系 LLM 検知器や AI テキスト分類器とは何が違いますか?

生成系の検知器は判定そのものをテキストとして生成します。1 回あたり 1,500〜3,000ms のトークン単位生成、毎回の出力トークン課金、そして 2〜8% が不正 JSON として届きパースとリトライが必要です。ルーブリックはプロンプトの中にあり、実行ごとにドリフトします。Jev はこの経路を逆にします。criteria は型付きでバージョン管理されたコードであり、答えは較正済み確率として Noul/Score ラベル上に 1 フォワードパスで返り、フォーマットエラーは 0%。課金は入力のみで、1,000 テキストあたり約 $0.0008 です。

人間が書いたテキストでも機能しますか?

機能します。ただし正直な注意点が一つあります。このゲートはテキストの性質を測るのであって著者を測るのではない、ということです。LLM が存在するずっと前から、人間はテンプレートまみれの水増し記事を量産してきました。人間製の原稿に is_slop=true と出るのは誤判定ではなく正しい slop 判定です。本物の誤検知リスクは逆向きにあります。簡潔で事実密度の高い人間の文章はきれいに通過し、深く編集された AI 支援の原稿は境界付近に着地します。だからこそ 0.60〜0.85 のフラグレーンと人手レビューレーンが存在するのです。

「35 の tell」という数字はどこから来たのですか?

madewithjev の AI slop checker の公開説明から来ています。1 チェック約 243ms で slop の tell を検出する無料のウェブツールで、この数字は同ツール独自の分類であり、Jev の公式仕様ではありません。本ページの 6 つのファミリー(テンプレート文、リストと太字の乱用、中身のないまとめ、句読点の痕跡、低い事実密度、構造の対称性)は、同じ領域を独自のスキーマに書ける criteria 語彙へ整理し直したものです。

サイト全体や CMS の既存記事を一括スキャンできますか?

できます。Python 例のバッチパターンがまさにそれです。1 ページ約 100〜500ms なら、1 万ページの監査はシングルスレッドで約 1 時間、入力のみの課金で数セント、GPU も不要です。各レーンを CMS のステータス(公開 / レビュー / 隔離)にマッピングし、全ページで answer + confidence + lane をログに残せば、ポリシーが変わっても監査記録は生き残ります。あとは定期的に再スキャンを。GitHub の jev-radar CASEBOOK には、まさにこのループで構築されたオープンソースツールが約 11 件登録されています。

コンテンツ品質設計をさらに深める