Files
Maven/docs/evals/2026-09-07-expanded-corpus-linear-head-experiment.md
T
claude cbac8b9c4f router/semantic: experiment reports (slice 15)
- 2026-09-07-linear-e5-router-experiment: 136-example baseline (superseded)
- 2026-09-07-expanded-corpus-linear-head-experiment: 3025-example expanded (live)
- CLAUDE.md: index updates for both evals
2026-09-07 13:52:54 +04:00

52 KiB
Raw Blame History

Semantic Router Linear Head Experiment — Report

1. Exact e5 representation used

  • Model: model_quantized@384/tok2
  • Checkpoint: models/embedder/multilingual-e5-small/model_quantized.onnx
  • Tokenizer: models/embedder/multilingual-e5-small/tokenizer.json
  • Dimension: 384
  • Pooling: mean-pool + L2-normalize
  • Normalization: L2
  • Input template: query:

2. Development/residual row counts

  • Total corpus: 3025
  • Frozen holdout: 535
  • Development pool: 2490
  • Fast-path resolved: 82
  • Router-residual: 2943

Route distribution (full corpus):

  • action: 990
  • conversation: 103
  • knowledge: 880
  • memory_write: 705
  • system: 226
  • uncertain: 121

3. Grouped fold composition

Folds: 5

  • Fold 0: eval=476 train=2014 routes={'action': 144, 'conversation': 30, 'knowledge': 150, 'memory_write': 74, 'system': 58, 'uncertain': 20}
  • Fold 1: eval=341 train=2149 routes={'action': 201, 'conversation': 30, 'knowledge': 44, 'memory_write': 39, 'system': 9, 'uncertain': 18}
  • Fold 2: eval=707 train=1783 routes={'action': 297, 'conversation': 12, 'knowledge': 210, 'memory_write': 125, 'system': 45, 'uncertain': 18}
  • Fold 3: eval=506 train=1984 routes={'action': 86, 'conversation': 12, 'knowledge': 160, 'memory_write': 125, 'system': 90, 'uncertain': 33}
  • Fold 4: eval=460 train=2030 routes={'action': 68, 'conversation': 9, 'knowledge': 151, 'memory_write': 190, 'system': 24, 'uncertain': 18}

4. Selected regularization

Experiment A: All development examples

  • Best C: 10.0
  • Mean accuracy: 69.2% ± 10.2%
  • Mean macro F1: 0.616 ± 0.093
  • Total false actions (CV): 390

Experiment B: Router-residual only

  • Best C: 10.0
  • Mean accuracy: 68.5% ± 10.2%
  • Mean macro F1: 0.608 ± 0.089
  • Total false actions (CV): 388

Stability across folds

C=0.01 acc=30.1%±18.1% f1=0.107±0.074 folds_acc=['33.6%', '21.4%', '63.8%', '17.0%', '14.8%'] C=0.1 acc=55.0%±16.8% f1=0.276±0.077 folds_acc=['63.4%', '70.7%', '71.6%', '35.2%', '34.3%'] C=1.0 acc=65.2%±10.7% f1=0.522±0.075 folds_acc=['75.4%', '76.0%', '68.9%', '56.9%', '48.7%'] C=10.0 acc=69.2%±10.2% f1=0.616±0.093 folds_acc=['79.8%', '79.5%', '66.8%', '67.8%', '52.0%'] C=100.0 acc=67.4%±9.0% f1=0.595±0.079 folds_acc=['74.4%', '77.4%', '66.5%', '67.2%', '51.3%']

5. All-example CV metrics

  • Accuracy: 68.5%
  • Macro F1: 0.675
  • False-action count: 390
  • False-action rate: 15.7%
  • Action precision: 0.629
  • Action recall: 0.832
  • Uncertain precision: 0.618
  • Uncertain recall: 0.589

Per-class metrics: action P=0.629 R=0.832 F1=0.716 (n=796) conversation P=0.825 R=0.710 F1=0.763 (n=93) knowledge P=0.721 R=0.610 F1=0.661 (n=715) memory_write P=0.748 R=0.635 F1=0.687 (n=553) system P=0.698 R=0.562 F1=0.623 (n=226) uncertain P=0.618 R=0.589 F1=0.603 (n=107)

Confusion matrix (rows=expected, cols=predicted): action conversation knowledge memory_write system uncertain action 662 4 65 45 4 16 conversation 2 66 8 4 4 9 knowledge 195 0 436 46 34 4 memory_write 135 0 49 351 13 5 system 33 4 42 15 127 5 uncertain 25 6 5 8 0 63

6. Residual-only CV metrics

  • Accuracy: 67.9%
  • Macro F1: 0.663
  • False-action count: 388
  • False-action rate: 16.0%
  • Action precision: 0.620
  • Action recall: 0.826
  • Uncertain precision: 0.604
  • Uncertain recall: 0.570

Per-class metrics: action P=0.620 R=0.826 F1=0.708 (n=766) conversation P=0.807 R=0.720 F1=0.761 (n=93) knowledge P=0.713 R=0.606 F1=0.655 (n=715) memory_write P=0.754 R=0.649 F1=0.698 (n=553) system P=0.685 R=0.484 F1=0.567 (n=184) uncertain P=0.604 R=0.570 F1=0.587 (n=107)

Confusion matrix (rows=expected, cols=predicted): action conversation knowledge memory_write system uncertain action 633 4 69 43 0 17 conversation 2 67 8 6 1 9 knowledge 198 1 433 44 35 4 memory_write 133 0 50 359 5 6 system 29 5 42 15 89 4 uncertain 26 6 5 9 0 61

7. Legacy-vs-linear comparison

All examples

metric legacy linear e5 delta

accuracy 52.2% 68.5% 16.3% macro F1 — 0.675 — action precision — 0.629 — false-action rate 19.9% 15.7% -4.2% uncertain F1 0.000 0.603 0.603

Router-residual only

metric legacy linear e5 delta

accuracy 40.8% 67.9% 27.1% macro F1 — 0.663 — false-action rate — 16.0% —

8. Fold variance

All-example CV: Fold 0: acc=79.8% f1=0.758 false_action=27 Fold 1: acc=79.5% f1=0.594 false_action=40 Fold 2: acc=66.8% f1=0.582 false_action=92 Fold 3: acc=67.8% f1=0.667 false_action=102 Fold 4: acc=52.0% f1=0.478 false_action=129

Residual-only CV: Fold 0: acc=78.7% f1=0.747 false_action=28 Fold 1: acc=78.7% f1=0.590 false_action=38 Fold 2: acc=67.6% f1=0.582 false_action=92 Fold 3: acc=66.2% f1=0.648 false_action=104 Fold 4: acc=51.0% f1=0.474 false_action=126

