剥去代码外衣,谁在假装作者
大模型无法真正识别自己写的代码,只是被表面格式骗了
1问题
想象你写了一段Python函数,然后让两个不同的人工智能(AI)分别改写它。现在,你把这两段代码混在一起,问其中一个AI:“哪段是你刚才写的?”如果AI真的拥有自我意识或某种内在的“代码DNA”,它应该能一眼认出那个熟悉的逻辑结构。但事实可能很残酷:很多大语言模型(LLM)根本分不清哪段是自己写的,哪段是别人改的。如果它们连自己的“笔迹”都认不出来,那我们之前以为它们在“监督”自己、或者通过比较来优化质量的那些操作,很可能只是一场自欺欺人的幻觉。
2翻译
这篇论文的主角是一群商业大模型。研究者给这些模型布置了几道编程题(比如MBPP和HumanEval数据集),让它们生成解决方案。然后,把这些生成的代码当作“嫌疑人”,反过来考问那些模型。
我们先看第一个场景:单挑。给一个模型看一段代码,问它:“这是你写的吗?”结果令人失望。所有测试中,模型的准确判断率在49%到58%之间徘徊。这是什么概念?这几乎等同于抛硬币瞎猜。有些时候准确率看起来高一点(比如60%多),研究者一扒皮发现,那只是因为模型特别喜欢夸自己——无论看到什么代码,它都倾向于说是自己写的,这种“自恋”偏差误导了原始准确率。
再看第二个场景:PK。给一个模型看两段代码,问它:“哪段是你写的?”这里出现了另一个有趣的现象。准确率竟然和代码的“长度”强相关(相关性高达0.93)。模型似乎不是在找逻辑指纹,而是在找“像我写得长的那个”。如果你生成的代码比对手长,你就赢了。
更打脸的是第三个场景:指认。问模型:“这段代码是Model A写的还是Model B写的?”结果完全随机,甚至在某些情况下正好相反。这说明模型对“身份”毫无概念。
为了验证这个猜测,研究者做了一个实验:用规则把代码里的注释、文档字符串、变量名全部去掉,只保留最核心的逻辑骨架。神奇的事情发生了,大部分模型在这种“裸奔”状态下,识别能力直接掉到了随机水平(50%左右)。只有少数因为长度差异巨大的案例还保有微弱信号。这意味着,模型所谓的“识别”,依赖的全是表面的装饰物,而不是真正的代码语义。
3核心概念
1. 零样本代码归属(Zero-Shot Code Attribution):这是故事的核心任务。意思是,不给模型任何训练或提示,直接让它判断某段代码是否由它自己生成。这里的“归属”不是法律意义上的版权,而是技术上的“亲生子”鉴定。2. 表面线索偏好(Surface Cues Preference):这是主角的认知缺陷。研究发现,大模型并不理解代码的深层逻辑树(AST)或算法思想,它们依靠的是表层特征,比如代码的长度、是否有注释、缩进风格等。对于模型来说,“像我”等于“长得像”,而不是“意思像”。3. 平衡准确率(Balanced Accuracy):这是一个关键的评价指标。之前的研究往往只看“原始准确率”,但这会被模型的“自恋”(总是说自己是作者)污染。平衡准确率同时考虑了真阳性和真阴性,能剥离这种偏差,暴露出模型到底有没有真正的判别能力。这篇论文用它证明了绝大多数模型的能力接近于无。
4洞见
大语言模型没有“自我”的代码记忆;它们眼中的“我是谁”,只是统计学上对表面格式的匹配游戏,而非对创造本质的认知。
5博导审稿
这个选题眼光很毒。大家默认大模型有自我监控能力,甚至担心多智能体系统会串通作弊,但没人认真做过这个基础的“亲子鉴定”测试。方法上,他们把实验拆得很细,从单判到双判再到指认,层层递进,尤其是那个“规则去噪”的实验,非常有说服力,直接戳穿了表面繁荣的泡沫。数字也很干净,平衡准确率的呈现让结论站得住脚。
不过有个隐忧:他们用的主要是商业模型的API,这些模型可能对特定的评测数据集存在过拟合嫌疑。虽然他们用了去噪来缓解,但如果数据泄露严重,模型可能是记住了特定题目的答案格式,而非泛化的自我识别。此外,仅用规则去除注释可能不够精细,如果能结合词法分析器做更深层次的标准化,结论可能会更硬。写作方面,逻辑清晰,证据链完整。
判决:Strong Accept。这是一篇典型的“泼冷水”式好文章,修正领域内一个潜在的傲慢假设,价值在于破除迷思。
6启发
这意味着你可以重新审视你的多智能体协作架构。1. 迁移:如果你设计了一个Agent让另一个Agent评估其代码,不要指望它能客观指出“这是我写的烂代码”。评估者很可能是在模仿它的表面风格,或者干脆看长短打分。你需要引入外部的、非大模型的静态分析工具作为仲裁者。2. 混搭:在做代码克隆检测或版权保护时,依赖单一LLM的判断是危险的。可以搭配传统的基于AST(抽象语法树)的结构化工具,LLM负责语义润色,传统工具负责指纹比对,形成互补。3. 反转:我们通常认为模型越聪明,越能理解自我。但这篇论文暗示,在代码生成领域,模型越“华丽”(注释多、格式完美),反而越容易干扰对自身真实贡献的判断。在评估模型真实性时,或许应该故意“丑化”代码输入,看看它还能不能认出来。