SlopTotal 发布可自托管的 AI 文本检测器,23 个引擎在 CPU 上运行
Self-host your own AI text detector on CPU to filter out slop
SlopTotal 是一个免费开源的 AI 文本检测器,可自托管在本地 CPU 上,粘贴文本、上传 PDF/Word 或输入 URL 后由 23 个独立检测引擎并行打分,再经校准集成给出单一结论,扫描内容不出本机。
AI 生成文本的 VirusTotal。粘贴文本、拖入 PDF 或 Word 文件,或 提供一个 URL。二十三个独立的 AI 检测器(神经分类器、 统计检验和语言启发式)并行打分,一个 经过校准的集成模型将它们的投票转化为一个你可以逐引擎 检查的结论。它在你自己的 CPU 上运行,因此你扫描的任何内容都不会离开你的机器。
它是一个免费、自托管、开源的替代方案,可替代 GPTZero、Originality.ai、Copyleaks、ZeroGPT 和 Humalingo 等托管式 AI 内容 检测器。 它不给出单一模型的一个数字,而是向你展示每个模型的意见,并且 公开其准确度,包括失败案例。
试用: sloptotal.com · 运行: docker run -p 8000:8000 ghcr.io/pablocaeg/sloptotal
功能
- 23 个检测引擎,一个校准分数。DeBERTa 和 RoBERTa 分类器、Binoculars、Fast-DetectGPT、GLTR、困惑度和突发性 测试,以及套话启发式。结果会在每个引擎完成时流式返回。
- 文本、URL 和文档。粘贴文本、扫描网页(正文内容会
自动提取),或上传
.pdf、.docx、.txt或.md。 - 站点检查:这个网站是 vibe-coded 的吗?找出 Lovable、v0、Bolt、Base44、Replit 和 Same 在它们部署的站点中留下的指纹, 并展示每一项的证据。工作原理
- 逐段热力图通过 API 提供,以查看哪些部分读起来像 AI。
- 实测,而非声称。下面的每一个准确度数字都附带语料库、 测试框架和原始逐样本分数。
- 默认私密。自托管,无第三方 AI API,无跟踪, 报告在 30 天后删除。
- 仅用 CPU 也可以。自动检测你的硬件;4 GB 内存足以运行 精简配置,GPU 为可选。
- JSON API 和一个 Chrome 扩展 可在 Google 搜索和 LinkedIn 中标记看起来像 AI 的结果。
实测准确度
大多数检测器会公布一个准确度数字,却不说明它是在什么数据上测得的。 SlopTotal 在 SlopBench 上测量:1,626 篇人类 文本,每一篇都写于 ChatGPT 之前,以及 1,626 篇 AI 文本,主题相同、 长度相同,来自 14 个当前模型,涵盖 15 种写作类型 (新闻、维基百科、arXiv、Stack Exchange、Reddit、评论、学生作文、 非母语英语、小说和 1532-1915 年出版的文学作品)。下面的每一个数字 都是在模型未经过调优的写作类型上测得的。
| AUC | 0.942 |
| 被判定为“很可能是 AI”(55+)的 AI 文本 | 67% |
| 被判定为“很可能是 AI”(55+)的人类文本 | 1.7% |
| 被标记的人类文本(45+) | 3.9% |
| 被标记的 1532-1915 年出版文学作品 | 87 篇中 0 篇 |
分数区间以该人类文本为锚点:45 是人类写作前 5% 的起点, 55 是前 2%,80 是前 0.5%。因此“很可能是 AI”意味着 每 100 篇人类文本中不到 2 篇能达到这么高的分数。
其他语言。支持西班牙语、法语、德语、意大利语、葡萄牙语、荷兰语、 波兰语、俄语和日语(AUC 0.91 至 0.997);阿拉伯语和 韩语为实验性;印地语、土耳其语和中文尚不可靠, 报告会如实说明。
哪些不管用。非英语母语者的文章仍比母语者更容易被标记(15% 的 TOEFL 作文被判定为“可能由 AI 生成”,而 88 篇美国学校作文中无一被标记)。低于约 80 词时,评分信号较弱。经过“humanizer”处理的 AI 文本约有一半概率被识别。源代码不在这些引擎的处理范围内。所有结果,按来源、按模型、按引擎,都在发现结果中,包括在 RAID 基准上排名靠前的分类器在当前模型上 AUC 降至 0.75。
快速开始
Docker(最快)
docker run -p 8000:8000 -v sloptotal-models:/app/models ghcr.io/pablocaeg/sloptotal
打开 http://localhost:8000。首次扫描会将约 2 GB 的模型下载到 sloptotal-models 卷中,因此后续启动会很快。若要从源码构建,请运行 docker compose -f docker/docker-compose.yml up。
从源码构建
需要 Python 3.10+(macOS 自带 3.9,版本过旧)。
git clone https://github.com/pablocaeg/sloptotal.git cd sloptotal python3.11 -m venv venv && source venv/bin/activate pip install -r requirements.txt ./scripts/start.sh # or: uvicorn app.main:app --port 8000
检查每个引擎能否端到端加载并评分:
python scripts/smoke_test.py # against http://localhost:8000站点检查:检测用 AI 应用构建器搭建的网站
“这个网站是 vibe-coded 的吗?”检查器大多只评估风格(Tailwind 类名数量、缺失的安全头、流行词),然后将其转化为百分比。手写网站也具备所有这些特征。SlopTotal 只查找构建器自身在其部署内容中留下的标记,每个标记都在线上站点或构建器自己的模板中得到确认:
| 构建器 | 指纹 |
|---|---|
| Lovable | gptengineer.js 运行时,/lovable-uploads/ 资源,Lovable 徽章,/~flock.js,*.lovable.app |
| v0 (Vercel) | 来自 v0 布局模板的 <meta name="generator" content="v0.app">,*.vusercontent.net |
| Bolt | X-Powered-By: Bolt.new 头部,bolt.new/badge.js,*.bolt.host |
| Base44 | app.base44.com 平台调用,base44_access_token,*.base44.app |
| Replit | Replit Agent 开发横幅,Replit 徽章,*.replit.app |
| Same | 从 same-assets.com 提供的资源 |
没有标记的网站仍可能是用 AI 编写的:从这些工具导出的代码托管在别处,或用 AI 编辑器编写,都不会留下指纹。因此结果是证据,而非概率。页面文案由文本引擎单独评分。
curl -X POST http://localhost:8000/api/scan/site \ -H "Content-Type: application/json" -d '{"url": "example.com"}'
API
| 端点 | 方法 | 功能 | 典型延迟(CPU) |
|---|---|---|---|
/api/analyze |
POST | 针对 text 或 url 的完整 23 引擎报告 |
2-8 秒 |
/api/quick-score |
POST | 4 个分类器加启发式规则 | 0.1-0.5 秒 |
/api/paragraph-score |
POST | 逐段评分(热力图) | 1-3 秒 |
/api/scan/site |
POST | AI 应用构建器指纹加文案评分 | 1-3 秒 |
/api/extract |
POST | 来自上传的 .pdf / .docx / .txt 的文本(multipart file) |
< 1 秒 |
/api/scan/snippets |
POST | 1-30 条短片段批量处理 | ~0.5 秒 |
/api/scan/urls |
POST | 1-10 个 URL 批量处理,感知页面类型 | 1-5 秒 |
/api/engines |
GET | 引擎元数据 | 即时 |
/api/report/{id} |
GET | 已存储的报告 | 即时 |
/api/report/{id}/feedback |
POST | 记录文本的实际作者:{"label": "human" | "ai" | "mixed" | "unsure"} |
即时 |
/api/queue/status |
GET | 队列容量 | 即时 |
curl -X POST http://localhost:8000/api/analyze \ -H "Content-Type: application/json" \ -d '{"text": "Your text to analyze here..."}'
在 Python 中,examples/python_client.py 分析文本,打印得分最高的五个引擎,并运行站点检查,服务器繁忙时在队列中等待:
python examples/python_client.py "Paste at least 50 characters of text here..." example.com响应会列出每个引擎及其得分、判定和通俗语言的详细说明,外加 overall_score(0-100)和 overall_verdict。
检测引擎
每个引擎都链接到其在 sloptotal.com 上的页面,其中包含针对两个语料库的实测得分。下面的 AUC 是引擎将随机 AI 段落排在随机人类段落之上的概率:1.0 为完美,0.5 为抛硬币。
神经分类器
| 引擎 | 模型 | AUC | 备注 |
|---|---|---|---|
| Desklib DeBERTa | DeBERTa-v3-large (435M) | 1.000 | 在我们自己的测试中区分度最强 |
| SuperAnnotate | RoBERTa-large (355M) | 0.989 | 对古体文风无可测量的偏见 |
| E5-Small | E5 + LoRA (33M) | 0.999 | 以 33M 参数匹敌远更大的模型 |
| TMR Detector | RoBERTa-base (125M) | 1.000 | 在 RAID 上训练,因此 RAID 分数对其有利 |
| BERT-tiny RAID | BERT-tiny (4.4M) | 1.000 | 毫秒级响应 |
| ReMoDetect | DeBERTa (184M) | 0.941 | 针对 RLHF 对齐的 LLM |
| ChatGPT Detector | RoBERTa-base (125M) | 0.829 | 专用于 ChatGPT |
| Fakespot | RoBERTa-base (125M) | 0.999 | 在现代文本上准确,但在1920年之前的散文上存在+0.533的偏差 |
| OpenAI Detector | RoBERTa-base(125M) | 0.771 | 2019年的GPT-2检测器;在现代LLM上表现较弱 |
统计方法
| 引擎 | 方法 | AUC |
|---|---|---|
| Log-Rank | GPT-2下的平均对数秩 | 0.909 |
| GLTR | Token排名分布 | 0.904 |
| Perplexity | GPT-2困惑度评分 | 0.901 |
| Cross-Perplexity | 双模型困惑度比较 | 0.891 |
| Fast-DetectGPT | 条件概率曲率 | 0.890 |
| Binoculars | 两个语言模型之间的交叉熵比率 | 0.836 |
| DivEye | 惊奇度多样性 | 0.730 |
语言学启发式
| 引擎 | 信号 | AUC |
|---|---|---|
| Structural Analysis | 破折号使用、句子一致性 | 0.836 |
| Linguistic Markers | AI偏好的短语(“delve”、“tapestry”……) | 0.713 |
| Formulaic Patterns | 陈词滥调的开头和结尾 | 0.698 |
| Vocabulary Richness | 类型-标记比、hapax legomena | 0.583 |
| Readability Uniformity | 跨段落一致性 | 0.581 |
| Burstiness | 逐句困惑度方差 | 0.582 |
| Sentiment & Hedging | 模糊限定与强行平衡 | 0.522 |
语言学启发式本身较弱。保留它们是因为它们独立于神经分类器而失败,这正是它们作为平局决胜而非证据有用的原因。
评分
最终分数是校准过的,而非简单平均,并且每个权重都源自测量而非直觉。参见 tests/eval/FINDINGS.md 和 sloptotal.com/detect/ai-detector-ensemble/。
- 锚定于无偏分类器——Desklib、SuperAnnotate、E5和 ReMoDetect都以高AUC得分,且对较旧散文没有可测量的偏差。 它们的共识与完整加权集合按60/40混合。
- 权重来自测量——每个引擎的份额与 Somers' D(2*AUC - 1)成正比,并按其对古旧 写作表现出的任何偏差进行缩减。RAID训练的引擎被抑制,因为我们的语料库是RAID。
- 置信度来自一致性——跨独立引擎 家族的紧密聚类是可信的;单个自信的引擎则不是。
- 怀疑,但只在有理由时——一致的高分类器分数仅在文本本身带有 人类标记(缩略形式、第一人称、俚语)时才被抑制。无条件应用时,它在70个AI样本中的69个和66个人类样本中的0个上触发,抑制了正确的检测。
Fakespot此前是锚点,权重为0.13。它在现代文本上准确 (AUC 0.999),但对1920年之前的人类散文评分为0.645,而现代 人类写作为0.112——是所有引擎中偏差最大的——而锚定放大了它。 Machiavelli得分为62.5。降级到0.033后,文学段落平均为10.2, 且没有一个被标记。
配置
SlopTotal在启动时检测CPU、RAM和GPU并选择配置文件。一切
都可以通过环境变量覆盖;参见.env.example。
| 配置文件 | RAM | CPU | GPU | 备注 |
|---|---|---|---|---|
| Lite | 4 GB | 2核 | 无 | 所有引擎,较慢 |
| Standard | 8 GB | 4核 | 无 | 大多数笔记本电脑的默认值 |
| Performance | 16 GB+ | 6+核 | CUDA可选 | 池化副本,最大吞吐量 |
高RAM CPU服务器(例如64 GB,无GPU):您会自动获得performance配置文件。没有CUDA时,所有推理都留在CPU上,但您可以运行更多并发工作进程和模型池副本:
# Tune for a 64 GB CPU-only server export SLOPTOTAL_PROFILE=performance export SLOPTOTAL_TORCH_THREADS=8 export SLOPTOTAL_FULL_WORKERS=8 export SLOPTOTAL_SNIPPET_WORKERS=6 export SLOPTOTAL_MAX_CONCURRENT_FULL=4 export SLOPTOTAL_POOL_FAKESPOT=2 export SLOPTOTAL_POOL_TMR=2 ./scripts/start.sh
| 变量 | 默认值 | 用途 |
|---|---|---|
SLOPTOTAL_PROFILE |
auto | lite、standard或performance |
SLOPTOTAL_RETENTION_DAYS |
30 |
N天后删除报告(0保留它们) |
SLOPTOTAL_ALLOW_PRIVATE_URLS |
off | 允许URL扫描到达私有或内网主机(默认阻止) |
SLOPTOTAL_DATA_DIR |
项目根目录data/ |
存储报告和数据库的目录 |
SLOPTOTAL_DB_NAME |
sloptotal.db |
数据目录内的数据库文件名 |
SLOPTOTAL_DB_TIMEOUT |
30.0 秒 |
SQLite 连接超时 |
SLOPTOTAL_DB_BUSY_TIMEOUT |
5000 毫秒 |
SQLite 忙等待超时 |
SLOPTOTAL_CACHE_ENABLED |
true |
启用结果缓存(true、1 或 yes,不区分大小写) |
SLOPTOTAL_DEVICE |
自动检测 | 用 cpu 或 cuda 覆盖推理设备;否则在可用时使用 CUDA |
SLOPTOTAL_RESERVED_CORES |
2 |
计算可用分析器核心数时保留的 CPU 核心 |
SLOPTOTAL_SHORT_LANE_WORDS |
350 |
短文本通道的字数阈值 |
SLOPTOTAL_SHORT_WORKERS |
4 |
短文本工作线程数 |
SLOPTOTAL_MAX_CONCURRENT_SHORT |
2 |
由队列管理器强制执行的并发短文本扫描上限 |
SLOPTOTAL_MAX_CONCURRENT_SNIPPET |
4(精简版中为 2) |
并发片段扫描上限 |
SLOPTOTAL_POOL_BERT_RAID |
1(见下文) |
BERT RAID 模型池副本数 |
SLOPTOTAL_POOL_E5 |
1(见下文) |
E5 模型池副本数 |
SLOPTOTAL_POOL_FAKESPOT |
1(见下文) |
Fakespot 模型池副本数 |
SLOPTOTAL_POOL_TMR |
1(见下文) |
TMR 模型池副本数 |
HF_HOME |
./models |
模型权重的缓存位置 |
启动配置文件会在分析器读取其回退默认值之前填充未设置的设置。显式环境值优先。精简配置文件将片段并发上限设为 2;其他配置文件使用 4。在 CPU 上,当 RAM 至少为 32 GB 时,性能配置文件会将上述四个分类器池都设为 2;否则这些池使用 1,包括 CUDA 配置文件。
常见问题
AI 检测器可信吗? 不能盲目相信。任何检测器,包括这一个,都不应成为指控的唯一证据。这就是 SlopTotal 展示全部 23 票、它们的一致程度以及其测得的误报率的原因。短文本(约 80 词以下)和经过大量编辑的 AI 文本对每个检测器来说都不可靠。
它能检测 ChatGPT、Claude、Gemini、Llama 和 Mistral 吗? 评估语料库包含 GPT-4、ChatGPT、Llama 和 Mistral 的输出。分类器是在更广泛的混合数据上训练的。较新的模型只要共享这些指纹特征就能被覆盖;评估工具让你可以测量你关心的任何模型。
它会标记经典文学或正式写作吗? 在我们的测试中不会:来自 Austen、Melville、Kafka、Machiavelli 等人的 26 段文字都没有被标记。1920 年之前的散文被纳入评估,正是因为朴素的检测器会在它上面失败。
我的文本会被存储或共享吗? 它在你运行的服务器上处理。报告会保留 30 天(可配置),以便报告链接有效,且不会向外部服务发送任何内容。
它能检测 AI 生成的代码吗? 不能,我们也不声称它能:在测试中,这些引擎从未标记人类代码,但也从未捕获机器编写的代码。Site 检查会报告哪个 AI 应用构建器生成了网站,这是另一个问题。
故障排除
| 症状 | 修复 |
|---|---|
启动时出现 TypeError: unsupported operand type(s) for | |
Python 3.9 或更旧;请使用 3.10+ |
某个引擎报告 Model loading failed |
检查磁盘空间和网络以完成首次模型下载,然后重启;python scripts/smoke_test.py 会显示哪个引擎失败 |
| 首次扫描很慢 | 模型正在加载;之后的扫描只需几秒 |
| URL 扫描提示“私有网络地址” | 这是有意为之;设置 SLOPTOTAL_ALLOW_PRIVATE_URLS=1 以扫描内网页面 |
项目结构
app/ FastAPI backend: engines, ensemble, site fingerprints, API
web/ The web UI (Jinja2 templates, vanilla JS, no build step)
tests/ Unit tests (seconds, no downloads) and tests/eval/ accuracy harness
scripts/ smoke_test.py (end-to-end) and the model drift check
benchmarks/ Speed and load scripts
ARCHITECTURE.md 涵盖内部细节。AGENTS.md 是面向贡献者和 AI 编码助手的简短说明。
我们测过的新开源检测器
检测器模型不断出现在 Hugging Face 上,每个都有自己的准确率声明。在添加任何模型之前,我们会在相同的两个语料库上对它们评分。2026 年 9 月,独立测试,180 篇 RAID 文本加上 26 段文学段落:
| 模型 | RAID AUC | 文学偏见(越低越好) | 状态 |
|---|---|---|---|
| Gradient(DeBERTa-v3-large) | 0.998 | 0.033 | 下一个要添加的引擎 |
| Vanguard(ModernBERT-large) | 0.998 | 0.037 | 候选;在 0.5 处校准不佳 |
| Earlybird-fast(82M) | 0.913 | 0.040 | 快速片段扫描的候选 |
| rasbt ModernBERT | 0.864 | 0.000 | 未添加 |
经 RAID 训练的模型在 RAID 上按构造方式得分接近 1.0,需要先使用不同的测试集。完整表格、我们排除的模型及原因,以及原始得分见 tests/eval/FINDINGS.md。 路线图见 TODO.md。
相关项目与阅读材料
- RAID 基准(ACL 2024):我们评估中使用的对抗性 AI 文本检测数据集
- Detecting the Machine (2026):跨架构检测器基准;集成方法优于单一检测器
- EditLens:人类 vs AI 编辑 vs AI 生成分类
- GLTR:可视化 token 排名检查,我们 GLTR 引擎的灵感来源
- distil-labs/distil-ai-slop-detector:一个可在浏览器中运行的 270M Gemma 检测器
- sloptotal-extension:Chrome 扩展
贡献
欢迎贡献,尤其是带有测量数据的新引擎。请从 CONTRIBUTING.md 开始。
如果 SlopTotal 对你有用,点个 star 能帮助其他人发现它。
许可证
MIT。模型权重保留各自的许可证;见 THIRD_PARTY_LICENSES.md。
来源:Hacker News · github.com


