@furongjun1999/dsh-memory 0.4.11 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (504) hide show
  1. package/README.md +16 -16
  2. package/codebuddy/CODEBUDDY.md +11 -3
  3. package/codebuddy/README.md +92 -90
  4. package/codebuddy/mcp.json +27 -27
  5. package/docs/GBrain/345/217/257/345/200/237/351/211/264/347/202/271_/347/201/265/346/236/242/350/220/275/347/202/271/344/272/244/346/216/245_20260919.md +169 -169
  6. package/docs/Pi/345/217/257/345/255/246/344/271/240/344/274/230/347/202/271_/347/201/265/346/236/242/345/244/247/350/204/221/346/224/271/350/277/233/344/272/244/346/216/245_20260915.md +144 -144
  7. package/docs/README.md +142 -111
  8. package/docs/discipline/harnesses.yaml +244 -226
  9. package/docs/discipline/templates/full.md.tmpl +61 -61
  10. package/docs/discipline/templates/rules.mdc.tmpl +68 -0
  11. package/docs/discipline/templates/skill.md.tmpl +23 -23
  12. package/docs/eval/AGI/344/270/203/347/273/264/350/257/204/345/210/206/346/212/245/345/221/212_md_cg_v1.0.md +299 -299
  13. package/docs/eval/AGI/344/270/203/347/273/264/350/257/204/345/210/206/346/212/245/345/221/212_md_cg_v2.0.md +239 -239
  14. package/docs/eval//345/256/236/351/252/214/346/226/271/346/241/210_/345/255/246/344/271/240/351/227/255/347/216/257AB/344/270/216/346/250/252/350/257/204_v1.0.md +174 -174
  15. package/docs/eval//346/250/252/350/257/204_/345/205/255/345/256/266100/351/242/230/344/270/255/350/213/261/345/217/214/346/237/245_v1.0.md +223 -223
  16. package/docs/{mdcg → hive}//344/273/244/347/211/214/344/270/216/350/247/222/350/211/262/346/235/203/350/201/214/345/210/206/347/246/273_v0.1.md +165 -160
  17. package/docs/hive//344/273/244/347/211/214/350/257/255/344/271/211/344/277/256/346/255/243_/344/273/262/350/243/201/344/275/215_v0.1.md +76 -0
  18. package/docs/{mdcg → hive}//345/255/220/344/273/243/347/220/206/351/205/215/347/275/256/346/240/207/345/207/206_v0.5.md +236 -236
  19. package/docs/hive//346/243/200/347/264/242/346/224/266/346/225/233/345/256/236/346/265/213/344/270/216S1b/350/256/276/350/256/241_v0.1.md +43 -43
  20. package/docs/hive//346/243/200/347/264/242/347/256/227/346/263/225/345/217/243/345/276/204/345/257/271/347/205/247_v0.1.md +85 -0
  21. package/docs/hive//346/243/200/347/264/242/350/267/257/345/276/204/344/270/216/350/256/244/347/237/245/347/273/223/346/236/204/345/245/221/347/272/246_v0.1.md +102 -102
  22. package/docs/hive//350/234/202/345/267/242M6_ingest/345/256/236/346/226/275/350/256/241/345/210/222_v0.1.md +47 -0
  23. package/docs/hive//350/234/202/345/267/242/345/217/214/345/256/236/344/276/213/344/272/222/351/252/214_/350/256/276/350/256/241/345/256/232/347/250/277.md +503 -503
  24. package/docs/hive//350/234/202/345/267/242/345/267/245/344/275/234/350/256/260/345/277/206_/351/241/271/347/233/256/350/256/241/345/210/222.md +85 -85
  25. package/docs/hive//350/234/202/345/267/242/350/256/276/350/256/241_/347/220/206/350/256/272/345/257/271/351/275/220_v0.1.md +191 -0
  26. package/docs/hive//350/234/202/345/267/242/350/277/255/344/273/243_/345/256/217/350/247/202/344/270/216/347/276/244/344/275/223/350/260/203/345/272/246_v0.1.md +90 -0
  27. package/docs/mdcg/D_meta_/345/267/245/347/250/213/345/214/226/346/226/271/346/241/210_v0.2.md +216 -216
  28. package/docs/mdcg/README/350/257/246/347/273/206/347/211/210_v0.4.10.md +646 -646
  29. package/docs/mdcg/lingshu_tutorial.html +14449 -14449
  30. package/docs/mdcg/release_v0.4.11.md +49 -0
  31. package/docs/mdcg/release_v0.4.5.md +55 -55
  32. package/docs/mdcg/tool_table_v0.3.0.md +117 -117
  33. package/docs/mdcg//345/205/250/345/272/223/344/273/243/347/240/201/350/257/204/345/256/241/344/270/216/346/235/241/344/273/266/345/214/226/346/263/250/351/207/212_/350/256/241/345/210/222_v0.1.md +600 -600
  34. package/docs/mdcg//345/212/237/350/203/275/350/260/203/347/224/250/346/230/240/345/260/204/350/241/250_v0.1.md +40 -40
  35. package/docs/mdcg//345/215/225/345/205/203/350/207/252/346/210/221/351/224/232/347/202/271_/347/263/273/347/273/237/346/217/220/347/244/272/350/257/215/346/240/207/345/207/206_v0.3.md +275 -275
  36. package/docs/mdcg//345/217/221/345/270/203/351/227/250/347/246/201/351/223/276_v0.1.md +54 -0
  37. package/docs/mdcg//346/272/220/347/240/201/347/272/247/346/236/266/346/236/204/345/256/241/350/256/241_GPT/346/211/271/350/257/204/345/257/271/347/205/247_v1.0.md +130 -130
  38. package/docs/mdcg//347/201/265/346/236/24282/345/267/245/345/205/267_/345/212/237/350/203/275/346/225/264/347/220/206/344/270/216/350/277/201/347/247/273/346/230/240/345/260/204_v0.1.md +278 -278
  39. package/docs/mdcg//347/201/265/346/236/242/350/256/260/345/277/206/345/212/250/350/257/215/345/215/217/350/256/256_v1.0-draft.md +172 -172
  40. package/docs/mdcg//347/274/272/345/217/243/345/215/225_P0/346/224/266/345/217/243_v0.1.md +270 -270
  41. package/docs/mdcg//350/256/244/347/237/245/345/233/276_G4-G8/347/274/272/345/217/243/350/243/201/345/256/232/345/215/225_v0.1.md +491 -491
  42. package/docs/mdcg//350/256/244/347/237/245/345/233/276_/346/235/241/344/273/266/347/251/272/351/227/264/345/220/210/346/210/220/344/270/216/347/224/237/346/225/210/346/235/241/344/273/266/345/217/243/345/276/204_v0.1.md +340 -340
  43. package/docs/mdcg//350/256/244/347/237/245/345/233/276_/347/264/242/345/274/225/344/270/216/345/267/245/347/250/213/350/247/204/350/214/203/345/214/226_/350/256/241/345/210/222_v0.1.md +588 -588
  44. package/docs/plans/GridWorld/346/234/200/345/260/217/351/227/255/347/216/257/350/247/204/346/240/274_v0.1.md +176 -176
  45. package/docs/plans//345/221/275/345/220/215/346/262/273/347/220/206_/351/241/271/347/233/256/350/256/241/345/210/222.md +81 -81
  46. package/docs/swarm//350/234/202/347/276/244/344/272/222/350/201/224_v0.1.md +704 -704
  47. package/docs/swarm//350/234/202/347/276/244/345/220/214/351/224/231/346/243/200/346/265/213/345/256/236/351/252/214/345/215/217/350/256/256_v0.1.md +242 -242
  48. package/docs/theory//345/215/225/347/272/277/347/250/213/344/270/216/346/263/250/346/204/217/345/212/233/351/233/206/344/270/255_/346/227/240/344/272/211/350/256/256/347/220/206/350/256/272/346/226/207/346/241/243_v1.0.md +129 -129
  49. package/docs/theory//345/271/266/345/217/221/345/277/205/347/204/266/346/200/247/347/220/206/350/256/272_v0.2.md +134 -134
  50. package/docs/theory//346/231/272/350/203/275/350/256/2723.4.md +5260 -5260
  51. package/docs/theory//346/246/202/345/277/265/345/210/206/345/261/202/345/257/271/351/275/220/350/241/250_v0.1.md +145 -145
  52. package/docs/theory//347/220/206/350/256/272_/346/234/272/345/210/266_/344/273/243/347/240/201_/345/256/236/351/252/214_/347/274/272/345/217/243/347/237/251/351/230/265_v0.1.md +144 -144
  53. package/docs/theory//347/220/206/350/256/272/344/273/223/346/213/206/345/210/206/344/270/216/347/231/275/347/256/261/347/237/245/350/257/206/345/272/223/345/206/205/350/277/201_v0.1.md +198 -198
  54. package/docs/theory//350/256/244/347/237/245/344/273/243/347/220/206/344/270/216/346/224/266/346/225/233/347/273/223/346/236/204_/346/235/241/344/273/266/350/256/272/351/207/215/346/236/204_v0.1.md +221 -221
  55. package/docs/world_model//344/270/226/347/225/214/346/250/241/345/236/213_/347/245/236/347/273/217/347/275/221/347/273/234/345/272/225/345/261/202/346/236/266/346/236/204_v1.0.md +237 -237
  56. package/docs//345/217/221/345/270/203/344/273/266/345/233/236/346/272/257/350/257/264/346/230/216_v0.1.md +82 -82
  57. package/docs//345/267/245/344/275/234/347/272/252/345/276/213_/350/256/244/347/237/245/345/233/276/346/235/241/347/233/256_v1.1.json +28 -2
  58. package/dsh/README.md +82 -82
  59. package/dsh/cordis.yml.example +139 -139
  60. package/dsh/update-lingshu.bat +11 -11
  61. package/lib/hooks.js +36 -2
  62. package/lib/lib/roleplay_web.js +427 -427
  63. package/md_cg/__init__.py +7 -7
  64. package/md_cg/audit.py +368 -368
  65. package/md_cg/autonomy.py +287 -287
  66. package/md_cg/backfill.py +1327 -1327
  67. package/md_cg/backfill_bigdomain.py +34 -34
  68. package/md_cg/bench6_arms.py +410 -410
  69. package/md_cg/bench6_common.py +230 -230
  70. package/md_cg/bench6_competitors.py +212 -212
  71. package/md_cg/bench_axis_domain.py +257 -257
  72. package/md_cg/bench_blind_comp.py +308 -308
  73. package/md_cg/bench_en_atoms_public.py +230 -230
  74. package/md_cg/bench_governance.py +348 -348
  75. package/md_cg/bench_lme_zh.py +410 -410
  76. package/md_cg/bench_locomo.py +121 -121
  77. package/md_cg/bench_locomo_zh.py +450 -450
  78. package/md_cg/bench_locomo_zh_public.py +147 -147
  79. package/md_cg/bench_longmem.py +112 -112
  80. package/md_cg/bench_membench.py +632 -632
  81. package/md_cg/bench_p0.py +149 -149
  82. package/md_cg/bench_progressive.py +287 -287
  83. package/md_cg/bench_role_views.py +238 -238
  84. package/md_cg/bench_task_ab.py +243 -243
  85. package/md_cg/bench_task_ab_llm.py +408 -408
  86. package/md_cg/bench_unified_en.py +204 -204
  87. package/md_cg/bench_zh_mad.py +601 -601
  88. package/md_cg/blindspot_tickets.py +123 -123
  89. package/md_cg/branches.py +285 -285
  90. package/md_cg/build_postings.py +73 -73
  91. package/md_cg/ccgc.py +1005 -948
  92. package/md_cg/census.py +132 -132
  93. package/md_cg/chain.py +300 -300
  94. package/md_cg/codeindex.py +531 -531
  95. package/md_cg/coldverify.py +292 -292
  96. package/md_cg/comment_gate.py +337 -337
  97. package/md_cg/cond_compose.py +190 -190
  98. package/md_cg/cond_facts.py +154 -154
  99. package/md_cg/cond_template.json +106 -106
  100. package/md_cg/condition_anchor.py +142 -142
  101. package/md_cg/conformance.py +726 -726
  102. package/md_cg/consistency.py +717 -717
  103. package/md_cg/consolidate.py +1536 -1439
  104. package/md_cg/corpus.py +110 -110
  105. package/md_cg/crosscheck.py +1097 -1097
  106. package/md_cg/crypto.py +437 -437
  107. package/md_cg/d_meta.py +310 -310
  108. package/md_cg/datapath.py +334 -334
  109. package/md_cg/docindex.py +473 -473
  110. package/md_cg/eval_common.py +575 -575
  111. package/md_cg/evidence.py +580 -580
  112. package/md_cg/evolution.py +477 -477
  113. package/md_cg/export.py +220 -220
  114. package/md_cg/forgetting.py +581 -581
  115. package/md_cg/fsutil.py +329 -329
  116. package/md_cg/hotcache.py +238 -214
  117. package/md_cg/hyperedge.py +251 -251
  118. package/md_cg/identity.py +390 -390
  119. package/md_cg/insight.py +500 -500
  120. package/md_cg/interop.py +199 -0
  121. package/md_cg/lexicon/build_cedict_en_zh.py +329 -329
  122. package/md_cg/lexicon/build_standard_en.py +171 -171
  123. package/md_cg/lexicon/expand_en_zh.py +211 -211
  124. package/md_cg/lifecycle.py +272 -272
  125. package/md_cg/linkref.py +280 -280
  126. package/md_cg/links.py +622 -622
  127. package/md_cg/mcp_server.py +129 -32
  128. package/md_cg/md_whitebox.py +345 -345
  129. package/md_cg/mdcg.py +176 -117
  130. package/md_cg/mdcos.py +79 -13
  131. package/md_cg/metacognition.py +591 -591
  132. package/md_cg/migrate.py +119 -119
  133. package/md_cg/migrate_aeis.py +221 -221
  134. package/md_cg/migrate_roleplay.py +293 -293
  135. package/md_cg/migrate_wisdom_graph.py +360 -360
  136. package/md_cg/mreview/__init__.py +25 -25
  137. package/md_cg/mreview/__main__.py +110 -110
  138. package/md_cg/mreview/bundle.py +178 -178
  139. package/md_cg/mreview/candidates.py +262 -262
  140. package/md_cg/mreview/govern.py +693 -693
  141. package/md_cg/mreview/locate.py +939 -939
  142. package/md_cg/mreview/pipeline.py +728 -728
  143. package/md_cg/mreview/rules/duplication.json +21 -21
  144. package/md_cg/mreview/rules/field_coverage.json +54 -54
  145. package/md_cg/mreview/rules/source_license.json +21 -21
  146. package/md_cg/mreview/rules/template_flow.json +21 -21
  147. package/md_cg/mreview/ruleset.py +252 -252
  148. package/md_cg/nodefile.py +575 -575
  149. package/md_cg/pooling.py +484 -472
  150. package/md_cg/postings.py +298 -298
  151. package/md_cg/predict.py +1100 -1100
  152. package/md_cg/progressive.py +123 -123
  153. package/md_cg/protect.py +272 -272
  154. package/md_cg/protocol/md_cg_gate.proto +33 -33
  155. package/md_cg/protocol.py +372 -372
  156. package/md_cg/provenance.py +582 -582
  157. package/md_cg/reach.py +453 -453
  158. package/md_cg/readcache.py +85 -0
  159. package/md_cg/refindex.py +833 -833
  160. package/md_cg/refine.py +604 -604
  161. package/md_cg/roleviews.py +89 -89
  162. package/md_cg/routing.py +365 -365
  163. package/md_cg/scrub.py +852 -852
  164. package/md_cg/security.py +274 -274
  165. package/md_cg/self_state.py +1029 -1029
  166. package/md_cg/selfreport.py +151 -151
  167. package/md_cg/semantic/__init__.py +10 -10
  168. package/md_cg/semantic/canonical.py +122 -122
  169. package/md_cg/semantic/en_normalizer.py +364 -364
  170. package/md_cg/semantic/en_zh_map.json +28694 -0
  171. package/md_cg/semantic/export_en_zh_map.py +64 -0
  172. package/md_cg/semantic/unify.py +45 -0
  173. package/md_cg/semantic/zh_en_atoms.py +139 -139
  174. package/md_cg/signer.py +562 -562
  175. package/md_cg/sources.py +815 -582
  176. package/md_cg/statushdr.py +179 -179
  177. package/md_cg/stg.py +48 -37
  178. package/md_cg/subgraph.py +729 -729
  179. package/md_cg/sustain.py +1138 -1138
  180. package/md_cg/tasks.py +470 -470
  181. package/md_cg/test_action_derive.py +203 -203
  182. package/md_cg/test_audit_rotate.py +270 -270
  183. package/md_cg/test_autonomy.py +143 -143
  184. package/md_cg/test_bench_governance.py +102 -102
  185. package/md_cg/test_blindspot_tickets.py +166 -166
  186. package/md_cg/test_branches.py +249 -249
  187. package/md_cg/test_ccg_perturb.py +184 -184
  188. package/md_cg/test_ccgc.py +433 -433
  189. package/md_cg/test_census_prune.py +81 -81
  190. package/md_cg/test_cond_compose_anchors.py +76 -76
  191. package/md_cg/test_cond_match.py +165 -165
  192. package/md_cg/test_condition_anchor.py +81 -81
  193. package/md_cg/test_d_meta.py +412 -412
  194. package/md_cg/test_datapath_root.py +199 -199
  195. package/md_cg/test_en_pipeline.py +166 -166
  196. package/md_cg/test_gain_gate.py +212 -212
  197. package/md_cg/test_health_scale.py +173 -173
  198. package/md_cg/test_hive_ingest.py +285 -0
  199. package/md_cg/test_hot_cold.py +215 -215
  200. package/md_cg/test_hyperedge.py +245 -245
  201. package/md_cg/test_i26_empty_first_write.py +116 -0
  202. package/md_cg/test_i27_e041_identity.py +128 -0
  203. package/md_cg/test_i28_hotcache_prodpath.py +122 -0
  204. package/md_cg/test_identity_attribution.py +147 -147
  205. package/md_cg/test_index_durability.py +224 -224
  206. package/md_cg/test_interop.py +93 -0
  207. package/md_cg/test_lifecycle.py +309 -309
  208. package/md_cg/test_linkref.py +306 -306
  209. package/md_cg/test_lock.py +43 -43
  210. package/md_cg/test_md_access_parity.py +255 -255
  211. package/md_cg/test_md_writepath.py +345 -345
  212. package/md_cg/test_mdstore_search_parity.py +160 -0
  213. package/md_cg/test_mr_m2.py +587 -587
  214. package/md_cg/test_mr_m3.py +710 -710
  215. package/md_cg/test_mr_m4.py +485 -485
  216. package/md_cg/test_p0.py +250 -250
  217. package/md_cg/test_p1.py +316 -316
  218. package/md_cg/test_p10_identity.py +173 -173
  219. package/md_cg/test_p11_consistency.py +233 -233
  220. package/md_cg/test_p12_metacognition.py +212 -212
  221. package/md_cg/test_p13_encryption.py +241 -241
  222. package/md_cg/test_p14_sustain.py +249 -249
  223. package/md_cg/test_p15_scrub.py +280 -280
  224. package/md_cg/test_p16_self_state.py +301 -301
  225. package/md_cg/test_p17_predict.py +354 -354
  226. package/md_cg/test_p18_whitebox.py +171 -171
  227. package/md_cg/test_p19_migrate_roleplay.py +149 -149
  228. package/md_cg/test_p20_evolution.py +315 -315
  229. package/md_cg/test_p21_tokens.py +293 -270
  230. package/md_cg/test_p22_theory.py +175 -175
  231. package/md_cg/test_p23_links.py +311 -311
  232. package/md_cg/test_p24_evidence.py +227 -227
  233. package/md_cg/test_p25_weights.py +156 -156
  234. package/md_cg/test_p26_refindex.py +416 -416
  235. package/md_cg/test_p27_docindex.py +765 -765
  236. package/md_cg/test_p28_refcheck.py +305 -305
  237. package/md_cg/test_p29_session_ingest_export.py +354 -333
  238. package/md_cg/test_p3.py +11 -2
  239. package/md_cg/test_p30_maintain.py +330 -330
  240. package/md_cg/test_p31_insight.py +534 -534
  241. package/md_cg/test_p32_backfill.py +298 -298
  242. package/md_cg/test_p33_ccg_wiring.py +293 -293
  243. package/md_cg/test_p34_crosscheck.py +331 -331
  244. package/md_cg/test_p35_conditioned_claim.py +252 -252
  245. package/md_cg/test_p36_kp_align.py +230 -230
  246. package/md_cg/test_p37_condition_space.py +248 -248
  247. package/md_cg/test_p38_concurrent_flush.py +102 -0
  248. package/md_cg/test_p38_contextualize.py +273 -273
  249. package/md_cg/test_p39_verify_flow.py +113 -0
  250. package/md_cg/test_p39_vision_evidence.py +369 -369
  251. package/md_cg/test_p40_refine_worklist.py +241 -241
  252. package/md_cg/test_p41_evolve_patrol.py +224 -224
  253. package/md_cg/test_p42_provenance.py +269 -269
  254. package/md_cg/test_p43_pooling.py +412 -398
  255. package/md_cg/test_p44_md_whitebox.py +231 -231
  256. package/md_cg/test_p45_session_identity.py +219 -219
  257. package/md_cg/test_p46_unit_scope.py +272 -272
  258. package/md_cg/test_p47_session_view.py +281 -0
  259. package/md_cg/test_p4_fuzzy.py +223 -223
  260. package/md_cg/test_p5_semantic.py +226 -226
  261. package/md_cg/test_p6_consolidate.py +440 -387
  262. package/md_cg/test_p7_goals_recent.py +202 -202
  263. package/md_cg/test_p8_subgraph_chain.py +200 -200
  264. package/md_cg/test_p9_forget_protect.py +231 -231
  265. package/md_cg/test_predict_beta.py +135 -135
  266. package/md_cg/test_preflight_failclosed.py +100 -100
  267. package/md_cg/test_progressive.py +146 -146
  268. package/md_cg/test_protocol.py +243 -243
  269. package/md_cg/test_reach.py +378 -378
  270. package/md_cg/test_reach_keys.py +201 -201
  271. package/md_cg/test_read_clip.py +141 -141
  272. package/md_cg/test_readcache_prodpath.py +155 -0
  273. package/md_cg/test_retr_gates_prodpath.py +140 -0
  274. package/md_cg/test_retr_s1.py +340 -340
  275. package/md_cg/test_retr_s1b.py +209 -209
  276. package/md_cg/test_retr_s3.py +194 -194
  277. package/md_cg/test_retr_s4.py +163 -163
  278. package/md_cg/test_retr_s5.py +200 -200
  279. package/md_cg/test_retr_s6.py +157 -157
  280. package/md_cg/test_retr_s7.py +384 -384
  281. package/md_cg/test_retr_s8_time.py +369 -316
  282. package/md_cg/test_retr_s9_edges.py +286 -286
  283. package/md_cg/test_retr_s9_entity_ctx.py +175 -175
  284. package/md_cg/test_review_conformance.py +367 -367
  285. package/md_cg/test_role_views.py +354 -354
  286. package/md_cg/test_sem_noise.py +242 -242
  287. package/md_cg/test_semantic_canonical.py +241 -241
  288. package/md_cg/test_subproc_encoding.py +192 -192
  289. package/md_cg/test_sustain_mutual.py +153 -153
  290. package/md_cg/test_tasks.py +409 -409
  291. package/md_cg/test_tool_face.py +189 -189
  292. package/md_cg/test_transfer.py +180 -180
  293. package/md_cg/test_trust.py +361 -361
  294. package/md_cg/test_twophase.py +286 -286
  295. package/md_cg/test_v14_fixes.py +397 -397
  296. package/md_cg/test_validity_filter.py +280 -280
  297. package/md_cg/test_verify_answer.py +138 -138
  298. package/md_cg/test_wisdom_md_store.py +292 -292
  299. package/md_cg/test_writelimit.py +197 -197
  300. package/md_cg/test_writepipe.py +214 -214
  301. package/md_cg/theory.py +273 -273
  302. package/md_cg/tokens.py +677 -663
  303. package/md_cg/tool_face.py +260 -260
  304. package/md_cg/trust.py +986 -950
  305. package/md_cg/twophase.py +231 -231
  306. package/md_cg/units.py +667 -667
  307. package/md_cg/vision_evidence.py +666 -666
  308. package/md_cg/weights.py +624 -624
  309. package/md_cg/whitebox.py +527 -527
  310. package/md_cg/whitebox_kb/__init__.py +37 -37
  311. package/md_cg/whitebox_kb/aeis_core/__init__.py +42 -42
  312. package/md_cg/whitebox_kb/aeis_core/semantic.py +280 -280
  313. package/md_cg/whitebox_kb/aeis_core/textutil.py +13 -13
  314. package/md_cg/whitebox_kb/engine.py +310 -310
  315. package/md_cg/whitebox_kb/seed_knowledge//346/231/272/350/203/275/350/256/2723.4.md +5260 -5260
  316. package/md_cg/whitebox_kb/wisdom/browser_units.py +2631 -2631
  317. package/md_cg/whitebox_kb/wisdom/causal_discover.py +432 -432
  318. package/md_cg/whitebox_kb/wisdom/chat_engine.py +1506 -1506
  319. package/md_cg/whitebox_kb/wisdom/code_solidified.json +6195 -6195
  320. package/md_cg/whitebox_kb/wisdom/compiler_code_units.py +3033 -3033
  321. package/md_cg/whitebox_kb/wisdom/condition_algebra.py +112 -112
  322. package/md_cg/whitebox_kb/wisdom/condition_frame.py +315 -315
  323. package/md_cg/whitebox_kb/wisdom/condition_kb.py +108 -108
  324. package/md_cg/whitebox_kb/wisdom/conflict_map.json +4445 -4445
  325. package/md_cg/whitebox_kb/wisdom/core/lexer.py +512 -512
  326. package/md_cg/whitebox_kb/wisdom/core/name_checker.py +1023 -1023
  327. package/md_cg/whitebox_kb/wisdom/cspmn.py +258 -258
  328. package/md_cg/whitebox_kb/wisdom/csre.py +264 -264
  329. package/md_cg/whitebox_kb/wisdom/danmaku_audit.py +252 -252
  330. package/md_cg/whitebox_kb/wisdom/distilled_condition_units.json +6417 -6417
  331. package/md_cg/whitebox_kb/wisdom/docs/WB-EVAL-20260902b.json +1950 -1950
  332. package/md_cg/whitebox_kb/wisdom/docs/WB-EVAL-20260902c.json +1296 -1296
  333. package/md_cg/whitebox_kb/wisdom/docs/whitebox_capability_graph_demo.json +59 -59
  334. package/md_cg/whitebox_kb/wisdom/graph_db_units.py +3089 -3089
  335. package/md_cg/whitebox_kb/wisdom/knowledge_points.py +318 -318
  336. package/md_cg/whitebox_kb/wisdom/md_access.py +470 -470
  337. package/md_cg/whitebox_kb/wisdom/md_store.py +276 -251
  338. package/md_cg/whitebox_kb/wisdom/migrate_wisdom.py +476 -476
  339. package/md_cg/whitebox_kb/wisdom/navigate.py +248 -248
  340. package/md_cg/whitebox_kb/wisdom/neural_retrieve.py +224 -224
  341. package/md_cg/whitebox_kb/wisdom/os_units.py +2735 -2735
  342. package/md_cg/whitebox_kb/wisdom/pattern_separation.py +376 -376
  343. package/md_cg/whitebox_kb/wisdom/prereq_map.json +364 -364
  344. package/md_cg/whitebox_kb/wisdom/python_code_units.py +2766 -2766
  345. package/md_cg/whitebox_kb/wisdom/role_solidified.json +7 -7
  346. package/md_cg/whitebox_kb/wisdom/route_memory.py +244 -244
  347. package/md_cg/whitebox_kb/wisdom/scene_reconstruction.py +148 -148
  348. package/md_cg/whitebox_kb/wisdom/snr_report.json +40 -40
  349. package/md_cg/whitebox_kb/wisdom/test_code_compose_domains.py +7541 -7541
  350. package/md_cg/whitebox_kb/wisdom/test_compiler_self_bootstrap.py +354 -354
  351. package/md_cg/whitebox_kb/wisdom/test_ecosystem_assembly.py +158 -158
  352. package/md_cg/whitebox_kb/wisdom/test_ecosystem_demos.py +193 -193
  353. package/md_cg/whitebox_kb/wisdom/test_graph_db.py +292 -292
  354. package/md_cg/whitebox_kb/wisdom/test_python_self_bootstrap.py +160 -160
  355. package/md_cg/whitebox_kb/wisdom/trigger_words_index.json +4366 -4366
  356. package/md_cg/whitebox_kb/wisdom/verifier.py +1297 -1297
  357. package/md_cg/writelimit.py +356 -356
  358. package/md_cg/writepipe.py +550 -542
  359. package/package.json +97 -96
  360. package/skills/plugin.json +54 -54
  361. package/skills/skills/designer-perspective/SKILL.md +158 -158
  362. package/skills/skills/designer-perspective/references/01-observation-position.md +66 -66
  363. package/skills/skills/designer-perspective/references/02-structure-recognition.md +62 -62
  364. package/skills/skills/designer-perspective/references/03-direction-judgment.md +55 -55
  365. package/skills/skills/designer-perspective/references/04-qualification-verdict.md +72 -72
  366. package/skills/skills/designer-perspective/references/05-condition-attribution.md +74 -74
  367. package/skills/skills/designer-perspective/scripts/designer.py +545 -545
  368. package/skills/skills/designer-perspective/tests/cases.jsonl +17 -17
  369. package/skills/skills/designer-perspective/tests/selftest.py +61 -61
  370. package/skills/skills/lingshu-browser/SKILL.md +60 -60
  371. package/skills/skills/lingshu-compiler/SKILL.md +56 -56
  372. package/skills/skills/lingshu-compiler/units/analyze-type-infer/SKILL.md +45 -45
  373. package/skills/skills/lingshu-compiler/units/check-name-real/SKILL.md +45 -45
  374. package/skills/skills/lingshu-compiler/units/compile-assign/SKILL.md +45 -45
  375. package/skills/skills/lingshu-compiler/units/compile-expr-tree/SKILL.md +45 -45
  376. package/skills/skills/lingshu-compiler/units/compile-full-pipeline/SKILL.md +45 -45
  377. package/skills/skills/lingshu-compiler/units/compile-func-def/SKILL.md +45 -45
  378. package/skills/skills/lingshu-compiler/units/compile-if-then/SKILL.md +45 -45
  379. package/skills/skills/lingshu-compiler/units/compile-logic-expr/SKILL.md +45 -45
  380. package/skills/skills/lingshu-compiler/units/compile-recursive/SKILL.md +45 -45
  381. package/skills/skills/lingshu-compiler/units/compile-scope/SKILL.md +45 -45
  382. package/skills/skills/lingshu-compiler/units/compile-type-check/SKILL.md +45 -45
  383. package/skills/skills/lingshu-compiler/units/compile-while/SKILL.md +45 -45
  384. package/skills/skills/lingshu-compiler/units/compiler-0010c4bf/SKILL.md +45 -45
  385. package/skills/skills/lingshu-compiler/units/compiler-0355bffb/SKILL.md +45 -45
  386. package/skills/skills/lingshu-compiler/units/compiler-0361708a/SKILL.md +45 -45
  387. package/skills/skills/lingshu-compiler/units/compiler-054a0414/SKILL.md +45 -45
  388. package/skills/skills/lingshu-compiler/units/compiler-05a1691a/SKILL.md +45 -45
  389. package/skills/skills/lingshu-compiler/units/compiler-05eeed1e/SKILL.md +45 -45
  390. package/skills/skills/lingshu-compiler/units/compiler-0622a1f6/SKILL.md +45 -45
  391. package/skills/skills/lingshu-compiler/units/compiler-08b54217/SKILL.md +45 -45
  392. package/skills/skills/lingshu-compiler/units/compiler-0a62b70c/SKILL.md +45 -45
  393. package/skills/skills/lingshu-compiler/units/compiler-0ab24d00/SKILL.md +45 -45
  394. package/skills/skills/lingshu-compiler/units/compiler-0e093688/SKILL.md +45 -45
  395. package/skills/skills/lingshu-compiler/units/compiler-0e82b966/SKILL.md +45 -45
  396. package/skills/skills/lingshu-compiler/units/compiler-0ee9b9b9/SKILL.md +45 -45
  397. package/skills/skills/lingshu-compiler/units/compiler-0f3787e6/SKILL.md +45 -45
  398. package/skills/skills/lingshu-compiler/units/compiler-1028685f/SKILL.md +45 -45
  399. package/skills/skills/lingshu-compiler/units/compiler-11897630/SKILL.md +45 -45
  400. package/skills/skills/lingshu-compiler/units/compiler-16661b9b/SKILL.md +45 -45
  401. package/skills/skills/lingshu-compiler/units/compiler-1f722303/SKILL.md +45 -45
  402. package/skills/skills/lingshu-compiler/units/compiler-25be1262/SKILL.md +45 -45
  403. package/skills/skills/lingshu-compiler/units/compiler-2a76ba07/SKILL.md +45 -45
  404. package/skills/skills/lingshu-compiler/units/compiler-2dbea54a/SKILL.md +45 -45
  405. package/skills/skills/lingshu-compiler/units/compiler-2df52f16/SKILL.md +45 -45
  406. package/skills/skills/lingshu-compiler/units/compiler-2ec2c9d2/SKILL.md +45 -45
  407. package/skills/skills/lingshu-compiler/units/compiler-2f8c8f39/SKILL.md +45 -45
  408. package/skills/skills/lingshu-compiler/units/compiler-38378ac7/SKILL.md +45 -45
  409. package/skills/skills/lingshu-compiler/units/compiler-39457d2e/SKILL.md +45 -45
  410. package/skills/skills/lingshu-compiler/units/compiler-39fb5926/SKILL.md +45 -45
  411. package/skills/skills/lingshu-compiler/units/compiler-47f4fbfa/SKILL.md +45 -45
  412. package/skills/skills/lingshu-compiler/units/compiler-4a8cd1f1/SKILL.md +45 -45
  413. package/skills/skills/lingshu-compiler/units/compiler-4b230b6b/SKILL.md +45 -45
  414. package/skills/skills/lingshu-compiler/units/compiler-4cbbda95/SKILL.md +45 -45
  415. package/skills/skills/lingshu-compiler/units/compiler-4d5a68ff/SKILL.md +45 -45
  416. package/skills/skills/lingshu-compiler/units/compiler-56dc9bdd/SKILL.md +45 -45
  417. package/skills/skills/lingshu-compiler/units/compiler-57e76ebe/SKILL.md +45 -45
  418. package/skills/skills/lingshu-compiler/units/compiler-61ff016b/SKILL.md +45 -45
  419. package/skills/skills/lingshu-compiler/units/compiler-63eae588/SKILL.md +45 -45
  420. package/skills/skills/lingshu-compiler/units/compiler-64c4224b/SKILL.md +45 -45
  421. package/skills/skills/lingshu-compiler/units/compiler-66377955/SKILL.md +45 -45
  422. package/skills/skills/lingshu-compiler/units/compiler-674ab4f6/SKILL.md +45 -45
  423. package/skills/skills/lingshu-compiler/units/compiler-6af76fd6/SKILL.md +45 -45
  424. package/skills/skills/lingshu-compiler/units/compiler-6d979db2/SKILL.md +45 -45
  425. package/skills/skills/lingshu-compiler/units/compiler-6de326c0/SKILL.md +45 -45
  426. package/skills/skills/lingshu-compiler/units/compiler-6f1c0eea/SKILL.md +45 -45
  427. package/skills/skills/lingshu-compiler/units/compiler-724d6c9b/SKILL.md +45 -45
  428. package/skills/skills/lingshu-compiler/units/compiler-7690177f/SKILL.md +45 -45
  429. package/skills/skills/lingshu-compiler/units/compiler-7b229a7d/SKILL.md +45 -45
  430. package/skills/skills/lingshu-compiler/units/compiler-7f471b3a/SKILL.md +45 -45
  431. package/skills/skills/lingshu-compiler/units/compiler-815cad08/SKILL.md +45 -45
  432. package/skills/skills/lingshu-compiler/units/compiler-83c61634/SKILL.md +45 -45
  433. package/skills/skills/lingshu-compiler/units/compiler-8c798c81/SKILL.md +45 -45
  434. package/skills/skills/lingshu-compiler/units/compiler-8dd747ac/SKILL.md +45 -45
  435. package/skills/skills/lingshu-compiler/units/compiler-90324d0a/SKILL.md +45 -45
  436. package/skills/skills/lingshu-compiler/units/compiler-94b8d72d/SKILL.md +45 -45
  437. package/skills/skills/lingshu-compiler/units/compiler-94f12231/SKILL.md +45 -45
  438. package/skills/skills/lingshu-compiler/units/compiler-95937c16/SKILL.md +45 -45
  439. package/skills/skills/lingshu-compiler/units/compiler-98a5625b/SKILL.md +45 -45
  440. package/skills/skills/lingshu-compiler/units/compiler-98b4c42f/SKILL.md +45 -45
  441. package/skills/skills/lingshu-compiler/units/compiler-98e3894a/SKILL.md +45 -45
  442. package/skills/skills/lingshu-compiler/units/compiler-9bdfe4b8/SKILL.md +45 -45
  443. package/skills/skills/lingshu-compiler/units/compiler-9d9b4e83/SKILL.md +45 -45
  444. package/skills/skills/lingshu-compiler/units/compiler-9f7be5ad/SKILL.md +45 -45
  445. package/skills/skills/lingshu-compiler/units/compiler-a6daf076/SKILL.md +45 -45
  446. package/skills/skills/lingshu-compiler/units/compiler-a7995a0c/SKILL.md +45 -45
  447. package/skills/skills/lingshu-compiler/units/compiler-a8399248/SKILL.md +45 -45
  448. package/skills/skills/lingshu-compiler/units/compiler-aabbd099/SKILL.md +45 -45
  449. package/skills/skills/lingshu-compiler/units/compiler-afe169d8/SKILL.md +45 -45
  450. package/skills/skills/lingshu-compiler/units/compiler-b0678bda/SKILL.md +45 -45
  451. package/skills/skills/lingshu-compiler/units/compiler-b09bd196/SKILL.md +45 -45
  452. package/skills/skills/lingshu-compiler/units/compiler-b1396e23/SKILL.md +45 -45
  453. package/skills/skills/lingshu-compiler/units/compiler-b9b31ce0/SKILL.md +45 -45
  454. package/skills/skills/lingshu-compiler/units/compiler-c10264a7/SKILL.md +45 -45
  455. package/skills/skills/lingshu-compiler/units/compiler-cb1e8e4b/SKILL.md +45 -45
  456. package/skills/skills/lingshu-compiler/units/compiler-ccafd438/SKILL.md +45 -45
  457. package/skills/skills/lingshu-compiler/units/compiler-cda9c262/SKILL.md +45 -45
  458. package/skills/skills/lingshu-compiler/units/compiler-ce648068/SKILL.md +45 -45
  459. package/skills/skills/lingshu-compiler/units/compiler-cf5776a4/SKILL.md +45 -45
  460. package/skills/skills/lingshu-compiler/units/compiler-d974e5d3/SKILL.md +45 -45
  461. package/skills/skills/lingshu-compiler/units/compiler-e3979fd3/SKILL.md +45 -45
  462. package/skills/skills/lingshu-compiler/units/compiler-eb1cf2b5/SKILL.md +45 -45
  463. package/skills/skills/lingshu-compiler/units/compiler-ecb30d5b/SKILL.md +45 -45
  464. package/skills/skills/lingshu-compiler/units/compiler-f8c8b24b/SKILL.md +45 -45
  465. package/skills/skills/lingshu-compiler/units/compiler-f99fedbe/SKILL.md +45 -45
  466. package/skills/skills/lingshu-compiler/units/compiler-fa8ff5f7/SKILL.md +45 -45
  467. package/skills/skills/lingshu-compiler/units/compiler-fe1b058d/SKILL.md +45 -45
  468. package/skills/skills/lingshu-compiler/units/lex-chinese-program/SKILL.md +45 -45
  469. package/skills/skills/lingshu-compiler/units/lex-dao-de-jing/SKILL.md +45 -45
  470. package/skills/skills/lingshu-compiler/units/lex-nine-chapters/SKILL.md +45 -45
  471. package/skills/skills/lingshu-compiler/units/vm-arithmetic/SKILL.md +45 -45
  472. package/skills/skills/lingshu-compiler/units/vm-array-ops/SKILL.md +45 -45
  473. package/skills/skills/lingshu-compiler/units/vm-closure-call/SKILL.md +45 -45
  474. package/skills/skills/lingshu-compiler/units/vm-closure-create/SKILL.md +45 -45
  475. package/skills/skills/lingshu-compiler/units/vm-compare/SKILL.md +45 -45
  476. package/skills/skills/lingshu-compiler/units/vm-cond-jump/SKILL.md +45 -45
  477. package/skills/skills/lingshu-compiler/units/vm-cond-space/SKILL.md +45 -45
  478. package/skills/skills/lingshu-compiler/units/vm-exception/SKILL.md +45 -45
  479. package/skills/skills/lingshu-compiler/units/vm-func-call/SKILL.md +45 -45
  480. package/skills/skills/lingshu-compiler/units/vm-loop-run/SKILL.md +45 -45
  481. package/skills/skills/lingshu-compiler/units/vm-profiling/SKILL.md +45 -45
  482. package/skills/skills/lingshu-compiler/units/vm-refcount/SKILL.md +45 -45
  483. package/skills/skills/lingshu-compiler/units/vm-run-loop/SKILL.md +45 -45
  484. package/skills/skills/lingshu-compiler/units/vm-short-circuit/SKILL.md +45 -45
  485. package/skills/skills/lingshu-compiler/units/vm-stack-guard/SKILL.md +45 -45
  486. package/skills/skills/lingshu-compiler/units/vm-stack-ops/SKILL.md +45 -45
  487. package/skills/skills/lingshu-compiler/units/vm-trust-accum/SKILL.md +45 -45
  488. package/skills/skills/lingshu-graph/SKILL.md +63 -63
  489. package/skills/skills/lingshu-net/SKILL.md +48 -48
  490. package/skills/skills/lingshu-os/SKILL.md +64 -64
  491. package/skills/skills/lingshu-pylang/SKILL.md +71 -71
  492. package/src/bridge.ts +401 -401
  493. package/src/hooks.ts +38 -2
  494. package/src/lib/datapath.ts +326 -326
  495. package/src/lib/mdcg_client.ts +413 -413
  496. package/src/lib/mutual.ts +428 -428
  497. package/src/lib/prompt_safety.ts +62 -62
  498. package/src/lib/python_path.ts +71 -71
  499. package/src/lib/roleplay_web.ts +932 -932
  500. package/src/lib/token_store.ts +192 -192
  501. package/src/tools.ts +212 -212
  502. package/zcode/AGENTS.md +11 -3
  503. package/zcode/README.md +41 -41
  504. /package/docs/{mdcg → hive}//344/270/273/344/273/243/347/220/206/345/255/220/344/273/243/347/220/206/350/256/260/345/277/206/346/236/266/346/236/204/350/256/276/350/256/241.md" +0 -0