9. False-action repair/new-error analysis

Note: Legacy per-example predictions were not available for this experiment. The legacy baseline was measured in aggregate in the Go test suite.

Learned router false-action cases (out-of-fold): kq-deadline-1717: 'когда дедлайн по задаче, пожалуйста' (true=knowledge, proba(action)=0.559) kq-deadline-1720: 'я хочу я успеваю до дедлайна по задаче' (true=knowledge, proba(action)=0.491) kq-deadline-1724: 'я хочу когда дедлайн по задаче' (true=knowledge, proba(action)=0.566) kq-deadline-1725: 'надо бы когда дедлайн по задаче' (true=knowledge, proba(action)=0.526) kq-deadline-1729: 'по задаче когда дедлайн' (true=knowledge, proba(action)=0.361) mw-fact-pills-2224: 'принял таблетки сегодня' (true=memory_write, proba(action)=0.342) mw-fact-pills-2229: 'принял таблетки вечером, пожалуйста' (true=memory_write, proba(action)=0.416) mw-fact-pills-2230: 'принял таблетки сегодня, пожалуйста' (true=memory_write, proba(action)=0.282) mw-note-idea-2363: 'запиши идею: гидропоника на балконе, пожалуйста' (true=memory_write, proba(action)=0.395) mw-note-idea-2366: 'идея: гидропоника на балконе, пожалуйста' (true=memory_write, proba(action)=0.399) mw-note-idea-2367: 'идея: сервер в шкаф, пожалуйста' (true=memory_write, proba(action)=0.517) mw-note-idea-2369: '记住: гидропоника на балконе, пожалуйста' (true=memory_write, proba(action)=0.410) mw-note-idea-2370: '记住: сервер в шкаф, пожалуйста' (true=memory_write, proba(action)=0.539) mw-note-idea-2380: 'я хочу идея: сервер в шкаф' (true=memory_write, proba(action)=0.455) mw-note-idea-2386: 'я хочу 记住: сервер в шкаф' (true=memory_write, proba(action)=0.460) mw-note-idea-2393: 'гидропоника на балконе идея:' (true=memory_write, proba(action)=0.483) mw-note-idea-2396: 'гидропоника на балконе 记住:' (true=memory_write, proba(action)=0.464) sys-quiet-on-2577: 'я хочу режим тишина' (true=system, proba(action)=0.448) conv-goodbye-2869: 'до свидания, пожалуйста' (true=conversation, proba(action)=0.253) conv-goodbye-2875: 'я хочу до свидания' (true=conversation, proba(action)=0.213) unc-single-word-verb-2947: 'выключи' (true=uncertain, proba(action)=0.873) unc-single-word-verb-2948: 'включи' (true=uncertain, proba(action)=0.698) unc-single-word-verb-2949: 'перезапусти, пожалуйста' (true=uncertain, proba(action)=0.428) unc-single-word-verb-2950: 'выключи, пожалуйста' (true=uncertain, proba(action)=0.835) unc-single-word-verb-2951: 'включи, пожалуйста' (true=uncertain, proba(action)=0.691) unc-single-word-verb-2953: 'я хочу выключи' (true=uncertain, proba(action)=0.733) unc-single-word-verb-2954: 'я хочу включи' (true=uncertain, proba(action)=0.720) kq-homelab-disk-1494: 'хватает ли места на диске' (true=knowledge, proba(action)=0.635) kq-homelab-disk-1498: 'хватает ли места на диске, пожалуйста' (true=knowledge, proba(action)=0.664) kq-homelab-disk-1503: 'я хочу хватает ли места на диске' (true=knowledge, proba(action)=0.500) kq-homelab-disk-1504: 'надо бы хватает ли места на диске' (true=knowledge, proba(action)=0.630) kq-homelab-disk-1510: 'на диске хватает ли места' (true=knowledge, proba(action)=0.541) kq-task-check-1700: 'покажи задачи' (true=knowledge, proba(action)=0.859) kq-task-check-1702: 'какие задачи есть, пожалуйста' (true=knowledge, proba(action)=0.574) kq-task-check-1703: 'покажи задачи, пожалуйста' (true=knowledge, proba(action)=0.808) kq-task-check-1706: 'я хочу покажи задачи' (true=knowledge, proba(action)=0.715) kq-task-check-1709: 'покажи задачи?' (true=knowledge, proba(action)=0.514) mw-note-task-2429: 'добавь в задачи купить молоко' (true=memory_write, proba(action)=0.935) mw-note-task-2430: 'добавь в задачи починить кран' (true=memory_write, proba(action)=0.721) mw-note-task-2431: 'добавь в задачи обновить сервер' (true=memory_write, proba(action)=0.900) mw-note-task-2432: 'запиши задачу купить молоко' (true=memory_write, proba(action)=0.740) mw-note-task-2433: 'запиши задачу починить кран' (true=memory_write, proba(action)=0.548) mw-note-task-2434: 'запиши задачу обновить сервер' (true=memory_write, proba(action)=0.773) mw-note-task-2435: 'добавь в задачи купить молоко, пожалуйста' (true=memory_write, proba(action)=0.851) mw-note-task-2436: 'добавь в задачи починить кран, пожалуйста' (true=memory_write, proba(action)=0.743) mw-note-task-2437: 'добавь в задачи обновить сервер, пожалуйста' (true=memory_write, proba(action)=0.925) mw-note-task-2438: 'запиши задачу купить молоко, пожалуйста' (true=memory_write, proba(action)=0.617) mw-note-task-2439: 'запиши задачу починить кран, пожалуйста' (true=memory_write, proba(action)=0.549) mw-note-task-2440: 'запиши задачу обновить сервер, пожалуйста' (true=memory_write, proba(action)=0.739) mw-note-task-2441: 'я хочу добавь в задачи купить молоко' (true=memory_write, proba(action)=0.820) mw-note-task-2442: 'надо бы добавь в задачи купить молоко' (true=memory_write, proba(action)=0.791) mw-note-task-2443: 'я хочу добавь в задачи починить кран' (true=memory_write, proba(action)=0.568) mw-note-task-2444: 'надо бы добавь в задачи починить кран' (true=memory_write, proba(action)=0.503) mw-note-task-2445: 'я хочу добавь в задачи обновить сервер' (true=memory_write, proba(action)=0.870) mw-note-task-2446: 'надо бы добавь в задачи обновить сервер' (true=memory_write, proba(action)=0.724) mw-note-task-2447: 'я хочу запиши задачу купить молоко' (true=memory_write, proba(action)=0.658) mw-note-task-2448: 'надо бы запиши задачу купить молоко' (true=memory_write, proba(action)=0.676) mw-note-task-2449: 'я хочу запиши задачу починить кран' (true=memory_write, proba(action)=0.557) mw-note-task-2450: 'надо бы запиши задачу починить кран' (true=memory_write, proba(action)=0.458) mw-note-task-2451: 'я хочу запиши задачу обновить сервер' (true=memory_write, proba(action)=0.676) mw-note-task-2452: 'надо бы запиши задачу обновить сервер' (true=memory_write, proba(action)=0.495) mw-note-task-2453: 'купить молоко добавь в задачи' (true=memory_write, proba(action)=0.926) mw-note-task-2454: 'починить кран добавь в задачи' (true=memory_write, proba(action)=0.895) mw-note-task-2455: 'обновить сервер добавь в задачи' (true=memory_write, proba(action)=0.933) mw-note-task-2456: 'купить молоко запиши задачу' (true=memory_write, proba(action)=0.884) mw-note-task-2457: 'починить кран запиши задачу' (true=memory_write, proba(action)=0.701) mw-note-task-2458: 'обновить сервер запиши задачу' (true=memory_write, proba(action)=0.783) kq-cal-time-1063: 'когда планёрка, пожалуйста' (true=knowledge, proba(action)=0.499) kq-cal-time-1066: 'я хочу когда планёрка' (true=knowledge, proba(action)=0.457) kq-world-def-1205: 'что такое TCP' (true=knowledge, proba(action)=0.592) kq-world-def-1207: 'что такое Kubernetes' (true=knowledge, proba(action)=0.581) kq-world-def-1209: 'что такое React' (true=knowledge, proba(action)=0.396) kq-world-def-1210: 'кто такой TCP' (true=knowledge, proba(action)=0.428) kq-world-def-1215: 'что значит TCP' (true=knowledge, proba(action)=0.581) kq-world-def-1217: 'что значит Kubernetes' (true=knowledge, proba(action)=0.564) kq-world-def-1219: 'что значит React' (true=knowledge, proba(action)=0.441) kq-world-def-1220: 'что такое TCP, пожалуйста' (true=knowledge, proba(action)=0.785) kq-world-def-1221: 'что такое Docker, пожалуйста' (true=knowledge, proba(action)=0.456) kq-world-def-1222: 'что такое Kubernetes, пожалуйста' (true=knowledge, proba(action)=0.700) kq-world-def-1224: 'что такое React, пожалуйста' (true=knowledge, proba(action)=0.587) kq-world-def-1225: 'кто такой TCP, пожалуйста' (true=knowledge, proba(action)=0.615) kq-world-def-1227: 'кто такой Kubernetes, пожалуйста' (true=knowledge, proba(action)=0.687) kq-world-def-1229: 'кто такой React, пожалуйста' (true=knowledge, proba(action)=0.411) kq-world-def-1230: 'что значит TCP, пожалуйста' (true=knowledge, proba(action)=0.771) kq-world-def-1231: 'что значит Docker, пожалуйста' (true=knowledge, proba(action)=0.444) kq-world-def-1232: 'что значит Kubernetes, пожалуйста' (true=knowledge, proba(action)=0.639) kq-world-def-1234: 'что значит React, пожалуйста' (true=knowledge, proba(action)=0.561) kq-world-def-1235: 'я хочу что такое TCP' (true=knowledge, proba(action)=0.588) kq-world-def-1236: 'надо бы что такое TCP' (true=knowledge, proba(action)=0.415) kq-world-def-1239: 'я хочу что такое Kubernetes' (true=knowledge, proba(action)=0.442) kq-world-def-1240: 'надо бы что такое Kubernetes' (true=knowledge, proba(action)=0.460) kq-world-def-1243: 'я хочу что такое React' (true=knowledge, proba(action)=0.411) kq-world-def-1244: 'надо бы что такое React' (true=knowledge, proba(action)=0.331) kq-world-def-1245: 'я хочу кто такой TCP' (true=knowledge, proba(action)=0.350) kq-world-def-1249: 'я хочу кто такой Kubernetes' (true=knowledge, proba(action)=0.418) kq-world-def-1250: 'надо бы кто такой Kubernetes' (true=knowledge, proba(action)=0.358) kq-world-def-1255: 'я хочу что значит TCP' (true=knowledge, proba(action)=0.630) kq-world-def-1256: 'надо бы что значит TCP' (true=knowledge, proba(action)=0.442) kq-world-def-1259: 'я хочу что значит Kubernetes' (true=knowledge, proba(action)=0.576) kq-world-def-1263: 'я хочу что значит React' (true=knowledge, proba(action)=0.480) kq-world-def-1265: 'TCP что такое' (true=knowledge, proba(action)=0.510) kq-world-def-1267: 'Kubernetes что такое' (true=knowledge, proba(action)=0.483) kq-world-def-1269: 'React что такое' (true=knowledge, proba(action)=0.365) kq-world-def-1270: 'TCP кто такой' (true=knowledge, proba(action)=0.331) kq-world-def-1272: 'Kubernetes кто такой' (true=knowledge, proba(action)=0.406) kq-world-def-1275: 'TCP что значит' (true=knowledge, proba(action)=0.493) kq-world-def-1277: 'Kubernetes что значит' (true=knowledge, proba(action)=0.436) kq-world-def-1279: 'React что значит' (true=knowledge, proba(action)=0.358) kq-world-def-1280: 'что такое TCP?' (true=knowledge, proba(action)=0.624) kq-world-def-1282: 'что такое Kubernetes?' (true=knowledge, proba(action)=0.544) kq-world-def-1284: 'что такое React?' (true=knowledge, proba(action)=0.350) kq-world-def-1285: 'кто такой TCP?' (true=knowledge, proba(action)=0.407) kq-world-def-1289: 'кто такой React?' (true=knowledge, proba(action)=0.266) kq-world-def-1290: 'что значит TCP?' (true=knowledge, proba(action)=0.514) kq-world-def-1292: 'что значит Kubernetes?' (true=knowledge, proba(action)=0.509) kq-world-def-1294: 'что значит React?' (true=knowledge, proba(action)=0.356) kq-homelab-status-1429: 'как дела с бэкапами' (true=knowledge, proba(action)=0.442) kq-homelab-status-1431: 'как дела с доменом' (true=knowledge, proba(action)=0.518) kq-homelab-status-1433: 'есть новости по бэкапами, пожалуйста' (true=knowledge, proba(action)=0.389) kq-homelab-status-1435: 'есть новости по доменом, пожалуйста' (true=knowledge, proba(action)=0.497) kq-homelab-status-1439: 'что там с доменом, пожалуйста' (true=knowledge, proba(action)=0.418) kq-homelab-status-1441: 'как дела с бэкапами, пожалуйста' (true=knowledge, proba(action)=0.509) kq-homelab-status-1442: 'как дела с сервером, пожалуйста' (true=knowledge, proba(action)=0.569) kq-homelab-status-1443: 'как дела с доменом, пожалуйста' (true=knowledge, proba(action)=0.697) kq-homelab-status-1444: 'как дела с DNS, пожалуйста' (true=knowledge, proba(action)=0.452) kq-homelab-status-1461: 'я хочу как дела с бэкапами' (true=knowledge, proba(action)=0.434) kq-homelab-status-1462: 'надо бы как дела с бэкапами' (true=knowledge, proba(action)=0.437) kq-homelab-status-1465: 'я хочу как дела с доменом' (true=knowledge, proba(action)=0.427) kq-homelab-status-1471: 'доменом есть новости по' (true=knowledge, proba(action)=0.350) kq-homelab-status-1477: 'бэкапами как дела с' (true=knowledge, proba(action)=0.386) mw-fact-break-2172: 'час took a break' (true=memory_write, proba(action)=0.508) mw-fact-break-2173: 'пять минут took a break' (true=memory_write, proba(action)=0.416) sys-self-version-2739: 'текущая версия maven' (true=system, proba(action)=0.668) sys-self-version-2741: 'текущая версия праксиса' (true=system, proba(action)=0.363) sys-self-version-2742: 'what version maven' (true=system, proba(action)=0.750) sys-self-version-2743: 'what version нексуса' (true=system, proba(action)=0.395) sys-self-version-2744: 'what version праксиса' (true=system, proba(action)=0.570) sys-self-version-2745: 'какая версия maven, пожалуйста' (true=system, proba(action)=0.589) sys-self-version-2747: 'какая версия праксиса, пожалуйста' (true=system, proba(action)=0.396) sys-self-version-2748: 'текущая версия maven, пожалуйста' (true=system, proba(action)=0.737) sys-self-version-2749: 'текущая версия нексуса, пожалуйста' (true=system, proba(action)=0.384) sys-self-version-2750: 'текущая версия праксиса, пожалуйста' (true=system, proba(action)=0.486) sys-self-version-2751: 'what version maven, пожалуйста' (true=system, proba(action)=0.711) sys-self-version-2752: 'what version нексуса, пожалуйста' (true=system, proba(action)=0.394) sys-self-version-2753: 'what version праксиса, пожалуйста' (true=system, proba(action)=0.576) sys-self-version-2760: 'я хочу текущая версия maven' (true=system, proba(action)=0.601) sys-self-version-2761: 'надо бы текущая версия maven' (true=system, proba(action)=0.633) sys-self-version-2763: 'надо бы текущая версия нексуса' (true=system, proba(action)=0.409) sys-self-version-2764: 'я хочу текущая версия праксиса' (true=system, proba(action)=0.367) sys-self-version-2766: 'я хочу what version maven' (true=system, proba(action)=0.714) sys-self-version-2767: 'надо бы what version maven' (true=system, proba(action)=0.501) sys-self-version-2768: 'я хочу what version нексуса' (true=system, proba(action)=0.408) sys-self-version-2770: 'я хочу what version праксиса' (true=system, proba(action)=0.568) sys-self-version-2775: 'maven текущая версия' (true=system, proba(action)=0.734) sys-self-version-2776: 'нексуса текущая версия' (true=system, proba(action)=0.386) sys-self-version-2777: 'праксиса текущая версия' (true=system, proba(action)=0.557) sys-self-version-2778: 'maven what version' (true=system, proba(action)=0.712) sys-self-version-2779: 'нексуса what version' (true=system, proba(action)=0.441) sys-self-version-2780: 'праксиса what version' (true=system, proba(action)=0.582) kq-world-explain-1303: 'опиши машинное обучение' (true=knowledge, proba(action)=0.545) kq-world-explain-1309: 'объясни машинное обучение, пожалуйста' (true=knowledge, proba(action)=0.536) kq-world-explain-1312: 'опиши машинное обучение, пожалуйста' (true=knowledge, proba(action)=0.607) kq-world-explain-1330: 'надо бы опиши машинное обучение' (true=knowledge, proba(action)=0.376) kq-world-explain-1336: 'машинное обучение объясни' (true=knowledge, proba(action)=0.471) kq-world-explain-1339: 'машинное обучение опиши' (true=knowledge, proba(action)=0.587) kq-cap-ha-1734: 'ты можешь выключить свет' (true=knowledge, proba(action)=0.920) kq-cap-ha-1735: 'ты можешь выключить жалюзи' (true=knowledge, proba(action)=0.988) kq-cap-ha-1736: 'ты можешь выключить вытяжку' (true=knowledge, proba(action)=0.983) kq-cap-ha-1737: 'ты можешь выключить вентилятор' (true=knowledge, proba(action)=0.909) kq-cap-ha-1738: 'умеешь ли включить свет' (true=knowledge, proba(action)=0.779) kq-cap-ha-1739: 'умеешь ли включить жалюзи' (true=knowledge, proba(action)=0.942) kq-cap-ha-1740: 'умеешь ли включить вытяжку' (true=knowledge, proba(action)=0.898) kq-cap-ha-1741: 'умеешь ли включить вентилятор' (true=knowledge, proba(action)=0.508) kq-cap-ha-1742: 'сможешь открыть свет' (true=knowledge, proba(action)=0.919) kq-cap-ha-1743: 'сможешь открыть жалюзи' (true=knowledge, proba(action)=0.986) kq-cap-ha-1744: 'сможешь открыть вытяжку' (true=knowledge, proba(action)=0.981) kq-cap-ha-1745: 'сможешь открыть вентилятор' (true=knowledge, proba(action)=0.900) kq-cap-ha-1746: 'ты можешь выключить свет, пожалуйста' (true=knowledge, proba(action)=0.928) kq-cap-ha-1747: 'ты можешь выключить жалюзи, пожалуйста' (true=knowledge, proba(action)=0.988) kq-cap-ha-1748: 'ты можешь выключить вытяжку, пожалуйста' (true=knowledge, proba(action)=0.976) kq-cap-ha-1749: 'ты можешь выключить вентилятор, пожалуйста' (true=knowledge, proba(action)=0.938) kq-cap-ha-1750: 'умеешь ли включить свет, пожалуйста' (true=knowledge, proba(action)=0.846) kq-cap-ha-1751: 'умеешь ли включить жалюзи, пожалуйста' (true=knowledge, proba(action)=0.938) kq-cap-ha-1752: 'умеешь ли включить вытяжку, пожалуйста' (true=knowledge, proba(action)=0.902) kq-cap-ha-1753: 'умеешь ли включить вентилятор, пожалуйста' (true=knowledge, proba(action)=0.559) kq-cap-ha-1754: 'сможешь открыть свет, пожалуйста' (true=knowledge, proba(action)=0.892) kq-cap-ha-1755: 'сможешь открыть жалюзи, пожалуйста' (true=knowledge, proba(action)=0.978) kq-cap-ha-1756: 'сможешь открыть вытяжку, пожалуйста' (true=knowledge, proba(action)=0.975) kq-cap-ha-1757: 'сможешь открыть вентилятор, пожалуйста' (true=knowledge, proba(action)=0.929) kq-cap-ha-1758: 'я хочу ты можешь выключить свет' (true=knowledge, proba(action)=0.835) kq-cap-ha-1759: 'надо бы ты можешь выключить свет' (true=knowledge, proba(action)=0.746) kq-cap-ha-1760: 'я хочу ты можешь выключить жалюзи' (true=knowledge, proba(action)=0.951) kq-cap-ha-1761: 'надо бы ты можешь выключить жалюзи' (true=knowledge, proba(action)=0.961) kq-cap-ha-1762: 'я хочу ты можешь выключить вытяжку' (true=knowledge, proba(action)=0.932) kq-cap-ha-1763: 'надо бы ты можешь выключить вытяжку' (true=knowledge, proba(action)=0.952) kq-cap-ha-1764: 'я хочу ты можешь выключить вентилятор' (true=knowledge, proba(action)=0.837) kq-cap-ha-1765: 'надо бы ты можешь выключить вентилятор' (true=knowledge, proba(action)=0.754) kq-cap-ha-1766: 'я хочу умеешь ли включить свет' (true=knowledge, proba(action)=0.793) kq-cap-ha-1767: 'надо бы умеешь ли включить свет' (true=knowledge, proba(action)=0.640) kq-cap-ha-1768: 'я хочу умеешь ли включить жалюзи' (true=knowledge, proba(action)=0.892) kq-cap-ha-1769: 'надо бы умеешь ли включить жалюзи' (true=knowledge, proba(action)=0.784) kq-cap-ha-1770: 'я хочу умеешь ли включить вытяжку' (true=knowledge, proba(action)=0.822) kq-cap-ha-1771: 'надо бы умеешь ли включить вытяжку' (true=knowledge, proba(action)=0.798) kq-cap-ha-1774: 'я хочу сможешь открыть свет' (true=knowledge, proba(action)=0.840) kq-cap-ha-1775: 'надо бы сможешь открыть свет' (true=knowledge, proba(action)=0.838) kq-cap-ha-1776: 'я хочу сможешь открыть жалюзи' (true=knowledge, proba(action)=0.946) kq-cap-ha-1777: 'надо бы сможешь открыть жалюзи' (true=knowledge, proba(action)=0.940) kq-cap-ha-1778: 'я хочу сможешь открыть вытяжку' (true=knowledge, proba(action)=0.936) kq-cap-ha-1779: 'надо бы сможешь открыть вытяжку' (true=knowledge, proba(action)=0.933) kq-cap-ha-1780: 'я хочу сможешь открыть вентилятор' (true=knowledge, proba(action)=0.857) kq-cap-ha-1781: 'надо бы сможешь открыть вентилятор' (true=knowledge, proba(action)=0.700) kq-cap-ha-1782: 'свет ты можешь выключить' (true=knowledge, proba(action)=0.893) kq-cap-ha-1783: 'жалюзи ты можешь выключить' (true=knowledge, proba(action)=0.982) kq-cap-ha-1784: 'вытяжку ты можешь выключить' (true=knowledge, proba(action)=0.971) kq-cap-ha-1785: 'вентилятор ты можешь выключить' (true=knowledge, proba(action)=0.897) kq-cap-ha-1786: 'свет умеешь ли включить' (true=knowledge, proba(action)=0.786) kq-cap-ha-1787: 'жалюзи умеешь ли включить' (true=knowledge, proba(action)=0.946) kq-cap-ha-1788: 'вытяжку умеешь ли включить' (true=knowledge, proba(action)=0.924) kq-cap-ha-1789: 'вентилятор умеешь ли включить' (true=knowledge, proba(action)=0.674) kq-cap-ha-1790: 'свет сможешь открыть' (true=knowledge, proba(action)=0.931) kq-cap-ha-1791: 'жалюзи сможешь открыть' (true=knowledge, proba(action)=0.983) kq-cap-ha-1792: 'вытяжку сможешь открыть' (true=knowledge, proba(action)=0.967) kq-cap-ha-1793: 'вентилятор сможешь открыть' (true=knowledge, proba(action)=0.886) kq-cap-ha-1794: 'ты можешь выключить свет?' (true=knowledge, proba(action)=0.913) kq-cap-ha-1795: 'ты можешь выключить жалюзи?' (true=knowledge, proba(action)=0.980) kq-cap-ha-1796: 'ты можешь выключить вытяжку?' (true=knowledge, proba(action)=0.970) kq-cap-ha-1797: 'ты можешь выключить вентилятор?' (true=knowledge, proba(action)=0.862) kq-cap-ha-1798: 'умеешь ли включить свет?' (true=knowledge, proba(action)=0.709) kq-cap-ha-1799: 'умеешь ли включить жалюзи?' (true=knowledge, proba(action)=0.866) kq-cap-ha-1800: 'умеешь ли включить вытяжку?' (true=knowledge, proba(action)=0.862) kq-cap-ha-1802: 'сможешь открыть свет?' (true=knowledge, proba(action)=0.905) kq-cap-ha-1803: 'сможешь открыть жалюзи?' (true=knowledge, proba(action)=0.975) kq-cap-ha-1804: 'сможешь открыть вытяжку?' (true=knowledge, proba(action)=0.967) kq-cap-ha-1805: 'сможешь открыть вентилятор?' (true=knowledge, proba(action)=0.859) mw-fact-water-1881: 'воды попил стакан, пожалуйста' (true=memory_write, proba(action)=0.543) mw-fact-water-1882: 'воды попил литр, пожалуйста' (true=memory_write, proba(action)=0.444) mw-fact-water-1886: 'пил воду литр, пожалуйста' (true=memory_write, proba(action)=0.480) mw-fact-water-1894: 'я хочу выпил воды стакан' (true=memory_write, proba(action)=0.527) mw-fact-water-1896: 'я хочу выпил воды литр' (true=memory_write, proba(action)=0.465) mw-fact-water-1902: 'я хочу воды попил стакан' (true=memory_write, proba(action)=0.503) mw-fact-water-1904: 'я хочу воды попил литр' (true=memory_write, proba(action)=0.403) mw-fact-water-1910: 'я хочу пил воду стакан' (true=memory_write, proba(action)=0.468) mw-fact-water-1925: 'стакан выпил воды' (true=memory_write, proba(action)=0.575) mw-fact-water-1929: 'стакан воды попил' (true=memory_write, proba(action)=0.613) unc-ambiguous-noun-2892: 'вода' (true=uncertain, proba(action)=0.371) unc-ambiguous-noun-2893: 'бэкап' (true=uncertain, proba(action)=0.641) unc-ambiguous-noun-2894: 'сервер' (true=uncertain, proba(action)=0.505) unc-ambiguous-noun-2895: 'контейнер' (true=uncertain, proba(action)=0.978) unc-ambiguous-noun-2896: 'задача' (true=uncertain, proba(action)=0.746) unc-ambiguous-noun-2897: 'вода, пожалуйста' (true=uncertain, proba(action)=0.381) unc-ambiguous-noun-2898: 'бэкап, пожалуйста' (true=uncertain, proba(action)=0.636) unc-ambiguous-noun-2899: 'сервер, пожалуйста' (true=uncertain, proba(action)=0.720) unc-ambiguous-noun-2900: 'контейнер, пожалуйста' (true=uncertain, proba(action)=0.938) unc-ambiguous-noun-2901: 'задача, пожалуйста' (true=uncertain, proba(action)=0.742) unc-ambiguous-noun-2902: 'я хочу вода' (true=uncertain, proba(action)=0.476) unc-ambiguous-noun-2903: 'я хочу бэкап' (true=uncertain, proba(action)=0.731) unc-ambiguous-noun-2904: 'я хочу сервер' (true=uncertain, proba(action)=0.661) unc-ambiguous-noun-2905: 'я хочу контейнер' (true=uncertain, proba(action)=0.946) unc-ambiguous-noun-2906: 'я хочу задача' (true=uncertain, proba(action)=0.747) unc-multi-ambiguous-3001: 'всё ок' (true=uncertain, proba(action)=0.391) unc-multi-ambiguous-3007: 'я хочу всё ок' (true=uncertain, proba(action)=0.447) kq-cap-tool-1806: 'ты можешь перезапустить nginx' (true=knowledge, proba(action)=0.975) kq-cap-tool-1807: 'ты можешь перезапустить docker' (true=knowledge, proba(action)=0.936) kq-cap-tool-1808: 'ты можешь перезапустить сервер' (true=knowledge, proba(action)=0.736) kq-cap-tool-1809: 'сможешь остановить nginx' (true=knowledge, proba(action)=0.923) kq-cap-tool-1810: 'сможешь остановить docker' (true=knowledge, proba(action)=0.849) kq-cap-tool-1811: 'сможешь остановить сервер' (true=knowledge, proba(action)=0.802) kq-cap-tool-1812: 'умеешь ли проверить nginx' (true=knowledge, proba(action)=0.691) kq-cap-tool-1815: 'ты можешь перезапустить nginx, пожалуйста' (true=knowledge, proba(action)=0.975) kq-cap-tool-1816: 'ты можешь перезапустить docker, пожалуйста' (true=knowledge, proba(action)=0.942) kq-cap-tool-1817: 'ты можешь перезапустить сервер, пожалуйста' (true=knowledge, proba(action)=0.834) kq-cap-tool-1818: 'сможешь остановить nginx, пожалуйста' (true=knowledge, proba(action)=0.958) kq-cap-tool-1819: 'сможешь остановить docker, пожалуйста' (true=knowledge, proba(action)=0.890) kq-cap-tool-1820: 'сможешь остановить сервер, пожалуйста' (true=knowledge, proba(action)=0.877) kq-cap-tool-1821: 'умеешь ли проверить nginx, пожалуйста' (true=knowledge, proba(action)=0.761) kq-cap-tool-1824: 'я хочу ты можешь перезапустить nginx' (true=knowledge, proba(action)=0.937) kq-cap-tool-1825: 'надо бы ты можешь перезапустить nginx' (true=knowledge, proba(action)=0.934) kq-cap-tool-1826: 'я хочу ты можешь перезапустить docker' (true=knowledge, proba(action)=0.813) kq-cap-tool-1827: 'надо бы ты можешь перезапустить docker' (true=knowledge, proba(action)=0.787) kq-cap-tool-1828: 'я хочу ты можешь перезапустить сервер' (true=knowledge, proba(action)=0.676) kq-cap-tool-1829: 'надо бы ты можешь перезапустить сервер' (true=knowledge, proba(action)=0.570) kq-cap-tool-1830: 'я хочу сможешь остановить nginx' (true=knowledge, proba(action)=0.908) kq-cap-tool-1831: 'надо бы сможешь остановить nginx' (true=knowledge, proba(action)=0.918) kq-cap-tool-1832: 'я хочу сможешь остановить docker' (true=knowledge, proba(action)=0.806) kq-cap-tool-1833: 'надо бы сможешь остановить docker' (true=knowledge, proba(action)=0.789) kq-cap-tool-1834: 'я хочу сможешь остановить сервер' (true=knowledge, proba(action)=0.795) kq-cap-tool-1835: 'надо бы сможешь остановить сервер' (true=knowledge, proba(action)=0.721) kq-cap-tool-1836: 'я хочу умеешь ли проверить nginx' (true=knowledge, proba(action)=0.587) kq-cap-tool-1837: 'надо бы умеешь ли проверить nginx' (true=knowledge, proba(action)=0.505) kq-cap-tool-1842: 'nginx ты можешь перезапустить' (true=knowledge, proba(action)=0.943) kq-cap-tool-1843: 'docker ты можешь перезапустить' (true=knowledge, proba(action)=0.908) kq-cap-tool-1844: 'сервер ты можешь перезапустить' (true=knowledge, proba(action)=0.776) kq-cap-tool-1845: 'nginx сможешь остановить' (true=knowledge, proba(action)=0.880) kq-cap-tool-1846: 'docker сможешь остановить' (true=knowledge, proba(action)=0.790) kq-cap-tool-1847: 'сервер сможешь остановить' (true=knowledge, proba(action)=0.660) kq-cap-tool-1848: 'nginx умеешь ли проверить' (true=knowledge, proba(action)=0.633) kq-cap-tool-1851: 'ты можешь перезапустить nginx?' (true=knowledge, proba(action)=0.947) kq-cap-tool-1852: 'ты можешь перезапустить docker?' (true=knowledge, proba(action)=0.886) kq-cap-tool-1853: 'ты можешь перезапустить сервер?' (true=knowledge, proba(action)=0.661) kq-cap-tool-1854: 'сможешь остановить nginx?' (true=knowledge, proba(action)=0.916) kq-cap-tool-1855: 'сможешь остановить docker?' (true=knowledge, proba(action)=0.628) kq-cap-tool-1856: 'сможешь остановить сервер?' (true=knowledge, proba(action)=0.625) kq-cap-tool-1857: 'умеешь ли проверить nginx?' (true=knowledge, proba(action)=0.604) mw-fact-meal-1946: 'пообедал салатом' (true=memory_write, proba(action)=0.634) mw-fact-meal-1950: 'поужинал салатом' (true=memory_write, proba(action)=0.685) mw-fact-meal-1951: 'поужинал пиццей' (true=memory_write, proba(action)=0.493) mw-fact-meal-1955: 'ел пиццей' (true=memory_write, proba(action)=0.238) mw-fact-meal-1962: 'позавтракал салатом, пожалуйста' (true=memory_write, proba(action)=0.459) mw-fact-meal-1966: 'пообедал салатом, пожалуйста' (true=memory_write, proba(action)=0.656) mw-fact-meal-1968: 'поужинал овсянкой, пожалуйста' (true=memory_write, proba(action)=0.414) mw-fact-meal-1970: 'поужинал салатом, пожалуйста' (true=memory_write, proba(action)=0.662) mw-fact-meal-1974: 'ел салатом, пожалуйста' (true=memory_write, proba(action)=0.592) mw-fact-meal-1975: 'ел пиццей, пожалуйста' (true=memory_write, proba(action)=0.290) mw-fact-meal-1976: 'just ate овсянкой, пожалуйста' (true=memory_write, proba(action)=0.328) mw-fact-meal-1978: 'just ate салатом, пожалуйста' (true=memory_write, proba(action)=0.429) mw-fact-meal-1984: 'я хочу позавтракал салатом' (true=memory_write, proba(action)=0.483) mw-fact-meal-1992: 'я хочу пообедал салатом' (true=memory_write, proba(action)=0.626) mw-fact-meal-1993: 'надо бы пообедал салатом' (true=memory_write, proba(action)=0.528) mw-fact-meal-2000: 'я хочу поужинал салатом' (true=memory_write, proba(action)=0.675) mw-fact-meal-2001: 'надо бы поужинал салатом' (true=memory_write, proba(action)=0.483) mw-fact-meal-2010: 'я хочу ел пиццей' (true=memory_write, proba(action)=0.265) mw-fact-meal-2016: 'я хочу just ate салатом' (true=memory_write, proba(action)=0.561) mw-fact-meal-2024: 'овсянкой пообедал' (true=memory_write, proba(action)=0.385) mw-fact-meal-2026: 'салатом пообедал' (true=memory_write, proba(action)=0.612) mw-fact-meal-2027: 'пиццей пообедал' (true=memory_write, proba(action)=0.444) mw-fact-meal-2028: 'овсянкой поужинал' (true=memory_write, proba(action)=0.438) mw-fact-meal-2030: 'салатом поужинал' (true=memory_write, proba(action)=0.591) mw-fact-meal-2031: 'пиццей поужинал' (true=memory_write, proba(action)=0.571) mw-note-homelab-2401: 'заметка про 备份策略' (true=memory_write, proba(action)=0.633) mw-note-homelab-2404: 'запиши про настройку 备份策略' (true=memory_write, proba(action)=0.657) mw-note-homelab-2406: 'заметка про DNS записи, пожалуйста' (true=memory_write, proba(action)=0.442) mw-note-homelab-2407: 'заметка про 备份策略, пожалуйста' (true=memory_write, proba(action)=0.730) mw-note-homelab-2410: 'запиши про настройку 备份策略, пожалуйста' (true=memory_write, proba(action)=0.719) mw-note-homelab-2415: 'я хочу заметка про 备份策略' (true=memory_write, proba(action)=0.671) mw-note-homelab-2416: 'надо бы заметка про 备份策略' (true=memory_write, proba(action)=0.645) mw-note-homelab-2421: 'я хочу запиши про настройку 备份策略' (true=memory_write, proba(action)=0.561) mw-note-homelab-2422: 'надо бы запиши про настройку 备份策略' (true=memory_write, proba(action)=0.666) mw-note-homelab-2425: '备份策略 заметка про' (true=memory_write, proba(action)=0.742) mw-note-homelab-2428: '备份策略 запиши про настройку' (true=memory_write, proba(action)=0.633) mw-free-remember-2460: 'запомни пароль от wifi' (true=memory_write, proba(action)=0.836) mw-free-remember-2461: 'запомни адрес электрика' (true=memory_write, proba(action)=0.753) mw-free-remember-2462: 'сохрани что встреча в 3' (true=memory_write, proba(action)=0.457) mw-free-remember-2463: 'сохрани пароль от wifi' (true=memory_write, proba(action)=0.939) mw-free-remember-2464: 'сохрани адрес электрика' (true=memory_write, proba(action)=0.980) mw-free-remember-2466: 'занеси пароль от wifi' (true=memory_write, proba(action)=0.733) mw-free-remember-2467: 'занеси адрес электрика' (true=memory_write, proba(action)=0.734) mw-free-remember-2469: 'внеси пароль от wifi' (true=memory_write, proba(action)=0.847) mw-free-remember-2470: 'внеси адрес электрика' (true=memory_write, proba(action)=0.898) mw-free-remember-2472: 'запомни пароль от wifi, пожалуйста' (true=memory_write, proba(action)=0.866) mw-free-remember-2473: 'запомни адрес электрика, пожалуйста' (true=memory_write, proba(action)=0.734) mw-free-remember-2474: 'сохрани что встреча в 3, пожалуйста' (true=memory_write, proba(action)=0.595) mw-free-remember-2475: 'сохрани пароль от wifi, пожалуйста' (true=memory_write, proba(action)=0.942) mw-free-remember-2476: 'сохрани адрес электрика, пожалуйста' (true=memory_write, proba(action)=0.935) mw-free-remember-2478: 'занеси пароль от wifi, пожалуйста' (true=memory_write, proba(action)=0.830) mw-free-remember-2479: 'занеси адрес электрика, пожалуйста' (true=memory_write, proba(action)=0.807) mw-free-remember-2481: 'внеси пароль от wifi, пожалуйста' (true=memory_write, proba(action)=0.942) mw-free-remember-2482: 'внеси адрес электрика, пожалуйста' (true=memory_write, proba(action)=0.946) mw-free-remember-2485: 'я хочу запомни пароль от wifi' (true=memory_write, proba(action)=0.692) mw-free-remember-2486: 'надо бы запомни пароль от wifi' (true=memory_write, proba(action)=0.698) mw-free-remember-2487: 'я хочу запомни адрес электрика' (true=memory_write, proba(action)=0.768) mw-free-remember-2488: 'надо бы запомни адрес электрика' (true=memory_write, proba(action)=0.706) mw-free-remember-2489: 'я хочу сохрани что встреча в 3' (true=memory_write, proba(action)=0.585) mw-free-remember-2490: 'надо бы сохрани что встреча в 3' (true=memory_write, proba(action)=0.465) mw-free-remember-2491: 'я хочу сохрани пароль от wifi' (true=memory_write, proba(action)=0.826) mw-free-remember-2492: 'надо бы сохрани пароль от wifi' (true=memory_write, proba(action)=0.868) mw-free-remember-2493: 'я хочу сохрани адрес электрика' (true=memory_write, proba(action)=0.914) mw-free-remember-2494: 'надо бы сохрани адрес электрика' (true=memory_write, proba(action)=0.932) mw-free-remember-2497: 'я хочу занеси пароль от wifi' (true=memory_write, proba(action)=0.606) mw-free-remember-2498: 'надо бы занеси пароль от wifi' (true=memory_write, proba(action)=0.775) mw-free-remember-2499: 'я хочу занеси адрес электрика' (true=memory_write, proba(action)=0.723) mw-free-remember-2500: 'надо бы занеси адрес электрика' (true=memory_write, proba(action)=0.776) mw-free-remember-2503: 'я хочу внеси пароль от wifi' (true=memory_write, proba(action)=0.738) mw-free-remember-2504: 'надо бы внеси пароль от wifi' (true=memory_write, proba(action)=0.895) mw-free-remember-2505: 'я хочу внеси адрес электрика' (true=memory_write, proba(action)=0.946) mw-free-remember-2506: 'надо бы внеси адрес электрика' (true=memory_write, proba(action)=0.955) mw-free-remember-2508: 'пароль от wifi запомни' (true=memory_write, proba(action)=0.843) mw-free-remember-2509: 'адрес электрика запомни' (true=memory_write, proba(action)=0.817) mw-free-remember-2510: 'что встреча в 3 сохрани' (true=memory_write, proba(action)=0.582) mw-free-remember-2511: 'пароль от wifi сохрани' (true=memory_write, proba(action)=0.955) mw-free-remember-2512: 'адрес электрика сохрани' (true=memory_write, proba(action)=0.974) mw-free-remember-2514: 'пароль от wifi занеси' (true=memory_write, proba(action)=0.672) mw-free-remember-2515: 'адрес электрика занеси' (true=memory_write, proba(action)=0.541) mw-free-remember-2517: 'пароль от wifi внеси' (true=memory_write, proba(action)=0.838) mw-free-remember-2518: 'адрес электрика внеси' (true=memory_write, proba(action)=0.781) sys-quiet-off-2583: 'громкий режим' (true=system, proba(action)=0.559) sys-quiet-off-2584: 'выключи тихий' (true=system, proba(action)=0.372) sys-quiet-off-2588: 'громкий режим, пожалуйста' (true=system, proba(action)=0.528) sys-quiet-off-2589: 'выключи тихий, пожалуйста' (true=system, proba(action)=0.470) sys-quiet-off-2593: 'я хочу громкий режим' (true=system, proba(action)=0.381) unc-anaphora-2922: 'сделай это, пожалуйста' (true=uncertain, proba(action)=0.312)

