Hitxym/RAPD

Python

0

4 commits

updated Sep 10, 2026

See the code

README

RAPD

项目简介

RAPD 是一个 AI 生成文本检测框架,核心方法为 PGR。该框架通过微调语言模型,使其能够高效区分人类撰写的文本与大语言模型(LLM)生成或修改的文本。

核心思想:将人类文本视为"非偏好"样本,机器修订文本视为"偏好"样本,通过偏好学习训练评分模型学习两者之间的风格差异,从而实现高精度的机器文本检测。

方法概述

PGR 训练流程

人类原始文本 (dispreferred) ──┐
                               ├──▶ PGR Loss + KL 正则 ──▶ 评分模型 (LoRA 微调)
机器修订文本 (preferred)   ──┘
  1. 评分模型:基于 GPT-Neo 2.7B,通过 LoRA(r=8, alpha=32)进行参数高效微调
  2. 参考模型:冻结的预训练语言模型,提供通用语言分布基准
  3. 评分函数:融合序列级差异与局部窗口差异,加入 KL 散度正则约束
  4. PGR 损失:基于偏好学习的损失函数,通过 β 系数控制偏好强度

PGR 的三个核心模块

PGR 方法由以下三个模块组合而成(代码中各文件对应不同模块组合的消融实验):

模块说明对应代码文件
有界概率聚合对概率分布进行有界聚合,提升评分鲁棒性有界概率聚合.py
减少偏差修正评分中的系统性偏差减少偏差.py
窗口模块基于动态语义窗口的局部特征捕捉窗口模块.py
全部组合三模块融合的完整 PGR 方法最终+++.py
基线(无模块)不含任何模块的基线对比0个模块.py

评分函数细节

评分综合了:

  • 序列级差异(Sequence-level Discrepancy):整段文本的概率分布偏移
  • 局部窗口差异(Window-level Discrepancy):细粒度的 n-gram 风格特征(动态语义窗口加权)
  • KL 散度正则:约束评分模型不偏离参考分布

项目结构

├── dpr/                          # 核心模型与训练代码
│   ├── spo.py                    # PGR 模型定义(ComputeScore 类、评分函数)
│   ├── engine.py                 # 训练与评估引擎
│   ├── run_spo.py                # PGR 训练入口脚本
│   ├── dataset.py                # 数据集加载(CustomDataset 系列)
│   ├── metrics.py                # 评估指标(ROC AUC、PR AUC)
│   ├── inference.py              # 交互式推理 Demo
│   ├── evaluation.py             # 独立评估脚本
│   ├── utils_spo.py              # PGR 损失计算
│   ├── utils_visualization.py    # 训练过程可视化(梯度陷阱、NLL 分布、Token 信号)
│   ├── demo.py                   # 可视化 Demo(含训练循环示例)
│   │
│   │ # ── 消融实验文件(不同模块组合)──
│   ├── 0个模块.py                # 基线:无任何模块
│   ├── 有界概率聚合.py            # 仅有界概率聚合模块
│   ├── 减少偏差.py                # 仅减少偏差模块
│   ├── 窗口模块.py                # 仅窗口模块
│   ├── 有界概率聚合+减少偏差.py    # 两模块组合
│   ├── 有界聚合模块+窗口.py        # 两模块组合
│   ├── 减少偏差+窗口.py            # 两模块组合
│   └── 最终+++.py                # 三模块融合的完整 PGR
│
├── tools/                        # 数据构建与辅助工具
│   ├── data_builder.py           # LLM 数据生成(polish/rewrite/expand/generation)
│   ├── data_builder_gpts/        # GPT 系列模型的 Notebook 数据生成脚本
│   ├── show_results.py           # 结果展示工具
│   ├── count_words.py            # 字数统计
│   ├── truncation.py             # 文本截断实验
│   └── solve_llama_output.py     # Llama 输出后处理
│
├── scripts/                      # Shell 脚本(训练、评估、下载)
│   ├── train_spo.sh              # PGR 训练
│   ├── eval_all.sh               # 全量评估(polish/rewrite/generation/expand)
│   ├── eval_spo_*.sh             # 分任务评估
│   ├── eval_ablation.sh          # 消融实验
│   ├── build_data.sh             # 数据构建
│   └── download_*.sh             # 模型下载
│
├── data/                         # 数据集
│   ├── ai_detection_*_polish*.json   # 训练数据(500/3000 条)
│   ├── polish/                   # Polish 任务数据(按模型组织)
│   ├── rewrite/                  # Rewrite 任务数据
│   ├── expand/                   # Expand 任务数据
│   ├── generation/               # Generation 任务数据
│   ├── truncation/               # 截断长度实验数据
│   └── multilang/                # 多语言数据(中文、西班牙语、葡萄牙语)
│
├── results/                      # 实验结果
│   ├── main/                     # 主实验结果(按 task/model 组织)
│   └── ablation/                 # 消融实验结果(SFT/ORPO/RLHF 对比)
│
├── evaluation/                   # 评估输出(ROC 曲线、散点图、Token 高亮图)
├── logs/                         # TensorBoard 训练日志
└── local_infer_ref/              # 本地推理参考分布数据

