diff --git a/docs/evals/2026-09-07-expanded-corpus-linear-head-experiment.md b/docs/evals/2026-09-07-expanded-corpus-linear-head-experiment.md new file mode 100644 index 0000000..7c0b82f --- /dev/null +++ b/docs/evals/2026-09-07-expanded-corpus-linear-head-experiment.md @@ -0,0 +1,635 @@ +# 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` diff --git a/docs/evals/2026-09-07-linear-e5-router-experiment.md b/docs/evals/2026-09-07-linear-e5-router-experiment.md new file mode 100644 index 0000000..b50d6b4 --- /dev/null +++ b/docs/evals/2026-09-07-linear-e5-router-experiment.md @@ -0,0 +1,263 @@ +# 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: 136 +- Frozen holdout: 21 +- Development pool: 115 +- Fast-path resolved: 23 +- Router-residual: 113 + +Route distribution (full corpus): + - action: 22 + - conversation: 7 + - knowledge: 46 + - memory_write: 19 + - system: 7 + - uncertain: 35 + +## 3. Grouped fold composition + +Folds: 5 + - Fold 0: eval=33 train=82 routes={'action': 4, 'conversation': 1, 'knowledge': 11, 'memory_write': 3, 'system': 1, 'uncertain': 13} + - Fold 1: eval=16 train=99 routes={'action': 3, 'conversation': 1, 'knowledge': 5, 'memory_write': 4, 'system': 1, 'uncertain': 2} + - Fold 2: eval=22 train=93 routes={'action': 3, 'conversation': 1, 'knowledge': 7, 'memory_write': 4, 'system': 2, 'uncertain': 5} + - Fold 3: eval=22 train=93 routes={'action': 4, 'conversation': 1, 'knowledge': 6, 'memory_write': 4, 'system': 2, 'uncertain': 5} + - Fold 4: eval=22 train=93 routes={'action': 4, 'conversation': 2, 'knowledge': 8, 'memory_write': 2, 'system': 1, 'uncertain': 5} + +## 4. Selected regularization + +### Experiment A: All development examples +- Best C: 100.0 +- Mean accuracy: 65.2% ± 6.2% +- Mean macro F1: 0.597 ± 0.070 +- Total false actions (CV): 10 + +### Experiment B: Router-residual only +- Best C: 100.0 +- Mean accuracy: 66.5% ± 7.6% +- Mean macro F1: 0.475 ± 0.083 +- Total false actions (CV): 0 + +### Stability across folds + + C=0.01 acc=32.0%±3.0% f1=0.081±0.006 folds_acc=['33.3%', '31.2%', '31.8%', '27.3%', '36.4%'] + C=0.1 acc=32.0%±3.0% f1=0.081±0.006 folds_acc=['33.3%', '31.2%', '31.8%', '27.3%', '36.4%'] + C=1.0 acc=44.8%±7.0% f1=0.190±0.049 folds_acc=['36.4%', '37.5%', '50.0%', '45.5%', '54.5%'] + C=10.0 acc=58.3%±4.6% f1=0.403±0.086 folds_acc=['51.5%', '62.5%', '63.6%', '59.1%', '54.5%'] + C=100.0 acc=65.2%±6.2% f1=0.597±0.070 folds_acc=['54.5%', '62.5%', '68.2%', '68.2%', '72.7%'] + +## 5. All-example CV metrics + +- Accuracy: 64.3% +- Macro F1: 0.620 +- False-action count: 10 +- False-action rate: 8.7% +- Action precision: 0.545 +- Action recall: 0.667 +- Uncertain precision: 0.800 +- Uncertain recall: 0.533 + +Per-class metrics: + action P=0.545 R=0.667 F1=0.600 (n=18) + conversation P=1.000 R=0.500 F1=0.667 (n=6) + knowledge P=0.756 R=0.838 F1=0.795 (n=37) + memory_write P=0.346 R=0.529 F1=0.419 (n=17) + system P=1.000 R=0.429 F1=0.600 (n=7) + uncertain P=0.800 R=0.533 F1=0.640 (n=30) + +Confusion matrix (rows=expected, cols=predicted): + action conversation knowledge memory_write system uncertain + action 12 0 0 5 0 1 + conversation 0 3 1 0 0 2 + knowledge 4 0 31 2 0 0 + memory_write 4 0 3 9 0 1 + system 2 0 2 0 3 0 + uncertain 0 0 4 10 0 16 + +## 6. Residual-only CV metrics + +- Accuracy: 64.6% +- Macro F1: 0.429 +- False-action count: 0 +- False-action rate: 0.0% +- Action precision: 0.000 +- Action recall: 0.000 +- Uncertain precision: 0.667 +- Uncertain recall: 0.533 + +Per-class metrics: + action P=0.000 R=0.000 F1=0.000 (n=5) + conversation P=1.000 R=0.500 F1=0.667 (n=6) + knowledge P=0.750 R=0.917 F1=0.825 (n=36) + memory_write P=0.400 R=0.625 F1=0.488 (n=16) + system P=0.000 R=0.000 F1=0.000 (n=3) + uncertain P=0.667 R=0.533 F1=0.593 (n=30) + +Confusion matrix (rows=expected, cols=predicted): + action conversation knowledge memory_write system uncertain + action 0 0 0 2 0 3 + conversation 0 3 1 0 0 2 + knowledge 0 0 33 3 0 0 + memory_write 0 0 4 10 0 2 + system 0 0 2 0 0 1 + uncertain 0 0 4 10 0 16 + +## 7. Legacy-vs-linear comparison + +### All examples +metric legacy linear e5 delta +------------------------------------------------------- +accuracy 52.2% 64.3% 12.1% +macro F1 — 0.620 — +action precision — 0.545 — +false-action rate 19.9% 8.7% -11.2% +uncertain F1 0.000 0.640 0.640 + +### Router-residual only +metric legacy linear e5 delta +------------------------------------------------------- +accuracy 40.8% 64.6% 23.8% +macro F1 — 0.429 — +false-action rate — 0.0% — + +## 8. Fold variance + +All-example CV: + Fold 0: acc=54.5% f1=0.507 false_action=1 + Fold 1: acc=62.5% f1=0.579 false_action=2 + Fold 2: acc=68.2% f1=0.554 false_action=2 + Fold 3: acc=68.2% f1=0.632 false_action=5 + Fold 4: acc=72.7% f1=0.712 false_action=0 + +Residual-only CV: + Fold 0: acc=53.6% f1=0.500 false_action=0 + Fold 1: acc=75.0% f1=0.573 false_action=0 + Fold 2: acc=72.2% f1=0.411 false_action=0 + Fold 3: acc=68.4% f1=0.541 false_action=0 + Fold 4: acc=63.2% f1=0.351 false_action=0 + +## 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): + en-query-003: 'show me this week's weight' (true=knowledge, proba(action)=0.402) + ru-query-014: 'я успеваю до дедлайна' (true=knowledge, proba(action)=0.343) + ru-note-003: 'заметка про настройку vlan на свитче' (true=memory_write, proba(action)=0.335) + ru-query-005: 'напоминания на завтра есть' (true=knowledge, proba(action)=0.336) + ru-fact-009: 'отметь что я выпил таблетки утром' (true=memory_write, proba(action)=0.437) + ru-query-011: 'почему сервер тормозит' (true=knowledge, proba(action)=0.381) + ru-fact-005: 'поспал часов пять' (true=memory_write, proba(action)=0.557) + ru-note-006: 'добавь в задачи купить молоко' (true=memory_write, proba(action)=0.739) + ru-sys-003: 'переходи в тихий режим' (true=system, proba(action)=0.404) + en-sys-002: 'turn quiet mode back on' (true=system, proba(action)=0.410) + +## 10. Contrast-family results + +### Experiment A (all dev) +family count correct accuracy false_act +------------------------------------------------------------ +negation 5 3 60.0% 0 +question 5 5 100.0% 0 +reported_speech 6 3 50.0% 0 +quotation 6 4 66.7% 0 +hypothetical 6 3 50.0% 0 +capability_question 6 6 100.0% 0 + +### Experiment B (residual only) +family count correct accuracy false_act +------------------------------------------------------------ +negation 5 3 60.0% 0 +question 5 5 100.0% 0 +reported_speech 6 3 50.0% 0 +quotation 6 4 66.7% 0 +hypothetical 6 3 50.0% 0 +capability_question 6 6 100.0% 0 + +## 11. Calibration metrics + +### Experiment A +- ECE: 0.116 +- Brier score: 0.418 +- Log loss: 0.832 + +### Experiment B +- ECE: 0.159 +- Brier score: 0.411 +- Log loss: 0.804 + +## 12. Abstention curves + +### Experiment A (all dev) + threshold n_accepted coverage accuracy macro_f1 false_act +-------------------------------------------------------------- + 0.40 98 85.2% 72.4% 0.654 6 + 0.50 75 65.2% 84.0% 0.690 2 + 0.60 56 48.7% 92.9% 0.851 1 + 0.70 42 36.5% 97.6% 0.714 1 + 0.80 28 24.3% 100.0% 1.000 0 + 0.90 10 8.7% 100.0% 1.000 0 + +### Experiment B (residual only) + threshold n_accepted coverage accuracy macro_f1 false_act +-------------------------------------------------------------- + 0.40 86 89.6% 67.4% 0.435 0 + 0.50 70 72.9% 78.6% 0.583 0 + 0.60 56 58.3% 91.1% 0.721 0 + 0.70 46 47.9% 95.7% 0.904 0 + 0.80 32 33.3% 96.9% 0.880 0 + 0.90 12 12.5% 100.0% 1.000 0 + +## 13. Action-threshold curve + +### Experiment A + threshold action_P action_R false_act +---------------------------------------- + 0.40 0.667 0.667 6 + 0.50 0.846 0.611 2 + 0.60 0.857 0.333 1 + 0.70 0.750 0.167 1 + 0.80 1.000 0.056 0 + 0.90 0.000 0.000 0 + +### Experiment B + threshold action_P action_R false_act +---------------------------------------- + 0.40 0.000 0.000 0 + 0.50 0.000 0.000 0 + 0.60 0.000 0.000 0 + 0.70 0.000 0.000 0 + 0.80 0.000 0.000 0 + 0.90 0.000 0.000 0 + +## 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 + +**need more data** + +All-example F1 (0.620) is acceptable but residual-only F1 (0.429) drops, suggesting the contrast-family examples are hard for a linear classifier. More contrastive training data may help. + +## 17. Commit hash for experiment tooling + +`59a0a08d329fbcbefad4ec858cf8c6cc07014a36` diff --git a/docs/evals/CLAUDE.md b/docs/evals/CLAUDE.md index 36a1c35..bcedad3 100644 --- a/docs/evals/CLAUDE.md +++ b/docs/evals/CLAUDE.md @@ -46,6 +46,8 @@ A pair in `docs/routing.md` went stale unnoticed. Its source predated the | [gemma-4-E4B against gemma-4-12B on the routing fixture](2026-08-09-e4b-vs-12b-routing.md) | live | | [The classifier baseline after the tokenizer fix](2026-08-11-classifier-baseline-after-tokenizer-fix.md) | live | | [The CPT+SFT Qwen3-1.7B routes better and cannot hold a sentence](2026-08-19-maven-model-cpt-sft.md) | live | +| [Linear-head experiment on e5-small (slice 14 baseline, 136 examples)](2026-09-07-linear-e5-router-experiment.md) | superseded | +| [Expanded corpus linear-head experiment (3025 examples, 93 seed families)](2026-09-07-expanded-corpus-linear-head-experiment.md) | live | `docs/routing.md` holds the arm table these feed. Cite from there, not from here.