Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 7 additions & 2 deletions scripts/bench/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -488,8 +488,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` 里的名字一出现就记错」判的。

## 已知的口径缺口

Expand Down
25 changes: 19 additions & 6 deletions scripts/bench/temporal.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -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) => {
Expand Down