@@ -1,309 +1,309 @@
1
- # -*- coding: utf-8 -*-
2
- """组合盲测基线(P4 · unseen compositions)—— P1 Semantic Composition 的验收器。
3
-
4
- ## 为什么做这个(先例取证)
5
-
6
- 四臂/域轴消融(bench_zh_mad / bench_axis_domain)的语料与题库同源(locomo),
7
- 组合概念的「分解规则」经由 morpheme/synonym 源已在系统可见范围内 —— 无法回答
8
- 「系统对**没见过**的组合是否仍能召回」。P1(compositions.json + ontology typing)
9
- 落地前后需要一把不可被训练数据污染的尺子,故自造受控盲测集。
10
-
11
- ## 盲测纪律(全部机器断言,非口头承诺)
12
-
13
- 1. 未见组合词 **不在** atoms.json(assert_material 运行时断言;未来若 atoms 混入
14
- 组合词,本 bench 立即 fail —— 防盲测腐化);
15
- 2. 组成原子 **在** atoms.json(素材完整性);
16
- 3. 干扰文档 **不含** 任何 gold 组合词的连续子串(防「原子命中即算对」的假阳性);
17
- 4. L3 语义题的 query 与对应 gold 文档 **bigram 零交集**(纯语义层,生成时校验
18
- + 模板 re-roll);L1/L2 query 允许词面重叠(它们考的就是词面/跨语词面)。
19
-
20
- ## 三档难度 × 两臂
21
-
22
- | 档 | query 形态 | 考什么 | 预期 |
23
- |---|---|---|---|
24
- | L1_surface | 组合词中文词面(马肉) | bigram 基础召回 sanity | b0 高 |
25
- | L2_crosslingual | 英文组合词面(horse meat) | en→zh 语素映射 + 组合 | b0≈0;b1 视词表覆盖 |
26
- | L3_semantic | 中文语义描述(零 bigram 重叠) | 结构组合理解 | b0/b1≈0 → **P1 靶区** |
27
-
28
- 臂差异:
29
-
30
- * b0_legacy:MDCG_EN_ATOMS 未设(现状默认链路);
31
- * b1_enatoms:MDCG_EN_ATOMS=1(opt-in 跨语路,en_zh_terms 映射);
32
- * b2_comp:**MDCG_SEMANTIC=1 + gold 节点附加 fm.semantic 标准原子摘要**
33
- (2026-09-14 加入)。臂差异扩展声明:正文与 b0/b1 库逐字一致(「同库
34
- 同内容」守恒),差异仅在 gold 节点的 fm 衍生层——semantic 标准原子
35
- 摘要本身即被测变量(AI 写入侧归一 + 检索组合共现,semantic/canonical.py)。
36
- L3 提升即语义摘要路净效应;L1 词面直配(sim=1)不受 max 聚合拖累、
37
- L2 与 b0 同(enatoms 关——跨语路正交性对照);
38
- * b3_unified:**MDCG_SEMANTIC=1 + 原句直查**(2026-09-14 加入)。与 b2 同库
39
- (gold 带 fm.semantic),差异在查询侧:不做 q_atoms 手工替换,英文原题
40
- /中文原句直接进检索,归一在 canonical.query_atoms 内部完成——英文经
41
- en_normalizer 归一为中文语素、复合概念保持整词、与 doc 侧共享同一真源
42
- 切分器。「英文检索路径归一化到统一标准真源」的最小闭环实证:预期 L2
43
- 英文原题经归一命中 semantic 摘要(受控上界),L3 中文原句=中间态(词面
44
- 原子齐备题才可救,其余需查询侧归一即 b2 形态)。
45
-
46
- ## 判决标准
47
-
48
- * L1 b0 hit@1 低 → 基础召回回归问题(先修基础,不谈组合);
49
- * L2 b1 > b0 → en_zh_terms 对未见组合有净增益;b1 亦≈0 → 对照 L2 白箱探针
50
- 归因「词表映射缺失」vs「组合结构缺失」(前者属 en 词表工作,后者属 P1);
51
- * L3 双臂≈0 → 现有路对该层无解,量化 P1 的增益空间上限;
52
- b2 L3 > 0 → 语义摘要路净效应实证(受控上界);b2 L3=100 且 L1/L2
53
- 与基线一致 → max 聚合与跨语路正交性同证。
54
-
55
- ## 诚实条款
56
-
57
- * 自造语料 33 篇 / 33 题,n 小 → 题级 CV 大(n=100 时 CV≈8.3%,n=33 显著放大)
58
- → 只做方向性判读,差距 <20% 不可下结论;
59
- * 组合配对(马肉/羊奶…)由出题人显式枚举,未经语料统计验证自然度;
60
- * 「牛肉/鸡蛋」等常用复合词在 atoms 是 serialize 出口的既有设计
61
- (zh_en_atoms.segment 贪心最长匹配依赖),不在本盲测评判范围;
62
- atoms 中长概念污染(整句/课程名)另案处理,属 P1 前置清单;
63
- * 指标为受控上界口径:池 = gold + 受控干扰,无开放域噪声;
64
- * 语料生成 seed 固定、纯规则零 LLM,同输入必同输出,可第三方重放。
65
-
66
- 跑法:python -m md_cg.bench_blind_comp
67
- """
68
- import json
69
- import os
70
- import random
71
- import shutil
72
- import sys
73
- import time
74
-
75
- HERE = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
76
- for _p in (HERE, os.path.join(HERE, "md_cg")):
77
- if _p not in sys.path:
78
- sys.path.insert(0, _p)
79
-
80
- from md_cg import eval_common as ec # noqa: E402
81
- from md_cg import mdcg as mg # noqa: E402 L2 白箱探针
82
- from md_cg.mdcos import MdCGOS # noqa: E402
83
-
84
- SEED = 7
85
- ARM_ROOT = os.path.join(HERE, "_md_cg_eval_blind") # .gitignore /_md_cg_eval_*/ 已覆盖
86
- ATOMS_PATH = os.path.join(HERE, "md_cg", "semantic", "atoms.json")
87
-
88
- # 未见组合(组成原子均已确认在 atoms:马鱼狗鸟羊猪鸭 / 肉奶蛋油)
89
- UNSEEN = ["马肉", "鱼肉", "狗肉", "鸟肉", "羊奶", "马奶", "鸭蛋", "鱼蛋",
90
- "鱼油", "羊油", "猪油"]
91
- L3_SET = {"鱼油", "羊油", "猪油"}
92
- COMP_EN = {"马肉": "horse meat", "鱼肉": "fish meat", "狗肉": "dog meat",
93
- "鸟肉": "bird meat", "羊奶": "goat milk", "马奶": "mare milk",
94
- "鸭蛋": "duck egg", "鱼蛋": "fish egg",
95
- "鱼油": "fish oil", "羊油": "sheep fat", "猪油": "pig fat"}
96
- COMP_L3 = {"鱼油": "体检后医生建议我补充一些从深海鱼类里提取的油脂",
97
- "羊油": "那种用羊的脂肪慢慢熬出来的白色油脂,是火锅底料的灵魂",
98
- "猪油": "妈妈熬了一罐雪白的荤油,拌饭特别香"}
99
- # L3 query 的标准原子串(设想终态:查询侧 AI 归一产物——AI 检索前按基准
100
- # 词表把原句归一为标准原子。bench 中手工标注,模拟 AI 归一;原句直查=
101
- # 中间态,代码侧无同义表时只救词面原子齐备题——本 seed 实测 1/3(鱼油),
102
- # 羊油(脂肪→油 距离 12>win6)与猪油(荤油无「猪」字)必须经查询侧归一)
103
- L3_QUERY_ATOMS = {"鱼油": "鱼 油", "羊油": "羊 油", "猪油": "猪 油"}
104
-
105
- G_TPL = [
106
- "今天午饭吃了{c},味道不错,下次还做。",
107
- "周末试着做了{c},家人都说好吃。",
108
- "朋友来家里聚餐,我特意准备了{c}。",
109
- "楼下新开的小馆子,招牌就是{c}。",
110
- "昨天在食堂居然吃到了{c},挺意外。",
111
- "妈妈寄来了做{c}用的食材,让我自己学着做。",
112
- "电视里正在介绍{c}的家常做法。",
113
- "下班路上买了{c},打算明天当早饭。",
114
- ]
115
- D_TPL = [
116
- "下午去市场买了{a},价格比昨天便宜一些。",
117
- "晚上用{a}和{b}做了两道菜,都没放辣椒。",
118
- "冰箱里还剩点{a},再不吃就要坏了。",
119
- "便利店买的{b}有点贵,下次去批发市场。",
120
- ]
121
- # 干扰原子池:只取组成原子自身(错位搭配由生成+断言保证不构成 gold)
122
- DISTRACT_POOL = ["马", "鱼", "狗", "鸟", "羊", "猪", "鸭", "肉", "奶", "蛋", "油", "米"]
123
-
124
-
125
- # 生效条件:s 为字符串时返回其全部相邻二元组集合;当 len(s) 小于 2 时返回空集合。
126
- def _bigrams(s):
127
- return {s[i:i + 2] for i in range(len(s) - 1)}
128
-
129
-
130
- # 生效条件:无参调用且 ATOMS_PATH 载入 atoms 后,逐条确认 UNSEEN 各组合词不在其中文集合、其相邻字符对均为原子,并确认 UNSEEN 无重复、set(COMP_EN)==set(UNSEEN)、set(COMP_L3)<=set(UNSEEN),全部成立才静默通过,任一断言不成立即 AssertionError。
131
- def assert_material():
132
- """盲测纪律的机器化:素材在/不在 atoms + 组合词互相不冲突。"""
133
- atoms = json.load(open(ATOMS_PATH, encoding="utf-8"))["atoms"]
134
- zh = {a["zh"] for a in atoms}
135
- for c in UNSEEN:
136
- assert c not in zh, "盲测腐化:组合词 %r 已混入 atoms" % c
137
- for i in range(len(c) - 1):
138
- assert c[i] in zh and c[i + 1] in zh, \
139
- "素材缺原子:%r 需要 %r/%r" % (c, c[i], c[i + 1])
140
- assert len(set(UNSEEN)) == len(UNSEEN)
141
- assert set(COMP_EN) == set(UNSEEN) and set(COMP_L3) <= set(UNSEEN)
142
-
143
-
144
- # 生效条件:以 SEED 初始化 random.Random 后对 UNSEEN 每词按 G_TPL 取模板生成含 gold 的篇目,再对 j=0..21 用 DISTRACT_POOL 随机取两个不同词按 D_TPL 造文,50 次重试内首次出现不含 UNSEEN 任何组合词的文本即 break 并 append,22 篇齐备后返回 corpus,50 次全冲突则 raise AssertionError。
145
- def gen_corpus():
146
- """33 篇受控语料:11 gold + 22 干扰。确定性,断言内嵌。"""
147
- rng = random.Random(SEED)
148
- corpus = []
149
- for i, c in enumerate(UNSEEN):
150
- body = G_TPL[i % len(G_TPL)].format(c=c)
151
- corpus.append({"id": "g_%s" % c, "text": body, "gold": c})
152
- for j in range(22):
153
- for _try in range(50):
154
- a, b = rng.choice(DISTRACT_POOL), rng.choice(DISTRACT_POOL)
155
- if a == b:
156
- continue
157
- text = D_TPL[j % len(D_TPL)].format(a=a, b=b)
158
- if not any(c in text for c in UNSEEN): # 纪律3:零子串
159
- break
160
- else:
161
- raise AssertionError("干扰文档 50 次重试仍冲突(seed=%d)" % SEED)
162
- corpus.append({"id": "d_%02d" % (j + 1), "text": text, "gold": None})
163
- return corpus
164
-
165
-
166
- # 生效条件:对 UNSEEN 中每个 c 生成 L1 与 L2 题;当 c 属于 L3_SET 时,用 assert 强制其 COMP_L3 问句与 g_c 的 gold 文本 bigram 零交集,失败抛 AssertionError,通过后追加 L3 题。
167
- def gen_questions():
168
- """33 题。L3 生成时校验 query×gold bigram 零交集(纪律4)。"""
169
- questions = []
170
- for c in UNSEEN:
171
- questions.append({"qid": "L1|%s" % c, "qtype": "L1_surface",
172
- "question": c,
173
- "evidence_turns": ["g_%s" % c]})
174
- questions.append({"qid": "L2|%s" % c, "qtype": "L2_crosslingual",
175
- "question": COMP_EN[c],
176
- "evidence_turns": ["g_%s" % c]})
177
- if c in L3_SET:
178
- q = COMP_L3[c]
179
- gold_text = next(r["text"] for r in CORPUS if r["id"] == "g_%s" % c)
180
- assert not (_bigrams(q) & _bigrams(gold_text)), \
181
- "L3 纪律破坏:%r 与 gold %r bigram 相交" % (q, c)
182
- questions.append({"qid": "L3|%s" % c, "qtype": "L3_semantic",
183
- "question": q, "evidence_turns": ["g_%s" % c],
184
- "q_atoms": L3_QUERY_ATOMS[c]})
185
- return questions
186
-
187
-
188
- CORPUS = None # gen_questions 需引用语料正文(L3 校验),main 内先建语料
189
-
190
-
191
- # 生效条件:以 cg/questions/tag/en_atoms 与默认 semantic=False 调用时,en_atoms 为真则设 os.environ["MDCG_EN_ATOMS"]="1"、为假则 pop,semantic 为真则设 MDCG_SEMANTIC="1" 且仅当 semantic=="norm" 时把带真值 q_atoms 的题替换为 q_atoms 文本、semantic=="raw" 保持原句、semantic 为假则 pop,随后在 lexical 路径以 k=5 评测并返回 (按 ALL/L1_surface/L2_crosslingual/L3_semantic 分型的 by_type, 仅 en_atoms 为真时按 L2_crosslingual 题收集中文语素的 probe)。
192
- def run_arm(cg, questions, tag, en_atoms, semantic=False):
193
- """单臂评测:臂差异只在查询侧环境开关展开。返回 (summary_by_type, l2_probe)。
194
-
195
- semantic 三态:False=关;"norm"=查询侧 AI 归一(q_atoms 替换,b2 臂);
196
- "raw"=原句直查(归一在 canonical.query_atoms 内部完成,b3 臂——统一
197
- 真源路,英文 query 同路:en_normalizer→中文语素→标准原子)。
198
- """
199
- if en_atoms:
200
- os.environ["MDCG_EN_ATOMS"] = "1"
201
- else:
202
- os.environ.pop("MDCG_EN_ATOMS", None)
203
- if semantic:
204
- os.environ["MDCG_SEMANTIC"] = "1"
205
- if semantic == "norm":
206
- # 设想终态:查询侧 AI 归一——检索前把原句按基准词表归一为标准原子串
207
- questions = [dict(q, question=q["q_atoms"]) if q.get("q_atoms") else q
208
- for q in questions]
209
- # semantic == "raw":原句直查,两端归一共享同一真源切分器
210
- else:
211
- os.environ.pop("MDCG_SEMANTIC", None)
212
- rows = ec.evaluate_group(cg, questions, k=5, paths=("lexical",),
213
- verbose=False)
214
- summ = ec.summarize(rows, k=5)
215
- by_type = {"ALL": summ}
216
- for lv in ("L1_surface", "L2_crosslingual", "L3_semantic"):
217
- sub = [r for r in rows if r["qtype"] == lv]
218
- by_type[lv] = ec.summarize(sub, k=5)
219
- # L2 白箱探针:展开出的中文语素(归因「映射缺失」vs「组合缺失」)
220
- probe = {}
221
- if en_atoms:
222
- for q in questions:
223
- if q["qtype"] != "L2_crosslingual":
224
- continue
225
- zh_terms = [t for t in mg.expand_query_terms(q["question"])
226
- if any("\u4e00" <= ch <= "\u9fff" for ch in t)]
227
- probe[q["qid"]] = zh_terms
228
- return by_type, probe
229
-
230
-
231
- # 生效条件:无参调用时先 assert_material 再经 gen_corpus/gen_questions 得到语料与题,os.path.isdir(ARM_ROOT) 为真则删除该目录,以 ARM_ROOT 建 cg 并写入 CORPUS 全部篇目,os.path.isdir(ARM_ROOT+"_b2") 为真则删除该目录、以该路径建 cg2 并仅对 gold 为真值的篇目附加 semantic=" ".join(gold) 后写入,再依次以 (cg,b0_legacy,False,False)/(cg,b1_enatoms,True,False)/(cg2,b2_comp,False,"norm")/(cg2,b3_unified,False,"raw") 四臂调 run_arm 汇总指标与 b1 的 L2 探针,最后 ec.save_result 写出 blind_comp_baseline.json 并在 out 中记录 seed/n_corpus/n_q/arms/l2_probe/elapsed_s/boundaries。
232
- def main():
233
- global CORPUS
234
- t0 = time.time()
235
- assert_material()
236
- CORPUS = gen_corpus()
237
- questions = gen_questions()
238
- print("[blind_comp] 素材断言通过;语料 %d 篇 / 题 %d 道(seed=%d)"
239
- % (len(CORPUS), len(questions), SEED))
240
-
241
- ec.unlock_global_cap()
242
- ec.use_jaccard()
243
-
244
- if os.path.isdir(ARM_ROOT):
245
- shutil.rmtree(ARM_ROOT, ignore_errors=True)
246
- cg = MdCGOS(ARM_ROOT, autoflush=500)
247
- for r in CORPUS:
248
- cg.add(r["id"], r["text"], layer="knowledge",
249
- eval_src="blind_comp", verification_basis="data")
250
- cg.flush()
251
- ec.install_read_cache(cg)
252
-
253
- out = {"seed": SEED, "n_corpus": len(CORPUS), "n_q": len(questions),
254
- "arms": {}, "l2_probe": {}}
255
- # b2 库:正文逐字一致,仅 gold 节点附加 fm.semantic 标准原子摘要
256
- # (模拟 AI 写入侧归一产物:同义体已按基准翻译成「鱼 油」类原子序列)
257
- arm2_root = ARM_ROOT + "_b2"
258
- if os.path.isdir(arm2_root):
259
- shutil.rmtree(arm2_root, ignore_errors=True)
260
- cg2 = MdCGOS(arm2_root, autoflush=500)
261
- for r in CORPUS:
262
- kw = {}
263
- if r["gold"]:
264
- kw["semantic"] = " ".join(r["gold"]) # 「鱼油」→「鱼 油」
265
- cg2.add(r["id"], r["text"], layer="knowledge",
266
- eval_src="blind_comp", verification_basis="data", **kw)
267
- cg2.flush()
268
- ec.install_read_cache(cg2)
269
-
270
- arms = ((cg, "b0_legacy", False, False),
271
- (cg, "b1_enatoms", True, False),
272
- (cg2, "b2_comp", False, "norm"),
273
- (cg2, "b3_unified", False, "raw"))
274
- for arm_cg, tag, en, sem in arms:
275
- by_type, probe = run_arm(arm_cg, questions, tag, en, semantic=sem)
276
- out["arms"][tag] = by_type
277
- out["l2_probe"][tag] = probe
278
- sem_desc = {False: "", "norm": ", 查询侧归一(q_atoms)",
279
- "raw": ", 原句直查(query_atoms 内部归一)"}.get(sem, "")
280
- print("\n== 臂 %s(MDCG_EN_ATOMS=%s, MDCG_SEMANTIC=%s%s%s)=="
281
- % (tag, "1" if en else "off", "1" if sem else "off",
282
- ", gold 带 fm.semantic" if sem else "", sem_desc))
283
- for lv in ("ALL", "L1_surface", "L2_crosslingual", "L3_semantic"):
284
- s = by_type[lv]
285
- print(" %-16s hit@1=%6.1f%% hit@5=%6.1f%% MRR=%.4f (n=%d)"
286
- % (lv, s["hit@1"] * 100, s["hit@5"] * 100, s["mrr"], s["n"]))
287
- if out["l2_probe"]["b1_enatoms"]:
288
- print("\n== L2 白箱探针(b1 展开出的中文语素)==")
289
- for qid, terms in out["l2_probe"]["b1_enatoms"].items():
290
- print(" %-16s -> %s" % (qid, terms or "(映射缺失)"))
291
-
292
- out["elapsed_s"] = round(time.time() - t0, 1)
293
- out["boundaries"] = [
294
- "自造受控语料 33 篇/33 题,n 小 CV 大,只做方向性判读",
295
- "组合配对为出题人显式枚举,未经语料统计验证",
296
- "b2 语义摘要为 gold 节点人工标注标准原子(模拟 AI 写入侧归一),"
297
- "非端到端自动归一质量;受控池 0 误配不可外推开放域"
298
- "(「鱼和油分述」需 P1 组合结构约束)",
299
- "L3 b0/b1 基线即该两路增益空间上限;P1 compositions 结构层另案",
300
- "b3 L2 受控上界:受控组合全在 en_normalizer 词表内"
301
- "(EN_ZH 已含 horse/goat/duck/mare/oil/fat),开放域英文受归一"
302
- "词表覆盖限制——开放域数字以 locomo-500 英文侧统一真源路实测为准",
303
- ]
304
- ec.save_result("blind_comp_baseline.json", out)
305
- print("\n[blind_comp] 完成,结果已存 blind_comp_baseline.json")
306
-
307
-
308
- if __name__ == "__main__":
1
+ # -*- coding: utf-8 -*-
2
+ """组合盲测基线(P4 · unseen compositions)—— P1 Semantic Composition 的验收器。
3
+
4
+ ## 为什么做这个(先例取证)
5
+
6
+ 四臂/域轴消融(bench_zh_mad / bench_axis_domain)的语料与题库同源(locomo),
7
+ 组合概念的「分解规则」经由 morpheme/synonym 源已在系统可见范围内 —— 无法回答
8
+ 「系统对**没见过**的组合是否仍能召回」。P1(compositions.json + ontology typing)
9
+ 落地前后需要一把不可被训练数据污染的尺子,故自造受控盲测集。
10
+
11
+ ## 盲测纪律(全部机器断言,非口头承诺)
12
+
13
+ 1. 未见组合词 **不在** atoms.json(assert_material 运行时断言;未来若 atoms 混入
14
+ 组合词,本 bench 立即 fail —— 防盲测腐化);
15
+ 2. 组成原子 **在** atoms.json(素材完整性);
16
+ 3. 干扰文档 **不含** 任何 gold 组合词的连续子串(防「原子命中即算对」的假阳性);
17
+ 4. L3 语义题的 query 与对应 gold 文档 **bigram 零交集**(纯语义层,生成时校验
18
+ + 模板 re-roll);L1/L2 query 允许词面重叠(它们考的就是词面/跨语词面)。
19
+
20
+ ## 三档难度 × 两臂
21
+
22
+ | 档 | query 形态 | 考什么 | 预期 |
23
+ |---|---|---|---|
24
+ | L1_surface | 组合词中文词面(马肉) | bigram 基础召回 sanity | b0 高 |
25
+ | L2_crosslingual | 英文组合词面(horse meat) | en→zh 语素映射 + 组合 | b0≈0;b1 视词表覆盖 |
26
+ | L3_semantic | 中文语义描述(零 bigram 重叠) | 结构组合理解 | b0/b1≈0 → **P1 靶区** |
27
+
28
+ 臂差异:
29
+
30
+ * b0_legacy:MDCG_EN_ATOMS 未设(现状默认链路);
31
+ * b1_enatoms:MDCG_EN_ATOMS=1(opt-in 跨语路,en_zh_terms 映射);
32
+ * b2_comp:**MDCG_SEMANTIC=1 + gold 节点附加 fm.semantic 标准原子摘要**
33
+ (2026-09-14 加入)。臂差异扩展声明:正文与 b0/b1 库逐字一致(「同库
34
+ 同内容」守恒),差异仅在 gold 节点的 fm 衍生层——semantic 标准原子
35
+ 摘要本身即被测变量(AI 写入侧归一 + 检索组合共现,semantic/canonical.py)。
36
+ L3 提升即语义摘要路净效应;L1 词面直配(sim=1)不受 max 聚合拖累、
37
+ L2 与 b0 同(enatoms 关——跨语路正交性对照);
38
+ * b3_unified:**MDCG_SEMANTIC=1 + 原句直查**(2026-09-14 加入)。与 b2 同库
39
+ (gold 带 fm.semantic),差异在查询侧:不做 q_atoms 手工替换,英文原题
40
+ /中文原句直接进检索,归一在 canonical.query_atoms 内部完成——英文经
41
+ en_normalizer 归一为中文语素、复合概念保持整词、与 doc 侧共享同一真源
42
+ 切分器。「英文检索路径归一化到统一标准真源」的最小闭环实证:预期 L2
43
+ 英文原题经归一命中 semantic 摘要(受控上界),L3 中文原句=中间态(词面
44
+ 原子齐备题才可救,其余需查询侧归一即 b2 形态)。
45
+
46
+ ## 判决标准
47
+
48
+ * L1 b0 hit@1 低 → 基础召回回归问题(先修基础,不谈组合);
49
+ * L2 b1 > b0 → en_zh_terms 对未见组合有净增益;b1 亦≈0 → 对照 L2 白箱探针
50
+ 归因「词表映射缺失」vs「组合结构缺失」(前者属 en 词表工作,后者属 P1);
51
+ * L3 双臂≈0 → 现有路对该层无解,量化 P1 的增益空间上限;
52
+ b2 L3 > 0 → 语义摘要路净效应实证(受控上界);b2 L3=100 且 L1/L2
53
+ 与基线一致 → max 聚合与跨语路正交性同证。
54
+
55
+ ## 诚实条款
56
+
57
+ * 自造语料 33 篇 / 33 题,n 小 → 题级 CV 大(n=100 时 CV≈8.3%,n=33 显著放大)
58
+ → 只做方向性判读,差距 <20% 不可下结论;
59
+ * 组合配对(马肉/羊奶…)由出题人显式枚举,未经语料统计验证自然度;
60
+ * 「牛肉/鸡蛋」等常用复合词在 atoms 是 serialize 出口的既有设计
61
+ (zh_en_atoms.segment 贪心最长匹配依赖),不在本盲测评判范围;
62
+ atoms 中长概念污染(整句/课程名)另案处理,属 P1 前置清单;
63
+ * 指标为受控上界口径:池 = gold + 受控干扰,无开放域噪声;
64
+ * 语料生成 seed 固定、纯规则零 LLM,同输入必同输出,可第三方重放。
65
+
66
+ 跑法:python -m md_cg.bench_blind_comp
67
+ """
68
+ import json
69
+ import os
70
+ import random
71
+ import shutil
72
+ import sys
73
+ import time
74
+
75
+ HERE = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
76
+ for _p in (HERE, os.path.join(HERE, "md_cg")):
77
+ if _p not in sys.path:
78
+ sys.path.insert(0, _p)
79
+
80
+ from md_cg import eval_common as ec # noqa: E402
81
+ from md_cg import mdcg as mg # noqa: E402 L2 白箱探针
82
+ from md_cg.mdcos import MdCGOS # noqa: E402
83
+
84
+ SEED = 7
85
+ ARM_ROOT = os.path.join(HERE, "_md_cg_eval_blind") # .gitignore /_md_cg_eval_*/ 已覆盖
86
+ ATOMS_PATH = os.path.join(HERE, "md_cg", "semantic", "atoms.json")
87
+
88
+ # 未见组合(组成原子均已确认在 atoms:马鱼狗鸟羊猪鸭 / 肉奶蛋油)
89
+ UNSEEN = ["马肉", "鱼肉", "狗肉", "鸟肉", "羊奶", "马奶", "鸭蛋", "鱼蛋",
90
+ "鱼油", "羊油", "猪油"]
91
+ L3_SET = {"鱼油", "羊油", "猪油"}
92
+ COMP_EN = {"马肉": "horse meat", "鱼肉": "fish meat", "狗肉": "dog meat",
93
+ "鸟肉": "bird meat", "羊奶": "goat milk", "马奶": "mare milk",
94
+ "鸭蛋": "duck egg", "鱼蛋": "fish egg",
95
+ "鱼油": "fish oil", "羊油": "sheep fat", "猪油": "pig fat"}
96
+ COMP_L3 = {"鱼油": "体检后医生建议我补充一些从深海鱼类里提取的油脂",
97
+ "羊油": "那种用羊的脂肪慢慢熬出来的白色油脂,是火锅底料的灵魂",
98
+ "猪油": "妈妈熬了一罐雪白的荤油,拌饭特别香"}
99
+ # L3 query 的标准原子串(设想终态:查询侧 AI 归一产物——AI 检索前按基准
100
+ # 词表把原句归一为标准原子。bench 中手工标注,模拟 AI 归一;原句直查=
101
+ # 中间态,代码侧无同义表时只救词面原子齐备题——本 seed 实测 1/3(鱼油),
102
+ # 羊油(脂肪→油 距离 12>win6)与猪油(荤油无「猪」字)必须经查询侧归一)
103
+ L3_QUERY_ATOMS = {"鱼油": "鱼 油", "羊油": "羊 油", "猪油": "猪 油"}
104
+
105
+ G_TPL = [
106
+ "今天午饭吃了{c},味道不错,下次还做。",
107
+ "周末试着做了{c},家人都说好吃。",
108
+ "朋友来家里聚餐,我特意准备了{c}。",
109
+ "楼下新开的小馆子,招牌就是{c}。",
110
+ "昨天在食堂居然吃到了{c},挺意外。",
111
+ "妈妈寄来了做{c}用的食材,让我自己学着做。",
112
+ "电视里正在介绍{c}的家常做法。",
113
+ "下班路上买了{c},打算明天当早饭。",
114
+ ]
115
+ D_TPL = [
116
+ "下午去市场买了{a},价格比昨天便宜一些。",
117
+ "晚上用{a}和{b}做了两道菜,都没放辣椒。",
118
+ "冰箱里还剩点{a},再不吃就要坏了。",
119
+ "便利店买的{b}有点贵,下次去批发市场。",
120
+ ]
121
+ # 干扰原子池:只取组成原子自身(错位搭配由生成+断言保证不构成 gold)
122
+ DISTRACT_POOL = ["马", "鱼", "狗", "鸟", "羊", "猪", "鸭", "肉", "奶", "蛋", "油", "米"]
123
+
124
+
125
+ # 生效条件:s 为字符串时返回其全部相邻二元组集合;当 len(s) 小于 2 时返回空集合。
126
+ def _bigrams(s):
127
+ return {s[i:i + 2] for i in range(len(s) - 1)}
128
+
129
+
130
+ # 生效条件:无参调用且 ATOMS_PATH 载入 atoms 后,逐条确认 UNSEEN 各组合词不在其中文集合、其相邻字符对均为原子,并确认 UNSEEN 无重复、set(COMP_EN)==set(UNSEEN)、set(COMP_L3)<=set(UNSEEN),全部成立才静默通过,任一断言不成立即 AssertionError。
131
+ def assert_material():
132
+ """盲测纪律的机器化:素材在/不在 atoms + 组合词互相不冲突。"""
133
+ atoms = json.load(open(ATOMS_PATH, encoding="utf-8"))["atoms"]
134
+ zh = {a["zh"] for a in atoms}
135
+ for c in UNSEEN:
136
+ assert c not in zh, "盲测腐化:组合词 %r 已混入 atoms" % c
137
+ for i in range(len(c) - 1):
138
+ assert c[i] in zh and c[i + 1] in zh, \
139
+ "素材缺原子:%r 需要 %r/%r" % (c, c[i], c[i + 1])
140
+ assert len(set(UNSEEN)) == len(UNSEEN)
141
+ assert set(COMP_EN) == set(UNSEEN) and set(COMP_L3) <= set(UNSEEN)
142
+
143
+
144
+ # 生效条件:以 SEED 初始化 random.Random 后对 UNSEEN 每词按 G_TPL 取模板生成含 gold 的篇目,再对 j=0..21 用 DISTRACT_POOL 随机取两个不同词按 D_TPL 造文,50 次重试内首次出现不含 UNSEEN 任何组合词的文本即 break 并 append,22 篇齐备后返回 corpus,50 次全冲突则 raise AssertionError。
145
+ def gen_corpus():
146
+ """33 篇受控语料:11 gold + 22 干扰。确定性,断言内嵌。"""
147
+ rng = random.Random(SEED)
148
+ corpus = []
149
+ for i, c in enumerate(UNSEEN):
150
+ body = G_TPL[i % len(G_TPL)].format(c=c)
151
+ corpus.append({"id": "g_%s" % c, "text": body, "gold": c})
152
+ for j in range(22):
153
+ for _try in range(50):
154
+ a, b = rng.choice(DISTRACT_POOL), rng.choice(DISTRACT_POOL)
155
+ if a == b:
156
+ continue
157
+ text = D_TPL[j % len(D_TPL)].format(a=a, b=b)
158
+ if not any(c in text for c in UNSEEN): # 纪律3:零子串
159
+ break
160
+ else:
161
+ raise AssertionError("干扰文档 50 次重试仍冲突(seed=%d)" % SEED)
162
+ corpus.append({"id": "d_%02d" % (j + 1), "text": text, "gold": None})
163
+ return corpus
164
+
165
+
166
+ # 生效条件:对 UNSEEN 中每个 c 生成 L1 与 L2 题;当 c 属于 L3_SET 时,用 assert 强制其 COMP_L3 问句与 g_c 的 gold 文本 bigram 零交集,失败抛 AssertionError,通过后追加 L3 题。
167
+ def gen_questions():
168
+ """33 题。L3 生成时校验 query×gold bigram 零交集(纪律4)。"""
169
+ questions = []
170
+ for c in UNSEEN:
171
+ questions.append({"qid": "L1|%s" % c, "qtype": "L1_surface",
172
+ "question": c,
173
+ "evidence_turns": ["g_%s" % c]})
174
+ questions.append({"qid": "L2|%s" % c, "qtype": "L2_crosslingual",
175
+ "question": COMP_EN[c],
176
+ "evidence_turns": ["g_%s" % c]})
177
+ if c in L3_SET:
178
+ q = COMP_L3[c]
179
+ gold_text = next(r["text"] for r in CORPUS if r["id"] == "g_%s" % c)
180
+ assert not (_bigrams(q) & _bigrams(gold_text)), \
181
+ "L3 纪律破坏:%r 与 gold %r bigram 相交" % (q, c)
182
+ questions.append({"qid": "L3|%s" % c, "qtype": "L3_semantic",
183
+ "question": q, "evidence_turns": ["g_%s" % c],
184
+ "q_atoms": L3_QUERY_ATOMS[c]})
185
+ return questions
186
+
187
+
188
+ CORPUS = None # gen_questions 需引用语料正文(L3 校验),main 内先建语料
189
+
190
+
191
+ # 生效条件:以 cg/questions/tag/en_atoms 与默认 semantic=False 调用时,en_atoms 为真则设 os.environ["MDCG_EN_ATOMS"]="1"、为假则 pop,semantic 为真则设 MDCG_SEMANTIC="1" 且仅当 semantic=="norm" 时把带真值 q_atoms 的题替换为 q_atoms 文本、semantic=="raw" 保持原句、semantic 为假则 pop,随后在 lexical 路径以 k=5 评测并返回 (按 ALL/L1_surface/L2_crosslingual/L3_semantic 分型的 by_type, 仅 en_atoms 为真时按 L2_crosslingual 题收集中文语素的 probe)。
192
+ def run_arm(cg, questions, tag, en_atoms, semantic=False):
193
+ """单臂评测:臂差异只在查询侧环境开关展开。返回 (summary_by_type, l2_probe)。
194
+
195
+ semantic 三态:False=关;"norm"=查询侧 AI 归一(q_atoms 替换,b2 臂);
196
+ "raw"=原句直查(归一在 canonical.query_atoms 内部完成,b3 臂——统一
197
+ 真源路,英文 query 同路:en_normalizer→中文语素→标准原子)。
198
+ """
199
+ if en_atoms:
200
+ os.environ["MDCG_EN_ATOMS"] = "1"
201
+ else:
202
+ os.environ.pop("MDCG_EN_ATOMS", None)
203
+ if semantic:
204
+ os.environ["MDCG_SEMANTIC"] = "1"
205
+ if semantic == "norm":
206
+ # 设想终态:查询侧 AI 归一——检索前把原句按基准词表归一为标准原子串
207
+ questions = [dict(q, question=q["q_atoms"]) if q.get("q_atoms") else q
208
+ for q in questions]
209
+ # semantic == "raw":原句直查,两端归一共享同一真源切分器
210
+ else:
211
+ os.environ.pop("MDCG_SEMANTIC", None)
212
+ rows = ec.evaluate_group(cg, questions, k=5, paths=("lexical",),
213
+ verbose=False)
214
+ summ = ec.summarize(rows, k=5)
215
+ by_type = {"ALL": summ}
216
+ for lv in ("L1_surface", "L2_crosslingual", "L3_semantic"):
217
+ sub = [r for r in rows if r["qtype"] == lv]
218
+ by_type[lv] = ec.summarize(sub, k=5)
219
+ # L2 白箱探针:展开出的中文语素(归因「映射缺失」vs「组合缺失」)
220
+ probe = {}
221
+ if en_atoms:
222
+ for q in questions:
223
+ if q["qtype"] != "L2_crosslingual":
224
+ continue
225
+ zh_terms = [t for t in mg.expand_query_terms(q["question"])
226
+ if any("\u4e00" <= ch <= "\u9fff" for ch in t)]
227
+ probe[q["qid"]] = zh_terms
228
+ return by_type, probe
229
+
230
+
231
+ # 生效条件:无参调用时先 assert_material 再经 gen_corpus/gen_questions 得到语料与题,os.path.isdir(ARM_ROOT) 为真则删除该目录,以 ARM_ROOT 建 cg 并写入 CORPUS 全部篇目,os.path.isdir(ARM_ROOT+"_b2") 为真则删除该目录、以该路径建 cg2 并仅对 gold 为真值的篇目附加 semantic=" ".join(gold) 后写入,再依次以 (cg,b0_legacy,False,False)/(cg,b1_enatoms,True,False)/(cg2,b2_comp,False,"norm")/(cg2,b3_unified,False,"raw") 四臂调 run_arm 汇总指标与 b1 的 L2 探针,最后 ec.save_result 写出 blind_comp_baseline.json 并在 out 中记录 seed/n_corpus/n_q/arms/l2_probe/elapsed_s/boundaries。
232
+ def main():
233
+ global CORPUS
234
+ t0 = time.time()
235
+ assert_material()
236
+ CORPUS = gen_corpus()
237
+ questions = gen_questions()
238
+ print("[blind_comp] 素材断言通过;语料 %d 篇 / 题 %d 道(seed=%d)"
239
+ % (len(CORPUS), len(questions), SEED))
240
+
241
+ ec.unlock_global_cap()
242
+ ec.use_jaccard()
243
+
244
+ if os.path.isdir(ARM_ROOT):
245
+ shutil.rmtree(ARM_ROOT, ignore_errors=True)
246
+ cg = MdCGOS(ARM_ROOT, autoflush=500)
247
+ for r in CORPUS:
248
+ cg.add(r["id"], r["text"], layer="knowledge",
249
+ eval_src="blind_comp", verification_basis="data")
250
+ cg.flush()
251
+ ec.install_read_cache(cg)
252
+
253
+ out = {"seed": SEED, "n_corpus": len(CORPUS), "n_q": len(questions),
254
+ "arms": {}, "l2_probe": {}}
255
+ # b2 库:正文逐字一致,仅 gold 节点附加 fm.semantic 标准原子摘要
256
+ # (模拟 AI 写入侧归一产物:同义体已按基准翻译成「鱼 油」类原子序列)
257
+ arm2_root = ARM_ROOT + "_b2"
258
+ if os.path.isdir(arm2_root):
259
+ shutil.rmtree(arm2_root, ignore_errors=True)
260
+ cg2 = MdCGOS(arm2_root, autoflush=500)
261
+ for r in CORPUS:
262
+ kw = {}
263
+ if r["gold"]:
264
+ kw["semantic"] = " ".join(r["gold"]) # 「鱼油」→「鱼 油」
265
+ cg2.add(r["id"], r["text"], layer="knowledge",
266
+ eval_src="blind_comp", verification_basis="data", **kw)
267
+ cg2.flush()
268
+ ec.install_read_cache(cg2)
269
+
270
+ arms = ((cg, "b0_legacy", False, False),
271
+ (cg, "b1_enatoms", True, False),
272
+ (cg2, "b2_comp", False, "norm"),
273
+ (cg2, "b3_unified", False, "raw"))
274
+ for arm_cg, tag, en, sem in arms:
275
+ by_type, probe = run_arm(arm_cg, questions, tag, en, semantic=sem)
276
+ out["arms"][tag] = by_type
277
+ out["l2_probe"][tag] = probe
278
+ sem_desc = {False: "", "norm": ", 查询侧归一(q_atoms)",
279
+ "raw": ", 原句直查(query_atoms 内部归一)"}.get(sem, "")
280
+ print("\n== 臂 %s(MDCG_EN_ATOMS=%s, MDCG_SEMANTIC=%s%s%s)=="
281
+ % (tag, "1" if en else "off", "1" if sem else "off",
282
+ ", gold 带 fm.semantic" if sem else "", sem_desc))
283
+ for lv in ("ALL", "L1_surface", "L2_crosslingual", "L3_semantic"):
284
+ s = by_type[lv]
285
+ print(" %-16s hit@1=%6.1f%% hit@5=%6.1f%% MRR=%.4f (n=%d)"
286
+ % (lv, s["hit@1"] * 100, s["hit@5"] * 100, s["mrr"], s["n"]))
287
+ if out["l2_probe"]["b1_enatoms"]:
288
+ print("\n== L2 白箱探针(b1 展开出的中文语素)==")
289
+ for qid, terms in out["l2_probe"]["b1_enatoms"].items():
290
+ print(" %-16s -> %s" % (qid, terms or "(映射缺失)"))
291
+
292
+ out["elapsed_s"] = round(time.time() - t0, 1)
293
+ out["boundaries"] = [
294
+ "自造受控语料 33 篇/33 题,n 小 CV 大,只做方向性判读",
295
+ "组合配对为出题人显式枚举,未经语料统计验证",
296
+ "b2 语义摘要为 gold 节点人工标注标准原子(模拟 AI 写入侧归一),"
297
+ "非端到端自动归一质量;受控池 0 误配不可外推开放域"
298
+ "(「鱼和油分述」需 P1 组合结构约束)",
299
+ "L3 b0/b1 基线即该两路增益空间上限;P1 compositions 结构层另案",
300
+ "b3 L2 受控上界:受控组合全在 en_normalizer 词表内"
301
+ "(EN_ZH 已含 horse/goat/duck/mare/oil/fat),开放域英文受归一"
302
+ "词表覆盖限制——开放域数字以 locomo-500 英文侧统一真源路实测为准",
303
+ ]
304
+ ec.save_result("blind_comp_baseline.json", out)
305
+ print("\n[blind_comp] 完成,结果已存 blind_comp_baseline.json")
306
+
307
+
308
+ if __name__ == "__main__":
309
309
  main()