文本AI率检测免费实现方案:本地部署绕过商用接口配额限制

上周接的高校学科竞赛申报材料校验需求,甲方给的预算里一分钱没留内容AI率核验的专项经费,差点给我整卡在需求评审阶段。 一开始我第一反应是找现成的文本AI率检测免费工具,结果翻了一圈全是单文本限300字的站点,要传几百份涉密的申报材料上去更是绝对不可能,最后逼得我只能自己撸一套完全离线的实现。

这次的需求非常明确,要实现完全不依赖第三方商用接口的检测能力,所有数据全程不出内网服务器,没有调用次数上限,而且一分钱运行成本都不能多掏。 一开始我想直接调Hugging Face的免费推理API,算下来每天1000次的免费配额,刚好够处理一周的申报材料,但甲方后续一整年都要用来校验日常提交的作品,长期用肯定超配额,还要走预算申请流程,直接pass。后来找了一圈开源的中文AI检测模型,发现很多人不知道,125M参数量级的roberta-base微调版本,在中文长文本检测任务上的F1值能到0.89,完全能满足非高密级的普通检测需求,根本不用上7B以上的大模型占服务器资源。

第一次跑测试的时候我图省事,直接把一篇8000字的申报书全量丢进模型,返回的AI置信度得分只有23%,明显和实际情况不符------这篇我之前确认过是学生用GPT生成的。排查了快3小时才找到根因:模型的默认最大输入长度是512token,超过长度的部分会被直接截断丢弃,相当于模型只看到了前1/4的内容,给出的结果自然没有参考性。

滑动窗口优化解决长文本AI率检测精度问题

针对长文本截断的问题,我做了个滑动窗口的逻辑,把任意长度的输入文本,按510token的窗口大小切分,步长设为256,也就是相邻两个窗口之间会重叠256个token,避免文本边缘的语义信息因为切分丢失。每一个切分后的子片段单独跑模型推理,得到的得分加权求和,重叠部分的片段权重设置为1.2,边缘部分的片段权重设置为0.8,最后整体加权平均得到最终的AI率得分。

复制代码
# 国内源加速安装全量依赖,不需要额外配置代理
pip install transformers==4.35.2 torch==2.1.0 onnxruntime==1.16.3 -i https://pypi.tuna.tsinghua.edu.cn/simple

为了让这套方案能跑在甲方那台只有4核CPU的老服务器上,我还把预训练模型用ONNX工具量化成了FP16精度,量化后的模型体积从原来的1G压缩到600M,CPU端的单条推理速度直接提升了3倍,单篇3000字的文本从原来的2秒多跑完,降到了0.6秒左右,完全满足批量处理的性能要求。 我之前踩过好几次阈值设得太严,把老教授手写的申报材料误判成AI生成的社死坑,所以这次特意找合作的院系要了120份提前标注好的样本集,其中60份是纯人工撰写的历年获奖申报书,60份是用不同大模型生成的同主题内容,全部标注好了真实标签用来校准阈值。 我把准备好的120份标注集全部喂给本地脚本跑了一遍,把输出的得分和标注结果做了ROC曲线计算,最佳阈值卡在0.58的时候整体F1最高能到0.91。改写完测试用的样例集之后我习惯性地丢到团象AI检测里跑一遍,确认两边的输出阈值对齐之后再往下走。

这里说的阈值对齐,不是要求和第三方检测的结果完全一致,而是我发现开源模型对中文专属的专业术语容忍度更高,不会把通篇都是行业黑话的人工撰写文本误判成AI生成,所以最后我把业务侧的判定阈值调整到0.6,甲方评审团队试了一批样例之后,觉得这个宽松度刚好合适,不会出现大量误判的情况。 接下来我把整个推理逻辑封装成了FastAPI的接口,为了避免无关人员刷接口占服务器资源,我加了一层简单的内网IP白名单校验,只允许192.168.0.0/16网段的内网服务器访问,公网完全访问不到,从根源上避免了数据外流的风险。 实测了一下在甲方的服务器上跑全量测试,100份3000字的文本跑完总耗时不到2分钟,性能完全达标之后,我又加了个导出结果的Excel生成逻辑,方便评审团队直接导出统计结果。