支持的检测任务

任务类型说明示例
PolishLLM 对人类文本进行润色/改写保持原意,改善表达
RewriteLLM 对人类文本进行同义改写替换词汇,调整句式
ExpandLLM 对人类文本进行扩写增加细节,扩展论述
GenerationLLM 从开头续写生成完整文本给定前缀,生成全文

支持的模型

基础评分模型

  • GPT-Neo 2.7B(默认,LoRA 微调)

待检测的 LLM(生成机器文本)

  • 闭源模型:GPT-3.5-Turbo、GPT-4o
  • 开源模型:Llama-3-8B、Mistral-7B、Qwen2-7B、Deepseek-7b

评估数据集

  • XSum:新闻摘要
  • Writing:创意写作
  • PubMed:医学文献
  • SQuAD:阅读理解

快速开始

环境依赖

pip install torch transformers peft accelerate
pip install scikit-learn matplotlib tensorboard
pip install tqdm numpy

1. 数据构建

使用开源 LLM 生成机器文本数据:

# 示例:用 Llama-3-8B 对 XSum 数据集进行 Polish
python tools/data_builder.py \
    --model_name Llama-3-8B \
    --dataset xsum \
    --task polish \
    --dataset_file ./data/xsum \
    --result_dir ./data/polish/Llama-3-8B

2. PGR 训练

# 使用 500 条 Polish 数据训练 2 个 epoch
python dpr/run_spo.py \
    --datanum 500 \
    --task_name ai_detection_polish_500 \
    --epochs 2 \
    --lr 1e-4 \
    --beta 0.05

关键参数:

  • --lr:学习率(默认 1e-4)
  • --beta:PGR 损失的 β 系数(默认 0.05)
  • -a:梯度累积步数(默认 1)
  • --datanum:训练样本数(默认 500)

3. 评估

# 评估单个数据集
python dpr/evaluation.py \
    --eval_dataset ./data/polish/gpt-3.5-turbo/xsum_polish_gpt-3.5-turbo.raw_data.json

# 全量评估
bash scripts/eval_all.sh

4. 交互式推理

python dpr/inference.py --task polish --detail True

输入文本后,模型将输出该文本被判定为机器生成的概率。

评估指标

  • ROC AUC:接收者操作特征曲线下面积,衡量整体区分能力
  • PR AUC:精确率-召回率曲线下面积,衡量在不平衡数据上的表现
  • Reward Accuracy:PGR 训练中偏好判断的准确率
  • Reward Margin:偏好与非偏好样本的奖励差异

关键技术细节

LoRA 配置

LoraConfig(
    task_type=TaskType.CAUSAL_LM,
    r=8,              # LoRA 秩
    lora_alpha=32,     # 缩放系数
    lora_dropout=0.1   # Dropout 率
)

PGR 损失函数

loss = -log_sigmoid(β * (r_preferred - r_dispreferred))

其中 r 为相对熵(模型 log 概率 - 参考模型 log 概率),β 控制偏好强度。

KL 散度正则

在 PGR 损失基础上加入 KL 散度约束项,防止评分模型过度偏离参考分布:

total_loss = pgr_loss + λ * KL(q_score || p_ref)

可视化功能

框架提供多维度可视化支持:

  1. 序列级 vs 窗口级散点图:展示人类/机器文本在两个评分维度上的分布差异
  2. Token 级 Crit 高亮图:高亮显示机器文本中被判定为"机器风格"的 Token
  3. 训练过程可视化:梯度陷阱分布、NLL 分布对比、Token 级信号对比
  4. TensorBoard 日志:实时监控训练损失、ROC AUC、PR AUC 等指标

消融实验

项目包含多种基线方法的消融实验对比:

PGR 模块消融(dpr/ 目录下的中文命名文件):

  • 0个模块.py:基线(无模块)
  • 单模块:有界概率聚合.py / 减少偏差.py / 窗口模块.py
  • 双模块组合:有界概率聚合+减少偏差.py / 有界聚合模块+窗口.py / 减少偏差+窗口.py
  • 完整方法:最终+++.py(三模块融合)

训练策略消融(results/ablation/):

  • SFT:标准监督微调(不同数据量:1000/2000/3000)
  • ORPO:Odds Ratio Preference Optimization
  • RLHF:基于人类反馈的强化学习

引用

如果您使用了本项目的代码或方法,请引用相关论文。

许可证

本项目仅供学术研究使用。

