跳转到主要内容
这会对 5% 的请求打开采集。控制台部署页的 Reflow 标签页里是同样这三个设置,多数人在那里设。 Reflow 是从一个 deployment 的流量回到它下一个版本训练数据的受管通路。它闭合了平台原本留着的那个 口子:数据进去、模型出来、它提供服务,而它从服务中学到的东西无处可去。
被采集的是真实用户输入,是这个平台会持有的最敏感的数据。采集默认关闭,打开它的人会被记录, 这些设置的每次改动都被审计。

它的形状

只有最后一步不可逆。它之前的一切都会过期或被替换,这正是”在采样、脱敏或挖掘上判断错了也没事”的 原因。 direct 的 deployment 什么都不采集。proxied 的在网关处采集,external 的自己回报流量 —— 见 模型部署。

三个设置

buffer 的字节算在所有者的存储配额上,而且配额压过保留期:超了之后最老的 buffer 文件会被提前 回收,损失会被计数。共享盘被填满会让集群上所有人的训练停下来。 从不采集的东西:任何请求头,所以 Authorization 头不可能意外到达;deployment 令牌本身,只记它的 id,那是一个 deployment 内部的租户边界;以及除 chat completions 以外的任何东西。

脱敏

掩码在任何东西落盘之前就跑完。事后才跑的脱敏不是脱敏,是筛选。 默认规则集覆盖邮箱、中国大陆与 E.164 格式的电话号、美国 SSN、中国居民身份证号、银行卡形状的数字串 和密钥形状的字符串。它有版本,版本被盖在每条记录上,所以之后你能分辨是哪套规则清过什么。 它宁愿多掩一些。代码样本里一个长十六进制串会被当成可能的密钥掩掉。那个代价是一条稍差的训练样本; 反过来犯错,就是把一个凭据放进了语料。

从你在别处运行的服务回报流量

适用于 external deployment:网关从未见过这些流量,所以由服务自己回报, 形状就是它自己日志里已有的 OpenAI chat-completions。回报来的记录会走和网关采集的记录同一套脱敏、 缓冲、保留期、挖掘和审核,下游无法区分两者。每次请求最多 500 条;响应里会给出被接受、被采样掉、 被丢弃、被拒绝的数量,四者之和始终等于这一批的条数。 反馈是证据,不是标签。差评会让记录成为候选,回报来的修正会作为起点展示给审核人;在这边有人读过 之前,两者都不会进入数据集。采样率为 0 时,回报会被拒绝而不是被丢掉,这样配置错了的集成能立刻 发现。带反馈的记录不受采样率影响,一律保留。

挖出难例

一个 buffer 里有用的那一半很小,而且不是平均请求。 rubric 可选;不填就只用免费信号。挖掘会替换掉上一次的候选集:它是一个工作建议,不是一份账本。

审核

上面每个信号都说明这条回答可疑,而提升后的记录会以这条回答作为 assistant 一轮 —— 也就是微调 要学着复现的目标。所以在有人读过之前,一个候选就是一条疑似错误的回答,提升只接受读过的。 信号只是怀疑:用户把同一个 prompt 贴了两次,不一定是不满意第一次的回答;评分模型也有误判。接受 就是用来区分这些情况的。读取一段对话会被审计,每个决定都记下是谁做的;只要这条记录下次还是因为 同一个原因被标出来,决定就会保留到下一次挖掘之后。管理员也不例外 —— 角色并不知道回答对不对。

修正

挖掘找到的难例,正是模型答错的那些,所以只能接受或丢弃的话,大部分都会被扔掉。修正保留生产流量 给出的 prompt,只替换回答。它还顺带得到一个偏好对 —— 你的回答为 chosen,模型原回答为 rejected —— 不需要第二轮标注。 修正保存在它所回答的那份采集流量旁边,不进数据库,并且随它一起过期:想保留的请及时提升。缓冲 在写入时已经脱敏,所以如果修正里引入了这段对话原本没有的敏感值,会被拒绝。空的修正也会被拒绝 (应该丢弃),与原回答完全相同的也会(应该接受)。

提升

四项检查,都是 fail-closed:
  • 审核。 选中的每个候选都必须是 accepted 或 corrected。有一个不是,整次提升就被拒绝, 而不是跳过它 —— 这样产出的版本不会悄悄比选中的少。
  • 可见性。 一个 deployment 的所有者和管理员能读它,所以唯一不构成权限扩大的目的地是那位所有者 自己的私有数据集。提升到一个公开数据集,等于把你用户的流量发布给平台上每个账号。管理员可以 这么做,审计记录会写明。
  • 污染。 在 against 里写出要比对的评测数据集,或者显式设 skip_contamination_check。这个选择 会记在版本上,因为没人检查过和检查过且干净在六个月后必须看起来不一样。生产流量与某个评测集 重叠是正常情况 —— 那个集合很可能就是从同一分布建的。
  • 不为空。 一个存在、可被引用、但什么都教不了的版本,比没有这个版本更糟。
shape 决定写出什么,一个版本只有一种形态。sft(默认)把选中的每个候选写成一段对话,以有人 担保的回答结尾:已接受的用原回答,已修正的用修正。preference 只写已修正的候选,形如 prompt / chosen / rejected;已接受的候选没有可配对的内容,会被略过。每一行都带一个 source —— 记录、部署、产出这条回答的 revision、时间、被标出的原因和审核人 —— 这样一行数据 出了问题,可以追到写出它的那个模型。 污染估计用按 1/64 抽样的 13-gram 指纹。一次提升的量小、prompt 又短时,产生的 n-gram 太少,估计没有 意义,此时结果报成不确定而不是通过。

确认成功

返回 buffer 的大小、它的保留期时钟,以及被丢弃和被提前回收的计数。丢掉了什么和留下了什么一样明显, 这是有意的。 一次提升之后,tp dataset ls alice/support-reflow 能看到新版本,下一次运行就能引用它。

看整个回路

Models → 展开一个模型 → Data flywheel。它显示一个版本的整条链:来源、训练运行、评测结论、 服务与采集量,以及回来的那些数据集。 那里的”闭合”是严格的。采集流量不算闭合回路,挖掘它也不算。回路闭合的时刻,是那些流量变成了某人 能拿去训练的数据集。

下一步

模型部署 · 数据集 · 评分标准