跳到正文
Hacker News· sloptotal·· 9 天前AI 评分60

SlopTotal 发布可自托管的 AI 文本检测器,23 个引擎在 CPU 上运行

Self-host your own AI text detector on CPU to filter out slop

AI 导读

SlopTotal 是一个免费开源的 AI 文本检测器,可自托管在本地 CPU 上,粘贴文本、上传 PDF/Word 或输入 URL 后由 23 个独立检测引擎并行打分,再经校准集成给出单一结论,扫描内容不出本机。

正文 · AI 翻译

SlopTotal: open-source AI text detector that runs 23 detection engines on your own hardware

CI status Latest release Docker image Python 3.10+ MIT license Live demo

AI 生成文本的 VirusTotal。粘贴文本、拖入 PDF 或 Word 文件,或 提供一个 URL。二十三个独立的 AI 检测器(神经分类器、 统计检验和语言启发式)并行打分,一个 经过校准的集成模型将它们的投票转化为一个你可以逐引擎 检查的结论。它在你自己的 CPU 上运行,因此你扫描的任何内容都不会离开你的机器。

它是一个免费、自托管、开源的替代方案,可替代 GPTZero、Originality.ai、Copyleaks、ZeroGPT 和 Humalingo 等托管式 AI 内容 检测器。 它不给出单一模型的一个数字,而是向你展示每个模型的意见,并且 公开其准确度,包括失败案例。

Pasting AI-written text into SlopTotal and watching 23 detection engines report in real time

试用: 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 应用构建器搭建的网站

SlopTotal Site check identifying a website built with Lovable from its asset paths and scripts

“这个网站是 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/。

  1. 锚定于无偏分类器——Desklib、SuperAnnotate、E5和 ReMoDetect都以高AUC得分,且对较旧散文没有可测量的偏差。 它们的共识与完整加权集合按60/40混合。
  2. 权重来自测量——每个引擎的份额与 Somers' D(2*AUC - 1)成正比,并按其对古旧 写作表现出的任何偏差进行缩减。RAID训练的引擎被抑制,因为我们的语料库是RAID。
  3. 置信度来自一致性——跨独立引擎 家族的紧密聚类是可信的;单个自信的引擎则不是。
  4. 怀疑,但只在有理由时——一致的高分类器分数仅在文本本身带有 人类标记(缩略形式、第一人称、俚语)时才被抑制。无条件应用时,它在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。

相关项目与阅读材料

贡献

欢迎贡献,尤其是带有测量数据的新引擎。请从 CONTRIBUTING.md 开始。

如果 SlopTotal 对你有用,点个 star 能帮助其他人发现它。

许可证

MIT。模型权重保留各自的许可证;见 THIRD_PARTY_LICENSES.md。

来源:Hacker News · github.com