10. Contrast-family results

Experiment A (all dev)

family count correct accuracy false_act

question 123 91 74.0% 27 capability_question 126 15 11.9% 111

Experiment B (residual only)

family count correct accuracy false_act

question 123 91 74.0% 27 capability_question 126 14 11.1% 112

11. Calibration metrics

Experiment A

  • ECE: 0.045
  • Brier score: 0.459
  • Log loss: 0.929

Experiment B

  • ECE: 0.046
  • Brier score: 0.467
  • Log loss: 0.946

12. Abstention curves

Experiment A (all dev)

threshold n_accepted coverage accuracy macro_f1 false_act

  0.40        2293      92.1%      70.7%      0.706        351
  0.50        1968      79.0%      74.5%      0.751        289
  0.60        1584      63.6%      78.0%      0.781        227
  0.70        1244      50.0%      80.9%      0.812        177
  0.80         851      34.2%      84.1%      0.883        120
  0.90         438      17.6%      83.3%      0.830         73

Experiment B (residual only)

threshold n_accepted coverage accuracy macro_f1 false_act

  0.40        2244      92.8%      70.4%      0.700        346
  0.50        1941      80.3%      73.6%      0.733        285
  0.60        1571      65.0%      77.3%      0.771        229
  0.70        1228      50.8%      79.9%      0.792        178
  0.80         845      34.9%      83.6%      0.873        120
  0.90         431      17.8%      81.9%      0.827         78

