AI 代码检测器会对一个文件、一个代码仓库或一份提交内容进行评分,判断其看起来有多像机器生成的。它会返回一个文档级评分,以及按文件或按函数的高亮标记。如果你的结果偏高,有用的做法不是去和这个数字争辩,而是找出哪些行携带了信号,并修复它们。
这个判定有一个令人不安的另一面。检测器是根据表面模式来猜测的,而代码的表面模式比散文少。一个人写出的干净、地道、注释良好的文件,可能看起来和生成的代码一模一样,因为生成的代码正是用这样写代码的人的数据训练出来的。高分很常见,它们并不能证明你作弊了。
AI 代码检测器实际测量的是什么
它读不懂你的意图。它读的是统计数据。
大多数检测器,无论是针对散文还是代码,都会看两件事:每个下一个 token 有多可预测(困惑度),以及这种可预测性在整篇文档中变化有多大(突发性)。人类写的代码是凹凸不平的。你写一个无聊的循环,然后是一个名字奇怪又特别具体的辅助函数,然后是一条提到工单编号的注释,然后是四行复制粘贴的配置。生成的代码往往更平滑:标识符长度一致、注释风格一致、从第一行到最后一行结构一致。
这种平滑就是信号。所以解决办法不是把你的代码写得更差,而是让真实项目自然的凹凸不平显露出来。
还有一点值得直说:检测器的输出是概率估计,不是作者身份的证明。GPTZero 自己的 FAQ 将置信度描述为“检测器分类正确的概率”,并举例说 90% 意味着在类似文档上检测器有 90% 的时间是正确的(来源:gptzero.me)。这是关于工具行为的陈述,而不是关于你的文件的陈述。Turnitin 的文档描述了调优,使得在 1% 到 19% 范围内不归因任何分数或高亮,以避免误报(来源:www.turnitin.com)。每个供应商都在公开管理同样的权衡:抓住生成的文本,不要烧毁诚实的工作。
为什么我自己的代码会被标记为 AI 写的?
四个原因涵盖了大多数情况。
样板就是样板。 CRUD 处理器、测试脚手架、配置文件和标准库胶水代码,无论是人还是模型输入的,都几乎一模一样。几乎找不到作者身份信号,所以检测器只能依赖先验。
你的风格是一致的。 如果你把所有东西都命名为 data、result、handleX,并且用同样简洁的语气给每个函数加注释,你就无意中产生了读起来像生成的平滑感。一致性通常是优点。在这里却让你吃亏。
文件很短。 短输入给检测器提供的信息很少。单个实用函数主要是先验,而不是证据。
你确实用了模型,只是用于其中一部分。 2026 年大多数被标记的代码都是混合的:你写了架构,助手写了三个辅助函数,你稍作编辑。接缝是真实存在的,它们表现为各部分之间质地的变化。
在重写任何内容之前,先正确评分。DeAIze 的 AI 检测器 会对整个文档评分,并按 AI 概率高亮每个句子,这样你就能看到哪些行携带信号,而不是靠猜。免费套餐注册即送 200 词,无需信用卡。
修复方法:编辑被标记的区域,而不是整个文件
把评分当作 linter。你不会因为一个函数发出警告就重新格式化整个仓库。
- 先评分,后编辑。 获取按行或按函数的视图。在 DeAIze 中,这是句子级高亮;用代码术语来说,它指向的是区域,而不是文件。
- 按信号排序,而不是按大小。 先修复三个最热的区域,再碰任何冷门区域。重写冷代码是浪费精力,还会增加风险。
- 让注释具体化。 这是代码中收益最高的编辑。把
// Initialize the client替换成只有你的项目才会产生的注释:一个工单引用、一个已知的上游 bug、一个参数被忽略的原因。 - 打破对称性。 如果每个函数都有相同的注释形状,删掉一些注释。如果每个变量都是完整单词,缩短那些显而易见的。如果结构完全平行,让一个分支内联处理。
- 保留你自己的粗糙边缘。 半完成的 TODO、你在事故后添加的防御性检查、带有日期的略显丑陋的变通方法。那些是作者身份的痕迹,而且它们是真实的。
- 重新评分并比较。 如果数字变了,保留编辑。如果没变,就还原。永远不要保留一个毫无理由让代码变得更糟的重写。
一个示例说明。之前,一个被标记的辅助函数:
// Function to calculate the total price
def calculate_total_price(items):
# Initialize total
total = 0
# Iterate through items
for item in items:
total += item.price
# Return the total
return total
之后,行为相同,对称性更少:
def order_total(items):
# No discount logic here on purpose - pricing service owns that (TICKET-4412)
return sum(i.price for i in items if not i.voided)
第二个版本更短、更地道,并且包含读者可以核查的理由。这才是真正的作者留下的东西。它不是混淆,也不会改变代码的功能。请注意,这只是一个示例,并非经过测量的前后对比。
我们自己的测试对检测率的说明
我们在2026-09-28对两个语料库运行了检测器,标记阈值为30%。从61份DeAIze指南中选取的709个参考段落样本——因其元数据未标记为生成内容而被选中——平均得分为26%,中位数为25%,范围从0%到69%;709个段落中有239个得分达到或超过该阈值。人类作者身份未经独立验证,因此这些计数无法确立人类假阳性率。未经编辑的模型输出,即由固定提示生成且未经编辑的12个DeepSeek段落,平均得分为33%,中位数为34%,范围为4%到46%。
再读一遍,因为这才是诚实的版本。参考段落——其人类作者身份未经独立验证——与未经编辑的DeepSeek模型输出处于重叠的范围内,且均值比大多数人预期的更接近。检测并非一个干净的分隔器。它是一个需要你去解读的噪声信号,这正是为什么逐句高亮比标题数字更重要。要更广泛地了解为什么不同工具之间的得分会有差异,请参阅AI检测器准确度。
当这是错误的选择时
不要用这些内容来冒充你没有做过的工作。如果作业、合同或代码审查要求代码必须是你自己写的,那么一旦有人读了 diff 并要求你解释一个你无法解释的函数,AI 代码检测器的分数就是你最不需要担心的问题。
如果出现以下情况,你也应该跳过这整套练习:
- 政策完全禁止 AI 协助。 通过编辑来降低分数并不会让未经授权的提交变得获得授权。先询问,再披露。
- 代码是端到端生成的,而你不理解它。 重写注释在走查中救不了你。要么学会代码,要么不要提交。
- 你正在被指控,而不是被评分。 如果正式程序已经启动,正确的做法是提供文档和你的草稿,而不是重写。Academic Integrity Hearing AI 涵盖了评审小组实际评估的内容。
- 你的团队共用一份风格指南。 为了取悦检测器而在共享仓库中强制推行个人风格是糟糕的交易。只修复被标记的区域。
重新提交前的简短检查清单
- 你知道哪些区域被标记了,而不仅仅是总体分数。
- 每次编辑都保持了行为一致,并且你有测试来证明这一点。
- 注释现在包含项目特定的原因、工单编号或日期。
- 你删除了没有任何作用的模板化注释。
- 你重新评分了,并能说明发生了什么变化。
- 你能在没有笔记的情况下口头解释提交中的每一行。
如果你确实对文件的部分内容使用了模型,请在需要披露的地方说明。简短说明哪些部分得到了协助以及你如何验证它们,几乎总是比一个你无法辩护的干净分数更好的结果。
这如何融入更广泛的工作流程
代码是一个特例,因为表面模式更稀薄。大多数相同的方法也适用于散文,而人性化 AI 文本指南更深入地介绍了这个循环:对文本评分,只重写被标记的句子,仅当语义相似度表明含义得以保留时才保留重写,然后重新评分并报告前后对比。在网站上使用的示例段落中,92% 的 AI 分数变成了 4%。
对于代码,循环更简单,而且大部分工作都是手动完成的。检测器被调校为谨慎行事。Turnitin 的文档指出,如果他们识别出文档中 50% 的内容可能由 AI 撰写,那么该文档可能包含高达 65% 的 AI 写作内容(来源:www.turnitin.com)——供应商扩大范围是因为点估计不可靠。以同样的方式对待每一个代码分数:它是查看的理由,绝不是恐慌的理由,也绝不是单独的定论。
测量说明:本文中的数字来自我们自己的本地检测器于 2026-09-28 的观察——n = 709 个来自 61 份元数据筛选指南的参考段落,对比 n = 12 个未经编辑的 DeepSeek 模型段落,AI 分数中位数分别为 25% 和 34%。人类作者身份未经独立验证;来自同一指南的段落相互关联,因此这些数字无法确立人类假阳性率。方法:方法论。带日期的证据:语料库观察,2026-09-28。