九种形状
形状是声明的,不是猜的,检查器只验证这个声明。另一条路是推断,而它在要紧的那一点上更糟:读三 行去猜的启发式几乎总是对的,而那个「几乎」意味着一次无声的错训,而不是一次拒绝。 这里没有generic,也没有 custom。什么都不意味着的格式无法被检查,只会变成一个要填的字段;形状
不在这份名单上的语料,干脆什么都不声明,其余一切照旧。
messages —— 对话 SFT。非空列表,每一项都带非空的 role 和 content。
prompt_completion —— 普通的有监督文本。两个键都是非空字符串。
preference —— DPO 及其同类。
fim —— 中间填充,代码模型学会在文件内部补全而不是在末尾续写靠的就是它。只有 middle 必须
非空:prefix 和 suffix 是上下文,在文件边缘任一侧为空都合理。
repo_context —— 前面摆着仓库其余部分的一次补全。files 是非空的 {path, content} 列表,
路径不许重复,外加一个非空的 target。RTL-Repo 和每个仓库级代码评测集用的都是这个形状,也是
那个一旦压平成 prompt 字符串就会丢掉「哪个文件是哪个」的形状。
spec_rtl —— 一段自然语言规格,和实现它的模块。
testbench —— 一个设计,和验证它的 bench。方向是要紧的,而且和 spec_rtl 不对称:这里模型写
的是 bench,那是验证工程师的活。
log_root_cause —— 一段工具或回归日志,和出了什么问题。它既是设计侧的形状,也是制造侧的。
script —— 一个 EDA 脚本任务:Tcl、Makefile、约束文件。之所以和 prompt_completion 分开,是
因为让它正确的是脚本跑得起来,而不是文本读着顺。
repo_context 里重复的路径是拒绝而不是容忍:框架留下哪一份,决定了模型看到什么,所以那两项会在同
一个样本里对同一个文件各说各话。
检查器可以看什么
形状,仅此而已。哪些键在、它们装的是字符串而不是嵌套结构、成对的两半都在。 关于内容、质量、语言和长度的一概不看 —— 那些属于质量报告,而一个开始 评判内容的格式检查,就是对你自己的数据发表第二种意见。一致性是比例,不是门禁
conformance 接受任何可迭代的行,所以读多少由调用方决定。它报告看了多少行、多少行合规、比例,以及
最多十条带行号的问题 —— 一份有一百万行坏数据的语料只有一个问题,不是一百万个。
两处刻意的拒绝:
- 它从不变成判决。 见到任何一条就触发的门禁,是一周之内就会被人关掉的门禁,而真实语料里就是有 一些没人想为之争论的坏行。平台欠你的是那个数字和头几个例子。
- 空文件没有比例。 零行时
ratio是None,而不是1.0。什么都没检查,「完美」是错的说法。
parse 返回 None —— 这是常态,不是错误 —— 对不认识的名字则抛错并附上已知名字
的排序列表。
随机切分一份工程语料会泄漏
平台已有的每一项污染检查比的都是文本。tp dataset check 匹配归一化后的 13-gram;指纹比对取的
是采样 n-gram 哈希的交集。两者都回答了各自被造出来要回答的问题,而都看不见那个会让工程团队的评测报
废的失败。
工程语料里满是同一个产物的近似变体:一个 UART 的八个修订、一个模块和实例化它的 wrapper、同一个
testbench 参数化出的四份。一个模块的两个修订之间确实几乎没有共同的 n-gram,而就「衡量模型学到了什
么」而言,它们是同一道题。
随机切分它们,评测集里装的就是训练集的兄弟。每一行都不同。重复率不会响。shingle 重叠读起来是干净
的。于是留出分数量的是模型早已见过的东西的记忆,数字涨了,模型没变好。
所以这项检查比的是身份而不是文本:group_key 点名的任何东西 —— 一个设计、一个仓库、一个工单号 ——
答案是评测组里有多大比例也出现在训练集中。
- 它按不同的组计数,不按行。 一个设计出现在一千条评测行里是一次泄漏。数一千次,就等于让语料的 行分布来决定它的泄漏看起来有多严重。
- 什么都没留出时
ratio是None,不是0.0,和空的一致性报告没有比例是同一个理由。 - 它完全不需要文本。 两个集合求交集,所以在两边都还没被读之前,它就能在元数据上跑。
声明分组键
spec.data.quality 是 JobSpec 里承载训练数据上限的那一块 —— 评测门禁的对偶:那些判出来的模型够不
够好,这些判进去的数据够不够干净。其中两个字段关于血缘:
- 比例不在
0–1之间。 - 有
max_group_leak_ratio却没有group_key—— 没有它,每一行都是自己一组,上限永远不可能被突 破,那就是一条永远不会被判的线。同一条规则早就把max_overlap_ratio绑在了overlap_with上。
design,脚本助手用 repo,日志定责用 case ——
同一个故障被报了两次,是一件事实。tp solution show 把它打印成 split by;见
工程方案。
哪些通了,哪些没通
把这件事说准,比这个功能本身更要紧。
所以今天,这九个名字是工程方案会声明的一套词汇,外加一个你可以在自己的行上跑的库函数 —— 在预处理
脚本里,或者在推送前的 CI 里。
group_key 同理:声明它记录了意图、并会拒掉自相矛盾的 spec;算泄漏
是 group_leak 的活,调用它是你的活。
这个说法比「平台会拦住一次泄漏的切分」小,而它是真的那一个。