拓冰建站拓冰建站
首页 / 资讯中心 / 正文

SCDLG:生成式抄袭检测与候选源重排序新方法

生成式模型的论文、作业、代码片段越来越多如何判断一段文字究竟是“基于资料库的正常引用”还是“对单一源头的隐性抄袭”已经变成 NLP 和内容安全领域一个非常现实的问题。传统做法大多依赖表征相似度也就是把两段文本分别编码成向量再算余弦相似度。但这类方法有一个明显缺陷生成式改写后的文本在表面形式上已经完全不同向量空间里的距离并不总是能反映真实的依赖关系。本文要介绍的思路来自一篇方向很明确的论文Beyond Representational Similarity: Source-Conditioned Description-Length Gain for Generative Plagiarism Detection and Candidate Source Reranking。它的核心贡献是提出了一种新的判定信号——Source-Conditioned Description-Length Gain源条件描述长度增益简称 SCDLG并用它来构建一套完整的生成式抄袭检测与候选源重排序框架。这篇文章会从问题背景、方法原理、实现流程、评估设计到工程落地逐层拆解适合对 LLM 评测、文本生成溯源、信息检索重排感兴趣的读者。1. 背景为什么“表征相似度”不够用了1.1 生成式抄袭与传统抄袭的本质差异传统抄袭检测比如 Turnitin 这类系统核心思路是找“连续字符串匹配”。如果一段文字和库里某个文档存在大量相同的 n-gram 片段就判定为高度相似。这种思路在纯复制粘贴时代非常有效。但到了 ChatGPT、GPT-4、Claude 这类大语言模型时代抄袭行为已经变成“读一篇文章然后用模型重新组织语言”。模型不会复制原句而是会做大量同义替换、句子重组、信息压缩和扩写。最后的产出和原文之间可能不存在任何连续 5 个相同的词但核心事实、论证顺序、表达逻辑几乎完全继承原文。这时候传统基于字符串匹配的方法会彻底失效。1.2 表征相似度的思路及其局限后来 NLP 社区普遍转向表征相似度方案。做法是用 BERT 类模型把待检测文本编码成向量。把候选源文档也编码成向量。计算两者之间的余弦相似度或欧氏距离。设定阈值超过就判定为“相似”。这比纯字符串匹配好很多因为语义编码能捕捉同义改写之间的相似性。但实际工程里会发现几个问题表征相似度不提供因果解释。两段文本相似可能是因为同源也可能只是话题相同。比如两篇聊“碳中和”的文章事实相近、用词相近但彼此没有抄袭关系。向量的数值相似无法区分“巧合”和“依赖”。改写程度高时表征差异会被放大。模型做深度改写后句法结构、信息冗余度都变了BERT 的 [CLS] 向量可能差异很大。阈值难定。跨领域、跨语料的向量分布差异极大一个固定阈值很难适应所有场景。1.3 需要一个更本质的信号论文的核心观点是与其问“两段文本长得像不像”不如问一个更根本的问题——如果允许生成模型在源文档条件下描述目标文本它的压缩编码效率会不会异常地好这里的关键直觉是一段真正从源文档衍生出来的文本在“已知源文档”的条件下生成模型描述它的代价会显著更低。模型只需提取源文档中已有的关键实体、关系和论证链条就能高效还原目标文本。而如果两段文本只是话题相近给定源文档后生成模型并不会获得什么额外帮助描述成本不会显著下降。这个“描述成本差异”被定义为一个可计算的增益指标也就是SCDLG。2. 核心概念Source-Conditioned Description-Length Gain2.1 先理解“描述长度”在文本生成评测中有一个成熟工具叫BARTScore它的想法是用一个预训练语言模型给候选文本打分分数来自生成概率的负对数似然。简单说给模型一个条件文本source让它生成目标文本target。计算生成target的平均对数似然。对数似然越低说明生成越困难质量越差。这里的“长度”并不是字数而是指编码长度也就是信息论意义上的负对数似然。如果模型能轻松还原目标文本说明目标文本的信息在给定条件下已经很“显然”了需要的编码比特数少对应负对数似然低。2.2 定义“增益”论文的核心公式会构造一个对比无源条件描述成本不提供任何源文档只给一个通用提示让模型直接描述目标文本记录负对数似然L_generic。有源条件描述成本把候选源文档拼接进上下文让模型在“看到源文档”的前提下描述目标文本记录负对数似然L_source。SCDLG 就是两者之差SCDLG L_generic - L_source如果源文档真的和目标文本有衍生关系那么在给定源文档后描述难度会显著下降L_source明显小于L_generic于是增益是一个较大的正值。如果源文档和目标文本无关那么即使给了源文档模型也得不到有效帮助L_source不会下降多少增益接近 0 甚至为负。2.3 为什么这个指标更可靠表征相似度回答的是“像一个不像”而 SCDLG 回答的是“能不能用源文档高效解释目标文本”。后者本质上是一个条件压缩测试更接近生成过程的因果判断。另一个重要特性是SCDLG 是可解释的。我们可以直接把源文档、目标文本、生成概率曲线拿出来逐句分析模型在哪些位置得到了回报。这对于内容安全审计、学术不端调查等场景非常有用。3. 候选源重排序从检测到定位3.1 为什么需要重排序SCDLG 本身解决的是“给定一个候选源判断是否有关”。但在真实场景里我们不一定知道抄袭者参考了哪篇文章。可能有几十万篇候选文档需要先缩小范围再判定关系。一个完整的生成式抄袭检测系统通常需要两个阶段召回阶段Recall用高效、便宜的检索方法从大规模语料库中找出排名靠前的候选文档。这一步可以用 BM25、DPR、向量库等。重排序阶段Re-ranking对召回得到的少量候选文档逐一计算 SCDLG 分数重新排序找出真正有衍生关系的那一个或几个。论文的方法正好可以作为重排序阶段的核心打分函数。3.2 重排序的具体流程假设我们有一段待检测文本T流程如下将T切分成段落或语义块避免超长文本超出上下文窗口。对每一块用轻量检索器从源库中召回 Top-K 候选文档。对每个候选文档分别计算无源条件下的描述成本有源条件下的描述成本得到 SCDLG 分数。聚合各块的分数得到候选文档与T的整体关联度。按关联度排序输出最可能的真实来源。这里有一个值得注意的设计上述三个打分步骤只针对候选集进行而候选集通常只有 10~50 篇文档所以能够接受成本较高的 LLM 调用。4. SCDLG 的数学表达与实现拆解4.1 形式化定义与编码器选择在实际实现中我们往往不能直接使用完整版本的论文公式因为配置细节取决于论文公开代码。但我们可以从一般化语言模型得分出发描述这个指标的核心计算思路。在 BARTScore 框架中给定一个预训练语言模型LM目标文本为x x_1 ... x_n条件文本为c则score(x | c) (1 / n) * Σ log p(x_t | x_t, c)这里p由模型给出。实际实现常用 Bart、T5 这类 encoder-decoder 模型。在论文公式实现中SCDLG 类似如下定义设h表示某种特征编码器输出文本的特征表示例如嵌入、潜变量、n-gram 计数或整段编码。描述损失使用非信息论框架对给定源特征下的目标特征做条件概率/重建损失的估计。将条件描述长度记为CL_h(target | source)然后定义增益SCDLG(source, target) CL_h(target | epsilon) - CL_h(target | source)其中epsilon表示一个中性/空条件下、或与源无关的基线表示。由于不同研究环境下公式细节存在版本差异我们在工程里更常见的落地方法是直接使用条件语言模型的对数似然差值即SCDLG_LM(src, tgt) L(tgt; generic_prompt) - L(tgt; src_context)其中L - (1 / |tgt|) * Σ log p_LM(tgt_t | tgt_t, ctx)4.2 核心实现流程具体实现需要考虑几个关键点模型选型BART、T5 这类 encoder-decoder 模型自带序列到序列的条件生成能力可以直接计算对数似然。归一化文本越长总负对数似然越大。如果不归一化长短文的分数会失去可比性。建议按 token 数取平均。上下文长度管理候选源文档可能很长需要按窗口截断。可以先做关键句抽取或者用滑动窗口取平均。基线提示无源条件下的提示要避免引入额外信息这样才能准确反映“没有候选源时描述该文本有多难”。下面给一个 Python 风格的伪代码思路展示核心计算不同环境需要按实际模型接口调整# 伪代码SCDLG 核心计算 # 实际使用时请按模型库 API 调整 import torch from transformers import AutoTokenizer, AutoModelForSeq2SeqLM model_name your-encoder-decoder-model # 例如 facebook/bart-base 或 google/flan-t5-small tokenizer AutoTokenizer.from_pretrained(model_name) model AutoModelForSeq2SeqLM.from_pretrained(model_name) def conditional_description_loss(text, condition): 计算给定 condition 条件下生成 text 的平均负对数似然。 prompt condition text inputs tokenizer(prompt, return_tensorspt, truncationTrue, max_length1024) # 将 text 部分作为 labels with torch.no_grad(): outputs model(**inputs, labelsinputs[input_ids]) loss outputs.loss.item() # 平均负对数似然交叉熵 return loss def scdlg_score(candidate_source, target_text): # 无源基线使用一个中性提示 generic_condition Target text: # 按需调整 L_generic conditional_description_loss(target_text, generic_condition) # 有源条件把源文档放进上下文 source_condition Source document: candidate_source L_source conditional_description_loss(target_text, source_condition) # SCDLG 基线成本 - 源条件成本 gain L_generic - L_source return gain这段伪代码展示了核心思路分别算两次条件描述损失再做差。真正做实验时可能还需要处理截断、滑动窗口、分句聚合等细节。4.3 一个迷你示例假设目标文本是“小李在南京的一家互联网公司做数据分析师负责用户增长和漏斗转化”。候选源文档 A 是“小李…数据分析师…用户增长…”的原始报道候选源文档 B 是“南京互联网产业迅速崛起”的行业报告。如果实现正确我们会看到给定 A模型生成目标文本的损失明显下降SCDLG高。给定 B模型生成目标文本时仍然需要自己组织大部分表达损失下降有限SCDLG低。这个对比刚好体现了“基于源条件压缩增益”的识别能力。5. 完整实战构建一个候选源重排序系统这一节会把前面讲的思路拼成一个完整管道。假设任务是从一个本地文档库中找出与待检测文本最可能构成生成式抄袭的源文档。5.1 系统结构设计系统分为三个模块预处理模块抽取待检测文本的段落过滤掉过短片段。召回模块使用 BM25 或向量检索从文档库中召回候选文档。重排序模块对候选文档计算 SCDLG 分数输出最终排序。5.2 准备数据为了让示例可运行我们设计一个小型数据集project/ ├── data/ │ ├── library/ # 源文档库 │ │ ├── doc_a.txt │ │ ├── doc_b.txt │ │ └── doc_c.txt │ ├── query.txt # 待检测文本 │ └── labels.txt # 真实标签可选用于评估 ├── src/ │ ├── recall.py # 召回模块 │ ├── rerank.py # 重排序模块 │ └── scdlg.py # SCDLG 计算5.3 召回模块实现召回阶段的目标是低延迟、高召回。BM25 是一个稳定可靠的关键词检索基线不需要额外训练模型。# 文件路径src/recall.py from rank_bm25 import BM25Okapi import re, glob def load_documents(folder: str): docs [] paths glob.glob(folder /*.txt) for path in paths: with open(path, r, encodingutf-8) as f: docs.append({path: path, content: f.read()}) return docs def tokenize(text: str): # 可按需替换为 jieba 分词 return re.findall(r[\u4e00-\u9fa5a-zA-Z0-9], text.lower()) def recall(query: str, docs, top_k3): corpus [tokenize(d[content]) for d in docs] bm25 BM25Okapi(corpus) scores bm25.get_scores(tokenize(query)) ranked sorted(zip(docs, scores), keylambda x: x[1], reverseTrue) return [doc for doc, _ in ranked[:top_k]]5.4 SCDLG 与重排序模块实现重排序模块调用前面定义的scdlg_score对每个候选文档打分排序。# 文件路径src/scdlg.py from transformers import AutoTokenizer, AutoModelForSeq2SeqLM def build_scoring_model(pretrainedgoogle/flan-t5-small): tokenizer AutoTokenizer.from_pretrained(pretrained) model AutoModelForSeq2SeqLM.from_pretrained(pretrained) return model, tokenizer这里要提醒一点如果候选文档很长需要先做文本切片取多个窗口的 SCDLG 均值避免单个长文档超过模型上下文限制。5.5 运行验证运行流程python src/rerank.py --query data/query.txt --library data/library --top_k 3预期输出 SCDLG Reranking Result 1. doc_a.txt SCDLG3.42 ← 最可能的真实源 2. doc_b.txt SCDLG0.78 3. doc_c.txt SCDLG0.15如果真实标签确实指向 doc_a那么这套流程就完成了检测和定位。6. 评估怎么设计6.1 评估数据构造生成式抄袭检测没有特别多公开标准数据集常见的做法是自动构造取一篇源文档 A。用 LLM 生成摘要、改写、扩写等不同“衍生文本”。构造若干干扰文本比如同主题但独立写作的文本。这样就能得到正负样本对。每一条样本包含source候选源文档。target待检测文本。label1 表示 target 由 source 衍生0 表示无关。6.2 检测指标AUC不同阈值下的排序能力。P1重排序后第一个候选是否是正确的源文档。MRR正确源在排序列表中的平均倒数排名。F1在选定阈值下检测系统对正负样本的分类性能。6.3 用 SCDLG 排序时的退化测试建议在实验里加入一个退化分析如果只使用表征相似度比如 SentenceBERT 余弦值效果如何再对比 SCDLG。通常会发现在“高改写强度”样本上表征相似度的下降幅度较大而 SCDLG 的稳定性更好。7. 常见问题与排查问题现象常见原因解决思路SCDLG 分数普遍偏高基线条件太弱模型几乎无法描述目标文本调整无源提示词让基线更中性SCDLG 分数普遍接近 0模型太小无法从源文档中提取有效信息换更大模型或扩大上下文窗口候选源文档太长模型 OOM一次性输入超长文本做窗口切片分段计算后取均值检索召回阶段漏掉真实源BM25 关键词不匹配增加向量检索互补或者增大召回规模目标文本包含多段落聚合困难不同段落来自不同源文档按段落独立检测再做跨段落投票另外很重要的一点是SCDLG 是辅助判断信号不是绝对证据。它的分数会被模型先验、文本风格、上下文长度、提示词写法等因素影响。在生产环境里使用必须用与业务分布接近的样本做校准确定合理的判定阈值。8. 工程化与最佳实践8.1 两阶段设计原则生产系统务必区分“召回”和“重排”。如果用 LLM 对全库所有文档做 SCDLG 计算成本会高到不可接受。先用手速度快、成本低的检索把候选集压到几十篇再对候选集做精排是信息检索领域非常成熟的做法。8.2 提示词敏感性控制SCDLG 是基于条件语言模型概率计算的提示词变化会直接影响分数。做工程化时建议把无源条件提示词固定为统一模板禁止用户自定义。例如统一使用“Target text:”这类中性前缀避免引入新的信息。8.3 异常处理与安全边界内容安全类系统需要额外关注几个方面数据权限源文档库可能包含版权内容使用前需要确认授权范围。结果可解释性记录每个候选文档的分段分数保留中间过程方便审计。被检测方对抗如果用户知道检测逻辑可能会构造对 SCDLG 不友好的改写例如故意插入噪声、混搭多源内容。系统需要支持多段落综合分析不能只看整文结果。最小权限如果需要连接数据库、索引库或调用内部 API按最小权限原则配置账号禁止生产环境直接使用管理员凭据操作。8.4 模型与算力选型BART、T5、Flan-T5 都可以支持条件生成概率计算。实际工程里推荐从flan-t5-small或flan-t5-base起步验证效果再根据预算和精度要求决定是否上更大模型。如果源文本和目标文本都是中文需要考虑模型是否具备足够的中文能力。也可以使用开源中文生成模型但要注意模型输出概率的稳定性。8.5 与检索增强生成RAG的协同SCDLG 与 RAG 的关系非常紧密。RAG 系统在回答问题时会把检索到的文档拼进上下文。如果用户把 RAG 的输出直接当作“自己的答案”发布这恰恰是一种新型生成式抄袭。SCDLG 可以反向用于检测这类输出与检索文档之间的依赖关系识别出哪些回答是从哪篇文档“压缩”而来的。这对于 RAG 系统的内容溯源、审计和版权管理非常有价值。9. 局限性与下一步方向9.1 当前局限SCDLG 不是万能的。第一个明显限制是依赖生成模型的能力。如果模型本身语言能力弱无论给定什么源文档都无法有效“利用”它增益会失去区分度。第二个限制是长文本处理。长文本需要切片切片方式可能影响最终分数。第三个限制是多源混抄。如果目标文本由多篇源文档拼凑而成整文级别的 SCDLG 会稀释每个源的信号需要设计更细粒度的片段级检测。9.2 可以继续深入的方向与表征相似度融合把 SCDLG 分数和向量余弦相似度作为双通道特征训练一个轻量分类器可能比任何单一指标更稳定。小模型蒸馏优化用大模型计算 SCDLG 标签训练一个小型回归模型去预测增益这样推理时不需要每次都调用大模型。跨语言检测目标文本可能是源文档的翻译改写。SCDLG 能否跨语言工作取决于生成模型是否具备跨语言理解能力。这个方向值得单独做实验验证。在线学习与阈值自适应不同领域、不同写作风格下SCDLG 分布差异很大。可以按领域维护校准集动态调整判定阈值。10. 总结与行动建议本文围绕“Beyond Representational Similarity”这篇论文带来的核心方法拆解了生成式抄袭检测从表征相似度到源条件描述长度增益的思路转变。真正值得记住的关键点有三个SCDLG 不是在比文本像不像而是在比“给定源文档后生成目标文本的代价下降多少”这是一个更接近生成因果的信号。实际系统需要两阶段设计先轻量召回大量候选再用 SCDLG 对少量候选做精确重排。评估时需要同时关注检测能力和排序能力不能只看单一指标。如果你需要在具体项目中落地建议从一个小型数据集开始准备几十篇源文档用 LLM 构造正负样本跑通 SCDLG 计算流程再用 BM25 SCDLG 搭建一个最小可用系统。相比直接套用向量相似度方案这种“条件压缩增益”的思路在面对强改写场景时往往更能揭示文本之间的真实依赖关系。如果你正在做 RAG 溯源、内容审计、学术诚信监测这类工作可以把它作为一个高价值的新指标加入方案。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门