Hitxym/RAPD

Python

0

4 commits

updated Sep 10, 2026

See the code

README

RAPD

项目简介

RAPD 是一个 AI 生成文本检测框架,核心方法为 PGR。该框架通过微调语言模型,使其能够高效区分人类撰写的文本与大语言模型(LLM)生成或修改的文本。

核心思想:将人类文本视为"非偏好"样本,机器修订文本视为"偏好"样本,通过偏好学习训练评分模型学习两者之间的风格差异,从而实现高精度的机器文本检测。

方法概述

PGR 训练流程

人类原始文本 (dispreferred) ──┐
                               ├──▶ PGR Loss + KL 正则 ──▶ 评分模型 (LoRA 微调)
机器修订文本 (preferred)   ──┘
  1. 评分模型:基于 GPT-Neo 2.7B,通过 LoRA(r=8, alpha=32)进行参数高效微调
  2. 参考模型:冻结的预训练语言模型,提供通用语言分布基准
  3. 评分函数:融合序列级差异与局部窗口差异,加入 KL 散度正则约束
  4. PGR 损失:基于偏好学习的损失函数,通过 β 系数控制偏好强度

PGR 的三个核心模块

PGR 方法由以下三个模块组合而成(代码中各文件对应不同模块组合的消融实验):

模块说明对应代码文件
有界概率聚合对概率分布进行有界聚合,提升评分鲁棒性有界概率聚合.py
减少偏差修正评分中的系统性偏差减少偏差.py
窗口模块基于动态语义窗口的局部特征捕捉窗口模块.py
全部组合三模块融合的完整 PGR 方法最终+++.py
基线(无模块)不含任何模块的基线对比0个模块.py

评分函数细节

评分综合了:

  • 序列级差异(Sequence-level Discrepancy):整段文本的概率分布偏移
  • 局部窗口差异(Window-level Discrepancy):细粒度的 n-gram 风格特征(动态语义窗口加权)
  • KL 散度正则:约束评分模型不偏离参考分布

项目结构

├── dpr/                          # 核心模型与训练代码
│   ├── spo.py                    # PGR 模型定义(ComputeScore 类、评分函数)
│   ├── engine.py                 # 训练与评估引擎
│   ├── run_spo.py                # PGR 训练入口脚本
│   ├── dataset.py                # 数据集加载(CustomDataset 系列)
│   ├── metrics.py                # 评估指标(ROC AUC、PR AUC)
│   ├── inference.py              # 交互式推理 Demo
│   ├── evaluation.py             # 独立评估脚本
│   ├── utils_spo.py              # PGR 损失计算
│   ├── utils_visualization.py    # 训练过程可视化(梯度陷阱、NLL 分布、Token 信号)
│   ├── demo.py                   # 可视化 Demo(含训练循环示例)
│   │
│   │ # ── 消融实验文件(不同模块组合)──
│   ├── 0个模块.py                # 基线:无任何模块
│   ├── 有界概率聚合.py            # 仅有界概率聚合模块
│   ├── 减少偏差.py                # 仅减少偏差模块
│   ├── 窗口模块.py                # 仅窗口模块
│   ├── 有界概率聚合+减少偏差.py    # 两模块组合
│   ├── 有界聚合模块+窗口.py        # 两模块组合
│   ├── 减少偏差+窗口.py            # 两模块组合
│   └── 最终+++.py                # 三模块融合的完整 PGR
│
├── tools/                        # 数据构建与辅助工具
│   ├── data_builder.py           # LLM 数据生成(polish/rewrite/expand/generation)
│   ├── data_builder_gpts/        # GPT 系列模型的 Notebook 数据生成脚本
│   ├── show_results.py           # 结果展示工具
│   ├── count_words.py            # 字数统计
│   ├── truncation.py             # 文本截断实验
│   └── solve_llama_output.py     # Llama 输出后处理
│
├── scripts/                      # Shell 脚本(训练、评估、下载)
│   ├── train_spo.sh              # PGR 训练
│   ├── eval_all.sh               # 全量评估(polish/rewrite/generation/expand)
│   ├── eval_spo_*.sh             # 分任务评估
│   ├── eval_ablation.sh          # 消融实验
│   ├── build_data.sh             # 数据构建
│   └── download_*.sh             # 模型下载
│
├── data/                         # 数据集
│   ├── ai_detection_*_polish*.json   # 训练数据(500/3000 条)
│   ├── polish/                   # Polish 任务数据(按模型组织)
│   ├── rewrite/                  # Rewrite 任务数据
│   ├── expand/                   # Expand 任务数据
│   ├── generation/               # Generation 任务数据
│   ├── truncation/               # 截断长度实验数据
│   └── multilang/                # 多语言数据(中文、西班牙语、葡萄牙语)
│
├── results/                      # 实验结果
│   ├── main/                     # 主实验结果(按 task/model 组织)
│   └── ablation/                 # 消融实验结果(SFT/ORPO/RLHF 对比)
│
├── evaluation/                   # 评估输出(ROC 曲线、散点图、Token 高亮图)
├── logs/                         # TensorBoard 训练日志
└── local_infer_ref/              # 本地推理参考分布数据

