Jev Recipe / 内容质量
用 Jev 检测 AI 垃圾内容(AI slop):类型化质量闸门
在发布前拦截 AI 量产的泔水文:一次 evaluate 调用同时返回 is_slop 判定和 1–5 有序质量分,校准置信度决定自动拦截、打标、人工复核三条车道。
搭建 slop 质量闸门的 6 个步骤
{
"is_slop": {
"type": "noul",
"instructions": "这段文字是否属于 AI slop:模板腔浓重、格式滥用、信息密度低的量产填充内容?"
},
"quality": {
"type": "score",
"instructions": "给这段文字的编辑质量打分",
"criteria": {
"1": "纯泔水:模板句和填充词堆砌,没有原创信息",
"2": "以填充为主:重复严重,信源含糊,具体事实很少",
"3": "混合:可读但平庸,信源单薄",
"4": "良好:具体、有出处,像人写的",
"5": "优秀:有原创观点,事实密度高,有自己的声音"
}
}
}什么算 AI slop:六个特征族
slop 是一族特征的总和,不是单一信号。下面的清单把常见 tells 归成六族——定义你产品自己的 slop 标准时,直接拿去当 criteria 词汇。广为流传的「35 条 tells」来自 madewithjev AI slop checker 的公开描述,并非官方规范;具体数字请当作某个工具的分类口径,而不是权威标准。
模板腔与重复 n-gram
复读机式短语、万能开头、毫无节奏变化的句式。
- "在当今快速发展的时代"式万能开头
- 同一个 n-gram 在相邻段落反复出现
- 公式化过渡词:「此外」「与此同时」「综上所述」
- 第一段把标题或提问原样复述一遍
- 句子长短高度一致,没有节奏起伏
- 万金油对冲句:「值得注意的是」「不得不说」
列表与加粗滥用
让排版干本该由正文干的活。
- 一句话能说清的事偏要拆成 bullet 列表
- 句中随手加粗关键词,制造虚假重点
- 每写两句就挂一个小标题
- 编号「步骤」其实是普通话题罗列
- 没人要求的「首次出现加粗注释体」术语表
空洞总结句式
什么也没压缩、什么也没补充的结论段。
- "总而言之,X 是一款能够帮助你……的强大工具"
- 动词堆叠:「赋能」「助力」「深耕」「引爆」「重塑」
- "X 不仅仅是 Y——更是 Z"句式
- TL;DR 只是复述正文,没有压缩任何信息
- "在……的大背景下""在……的浪潮中"式填充
破折号与 emoji 痕迹
跨模型、跨 prompt 都活下来的标点习惯。
- 破折号当默认连接符——一段里连用三四个
- emoji 当项目符号或小标题
- 同一页里直角引号和弯引号混用
- 一句成段的「金句」连续堆叠
低事实密度与信源含糊
没有可核查的东西:该出现数字、名字、日期的地方全是空的。
- "研究表明"但通篇没有一项研究
- "众多专家认为"却给不出一个名字
- 该有数字、版本号、日期的地方一笔带过
- 该举例子的时候只给抽象论断
- 所谓「事实」只是把读者的问题复述一遍
结构性对称
每个章节都像同一个模子刻的——批量生产的几何特征。
- 每个 H2 章节长度几乎一致
- 标题完全平行对称(「5 大优势……5 大挑战……」)
- 文章自问自答出一个没人问的 FAQ
- 「结语」部分再补最后一句正确的废话
AI slop 检测与三车道分流模拟器
选择一段示例文本并运行双层判定,看置信度如何把它分进拦截、打标、人工三条车道(纯前端模拟,不调用真实 API):
点击「运行 Jev 检测」查看 is_slop 判定、quality 评分与三车道分流结果。
Slop 检测基准对比:Jev 类型化闸门 vs 生成式 LLM 检测器
仅输入计费,0 输出 token
输入与生成的判定文本双向计费
单次前向推理,无文本生成
逐 token 生成判定结论
Noul / Score 原生输出,无需任何解析
一个数字直接决定拦截 / 标记 / 复核车道
未校准,需额外接 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": "纯泔水:模板句和填充词堆砌,没有原创信息",
"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,
};
}
// 典型路径:单篇 ~100-500ms,仅输入计费,0% schema 错误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": "纯泔水:模板句和填充词堆砌,没有原创信息",
"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:
# 单页 ~100-500ms:一万页的 CMS 审计单线程约一小时跑完,
# 按仅输入计费只花几美分。
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 垃圾内容检测常见问题
用 Jev 检测 AI slop 靠谱吗?
用来分诊足够可靠,用来「定罪」则要留人工车道。slop 是一族特征的总和——模板腔、格式滥用、空洞总结、低事实密度——类型化双问题判定(is_slop Noul + 1–5 quality Score)在单次 ~100–500ms 前向推理中就能抓住这些痕迹,且 0% 格式错误。真正可以自动化依赖的可靠性来自校准置信度:阈值是准确率契约,所有低置信度或边界判定都会落进复核车道,而不是被静默删除。
置信度阈值应该设多少?
从 0.85 自动隔离、0.60–0.85 打标复核、低于 0.60 人工阅读起步,然后用标注样本推导你自己的切分点:把预测置信度和编辑结论画成校准曲线,把每个切分点放在「错一次也能承受」的位置。强制生效前先影子模式(只记日志)跑一段,给易抖动的文本放宽中间带(迟滞),并随内容分布漂移每季度重验。
这和生成式 LLM 检测器、AI 文本分类器有什么区别?
生成式检测器的判定结论是一段生成的文本:1,500~3,000ms 的逐 token 生成、每次调用都计输出 token、2~8% 的响应是非法 JSON 需要解析重试,而且评分细则埋在 prompt 里、每次运行都在漂移。Jev 把这个路径反过来:criteria 是类型化、可版本化的代码,答案以校准概率的形式在单次前向中落在 Noul/Score 标签上,0% 格式错误,仅输入计费——约每千篇 $0.0008。
对人写的内容也有效吗?
有效——但要诚实面对一点:闸门度量的是文本特征,不是作者身份。早在 LLM 出现之前,人类就在批量生产模板化、注水的内容农场文章,所以一篇人写稿子被判定 is_slop=true 是正确的 slop 结论,不是误报。真正的误报风险在反方向:精炼、事实密度高的人写文本会干净通过,深度编辑过的 AI 辅助稿件会落在边界附近——这正是 0.60–0.85 打标车道和人工复核车道存在的意义。
「35 条 tells」这个数字是哪来的?
来自 madewithjev AI slop checker 的公开产品描述——一个免费网页工具,单次检查(约 243ms)即可标记 slop 特征。它是某一款工具自己的分类口径,不是 Jev 的官方规范。本页的六个特征族(模板腔、列表与加粗滥用、空洞总结、标点痕迹、低事实密度、结构性对称)把同一片领域整理成你能直接写进 schema 的 criteria 词汇。
能扫整站或 CMS 存量内容吗?
可以——就是 Python 示例里的批量模式。按单页 ~100–500ms 计算,一万页审计单线程约一小时跑完,仅输入计费只花几美分,完全不需要 GPU。把每条车道映射成 CMS 状态(发布 / 复核 / 隔离),每一页都落 answer + confidence + lane 日志,政策变更时审计记录仍在;再按周期重扫。GitHub 上的 jev-radar CASEBOOK 收录了大约十一个基于同一套循环构建的开源工具。