计算机专业报告的 AI 率:代码算不算,哪些字一个都不能动
一份计算机课程报告其实是两份文档订在一起。被打分的是其中一份;另一份由值组成,而它才是改写时最容易被悄悄弄坏的那份。
HumanPen 团队
· 12 分钟
先说结论
Turnitin 对代码的公开说法很短也很明确:模型 "does not reliably detect AI-generated text in the form of non-prose, or code"(无法可靠检测非散文形式或代码形式的 AI 生成文本),FAQ 还写着它 "not pursuing ChatGPT code detection at this time"(目前不在推进 ChatGPT 代码检测)。所以你的代码清单、伪代码块、终端输出,都不是那个 AI 百分比在讲的东西。它讲的是夹在这些块之间的段落——设计取舍、算法讲解、复杂度分析、实验结果讨论。而这几段恰好是全篇最整齐划一的文字,因为好的技术写作本来就要求整齐划一。
另外有一件事必须分开说:你们学院允许你用 AI 生成什么,是学术诚信规定说了算,不是检测器说了算。这两个问题彼此无关,用其中一个去回答另一个是错的。
官方到底怎么说代码
关键就两句。第一句在 FAQ 关于「分析什么」的定义里:
"The model does not reliably detect AI-generated text in the form of non-prose, or code, nor does it detect short-form/unconventional writing such as bullet points (short non-sentence structures)."(模型无法可靠检测非散文形式或代码形式的 AI 生成文本,也无法检测项目符号这类短篇/非常规写作,即短的非句子结构。)
紧接着的下一句才是能用上的那半:
"This means that a document containing several different writing types would result in a disparity between the percentage and the highlights."(这意味着一份包含多种写作类型的文档,其百分比与高亮量之间会出现落差。)
计算机专业的报告天生就是「包含多种写作类型」的文档,所以这个落差在这个文体里是常态,不是异常。使用指南那一页给出的排除清单更长一些,除代码外还点名了诗歌、剧本,并把表格和注释书目归到短篇那一侧。
第二句常常被单独摘出来传,所以值得说清楚它长在哪儿。它是「Why is AI detection not being added to Gradescope?」(为什么 AI 检测不加进 Gradescope?)这一问答案里的最后一句,整段是:Turnitin 目前 "not currently have plans to add these capabilities to Gradescope, since the primary use case for Gradescope is handwritten text while for AI detection we're focusing on typed text"(没有把这些能力加到 Gradescope 的计划,因为 Gradescope 的主要用途是手写文本,而 AI 检测这边关注的是键入文本),然后才是 "In addition, we are not pursuing ChatGPT code detection at this time."
这句话对计算机专业的意义比对其它任何专业都大,因为不少编程作业就是交在 Gradescope 上的。如果你的实现交给自动评测、报告交到 Turnitin 的作业里,那是两条各干各的流水线,你最后看到的 AI 百分比算的是后面那一条。哪个 Turnitin 产品才带 AI 检测,见 Turnitin Originality、Feedback Studio、iThenticate 有什么区别。
你的报告里,哪些部分算「散文」
定义在使用指南上,注意它举的例子:
"Qualifying text (prose sentences contained in long-form writing format) means individual sentences contained in paragraphs that make up a longer piece of written work, such as an essay, a dissertation, or an article, etc."(合格文本,即长文写作格式中的散文句子,指的是构成一篇更长作品的段落中的一个个句子,比如一篇论文、一篇学位论文或一篇文章等等。)
论文、学位论文、文章。一份写成接口文档语气的项目报告,这三个都不是,官方也没有给它一个裁定。官方给的是「是不是段落里的句子」这条判据,那就把这条判据逐项套上去。下面这张表是我们对公开规则的读法,不是厂商确认过的结论。
| 报告里的成分 | 是段落里的句子吗 | 说明 |
|---|---|---|
| 引言、问题描述、相关工作 | 是 | 普通的学术段落 |
| 设计取舍:为什么选这个结构而不是那个 | 是 | 通常是全篇论证密度最高的地方 |
| 算法的中文/英文讲解 | 是 | 高亮最常落在这一块 |
| 复杂度分析 | 写成句子就是 | 一行只有 `O(n log n)` 加两个符号,不构成句子 |
| 伪代码块 | 否 | 按行组织,不是语法句子 |
| 源码清单 | 否 | 官方排除句里直接点名了 code |
| 终端输出、日志、调用栈 | 否 | 不是散文,也不该由你重新措辞 |
| 编号的安装、构建命令 | 否 | 项目符号与短的非句子结构被排除 |
| 函数或接口的条目式说明 | 看你怎么写 | 「返回解析后的 token 序列。」是句子;两列参数表不是 |
| 耗时与准确率的实验表 | 数字不算 | 2023 年 8 月 9 日的更新记录写明表格中的长文散文会被处理,同条还写明既有提交需要重新提交才会重新处理 |
| 结果讨论、局限、未来工作 | 是 | 从头到尾都是段落 |
| 参考文献 | 排除 | 同一条更新记录写明,处理 AI 写作报告时参考文献被排除 |
这张表推出两件事。一是你的分母很小,所以那个百分比讲的是文件的一小片而不是整个文件,FAQ 原话就是这么写的:"This percentage is not necessarily the percentage of the entire submission. If text within the submission is not considered long-form prose text, it will not be included."。二是如果你的报告以代码清单为主,合格散文可能少到让短文档的「全有或全无」那套行为变得相关——文件要求那一条写着 "at least 300 words of prose text in a long-form writing format",散文不到 300 词,报告本身就不会生成。
被测的那部分,恰好是你写得最整齐的那部分
官方公开过一段话,讲误报的文本通常有什么共同点:
"Sometimes false positives (incorrectly flagging human-written text as AI-generated), can include content without a lot of structural variation, text that literally repeats itself, or text that has been paraphrased without developing new ideas."(有时候误报——把人写的文本错标成 AI 生成——可能出现在结构变化不多的内容、字面上重复自己的文本,或者只做了改写而没有产生新想法的文本上。)
下一句不是说给你听的,是说给看报告的老师听的:
"If our indicator shows a higher amount of AI writing in such text, we advise you to take that into consideration when looking at the percentage indicated."(如果我们的指标在这类文本上显示出较高的 AI 写作比例,我们建议你在看这个百分比时把这一点考虑进去。)
把这两条特征对着一份写得好的技术文档读一遍。「结构变化少」正是接口说明刻意做掉的东西:每个函数都是同一副骨架,名称、参数、返回值、失败情形,读者学会一次就能扫完剩下的全部。「字面重复」是你在告诉读者这两个组件行为完全一致。一份要求你把每个条目写出花来的规范,是一份糟糕的规范。
算法讲解那一段是同样的形状,但原因不同:它多半是在用自然语言复述上面那段代码。复述这件事在文体上无处可去——每一步都以那一步开头,每句话主语一样,整段就是控制流的转录。
两点老实话。官方给的是误报「可能包括」哪些特征,没有附任何频率,所以谁也说不出这一条能解释多少。另外这个模型不是一本能倒推的规则书:FAQ 写着 "Our model is not explicitly programmed to evaluate specific signals such as 'burstiness,' 'perplexity,' or other individual metrics sometimes referenced in public discussions."(我们的模型并没有被明确编程去评估突发度、困惑度这类公开讨论中常被提到的单项指标。)完整版本,包括同一页上另一句会让你别读过头的话,在困惑度与突发度的误传:Turnitin 实际用的是什么。
另一半文件是由「值」构成的
这里有一个和写小论文完全不同的不对称:被排除在测量之外的那部分,不是无关紧要的背景板。它恰恰是改一个字符就会让文档变错的地方,而改写这个动作是不管有没有人给它打分都会读到它的。
| 内容 | 为什么它是值而不是措辞 | 一次听起来很合理的改写会造成什么 |
|---|---|---|
| 标识符和它的大小写,`getUser` 与 `get_user` | 名字就是被解析的那个东西 | 正文提到了一个你代码里并不存在的函数 |
| 命令行参数,`--max-workers=8` | 它是可执行文本 | 「把 max workers 参数设成 8」没法粘进终端 |
| 路径与模块名,`src/parser/tokenizer.py` | 它指向一个真实位置 | 读者找不到那个文件 |
| 版本,`Python 3.11`、`CUDA 12.4` | 复现的前提 | 谁也搭不出来的环境 |
| 复杂度表达式,`O(n log n)`、均摊 `O(1)` | 背后有推导的断言 | 「大致线性」是另一个、而且更弱的断言 |
| 引用的报错文本与退出码 | 那是程序打印出来的原话 | 它不再是一段引用 |
| 接口与方法名,`POST /v1/jobs` | 那是接口契约 | 一个会返回 404 的请求 |
| 随机种子、超参、数据集划分 | 你那些数字的依据 | 没人能复现的结果,包括你自己 |
还有一种更难发现的坏法,因为改完读起来完全通顺:技术文档里,一个概念只能有一个名字。如果改写之后第三节写 `hash map`、第四节对同一个对象写 `dictionary`,或者 `worker` 和 `thread` 交替出现,文档就不再告诉读者这是一个东西还是两个东西,而老师不翻你的代码就没法确定。这是文档本身的问题,跟任何分数都没有关系。之所以要专门讲,是因为它和你在别处养成的习惯相反:多数写作里,用哪个词是措辞问题;在这个文体里,一个已定义的术语更接近一个标识符。
十分钟能做完的检查,按这个顺序
下面每一条都不需要额外的工具。
- 把文档里的每条命令复制出来,在一个空目录里真跑一遍。安装说明是最先烂掉、也是最少有人回头看的部分。
- 列出代码里定义的标识符,逐个在文档里搜。代码里有、文档里没有的,就是一次你没打算发生的重命名。
- 挑出五个最要紧的概念词,逐个搜索,确认全篇只用一个名字,不一致就现在改。
- 把每一处复杂度断言对着它描述的那个函数读一遍。`O(n log n)` 和「效率高」不能互换,而只有前者能拿分。
- 引号里的东西逐字比对真实运行结果。日志行和报错信息是引文。
真正能发挥的地方在哪儿
如果被标红的是算法讲解那一段,动手改句子之前先问一个问题:这一段有没有做到上面那段代码没做到的事?把变量换个名字、在步骤之间加上「然后」,那是报告里的冗余内容,跟检测器怎么看无关。真正撑得起篇幅的版本,讲的是这个循环为什么这么组织、被放弃的方案是什么、它在什么情况下会失效。
那也正是你的文字有地方可去的部分:设计取舍、被否掉的备选方案、卡了两天的那个 bug、这套评测没测到什么、再给一周你会先修哪个局限。这些段落的形状本来就参差,因为里面的思考本来就参差。条目式的章节不是这样,也不该是这样。
关于这条建议的边界,我说清楚:我描述的是怎样让报告更好读、更好给分。它对那个数字有什么影响,谁也说不了,我们也说不了。Turnitin 没有公开池化函数和片段长度,而且它自己就写着模型 "may not always be accurate (it may misidentify human-written, AI-generated, and AI-paraphrased text), so it should not be used as the sole basis for adverse actions against a student."(可能并不总是准确,可能误判人写的、AI 生成的和 AI 改写的文本,因此不应作为对学生采取不利行动的唯一依据。)
如果确实要改那几段文字
计算机报告改起来麻烦,麻烦的不是写字。是一个被改写的段落里可能塞着四个标识符、一个命令行参数和一个版本号,每一样都得回头对着代码核一遍。成本单位是「动过的段落数」,不是词数。
所以 HumanPen 让你先把范围说死。上传文档,然后要么自己点出要改的片段,要么导入 Turnitin / iThenticate 的 AI 报告,由报告标记的片段来划这条线,边界以外的内容原样保留——落到这个文体上,意思是代码清单和命令块除非你亲手放进去,否则根本不进这一趟。段落是引擎能改写的最小单位,选区只覆盖半个段落时会扩成整段,并在开跑前先展示给你确认;积分只按实际改写的词数计。它列出的保留项里,术语和结构、引用、排版并列。符合条件时,仍被标记的片段可以免费继续降。
它自己的常见问题里写着「复杂文档下载后请复核」。对一份满是标识符的报告来说,复核指的是上一节那份清单,不是通读一遍。文档层面还有什么会在往返中损坏(域、目录、交叉引用),见 Word 的域、目录与交叉引用。
常见问题
Turnitin 会检测 AI 写的代码吗? 官方说模型无法可靠检测非散文形式或代码形式的 AI 生成文本,FAQ 也写着目前不在推进 ChatGPT 代码检测。这是在说这份报告测什么,不是在说你们学校允许什么——后者是另一份文件,你应该去读。
伪代码块会被打分吗? 公开的规则是模型分析段落中的散文句子,并把短篇和非句子结构列为它不检测的东西。伪代码块是按行组织的,不是按句子组织的。引出它的那个段落才是散文。
为什么高亮全挤在一个章节里? 一部分是算术:如果文件的大半都被排除了,高亮只能出现在剩下的那部分。官方还描述过按重叠片段打分再池化的做法,所以一整片写法一致的文字,倾向于产出一致的结果,而不是零散分布。
复杂度分析那一节被标红了,可那真是我一个字一个字写的。 这种情况确实会发生,能拿去跟老师说的就是 FAQ 里讲误报的那一段,尤其是它最后那句建议老师结合文本特征来看这个百分比。它不能做的是替你证明作者是谁——两个方向都不能。
我的报告几乎全是代码清单,结果根本没生成 AI 报告。 先看那条下限再判断是不是出错了。文件要求写着一次提交需要长文写作格式中至少 300 词的散文,而一份以代码清单为主的报告,页数看着不少,散文词数却可能不够。排除清单的通用版本见 Turnitin AI 检测跳过哪些内容。
继续阅读