支持的检测任务

任务类型说明示例
PolishLLM 对人类文本进行润色/改写保持原意,改善表达
RewriteLLM 对人类文本进行同义改写替换词汇,调整句式
ExpandLLM 对人类文本进行扩写增加细节,扩展论述
GenerationLLM 从开头续写生成完整文本给定前缀,生成全文

支持的模型

基础评分模型

  • GPT-Neo 2.7B(默认,LoRA 微调)

待检测的 LLM(生成机器文本)

  • 闭源模型:GPT-3.5-Turbo、GPT-4o
  • 开源模型:Llama-3-8B、Mistral-7B、Qwen2-7B、Deepseek-7b

评估数据集

  • XSum:新闻摘要
  • Writing:创意写作
  • PubMed:医学文献
  • SQuAD:阅读理解

快速开始

环境依赖

pip install torch transformers peft accelerate
pip install scikit-learn matplotlib tensorboard
pip install tqdm numpy

1. 数据构建

使用开源 LLM 生成机器文本数据:

# 示例:用 Llama-3-8B 对 XSum 数据集进行 Polish
python tools/data_builder.py \
    --model_name Llama-3-8B \
    --dataset xsum \
    --task polish \
    --dataset_file ./data/xsum \
    --result_dir ./data/polish/Llama-3-8B

2. PGR 训练

# 使用 500 条 Polish 数据训练 2 个 epoch
python dpr/run_spo.py \
    --datanum 500 \
    --task_name ai_detection_polish_500 \
    --epochs 2 \
    --lr 1e-4 \
    --beta 0.05

关键参数:

  • --lr:学习率(默认 1e-4)
  • --beta:PGR 损失的 β 系数(默认 0.05)
  • -a:梯度累积步数(默认 1)
  • --datanum:训练样本数(默认 500)

3. 评估

# 评估单个数据集
python dpr/evaluation.py \
    --eval_dataset ./data/polish/gpt-3.5-turbo/xsum_polish_gpt-3.5-turbo.raw_data.json

# 全量评估
bash scripts/eval_all.sh

4. 交互式推理

python dpr/inference.py --task polish --detail True

输入文本后,模型将输出该文本被判定为机器生成的概率。

评估指标

  • ROC AUC:接收者操作特征曲线下面积,衡量整体区分能力
  • PR AUC:精确率-召回率曲线下面积,衡量在不平衡数据上的表现
  • Reward Accuracy:PGR 训练中偏好判断的准确率
  • Reward Margin:偏好与非偏好样本的奖励差异

关键技术细节

LoRA 配置

LoraConfig(
    task_type=TaskType.CAUSAL_LM,
    r=8,              # LoRA 秩
    lora_alpha=32,     # 缩放系数
    lora_dropout=0.1   # Dropout 率
)

PGR 损失函数

loss = -log_sigmoid(β * (r_preferred - r_dispreferred))

其中 r 为相对熵(模型 log 概率 - 参考模型 log 概率),β 控制偏好强度。

KL 散度正则

在 PGR 损失基础上加入 KL 散度约束项,防止评分模型过度偏离参考分布:

total_loss = pgr_loss + λ * KL(q_score || p_ref)

可视化功能

框架提供多维度可视化支持:

  1. 序列级 vs 窗口级散点图:展示人类/机器文本在两个评分维度上的分布差异
  2. Token 级 Crit 高亮图:高亮显示机器文本中被判定为"机器风格"的 Token
  3. 训练过程可视化:梯度陷阱分布、NLL 分布对比、Token 级信号对比
  4. TensorBoard 日志:实时监控训练损失、ROC AUC、PR AUC 等指标

消融实验

项目包含多种基线方法的消融实验对比:

PGR 模块消融(dpr/ 目录下的中文命名文件):

  • 0个模块.py:基线(无模块)
  • 单模块:有界概率聚合.py / 减少偏差.py / 窗口模块.py
  • 双模块组合:有界概率聚合+减少偏差.py / 有界聚合模块+窗口.py / 减少偏差+窗口.py
  • 完整方法:最终+++.py(三模块融合)

训练策略消融(results/ablation/):

  • SFT:标准监督微调(不同数据量:1000/2000/3000)
  • ORPO:Odds Ratio Preference Optimization
  • RLHF:基于人类反馈的强化学习

引用

如果您使用了本项目的代码或方法,请引用相关论文。

许可证

本项目仅供学术研究使用。