EnhancedReplica Research Repository
这是一个面向 Hugging Face 交付的完整研究资产仓。它不是只放模型权重的模型包,而是把最终模型、内置数据、训练与推理源码、正式结果和研究说明一起整理成了一个可以长期交接和复查的仓库。
At A Glance
- 最终正式系统:
7-voter Logistic Regression Stacking
- 最终测试集:
DS13_NLPCC_full_test_v1
- 正式结果:
F1 = 0.986091, Accuracy = 0.986182
- 跨域 bucket ensemble:
DS06: global 0.643836 -> bucket 0.904255
DS07: global 0.743119 -> bucket 0.872340
- 仓库同时包含:
- 最终模型资产
- 可直接实验的数据集和原始素材
- 训练与推理脚本
- 研究结论和预测留档
最终系统是什么
最终正式方案是一个 7-voter Logistic Regression Stacking 系统,用于中文机器生成文本检测。
7 个 voter 分别是:
| Voter | 类型 | 作用 |
|---|
qwen7b_general | Qwen2.5-7B-Instruct LoRA adapter | 通用文本分支 |
qwen7b_short | Qwen2.5-7B-Instruct LoRA adapter | 短文本专门化分支 |
qwen7b_extreme_short | Qwen2.5-7B-Instruct LoRA adapter | 极短文本专门化分支 |
bert | 微调分类模型 | 最终 LR 中权重最高的监督分支 |
roberta | 微调分类模型 | 与 BERT、Qwen 形成互补 |
FastDetectGPT | 零样本检测算法 | 提供生成痕迹分数 |
Binoculars | 零样本检测算法 | 提供另一类生成痕迹分数 |
这里最重要的一点是:FastDetectGPT 和 Binoculars 不是额外训练出来的新分类模型。它们是算法分支,底层都调用同一对 3B 模型:
Qwen2.5-3B
Qwen2.5-3B-Instruct
因此最终系统本质上是:
- 5 个监督/微调分支特征
- 2 个零样本 detector 特征
- 1 个长度特征
len_norm
共同进入 Logistic Regression stacking。
最终权重如何确定
正式最终系统的权重不是人工拍出来的,也不是探索阶段硬投票脚本里的默认表。正式系统采用以下流程:
- 收集 7 个 voter 在 dev 上的连续分数。
- 追加长度特征
len_norm = length / 1000.0。
- 用
StandardScaler 对特征做标准化。
- 用
sklearn.linear_model.LogisticRegression(solver="lbfgs", C=1.0) 学出 stacking 系数。
- 在 dev 上搜索最佳 F1 阈值,得到最终二分类阈值。
DS13 正式系统保留的 LR 系数如下:
| Feature | Coefficient |
|---|
bert | 2.0188854029 |
qwen7b_general | 1.8788706258 |
roberta | 1.8788624937 |
qwen7b_short | 1.2970493780 |
qwen7b_extreme_short | 0.8596312618 |
FastDetectGPT | 0.2563906985 |
Binoculars | 0.2295749248 |
len_norm | 0.0062348417 |
补充参数:
intercept = 1.6861943699
threshold = 0.1307
正式事实来源:
results/final-system/ds13/ensemble_meta.json
configs/ensemble_config.json
分桶策略怎么工作
仓库里同时保留了 global LR 和 bucket LR 两套结果逻辑。分桶定义固定为:
extreme_short = 0-75
short = 76-180
general = 181+
但要注意,DS13 正式结果虽然保留了 bucket 流程,实际上 3 个桶全部回退到了 global LR,因为 dev 太小:
extreme_short: n_dev = 1
short: n_dev = 0
general: n_dev = 9
真正体现 bucket 价值的是跨域集:
- DS06:global
F1=0.643836,bucket F1=0.904255
- DS07:global
F1=0.743119,bucket F1=0.872340
这说明 bucket 不是为了展示“复杂方法”而保留的探索残留,而是在 dev 足够时确实能改善跨域表现。
核心结果
DS13 正式最终系统
- 数据集:
DS13_NLPCC_full_test_v1
- 方案:7-voter Logistic Regression Stacking
- 测试集结果:
F1 = 0.986091
Accuracy = 0.986182
Precision = 0.992448
Recall = 0.979815
DS13 子集表现
| Subset | F1 | Accuracy |
|---|
normal | 0.997505 | 0.997500 |
mixed_attack | 0.962810 | 0.964000 |
paraphrase_attack | 0.979675 | 0.980000 |
perturbation_attack | 0.996000 | 0.996000 |
len_64 | 0.940452 | 0.942000 |
len_128 | 0.982880 | 0.983000 |
len_256 | 0.994995 | 0.995000 |
len_512 | 0.998004 | 0.998000 |
短文本仍然是 hardest case,len_64 是所有正式子集里最弱的一档。这也是为什么仓库里保留了两个长度专门化的 Qwen adapter,而不是只留下一个通用分支。
单模与 detector 参考结果
- Qwen general:DS01 test
F1 = 0.987230
- BERT:DS01 test
F1 = 0.960762
- RoBERTa:DS01 test
F1 = 0.933554
- Qwen short:DS01 test
F1 = 0.926173
- Qwen extreme short:DS01 test
F1 = 0.901213
- FastDetectGPT:DS01 test
F1 = 0.811014
- Binoculars:DS01 test
F1 = 0.742803
这些结果说明零样本 detector 不是最终性能主力,但它们提供的是不同于微调分类器的补充信号,因此最终仍然被纳入 7-voter 方案。
仓库包含什么
1.
2├── README.md
3├── LICENSE
4├── requirements.txt
5├── data/
6├── models/
7├── src/
8├── scripts/
9├── configs/
10├── reports/
11├── results/
12└── docs/
8 个一级部分的定位如下:
data/: 仓库内置数据,包含 5 个可直接实验的数据集和原始素材 / AI 生成文本 / 提示词资产。
models/: 最终保留的模型资产,只保留 Qwen adapter,不包含 Qwen 基础模型。
src/: 共享 Python 模块,包括 voter_registry.py 等研究期公共逻辑。
scripts/: 训练、评估、推理、集成、跨域实验入口脚本。
configs/: 训练、推理和正式集成配置快照。
reports/: 训练产物、日志、metrics、manifest、压缩预测文件。
results/: 正式研究结果区,专门放最终系统和跨域结论。
docs/: 解释文档。主文档面向交接,docs/archive/ 只做旧材料归档。
先看哪里
正式结果入口
results/final-system/ds13/: DS13 正式 7-voter 结果
results/final-system/upstream-voters/ds13/: DS13 七个上游 voter 的逐项输出,用于追溯最终 ensemble
results/final-system/ds01-reference/: DS01 参考 bundle,用来解释 fallback 训练语境
results/cross-domain/ds06/: DS06 跨域 bucket ensemble 结果
results/cross-domain/ds07/: DS07 跨域 bucket ensemble 结果
results/experiment-summaries/: 单模、detector、最终系统的机器可读摘要
快速使用
安装依赖:
pip install -r requirements.txt
查看仓库内置数据清单:
python scripts/train_eval/data_checks/inspect_dataset_distribution.py --dataset_ids DS04,DS06,DS07,DS11,DS12 --smoke
运行 BERT / RoBERTa 推理:
python scripts/inference/infer_bert_roberta.py --dataset DS06_External_core_balanced_v1
运行 Qwen adapter 推理:
1export QWEN_BASE_MODEL_PATH=/path/to/Qwen2.5-7B-Instruct
2python scripts/inference/infer_qwen_adapters.py --dataset DS06_External_core_balanced_v1
运行零样本 detector:
python scripts/inference/run_zero_shot_detectors.py --dataset DS06_External_core_balanced_v1
外部依赖边界
如果要运行 Qwen adapter 或零样本 detector,需要你自行准备外部基础模型:
- Qwen adapter 需要
Qwen2.5-7B-Instruct
- FastDetectGPT / Binoculars 需要
Qwen2.5-3B 与 Qwen2.5-3B-Instruct
本仓库更强调“研究资产完整交付”和“最终系统可解释”,而不是“把所有外部依赖也一并打包进仓”。
仓库没有什么
- Qwen 基础模型权重
- 公网 benchmark 的原始下载包本体
- 把
voter_registry.py 中探索期硬投票默认值当成正式最终权重的理由
- 承诺当前目录下一键重跑全部历史实验的运行环境
License And Use
本仓库采用
EnhancedReplica Research Asset License,见
LICENSE。
这是一个保守的研究资产授权口径,原因很简单:仓库里同时包含代码、模型资产、结果留档和混合来源的数据材料,不适合直接套一个过于宽松的统一开源许可证。
你可以把它理解为:
- 允许:研究、教学、论文复核、内部评测、方法复现、非商业参考
- 不允许:未经许可的商业化使用、对外托管服务部署、将原始数据素材整体镜像再分发、绕过上游许可和来源平台条款使用资产
如果后续你希望把“代码子集”单独拆出来走标准开源许可证,例如 Apache-2.0,我们也可以再额外整理一个 code-only 子仓。