Methodology
技术方法
模型架构、训练与推理链路,及与线上一致的参数与部署说明。
双层模型架构
创新的双层架构设计,同时实现文本分类与边界定位
架构流程图
输入层
将中文文本编码为固定长度的 token 序列BERT编码层
利用BERT提取深层语义特征分类判定层
输出 Human / AI / mixed 的主判定结果边界分析层
仅在需要时补充混合文本边界分析BERT编码器
采用BERT-wwm-ext中文预训练模型,通过全词掩码策略更好地理解中文语义。
- 12层Transformer编码器
- 768维隐藏层
- 12个注意力头
- 约1.1亿参数
核心创新
- 1双层架构同时实现分类与边界定位
- 2针对中文特点优化的分词策略
- 3[SEP]标记机制精确标注边界位置
- 4Temperature Scaling置信度校准
当前线上模型与参数
本页不只展示「用了 BERT」,而是明确给出当前线上版本的模型名称、阈值策略与部署选择,便于答辩时老师直接理解系统的工程落地形态。
关键运行参数
| 项目 | 当前值 | 说明 |
|---|---|---|
| 默认分类模型 | bert_v11c_boundary_fix | 当前线上主模型 |
| 边界分析模型 | bert_span_detector | 辅助混合文本分析 |
| 最大输入长度 | 256 tokens | 分类主路径使用 256 |
| 温度缩放 | T = 0.8165 | 用于置信度校准 |
| AI判定阈值 | 0.8 | 优先降低人类误判 |
| 输出类型 | human / ai / mixed | API 直接返回三类结果 |
数据治理与模型训练
V11c通过四阶段数据治理与精细微调达成最优性能
数据风险审计
移除模板匹配和unknown来源样本
弱域数据增补
定向补充formal和LLaMA-405B弱域样本
长文AI边界修复
补充长文本AI样本恢复覆盖率
模型微调
沿用 V11 系列主配置做单阶段精细微调
从输入文本到最终结果
当前线上系统采用「分类优先、边界辅助」的推理逻辑。老师看到这一部分,可以直接理解前端显示的 Human / AI / mixed 是如何一步步得到的。
文本编码
前端提交原始文本,后端使用 BertTokenizer 做截断、padding 和 attention mask 构造。
概率校准
分类器 logits 先做 Temperature Scaling,再计算 Human / AI softmax 概率。
阈值决策
当 AI 概率 >= 0.8 判为 AI;当 Human 概率 >= 0.8 判为 Human;否则返回 mixed。
边界分析
仅当结果偏向 AI 或需要解释 mixed 时,才调用 span detector 生成边界提示。
当前分类主逻辑(伪代码)
encoding = tokenizer(
text,
max_length=256,
padding="max_length",
truncation=True
)
logits = classifier(**encoding)
scaled_logits = logits / 0.8165
prob_human, prob_ai = softmax(scaled_logits)
if prob_ai >= 0.8:
result_type = "ai"
elif prob_human >= 0.8:
result_type = "human"
else:
result_type = "mixed"
if result_type == "ai" or (result_type == "mixed" and prob_ai >= 0.5):
boundary_hint = span_detector(text)
else:
boundary_hint = None/api/detect 返回字段
技术栈
PyTorch
深度学习框架
Transformers
预训练模型库
BERT-wwm
中文预训练模型
Scikit-learn
机器学习工具
Pandas
数据处理
NumPy
数值计算
线上部署结构
项目不是只停留在离线训练,而是已经部署成可在线访问的完整前后端系统。
Vercel Frontend
Next.js 16 + TypeScript,页面展示与交互入口。
Next.js Route Handlers
/api/detect 与 /api/health 先在服务端代理,再转发到后端。
api.baxfor.fun
独立后端域名,使用 HTTPS 反向代理到模型服务。
FastAPI + PyTorch
负责推理、阈值决策、边界分析与 JSON 返回。
当前生产环境要点
核心算法
文本分类算法
def classify_text(text):
encoding = tokenizer(
text,
max_length=256,
padding="max_length",
truncation=True
)
logits = classifier(**encoding)
scaled_logits = logits / 0.8165
prob_human, prob_ai = softmax(scaled_logits)
if prob_ai >= 0.8:
return "ai", prob_ai
if prob_human >= 0.8:
return "human", prob_human
return "mixed", max(prob_human, prob_ai)边界检测算法
def detect_boundary(text, result_type, prob_ai):
if result_type != "ai" and prob_ai < 0.5:
return None
encoding = span_tokenizer(
text,
max_length=512,
padding="max_length",
truncation=True
)
token_labels = span_detector(**encoding)
boundary_char = decode_boundary(token_labels)
return boundary_char当前版本仍然存在的问题
这一部分专门保留给答辩老师看:不仅展示成绩,也清楚说明当前模型的边界和工程取舍。
主分类器使用 max_length=256,因此当前更像稳定的单窗分类器,而不是严格意义上的全文阅读器。
模型对“高完成度中文书面表达”偏敏感,学术导论、社论、抒情散文这类人类文本更容易被误判为 AI。
全文 sliding-window 聚合已做对比实验,但在当前分类器上尚未稳定带来净收益,因此线上仍以 V11c 单窗主模型为准。
边界检测模块保留为辅助解释工具,前端展示时不再将其表述为当前系统的唯一核心能力。