Jev Recipe / コンテンツ品質
Jev で検知する AI slop:型付き品質ゲートの構築
公開前に量産型の低品質コンテンツ(AI slop)をふるいにかける。1 回の evaluate 呼び出しで is_slop 判定と 1〜5 の順序付き品質スコアを返し、較正済み信頼度が自動隔離・フラグ・人手レビューの 3 レーンを振り分けます。
slop 品質ゲート構築 6 ステップ
{
"is_slop": {
"type": "noul",
"instructions": "このテキストは AI slop(テンプレート文の繰り返し、書式の乱用、事実密度の低い量産型フィラー)に読めますか?"
},
"quality": {
"type": "score",
"instructions": "このテキストの編集品質を評価する",
"criteria": {
"1": "純粋な slop:テンプレート句とフィラーのみ、独自の情報なし",
"2": "フィラー主体:繰り返しが多く、出典が曖昧、具体的な事実が少ない",
"3": "混合:読めるが平凡、出典が薄い",
"4": "良好:具体的で出典があり、人間が書いたように読める",
"5": "優秀:独自の洞察、高い事実密度、明確な声"
}
}
}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 つ足す「まとめ」ブロック
AI slop 検知 & 3 レーン判定シミュレーター
サンプルテキストを選んで 2 層判定を実行。信頼度が隔離・フラグ・人手のどのレーンへ振り分けるかを確認できます(フロントエンドのシミュレーションであり、実 API は呼びません):
「Jev 検知を実行」を押すと、is_slop 判定・quality スコア・3 レーン判定の結果を表示します。
slop 検知比較:Jev 型付きゲート vs 生成系 LLM 検知器
入力のみ課金、出力トークンゼロ
入力+生成された判定テキストの双方課金
単一フォワードパス、生成なし
トークン単位の判定文生成
Noul / Score はネイティブ出力、解析不要
1 つの数値が隔離 / フラグ / レビューのレーンを決定
未較正、logprob の追加実装が必要
実装コード:TypeScript / Python の slop ゲート
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%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 lanesAI 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 件登録されています。