跳到主要内容
那条最相似的示例,就是它自己

那条最相似的示例,就是它自己

老墨
老墨

· 阅读约 5 分钟

旧稿的提示骨架是这么长的:

[系统块] 你是工单路由助手……
[示例 1] 最不相似的已标注工单 + 金标签
…(中间六条)
[示例 8] 最相似的已标注工单 + 金标签
[待分类工单]

问题不在八个,在【最后】这两个字。

把最相似的那条压在结尾,这做法本身是懂行的。模型对离输出最近的内容天然敏感,结尾那条示例的权重比前面七条加起来还大。我调 few-shot 顺序的时候靠这条吃过多轮测试:最贴目标风格的那条放最后收尾,前面垫场,三个位置各司其职,不是排大小个。

同一个动作,换一个数据环境,性质就反过来。

选择器的向量索引是从 labeled_tickets.jsonl 建的,评测集也从同一份文件里抽。于是每个评测样本在索引里的最近邻就是它自己,还带着自己的金标签。选择器再按"最相似者最后渲染"把这条排到末位。实际发出去的提示就长这样:

[示例 8] 我的 Wi-Fi 昨天开始连不上,重启路由器没用  →  网络类
[待分类] 我的 Wi-Fi 昨天开始连不上,重启路由器没用

答案印在题干正上方,隔一行。

作者是在排查 p99 延迟超两秒的时候,去读实际发送的完整提示,才撞见这一幕的——同一条模式在多个 trace 里重复。要不是延迟先出问题,逼着他看渲染后的全文,这泄漏大概还能再活一阵。所以这条最值得记的不是"泄漏有多隐蔽",是发现它的路径:不是评测分数先报警,是一个跟精度无关的性能指标把人拽到了现场。分数从头到尾没报过警。

说起来有点丢人,我为"最后一条该放什么"这件事纠结过不止一次,前前后后改到第七八版才算能看。所以看到那条 trace,我第一反应不是"他们怎么这么粗心",是我自己那套顺序直觉在什么条件下会变成同一种事故。

0.94 能撑五周,是因为它高到值得庆祝,低到显得可信。1.00 第一天就会被当 bug 摁下去查,0.60 早就有人拍桌子。唯独 0.94 这个位置,像是努力过后的正常结果,谁也没理由动它。何况提示里除了那条自身示例,另外七条偶尔还和它冲突,分数才没顶到 1.00——这些冲突反过来成了掩护,让这个数字更像真的。评论区 Max Quimby 把这个观察往外推了一层,说"不是满分所以逃过审查"这机制不只在评测污染里成立,他还建议每次部署记一份完整渲染提示、人工读一遍。前半句我认同,但后半句才是这篇里最该抄走的东西——不是抄那个脚本,是抄"读渲染全文"这个动作。

回到正题。真实数字在从未进过索引的工单上重测,约 0.79。修复也简单,只用 few-shot 一侧的数据重建索引,然后重跑那 600 条评测,分数落到 0.79,掉了大约十五个百分点。

旧稿:索引与评测集从同一池抽样 新稿:按归一化内容加盐哈希,确定性分配记录进评测侧或 few-shot 侧

差别不在长短,在【确定性】这三个字。哈希切分是定死的,池子以后怎么长,已有记录的划分不会漂;完全重复的工单也自然落进同一侧,不会一边一个。盐值还能用来有意识地轮换划分——这一点我先记着,还没想好什么时候该轮。

换池之后错误切片第一次变得可读:滥用报告这一类明显低于平均,账单那一类高于平均。这话听着不像收获,但在我看来,团队真正拿回来的东西就是这个。前五周那个 0.94 不光数字是假的,它的错误结构也是假的——你自己把答案放进去,错误全被盖住,切片图上一片平滑,什么都看不出来。分数从虚高的 0.94 掉到 0.79,不叫丢了十五个点,叫确认这十五个点从来没在手过。

还有个更麻烦的层面。作者写了个 contamination_check.py,归一化哈希查逐字和外观编辑重复,n-gram 包含度查评测样本被长示例包住的情况,五条玩具样例里查出三条,首次真跑也抓到了他们那条逐字泄漏。但这脚本对付不了改写型污染——改写样本可能共享很少甚至没有 n-gram。Yang 等人那篇关于改写样本的论文讲的就是这个:简单改写或翻译就能绕过字符串和 n-gram 去污染,一个 13B 模型在保留改写测试数据的情况下可能过拟合到接近 GPT-4 的水平;他们在 RedPajama-Data-1T、StarCoder-Data 这类预训练集合里查到 8% 到 18% 的 HumanEval 重叠。评论区 Sachin Kr. Rajput 顺着往下接,说分组不能只看内容哈希,得按来源分——他举了 GroupKFold 在患者多次就诊数据上的例子:随机切分 1.0000,按患者分组 0.8620。作者回复说会按"最强标识符优先、内容哈希兜底"来排,也承认那个宏 ID 其实一直在管线里,只是没人拿它连线。

定稿的切分逻辑先放这:

按 normalize(record) + salt 做哈希,
偶数进评测侧,奇数进 few-shot 侧;
重复内容天然同侧,不做二次分配。

不再跟位置较劲了——位置没错,错的是给它喂了什么。但我不敢说这套就够,改写的口子还开着,盐值取什么、多久轮一次,我也拿不准,先用着。