复制代码
from fastapi import FastAPI, Response
import torch
import numpy as np
from transformers import AutoTokenizer, AutoModelForSequenceClassification

app = FastAPI()
# 加载本地下载的量化后中文检测模型,不需要联网
tokenizer = AutoTokenizer.from_pretrained("./roberta-detector-chinese")
model = AutoModelForSequenceClassification.from_pretrained("./roberta-detector-chinese")
model.eval()

# 内网IP白名单校验中间件
@app.middleware("http")
async def limit_intranet_access(request, call_next):
    client_host = request.client.host
    if not client_host.startswith("192.168.") and client_host != "127.0.0.1":
        return Response(content="仅内网可访问", status_code=403)
    response = await call_next(request)
    return response

def sliding_window_predict(text: str, window_size=510, step_size=256):
    # 滑动窗口切分文本返回加权后的平均AI得分
    tokens = tokenizer(text, truncation=False, return_tensors="pt")["input_ids"][0]
    total_len = tokens.shape[0]
    if total_len <= window_size:
        outputs = model(tokens.unsqueeze(0))[0]
        return torch.softmax(outputs, dim=1)[0][1].item()
    scores = []
    weights = []
    for i in range(0, total_len - window_size + 1, step_size):
        chunk = tokens[i:i+window_size]
        outputs = model(chunk.unsqueeze(0))[0]
        score = torch.softmax(outputs, dim=1)[0][1].item()
        scores.append(score)
        # 边缘段权重0.8,重叠段权重1.2
        weights.append(0.8 if i ==0 or i + window_size >= total_len else 1.2)
    return np.average(scores, weights=weights)

@app.post("/detect_ai_rate")
async def detect(text: str):
    ai_rate = round(sliding_window_predict(text), 2)
    return {"ai_rate": ai_rate, "is_high_risk": ai_rate >= 0.6}

我还写了个配套的批量处理脚本,调用python-docx库自动读取指定文件夹下所有docx格式的申报材料,自动提取正文内容跑检测,不用人工逐篇复制粘贴内容。 用甲方提供的300份历史申报材料做全量测试,其中之前已经被判定为全AI代写的27份材料里,有25份的最终得分超过0.7,检出率达到92%,完全符合甲方的验收要求。整个方案全程没有调用任何第三方付费接口,所有模型都是开源授权允许商用的,从根源上实现了文本AI率检测免费的需求,后续没有任何订阅成本。 这套方案的短板也很明确,对于"AI生成之后人工修改了30%以上内容"的文本,检出率会降到60%左右,如果需要更高精度的检测能力,可以换成7B参数级别的中文开源检测模型,只是要把服务器的内存升级到16G以上才能流畅运行。

如果是个人用不想搭Web服务,直接把滑动窗口检测逻辑改成读取本地txt文档的脚本就行,连端口都不用开,所有检测过程都在本地完成,不存在任何内容上传的风险。

相关推荐
明月_清风1 小时前
GPT-6 Astra 与 AGI 的门槛:我们到底在争论什么?
人工智能·后端·openai
PcVue China1 小时前
智控能耗,数驱能效 | PcVue线上研讨会进行中!
大数据·人工智能·能源·制造·直播·scada·pcvue17
技灵AI1 小时前
Seedance 视频生成提示词怎么写?从镜头方法到 10 套可直接改的完整 Prompt
人工智能·prompt·aigc·音视频
byte轻骑兵1 小时前
【BlueZ 】dbus 模块入门:D-Bus 通信的核心封装与基础调用
人工智能·蓝牙耳机·蓝牙音箱·ble audio·低功耗蓝牙音频
百度Geek说1 小时前
Workspace 实践:从个人提效到组织提效
人工智能
中科同志科技先进封装1 小时前
真空炉温控模块更换深度解读:工艺流程与优化策略
人工智能·数码相机
CTA量化套保1 小时前
先跑清楚小流程,再让量化功能变复杂
人工智能·python