审查状态:Cora Master 09-26 16:31 设计初审 —— 方向可继续,五处要补(已补,见各节「初审补」);不是实现验收。
这份回答一个问题:我们怎么把「判一句话让两人更近还是更远」的模型,自己一步步训出来,而且每天都看得见它在哪、有没有变好。
起因:Jeff 2026-09-26 16:24 在 Source Code 房的语音:「我们就全力以赴做这个模型训练……从开始设计,SetFit 是不是最好的……用很有规范性的方法做一个小 App,我可以看到整个的进展,包括怎么训练、怎么自动化训练、怎么调用大模型帮我们……每一天可以看到测试它的成果……不可能就丢给你,训练好跟我讲做好了。」
状态:设计,未动工。 Cora 16:26 定的五条要求(§3~§7 各落一条)已写进来;动手前要 Jeff 定的事在 §11。
0. 一句话
不是「训一个模型交差」,是建一条每天自己转的流水线:攒例子 → 标答案 → 审核 → 够了才训 → 固定考卷考 → 比上一版好才换 → 小程序上天天出成绩单。 每一步都留账,点得开。
1. 现在站在哪(2026-09-26 实测,不是估的)
用中英马三语新题(训练时没见过,每语约 40 句)考,判对的比例(两套 AI 答案取范围):
| 中文 | 英文 | 马来文 | |
|---|---|---|---|
| Jev(外部大模型) | 78~80% | 89~91% | 74~86% |
| 自训 SetFit(251 句例子) | 57~66% | 73~74% | 52~54% |
| 现在线上的字典(未修 k 边界的原版) | 17~30% | 32% | 18~29% |
另外几个实测过的事实:
- 字典低分的主因是「认不出」:把字典里一个老 bug(单字母「k」会命中任何带 k 的词)单独修掉重跑,新题里一个词都没命中的 —— 中文 30/39、英文 36/42、马来 36/39。
- 加例子还没看到在涨:60 / 125 / 251 句各训 3 次,开发题上 45% / 50% / 49%,同规模三次之间差 5~11 个点。范围太小,不能据此说加例子没用。
- 答案本身不齐:两个 AI 标注者在新题上只有 69% 一致,分歧大多卡在「看不出」这一类。这很可能是现在的天花板之一。
- Mac 上训练默认跑苹果 GPU(mps),
device="cpu"也会被训练器挪回去;要在 import 前关掉 mps 才是真 CPU。真 CPU 训一次(251 句,6 线程)814 秒 ≈ 14 分钟;GPU 上约 5 分钟。 - 完整模型(编码 + 分类那一步)只用 CPU 判(本机 M5 Pro,单进程、每请求 1 线程):并发 1 / 2 / 4 / 8 时每秒 176 / 189 / 190 / 135 条,p99 8 / 16 / 31 / 75 毫秒,当下常驻 0.95~0.98G(其中载模型前 Python + torch 已占 0.43G)。服务器同型 CPU 上没测。
所有原始数据、脚本、判定输出都在 Source Code 房的附件里(v4_results.zip、dict_diag.zip)。
2. 整条流水线长什么样
① 攒例子 ──► ② 标答案 ──► ③ 审核 ──► 数据版本(冻结,带编号)
│ 新合格数据够了才触发
▼
④ 训练(候选模型)
│
▼
⑤ 考试:开发题 / 回归题 / 验收盲测
│ 比现役好才晋级
▼
⑥ 发布:候选 → 影子 → 现役(旧版留着可回退)
小程序看板:①~⑥ 每一步的数、状态、失败日志、错例,天天看得见
判据:每一个箭头都要留一行账。 看板上看到的每个数,点下去都能找到它是哪一批数据、哪一版模型、哪台机器、几点算的。
3. 数据:每条例子都要说得清来历(Cora 要求 1)
每条例子一行,至少记这些:
| 字段 | 说明 |
|---|---|
| 句子 + 前文 | 最后一句是 B 发给 A 的;前文 0~3 行 |
| 语言 | 中 / 英 / 马 |
| 来源 | 自己写的(哪个写题者)/ 以后若开放:真实聊天(需 §11 批准) |
| 标注者 | 每个标注者一行:AI(哪个模型、哪版提示词)/ 真人(谁) |
| 分歧 | 各标注者给的答案原样留着,不合并掉 |
| 审核状态 | 待审 / 已审通过 / 已审驳回 / 有争议 |
| 用途 | 训练 / 开发 / 回归 / 验收盲测(同一组变体只能在同一边) |
三条硬规矩:
- AI 之间意见一致 ≠ 标准答案。 AI 一致的只能算「候选答案」;要进验收盲测的,必须有真人审过。
- 先统一判法,再扩量。 「拉近 / 疏远 / 中性 / 看不出」四类各写清判据和正反例,写成一份「标注规范」(
聊天温度标注规范.md,v0.1 草稿),标注者照它标。现在 69% 的一致率说明判法没统一 —— 不先解决,加再多例子也是加噪音。 - 真实用户聊天,没批准一条都不碰。 先只用自己写的例子(§11-B)。
4. 训练:每一次都有账(Cora 要求 2)
每次训练一行账:
| 字段 | 说明 |
|---|---|
| 数据版本 | 用的是哪一版冻结数据(编号 + 各类条数 + 各语言条数) |
| 模型版本 | 框架、底座名、底座版本号(HF commit)、超参数、随机种子 |
| 设备 | 训练前、训练后各记一次(mps 那次教训:建模型时写 cpu,训完被挪到 mps) |
| 耗时 | 墙钟时间 |
| 费用 | 外部调用费按次记;本机训练记「外部调用费 0,机器 / 电费未计」,不写总成本 0 |
| 失败日志 | 失败也留一行,不删 |
自动流程的护栏(初审补 4): - 每个任务有唯一编号;中断后从断点恢复,不从头重来 - 失败重试有上限(先定 3 次),超了停下报警,不无限重跑 - 同一个数据版本只启动一次训练,不重复 - 外部调用费到上限自动暂停,等人放行 - 人审积压时,看板显示「等待人审 N 条」—— 绝不把「AI 一致」自动改成「已审」
什么时候训: 不按时间空转。新的「已审通过」例子攒够一批(先定 200 条,跑起来再调)才触发一次训练。「24 小时不停」指的是流水线常驻、随时在攒例子和审核,不是模型一直在训。
5. 选框架:先比,不拍板
SetFit 先当基线,不预先认定谁最好。候选:
| 候选 | 是什么 | 为什么值得比 |
|---|---|---|
| SetFit + MiniLM 多语(已有) | 小底座 + 少量例子快速教会分类 | 例子少时强;已有成绩可对照 |
| 整体微调 XLM-R base | 多语言底座整个一起训 | 例子多了之后业界常用 |
| 整体微调 mDeBERTa-v3 base | 同上,另一种底座 | 同上 |
| 冻结 e5 + 逻辑回归(已有) | 只训最后一层 | 最便宜,当下限 |
比四样,不只比准: - 准确率(按语言分开) - CPU 上判一句的速度(完整模型,含分类那一步;并发下的 p95/p99) - 常驻内存 - 训练成本
不预先承诺「整体微调一定更准」(Cora 16:26)。谁赢由同一份考卷决定。
6. 考卷:三份分开,各管各的(Cora 要求 3、5)
| 考卷 | 干什么用 | 能看几次 |
|---|---|---|
| 开发题 | 调参数、选输入方式、定阈值 | 随便看 |
| 回归题 | 固定不变,每天都考,看有没有退步 | 天天看 —— 但不能拿它选冠军 |
| 验收盲测 | 候选要晋级现役时才考 | 每份只用一次,用过就降级成回归题,再出新的 |
为什么要三份: 同一套题天天看、天天挑最好的,挑出来的只是「最会考这套题的」,不是真的好。回归题管「有没有变坏」,盲测管「是不是真的变好」。
晋级判据(初审补 1,跑前写死;⚠️ 不是和 v4 完全同一套,见下方第 2 条): 候选和现役在同一份新盲测题上成对比较,不拿不同日期考卷的原始百分比直接比。每种语言都要满足: - 该语言非「看不出」题 ≥ 20 句,不够就不晋级(不是「无法判断所以放行」) - 作答准确率 ≥ 80% · 覆盖率 ≥ 70% · 「看不出」题拒判 ≥ 50% · 冷暖判反 ≤ 作答数 10% - 相对现役:任一语言有效准确率退步不得超过 2 个百分点;至少一种语言进步 ≥ 3 个百分点(这两个数是初定,Cora 复核后再冻结) - 两套答案(两个标注来源)下都满足才算
⏳ 启用自动晋级之前必须收齐的三处(Cora 16:34;不挡规范和看板,挡「自动上线」): 1. 20 句时一题就是 5 个百分点,+3 / −2 点只作展示参考,不自动触发上线;要补「成对救回 / 丢失几句」和按同源组算的不确定性,样本不足就待人复核。 2. 分母为空(U 题为 0、作答为 0)→ 不晋级。上面这套漏了 v4 的「上下文翻转组」一项,所以不是「和 v4 同一套」:要么补回「缺翻转组 = 该项无法验收」,要么单独版本化说明改了标准。 3. 首版还没有现役时,和固定的基线版本比(先定为 v4 的 SetFit 结果),不能拿「空现役」默认通过。
每份成绩都报: 中 / 英 / 马分开;和昨天比;和 Jev 同题比;和字典同题比;冷暖判反几次;「看不出」的句子有没有老实说看不出。每个数点开能看到错例原句 —— 只限已开封的成绩(初审补 2)。 还没用过的验收盲测:原文和答案不进看板、不进训练和选型用的任何目录,单独存放,只有出题和开封的那一步读得到;每次开封记一行(谁、几点、给哪个候选用)。开封之后它降级成回归题,才开放错例。 切分: 翻译、同源改写、同一句的不同前文变体,整组同边,不许一半在训练一半在考卷。
7. 发布:训完 ≠ 上线(Cora 要求 5)
模型有四种状态,看板上分开显示:
- 候选 —— 训完了,还没考盲测
- 合格 —— 盲测过线了,还没上
- 影子 —— 在旁边跟着判,结果只记账不生效(要碰真实消息,需 §11 批准)
- 现役 —— 真的在用
上一版现役永远留着,一键回退。 新版出问题,退回去不需要重新训练。
8. 小程序看板:Jeff 每天看什么
五个页面:
- 今日成绩单 —— 现役 / 最新候选,在回归题上的中英马成绩;和昨天、和 Jev、和字典的差;一句话结论(「比昨天好 / 持平 / 退步」)
- 数据 —— 总条数、今天新增、各来源、各语言、四类分布、标注分歧率、待审多少
- 训练记录 —— 每一次:数据版本、模型、设备、耗时、费用、成败
- 错例 —— 从任何一个成绩点进来,看它判错的原句、正确答案、它给的答案
- 流水线状态 —— 常驻进程还活着吗(心跳)、卡在哪一步、最近一次失败的日志
判据:Jeff 不问,也能从看板上看出「今天有没有进展、卡在哪」。
原型(09-26): tools/warmth_lab/export_dashboard.py 从账本导出汇总 JSON(只导已开封考卷的错例),tools/warmth_lab/dashboard/index.html 画五页,顶上标「原型 · 数据待核实 · 不是正式成绩单」。现在只能在本机预览;接进 HOOP 小程序要等 §11-D(新房)和 §9 的鉴权挂钩。
选型表的口径(09-26 16:57 更新): 「整体微调经调参后开发成绩有改善,选型未定」。 整体微调第一次几乎全判「拉近」,排查结果是原设定训练不足(训练集自己都只对 43%);例子少也可能同时是原因,不排除;把学习率调到 5e-5、训 20 轮后,XLM-R 在开发集上 0.595,高于 SetFit 的 0.459~0.514。训练 1.00 / 开发 0.595 说明有泛化差距。只有一个种子、设定是看着开发集挑的,不能据此说整体微调赢。
定输赢的做法(Cora 16:56):两边都给同等的开发集调参机会(SetFit 不能只用一套默认设置);先冻结选中的设定、阈值和比较指标,再出新的独立题比;每轮保留学习曲线、逐题预测、设备和版本。
8.1 即时预测:在看板里自己打一句话让模型判(09-26,Cora 19:02 设计审)
页面不能自己发网络请求,只能走壳。所以一单请求这样走:
1. 页面写私有存储键 ember_ask(JSON:message 1~300 字、context 至多 3 行、说话人只能 A/B、with_jev 默认关)。壳带着用户的票 → miniapp.kvSet → 登记过的挂钩 emberlab.Ask(RegisterKVWrite,接线在 router.go),不落 miniapp_kv。
2. Ask 按真实 uid 核「是绑定工作房的在房成员」(miniapp.InAppRoom → 数据库函数 miniapp_in_room,迁移 000457;和 §9 数据锁、worker 认领同一个函数),不是回 403;再限长(400)、限频(每人 10 分钟 20 单,429)、同一人同时至多一单没完成(唯一索引兜底,409)。建一行 ember_predict_tasks,号和时间都是服务端给。
3. 训练机上的 worker 原子认领(FOR UPDATE SKIP LOCKED),认领这一跳在数据库里再核一次当前成员(入队后退房 → 认领不到,留着等过期);只有「还在 running、是我认领的、而且没过时限」才交得进结果(用户关了页面、没人触发过期处理也一样);SQL 在 tools/warmth_lab/worker_sql/,Python worker 和 Go 测试读同一份。心跳按 app 分开记在 ember_workers,20 秒内有心跳算在线。
4. 页面读共享数据键 ember_task → emberlab.TaskForCaller:同样先核成员,只回自己最新一单 + worker 在不在线。状态只有 pending / running / done / error / expired;超过时限(数据库函数 ember_task_ttl(),3 分钟,Go 和 SQL 都调它)没完成标 expired(机器离线时不把人卡在「上一句还没判完」)。库出错时回错误,不当成「没有单 / 机器离线」。
app 还没上架时:可见性门(launch / 共享数据 / 权限页共用 visibleAt)对登记了「只给房里人」的 app 多认一种人 —— 绑定工作房的在房成员,所以普通成员也能开页面;别的 draft app 不变。
5. worker(tools/warmth_lab/ember_worker.py)用的模型必须是已保存、重载验证过的那一个 checkpoint:启动时在 CPU 上对开发集前 20 题重算,和训练时存的概率比,差超过 1e-3 拒绝启动(这是跨设备核对,和训练产物同设备重载闸 1e-4 是两项检查)。输出分开给:方向按评估口径(正两档合并 W、负两档合并 C、0 → N、U → U,取最大,用未舍入概率)和六类最大一类,不拿六类直接换方向;不用最终阈值(冻结后才定),只有方向为 U 才算拒判。页面「试一句」一页,舍入只在显示时做。页面认「本次提交」只认页面自己生成、服务端原样回传的请求号(client_request_id,放在提交的 JSON 里,迁移 000458;同一台账号另一设备同时提交也不会认错);同一句同一前文没确认就重交沿用同一个号,服务端回原来那一单、不多排队也不占限频(幂等);轮询绑定服务端单号,号变了就停;桥只回成功 / 不可用、读出错也当空值,所以对不上时只说「无法确认 / 暂时读不到,请重试查询」,不猜身份或限频,输入不清,旧单标「上一单」。模拟桥测试 tools/warmth_lab/dashboard/test_try_tab.py(八个情形:含别的设备同时提交、建了单但回包丢了、原样重交沿用同号);服务端幂等两条路各有一个测试(限频满时同号重交回原单 / 同号撞唯一索引回先到那单)。结果里带候选名 / 种子 / 是否集成 / 底座版本 / 权重哈希 / 未校准,标「实验模型」。输入和结果只写服务器那一行,不进任何训练或考卷文件。Jev 对照首版不接(打开开关的单结果里写明「这一版没接」,不发外部请求)。
守卫:backend/internal/domain/emberlab/emberlab_db_test.go(真 Postgres + 全部迁移 + 真 handler:非成员 / 退房 / 没登录三种拒绝且不留行、并发认领只有一个成、非认领者交不进、做完不能再改、过期不能认领、限频;09-27 加:入队后退房认领不到、超时 running 直接交不进、draft 时普通成员 launch / 入队 / 读结果都通而没登记的 draft 照旧 404)。坏刀六把各红。迁移 000456、000457。
9. 在哪跑、数据放哪(初稿,Cora 复核)
- 训练: Sora 的 Mac mini(M5 Pro,有苹果 GPU)。生产服务器 2 核、内存 3.8G 且已用上约 1G 交换空间,不适合训练。
- 推理(将来上线判真实消息): CPU 就能跑;放不放生产机:完整模型本机常驻约 0.95G,而生产机 3.8G 内存已在用交换空间 —— 要在同型机上实测再定。
- 账本(数据、标注、训练、考试记录): 现在是 Sora 那台 Mac mini 上的一个 SQLite 文件(
~/.hoop/warmth_lab/ledger-4.sqlite,不进 git —— 里面有考卷原文;表结构 4,09-27 从ledger.sqlite整表搬过来、逐表摘要一致,旧文件原样留着)。代码在tools/warmth_lab/ledger.py,闸门自测test_ledger.py(每道闸故意撞一次)。已有的闸:审核只追加不覆盖;标签按「标注者 × 规范版本」分开存;冻结的数据集由数据库触发器拦增删改、冻结前查同源组不跨用途、冻结不可撤;数据集写明用哪一版标签当答案;未开封盲测不给原文;错例按答案版本和输入模式取,含「应拒判却硬判」。⚠️ 原型限制:「只有真人能写已审」靠调用方自报身份,只能防误传;接 API 时要由服务端按已验证身份判定。import_v4.py已把 09-26 那一轮入账:540 条题、1020 个标签(全是 AI 标、规范 v0、审核全部 pending)、6 次运行、30 份成绩,已冻结。 表结构 4(09-27): 标签放开五档 + 看不出(规范 v0.3 起),触发器按规范版本管格式 —— v0~v0.2 只许四类、v0.3 起只许五档 + U,旧四类不换算,写入和修改都管(没冻结的标签改档 / 改规范版本对不上也拒,Cora 09-26 22:16);错例按方向比(五档答案先换成方向)。SQLite 改不了已有表的约束,所以换文件:migrate_3_to_4.py先搬到临时文件<新库>.partial,逐表摘要 / 外键 / 完整性都核过才改名发布成正式文件(核不过临时文件留着查,正式文件不出现);旧库只读打开、不存在就报错,不会被顺手建成空库;自测test_migrate.py(旧库缺失 / 搬成 / 核不过 / 半截临时文件四种)。新文件不存在时connect()直接报错,不悄悄开空账本。import_v5.py把 v5 入账(Cora 那套标签的来历分开记两个哈希:原标签文件 sha 20edc9aa… 和文件里记的题目来源 sha 3477325b…;已入账那 249 行当时误写成「原文件 sha 3477325b…」,冻结答案不改原行,更正写在 v5 数据集的说明里):1350 条题(训练 870 / 开发 210 / 盲测 249 / 剔除 21)、4 套标签(A / B / T / Cora,全是 AI、审核 pending)、12 次训练 + 3 个判定系统、24 份成绩(8 格 × Ember / Jev / D0)、盲测开封一条,已冻结;入账前核冻结记录和 24 个输入哈希,入完用入账的预测和答案重算每格「方向答对」必须和 verdict 一致,否则整笔回滚(坏刀:阈值挪 0.1 → 回滚、零行留下)。看板成绩单加「v5 盲测」一块:结论、每格两套答案、Ember − Jev 区间、冷暖判反;标注按四类 / 五档分两张表;错例下拉带轮次。 v6(09-27):import_v6.py入账 —— 数据集 v6-2026-09-27(v5 训练 / 开发池引用 + 新写题 2589 条目含剔除)、新增训练池 A6 / B6、盲测 X / Cora、6 次训练 + 4 个判定系统(E / J / 固定 v5 对照 R / D0)、50 份成绩(含切片,只作描述)、开封一条,已冻结;入账前核冻结记录 cd975bb3…、18 个输入哈希和两份答案的哈希承诺,入完逐格重算 32 个「方向答对」必须和 verdict 一致(坏刀:固定 v5 阈值挪 0.1 → 回滚、零行)。结论未通过:冻结时 Ember 阈值校准失败,按预设规则提前判定;盲测数字是未校准回退阈值 0 的描述性结果。这份盲测几乎没有冷的题(两套答案 -1 只有中 1 / 英 6 / 马 0 题,没有 ±2),主要考「拉近 vs 中性」。看板成绩单的盲测块改成 v5、v6 共用一个画法,v6 多「同卷对照固定 v5」区间和切片表;成绩单(evals)从汇总键里切出来按ember_eval_<n>分块(汇总超过 64KB),页面按eval_count对账。另加「冷暖判反分方向」表(Cora 09-26 23:33):暖题判成冷、冷题判成暖,各带真实分母,由export_dashboard.py从账本里入账的预测和答案现算(flip_split);没有冷题的格写「无冷题」,不写 0%。v6 合计暖判成冷 Ember / Jev / 固定 v5 = 7/88、1/88、28/88(X)和 5/60、0/60、17/60(Cora);冷题只有 7 道,不外推。v6 的方案、判定器、查重、写题 / 标注产物在训练机工作目录,证据包(清单带哈希)在 Source Code 房里。 v7(09-27):import_v7.py入账 —— 数据集 v7-2026-09-27(v5 / v6 旧池按规范 v0.4(甲) 重标 + v7 新写题,共 2991 条目含剔除)、训练 / 开发池 A7 / B7(旧池)和 A7n / B7n(新题)、盲测 X7 / Cora、6 次训练(FT-M1、FT-M1w 各 3 种子,同一预训练起点)+ 5 个判定系统(E / J / 固定 v6 对照 R / D0 / 多数类 M)、98 份成绩、开封一条,已冻结;入账前核冻结记录(r1 471f924f…)、输入哈希和两份答案承诺,入完逐格重算 80 个「方向答对」(主盲测 + blind_x)必须和 verdict 一致(坏刀:Ember 阈值挪成 0 → 14 格对不上、回滚、零行)。训练真值只用两位标注者六档完全一致的条目(1863 条里 1725 条);方向一致率六格(语言 × 旧 / 新)92.7%~98.6%,都过 80%,但 A / B 是同一底层模型,不能单独证明规范写清了。结论未通过:英文两格 Ember 都没超过 Jev(0.63 对 0.88 / 0.82,区间整段 < 0);中文可判 14、马来文 7,不到 20,四格无法判定(查重后就定了);Ember 这轮开发集校准成功(t = 0.6),不等于泛化通过;和固定 v6 比区间跨 0。判定器 r1 是开封前的格式兼容修订(Cora 的答案档位是整数,解析层严格换成字符串),原冻结留审计。blind_x(盲测补写那一轮提示多了「用少见情境」= 协议偏离)只作描述;账本 split 没有这一种,记成regression;真实用途由ledger.DESCRIPTIVE_ONLY固定标出(v7-2026-09-27 + regression → blind_x),读账本的地方一律经ledger.exam_tag取,不许直接按 split 合并 —— 看板错例单因此把 blind_x 单独成单、标「仅描述,不参与验收」(之前和主盲测错例混在同一张单里,Cora 09-27 04:00 要求隔离后修);训练 / 选模 / 校准都读 items_v7.json 的 split 字段(那里仍是 blind_x),不读账本。看板成绩单加 v7 和 blind_x 两块(系统名、对照名、切片名按块配置;切片「强烈」显示为「强烈互动」);「冷暖判反分方向」表原来把「没有暖题」也写成「无冷题」,改成分开写。开封后的诊断(已开封题,只作诊断):强烈互动切片 Ember 主要错在暖判冷 7 条和拒判 6 条;前文对照试验(90 条新写控制题,不进训练 / 验收)没有支持「负面前文导致判冷」,原失败仍未解释。 v8(09-27):import_v8.py入账 —— 数据集 v8-2026-09-27(引用 v7 训练 / 开发池 + 对照训练题 90 组(查重留 21 组 63 条,剔除的也入账为 dropped)+ 新盲测 4 批隔离写题 420 组(查重留 38 组 114 条,剔除的 382 组也入账)),对照训练题 A8 / B8(匿名标注,方向一致率 98%~100%,六档 89%~96%)、盲测 X8 / Cora、6 次训练(FT-M1-c 不加权、FT-M1w-c 加权)+ 5 个判定系统(E / J / 固定 v7 对照 R / D0 / M)、开封一条,已冻结;入完逐格重算 40 格必须和 verdict 一致(坏刀:Ember 阈值挪成 0 → 对不上、回滚、零行)。结论未通过:中、英四格 Ember 都没超过 Jev(中 12/23 · 12/22 对 23/23 · 22/22,英 50/73 · 50/72 对 69/73 · 68/72);马来文可判 11,无法判定。同卷对照固定 v7:三语合计多对 4 题(65.4% / 67.6% 对 61.7% / 63.8%),描述区间下限 0.009,分语言区间都含 0,冷暖判反 8 / 7 对 5 / 5,强烈互动切片不变 —— 只作描述,不能归因于对照训练题(对准假设的训练题只有英文 7 条;开发集、选型、校准也变了)。中文盲测里多数类(猜中性)78% / 82%,高过 Ember 的 52% / 55%。复现限制:train_v8 加载预训练没带显式 revision(Cora 07:11)。构题覆盖:8 个场景格没到 10 组;覆盖分析(独立 AI 参考判定,只描述所抽 72 个首个命中对)近重复 51 / 非近重复 20 / 不确定 1,无前文末句触发的多为近重复,有前文触发的非近重复较多。看板加 v8 一块(staging 第 11 版)。 v9(09-27):import_v9.py入账 —— 数据集 v9-2026-09-27(引用 v8 训练 / 开发池 + 蒸馏新题 1360 写、查重留 712(英 644、马冲突 68、中 0;Jev 当老师,硬标签记成标注者 jev-v9)+ 新盲测(按语言写场景种子、3 批写题,留 63 组 189 条;马来文 18 条)),剔除候选也入账为 dropped;9 次训练(C0 原配方 / C1-L 加 Jev 硬标签 / C2-L 加 Jev 软概率,各 3 种子,固定 1700 步,每批一半新题)+ 判定系统 E / J / 固定 v8 R / D0 / M + 两个描述用条件 run;入完逐格重算 64 格必须和 verdict 一致(坏刀:条件阈值挪成 0 → 回滚、零行)。Jev 调用改成串行逐条结算的滚动预留(run_v9.py:单次上界 32000 token × 0.000000042 美元,缺 cost / 单价偏离就暂停,排他锁、次数上限、重复题号都拦)。结论未通过:中、英四格 Ember(开发集预选 C1-L)都没超过 Jev(中 19/44 · 22/47 对 39/44 · 40/47,英 63/110 · 67/114 对 100/110 · 101/114);马来文可判 14 / 18,无法判定。同卷描述:C1-L 对 C0 总体 +13.1 / +15.1 个百分点、C2-L 对 C0 +17.3 / +19.6,这两对区间在 0 以上,C2−C1 含 0;提升同时来自多作答和作答准确率;英文冷暖判反 C0 8/6 → C1-L 10/7 → C2-L 13/10;中文 C1−C0 区间含 0 —— 是本卷、整套配方的提升,不含重训波动,不能拆成纯数据量或纯老师效果。Ember 总体和字典 D0 相近。偏离:train_v9 漏出 24 条无共识开发题的概率,冻结前用保存的 checkpoint 补出(不影响选型和成绩);判定器 r1 是开封前补的「每个条件各自校准 + 条件间配对区间」。看板加 v9 一块(staging 第 12 版);空错例单不再推,汇总回到 64KB 以内。 v10(09-27):import_v10.py入账 —— 数据集 v10-2026-09-27(引用 v8 训练 / 开发池 + 蒸馏池:按格每批 100 条、最多 6 批写 5400 条,防泄漏剔 2736(其中只因从严的旧剔除题 / v8 对照题 527),「v8 训练 + 新池」整段余弦 ≥ 0.85 单链聚类、每簇 ≤ 3 → 2604 条(中 625 / 英 1373 / 马 606;Jev 硬标签记成 jev-v10) + 新盲测(两句英文场景种子 180 个、3 批写题,留 95 组 285 条,中 28 / 英 33 / 马 34 组)),剔除候选也入账为 dropped;9 次训练(C0 / C1-L 全池 / C1-S 按簇取的小档 859 条,各 3 种子,1700 步) + 判定系统 E / J / 固定 v9 R / D0 / M + 两个描述用条件 run;入完逐格重算 64 格必须和 verdict 一致(坏刀:条件阈值挪成 0 → 回滚、零行)。乙线写题者只读自己那份提示文件、先核哈希;池、簇和代表在调老师前冻结;Jev 前 500 条先查异常率(分母 500,> 10% 退出码 10 停),0 / 500、全池 0 / 2604。结论未通过:三语六格都能评(可判 74~99),Ember(开发集上 C0 和 C1-L 并列、按方向有效准确率选 C0)六格都没超过 Jev(中 27/74 · 27/80 对 48 · 52,英 28/76 · 33/87 对 63 · 58,马 58/90 · 60/99 对 62 · 62,马来文区间含 0)。同卷描述:C1-L 对 C0 总体区间 X (0.0, 0.152)、Cora (−0.007, 0.13),不能确认更好,只有英文 X 一格 > 0;C1-L 对 C1-S 总体 > 0;马来文多数类(永远猜中性)答对 65 / 72,高过 Ember 和 Jev;冲突切片 Ember 最弱。选中的 C0 对固定 v9 对照:英文两套区间都在 0 以下(X −0.358~−0.123,Cora −0.261~−0.062),全卷 Cora 也在 0 以下(−0.125~−0.007),X 全卷含 0 —— 不能说 v10 整体进步(Cora 11:47 独立重算 verdict 逐字节一致时补的);区间是本卷按组重抽样,不含重训波动。偏离:甲线写题提示是贴正文,没对实际输入单独哈希;乙线几份写题者第一次条数不对重写、三份打开过自己的输出删多余条、一份用了泛用人名。看板加 v10 一块(staging 第 13 版)。 换模型数据不丢(Cora 17:05): 句子、前文、来源、标签、审核、判法版本、历史训练 / 测试分组都存在账本里,和用哪个框架无关;ledger.export_jsonl每表导一份 JSONL(标准格式,换框架换机器都能读回),ledger.backup整库在线备份,备份放~/.hoop/warmth_lab/backups/<时间>/。换框架只省掉重新收集和标注,模型参数一般搬不过去,仍要重训重验。ledger.check_blind_never_seen拦「新盲测里混进旧数据集出现过的题或同组题」——换了框架,旧训练题也不能当新盲测。 以后看板要读,再把「看板需要的汇总」推到后端;原文仍只在这台机器上。例子原文只放「自己写的」;真实聊天未批准前不进账本。 - 看板: HOOP 小程序,绑定 Source Code 工作房,先放 staging,不上架给用户。
⚠️ staging 不自动等于「只有房里的人看得到」(初审补 3)。 看板读数据的接口必须自己校验:登录身份 + 是这个房的成员,两条都过才给;训练进程写数据用的凭证和浏览器读数据的凭证分开,各只有自己需要的权限。
平台现状(09-26 读代码核过):
· 小程序页面拿不到真 uid,只有影子 id;但
hoop.data.get(key)走的是用户自己的登录令牌,服务端dataGet知道真 uid(backend/internal/domain/miniapp/miniapp.go:360)。 · 现成的挂钩:miniapp.RegisterCallerData(appID, key, fn)(miniapp.go:348),fn(ctx, uid)自己判权限,不给就回空;新闻编辑台就是这么做的(router.go:137,按miniapps.workroom_id找房再判成员)。 · 判房成员用conversation.Repository.IsMember(domain/conversation/repository.go:858,只算现任成员)。 · staging 谁能开由服务端判(envAndVersion,miniapp.go:221),但 staging 一被推上线,人人可开,所以看板数据不能靠 staging 挡,只能靠上面那个挂钩判成员。 · 小程序只能绑一个「还没有消息的新工作房」(bindAppWorkroom,miniapp.go:1769);Source Code 房已有消息,接口会拒 —— 09-26 按 Jeff 指示改库字段绑上了(见 §11-D)。
10. 分几刀做
| 刀 | 做什么 | 做完能看到什么 |
|---|---|---|
| 1 | 标注规范(四类判据 + 正反例)+ 把现有 v4 数据按 §3 格式入账 | 一份判法;已有 510 条带来历的数据 |
| 2 | 框架比较(§5 四个候选,同一份开发 / 回归题) | 一张比较表,选出主力 |
| 3 | 流水线常驻进程:攒例子 → 标 → 审 → 够了训 → 考 → 记账 | 第一份自动出的成绩单 |
| 4 | 小程序看板(staging) | Jeff 在 HOOP 里点开就能看 |
| 5 | 影子模式(需批准) | 真实消息上的对照,不生效 |
每一刀都先交 Cora 审,再往下。
11. 要 Jeff 定的事
- A) 已定一半(Jeff 09-26 17:39 / 17:41):本项实验外部调用总预算 10 美元(替代先说的 5 美元,不是累加);账本
spend表每次先记预计、调完记实际,预计超预算直接拒。Jev 当「候选老师」之一,先小批比较有没有帮助再扩量。 - ~~A) 请哪些外部大模型帮忙标答案?(Jeff 16:24 语音里提到的,我听成「Claude、ChatGPT」,待确认)以及每月标注费用上限。~~
- B) 训练例子能不能用 HOOP 用户的真实聊天?涉及隐私和发给外部 AI。建议先只用自己写的例子;要用真实聊天,需要 Jeff 同意且用户条款允许。
- C) 训练放在 Sora 这台 Mac mini 上、它要常开机,可以吗?
- E) 已定(Jeff 09-27 01:06 语音,取代 01:04 的选择):标注里「+1 还是 0」这条界线选甲 —— 判的是给定前文里这一句表达的关系倾向;普通问答、接话、答应邀约、只说事实默认中性;要有明确的关心、安慰、帮助、说出感受、求支持才算拉近;读不清标 U;不因为聊得多就自动加温(Jeff:「只做一句的分析……很多累积来的话,我们就不管了」)。01:04 他先选了乙,是以为 Sora / Cora 倾向乙,01:06 改成甲,Cora 01:07 确认。写进标注规范 v0.4 草稿(只改这一条),旧规范、旧标签、旧成绩都保留,不自动重标;新口径的效果另外测。起因:v5、v6 两轮标注者分歧最多的就是这一条。
- ~~D) 看板放哪间房~~ 已定(Jeff 09-26 17:15 语音):Jeff 自己建了小程序 Ember Lab(
app-5a2e3f),要把 Source Code 房直接转成它的工作室。平台接口因「房里已有消息」会拒绝,按 Jeff 指示直接改了miniapps.workroom_id这一个字段(带条件、1 行、可一行撤销);成员与聊天记录未动。 副作用(读代码核过,provision/provision.goⓓ):以后用钥匙往这间房开新 AI 分身,会被改装到沙盒主机。 ⚠️ 删 Ember Lab 会连带解散这间房(miniapp/lifecycle.go彻底删除流程调SoftDeleteWorkroom,Cora 17:20 查出)。要删 app、又要留房,先解绑;不许拿这间真实房做删除试验。 🔒 数据锁(09-26 上线):miniapp.RegisterRoomOnly(app-5a2e3f)—— Ember Lab 的共享数据只给绑定工作房的在房成员读,服务端按 uid 查,不在房里回空;不靠 draft / staging 挡(一上架、一推版本就没了)。守卫room_only_test.go。
12. 我没做的 / 不确定的
- 完整模型在服务器同型 CPU 上的并发速度没测,§1 的是本机数字,只能参考。
- 「加例子会不会变好」没有答案:60~251 句范围太小。要等标注规范统一、例子到上千再看。
- Jev 做老师(让它批量标、小模型学它) 这条路没展开:学老师一般接近老师、难超过老师;要超过,得靠我们自己审过的、比老师更准的答案。
- 看板要推哪些汇总到后端、怎么推(训练机的写入凭证)还没设计。
- 「仅描述」题组的隔离只是调用方约定,不是库层强制(Cora 09-27 04:28):v7 blind_x 在账本里存成
regression,靠ledger.DESCRIPTIVE_ONLY+exam_tag()认出来;以后新加读账本的入口,也必须经exam_tag取真实用途,不许直接按 split 合并统计。下次换账本表结构(schema 5)时,把它改成库层能拦的形式(比如 split 加一种,或加一列标用途)。