Methodology

技术方法

模型架构、训练与推理链路,及与线上一致的参数与部署说明。

系统设计

双层模型架构

创新的双层架构设计,同时实现文本分类与边界定位

架构流程图

输入层

将中文文本编码为固定长度的 token 序列
原始文本BERT Tokenizer长度裁剪/填充

BERT编码层

利用BERT提取深层语义特征
预训练权重上下文编码语义表示

分类判定层

输出 Human / AI / mixed 的主判定结果
Temperature ScalingSoftmax概率阈值决策

边界分析层

仅在需要时补充混合文本边界分析
Span Detector序列标注可选边界提示

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 / mixedAPI 直接返回三类结果
训练流程

数据治理与模型训练

V11c通过四阶段数据治理与精细微调达成最优性能

阶段一

数据风险审计

移除模板匹配和unknown来源样本

清除750条硬编码模板
移除1,767条unknown样本
V10→V11a: 62,980→60,456
阶段二

弱域数据增补

定向补充formal和LLaMA-405B弱域样本

formal风格+300条
LLaMA-405B+300条
V11a→V11b: 60,456→61,056
阶段三

长文AI边界修复

补充长文本AI样本恢复覆盖率

+2,131条256+字符AI样本
恢复V10级别长文覆盖
V11b→V11c: 61,056→63,187
阶段四

模型微调

沿用 V11 系列主配置做单阶段精细微调

lr=1e-5, batch=8×4(有效32)
max_len=256, 最佳轮次见训练日志
Label Smoothing=0.05 + 长度感知损失
推理链路

从输入文本到最终结果

当前线上系统采用「分类优先、边界辅助」的推理逻辑。老师看到这一部分,可以直接理解前端显示的 Human / AI / mixed 是如何一步步得到的。

Step 1

文本编码

前端提交原始文本,后端使用 BertTokenizer 做截断、padding 和 attention mask 构造。

Step 2

概率校准

分类器 logits 先做 Temperature Scaling,再计算 Human / AI softmax 概率。

Step 3

阈值决策

当 AI 概率 >= 0.8 判为 AI;当 Human 概率 >= 0.8 判为 Human;否则返回 mixed。

Step 4

边界分析

仅当结果偏向 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 返回字段

type
主判定结果:human / ai / mixed
confidence
当前最终类别的置信度百分比
humanPercentage
Human 概率的整数百分比
aiPercentage
AI 概率的整数百分比
boundary
可选,句级边界索引
sentences
逐句切分后的结果与标签
modelVersion
可选,当前模型版本名
decisionThreshold
可选,当前部署阈值
开发工具

技术栈

PyTorch

深度学习框架

Transformers

预训练模型库

BERT-wwm

中文预训练模型

Scikit-learn

机器学习工具

Pandas

数据处理

NumPy

数值计算

工程落地

线上部署结构

项目不是只停留在离线训练,而是已经部署成可在线访问的完整前后端系统。

Layer 1

Vercel Frontend

Next.js 16 + TypeScript,页面展示与交互入口。

Layer 2

Next.js Route Handlers

/api/detect 与 /api/health 先在服务端代理,再转发到后端。

Layer 3

api.baxfor.fun

独立后端域名,使用 HTTPS 反向代理到模型服务。

Layer 4

FastAPI + PyTorch

负责推理、阈值决策、边界分析与 JSON 返回。

当前生产环境要点

前端托管于 Vercel,主站域名使用 www.baxfor.fun
后端部署在 Linux 服务器,通过 api.baxfor.fun 暴露 /api 与 /v1 路由
后端推理模型目录挂载到容器内,主模型为 bert_v11c_boundary_fix
前端通过 Next.js Route Handlers 做服务端代理,浏览器不直接接触模型服务
实现细节

核心算法

文本分类算法

Python分类器 + Temperature Scaling 阈值
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)

边界检测算法

PythonSpan 辅助 — 仅在需要时触发
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
局限与取舍

当前版本仍然存在的问题

这一部分专门保留给答辩老师看:不仅展示成绩,也清楚说明当前模型的边界和工程取舍。

1

主分类器使用 max_length=256,因此当前更像稳定的单窗分类器,而不是严格意义上的全文阅读器。

2

模型对“高完成度中文书面表达”偏敏感,学术导论、社论、抒情散文这类人类文本更容易被误判为 AI。

3

全文 sliding-window 聚合已做对比实验,但在当前分类器上尚未稳定带来净收益,因此线上仍以 V11c 单窗主模型为准。

4

边界检测模块保留为辅助解释工具,前端展示时不再将其表述为当前系统的唯一核心能力。