From 557aa6e61a490a0d12d7e7138adc6764c9546027 Mon Sep 17 00:00:00 2001 From: dada-yan Date: Mon, 28 Sep 2026 19:09:13 +1000 Subject: [PATCH] The temporal bench's chat check scores the name the question asks for Signed-off-by: dada-yan --- scripts/bench/README.md | 9 +++++++-- scripts/bench/temporal.mjs | 25 +++++++++++++++++++------ 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/scripts/bench/README.md b/scripts/bench/README.md index ae6e0e8ad..6edd9009f 100644 --- a/scripts/bench/README.md +++ b/scripts/bench/README.md @@ -468,8 +468,13 @@ BENCH_SERVER_LOG=/path/to/server.log node scripts/bench/timewords.mjs --db utopi - `absent`(抽取压根没抽出这个实体)单独一档,不算时态答错——与上面那个台子同理。 - `--chat` 再跑一遍**对话**:模型带着工具自己去问。账本那一路量的是账本,对话那一路 量的是 agent 那一层,两者的差就是工具用得好不好。对话判分只做一件归一:千位分隔符 - (模型写 28,000,题上写 28000)。否定句里出现 `not` 的名字仍记错——自然语言判分的 - 已知弱点,下面单独有数。`ask` 里的 `{wave-N}` 跑分时换成那一波灌完的时间戳。 + (模型写 28,000,题上写 28000)。`ask` 里的 `{wave-N}` 跑分时换成那一波灌完的时间戳。 +- 对话的回答看**题目问的那个名字**:`expect` 得出现,而且 `not` 里的哪一个都不在它 + 前面。对的回答常顺带说出前任、后任或后来改成的值——「李四管到 2025-09-01,那天 + 周七接手」——这不算答错(#986 的评审)。子串判分分不出的还有两样:先说对了名字、 + 后面又说错了别的,照样记对;`expect: null` 的题没有先后可比,`not` 里的名字一出现 + 就记错,否定句也一样——自然语言判分的已知弱点,下面单独有数。这条是 2026-09-28 + 改的,下面「对话那一路」的数是之前按「`not` 里的名字一出现就记错」判的。 ## 已知的口径缺口 diff --git a/scripts/bench/temporal.mjs b/scripts/bench/temporal.mjs index c4710e6e3..ed9209b42 100644 --- a/scripts/bench/temporal.mjs +++ b/scripts/bench/temporal.mjs @@ -586,14 +586,27 @@ function readsGraph(step) { /// 对话判分:子串匹配,只做一件归一——千位分隔符。模型写 "28,000 CNY",题上写 /// 28000,那是同一个数,不是另一个答案;第一版没归一,六道薪资题里答对的也记了错。 -/// 否定句里出现 `not` 的名字仍记错("没有证据表明王五曾经…")——这是自然语言 -/// 判分的已知弱点,README 里单独有数,不在这里用一串否定词去猜 +/// +/// 有 `expect` 的题看题目问的那个名字:它得出现,而且 `not` 里的哪一个都不在它前面。 +/// 对的回答常顺带说出前任、后任或后来改成的值("Li Si led Project Aurora … until +/// 2025-09-01, when Zhou Qi took over");从前一出现就记错,量的是回答提没提别的 +/// 名字,不是答对没有(#986 的评审)。同一处起头的两个取长的那个。先说对了名字、 +/// 后面又说错了别的,照样记对——子串判分分不出来。 +/// +/// `expect: null` 的题没有「谁在前」可比,照旧:`not` 里的名字一出现就记错,否定句 +/// 也一样("没有证据表明王五曾经…")——自然语言判分的已知弱点,README 里单独有数, +/// 不在这里用一串否定词去猜 function chatVerdict(q, reply) { const text = reply.replace(/(?<=\d),(?=\d)/g, ""); - const ok = - (q.expect === null || text.includes(q.expect)) && - !(q.not || []).some((bad) => text.includes(bad)); - return ok ? "pass" : "fail"; + const not = q.not || []; + if (q.expect === null) return not.some((bad) => text.includes(bad)) ? "fail" : "pass"; + const at = text.indexOf(q.expect); + if (at === -1) return "fail"; + const before = not.some((bad) => { + const i = text.indexOf(bad); + return i !== -1 && (i < at || (i === at && bad.length > q.expect.length)); + }); + return before ? "fail" : "pass"; } main().catch((e) => {