先说结论:CopyGen 的方法我给八分,那句「相对提升约 35%」我给五分,摘要页上那个代码链接,零分。
好话先放前面,免得后面开火被当成无脑黑。论文 10 月 20 号挂上 arXiv,2610.28393,NeurIPS 2026 收了,cs.CL,八位作者。方法部分我读了两遍。不是水文。
代码呢
「相关代码已公开」——原话大概就这个意思。翻到摘要页,链接是个占位符,仓库地址没有。
声称:code released
实际:占位链接,无仓库地址
arXiv:2610.28393v1 / 2026-10-20 15:40:54 UTC
一篇论文最没面子的地方,就是它讲的那件事自己没做到。
讲逐字复制,结果最该被原样复制出来的那串东西,是个占位符。🙂
我不觉得这是诚信问题。中稿到放码隔几周很正常。可你既然把「已公开」三个字写出来了,就别怪我用你自己的标准照你。这条先记着,不下判决。
方法那一块拆成三个判断:进不进复制态、这次抄多长、什么时候停。给一个候选长度,逐词元校验,动态调 logits,只输出最长的合法前缀。参数冻结,不微调。
说句公道话,这个拆法站得住。
复制从来不是一次 next-token 预测能搞定的事。它是「我决定开始抄」加「我抄到哪儿收手」,两个显式动作。默认模型看着上下文就能抄对——这假设本身就懒。这些年大家被「上下文里有它就该输出对」这句话惯坏了。
第四类才是戏眼
合同、科学文献、代码、随机序列。前三条我认。第四条有意思。
随机串抄不对,病根不在解码策略,在 tokenizer。一串 base64 在上下文里被切成什么词元边界,跟它在输出里该被切成什么,本来就不保证一致。你在词元层面做校验,天花板就是「上下文里恰好已经有这条词元序列」。边界一错位,那套约束就从「保证正确」退化成「帮忙猜」。
只输出最长合法前缀这一手确实有用。至少不吐半截脏串。可反过来看:边界本来就在上下文里对齐了的串,它抄对是应该的;对齐不了的那批,这套也只能少错一点,保证不了不错。
论文自己的说法是,可靠复制不是天然能力,得在解码阶段显式建模。这话对一半。另一半是:有些活儿压根不归解码管。
那个 35%
相对提升(免微调): +35%
相对提升(挂 SFT): +4%
绝对匹配率: ?
「相对提升」这四个字,先砍一半再看。
40 到 54 叫相对提升 35%,8 到 10.8 也叫相对提升 35%。同一个百分比,背后可能是「基本能用」和「基本不能用」两个完全不同的世界。我手上这一层摘要只给了相对数,四个任务的绝对值一个没有!不是说他没写,是这一层看不见。等仓库落地,这个数我第一个去翻。
我最烦这种只给相对数的摘要。
更尴尬的是紧跟着那句:跟 SFT 结合,再相对提升 4%。
翻译一下:一套主打「无需微调」的插件,最好看的数字是搭上微调才拿到的。主菜是免微调那个 35%,甜点是这 4%。甜点排在主菜后面,说明作者自己也知道主菜没吃饱。
当然,4% 不小。免微调方案上再叠 4%,工程上值这个钱。我只是不习惯看一篇论文把最好的数字放在括号里。
作者给的第一顺位动机是:代码生成里,密钥这类敏感串必须跟上下文里一模一样地写进输出。
看到这儿我停了一下。谁真让模型手抄一遍密钥?
正常做法是占位符、环境变量、构建期注入。密钥的正确用法是压根别出现在 prompt 里,而不是出现了之后再想办法让它被抄对。拿这个当第一动机,有点像先做出锤子,再回头找钉子。
说完我又想收回半句。agent 写 config、把上下文里的连接串补进 yaml、把测试用例里那个固定 ID 原样带过去——这类活躲不掉,错一个字符就是线上事故!动机成立,只是不该拿密钥打头。密钥不归这个模块管,密钥归流程管。
哦对,我本来想自己在本地写个三十行版本,照它那套「最长合法前缀」试一下。写到一半卡住:你得先判断目标串在不在上下文里,而这个判断本身又是一次模型调用,成本立刻回到原点。这条我还没验完,先别信我这半句。
锐评评分卡
- 方法:八分。复制确实该从 next-token 的副产物里拎出来单独管。这个判断比那个 35% 值钱。
- 数字:五分。相对提升叠四个任务取平均,两个最会讲故事的口径摞一块儿,绝对值欠奉。
- 代码:零分。占位链接不算公开。
- 这钱花得冤不冤:不冤,但也不用现在就跟。
值不值得跟:你手上要是有「必须原样搬过去」的串——合同条款、配置、连接串、测试用的固定 ID——等仓库出来,拿你自己的脏数据喂一遍再决定。天天写 CRUD 的,这 35% 跟你没关系,看看方法那三行就够了。
别记那个百分比,记它拆出来的三个判断。仓库放出来那天,我再来照一遍。