13. Action-threshold curve

Experiment A

threshold action_P action_R false_act

  0.40      0.645      0.803        351
  0.50      0.672      0.745        289
  0.60      0.697      0.655        227
  0.70      0.708      0.539        177
  0.80      0.733      0.413        120
  0.90      0.721      0.237         73

Experiment B

threshold action_P action_R false_act

  0.40      0.640      0.803        346
  0.50      0.664      0.736        285
  0.60      0.687      0.655        229
  0.70      0.698      0.537        178
  0.80      0.722      0.407        120
  0.90      0.690      0.227         78

14. Model artifact size and runtime cost

  • Trainable parameters: 2310
    • 6 classes × 384 features = 2304 weights
    • 6 bias terms
  • Serialized head size: 9240 bytes (9.0 KB)
  • Additional inference FLOPs: 2304 multiply-accumulates
  • Incremental cost (e5 already computed): ~2304 FLOPs, <1µs
  • Cost if semantic router must trigger its own e5: full ONNX inference (~384 × 128 × 12 = ~590K FLOPs)

16. Recommendation

linear head sufficient

Residual macro F1 of 0.663 and accuracy of 67.9% exceed the legacy baseline (40.8% residual accuracy) by a meaningful margin. A linear head over frozen e5-small embeddings is a viable first production candidate.

17. Commit hash for experiment tooling

59a0a08d329fbcbefad4ec858cf8c6cc07014a36