@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.
- package/README.md +16 -16
- package/codebuddy/CODEBUDDY.md +11 -3
- package/codebuddy/README.md +92 -90
- package/codebuddy/mcp.json +27 -27
- 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
- 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
- package/docs/README.md +142 -111
- package/docs/discipline/harnesses.yaml +244 -226
- package/docs/discipline/templates/full.md.tmpl +61 -61
- package/docs/discipline/templates/rules.mdc.tmpl +68 -0
- package/docs/discipline/templates/skill.md.tmpl +23 -23
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- package/docs/mdcg/README/350/257/246/347/273/206/347/211/210_v0.4.10.md +646 -646
- package/docs/mdcg/lingshu_tutorial.html +14449 -14449
- package/docs/mdcg/release_v0.4.11.md +49 -0
- package/docs/mdcg/release_v0.4.5.md +55 -55
- package/docs/mdcg/tool_table_v0.3.0.md +117 -117
- 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
- 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
- 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
- package/docs/mdcg//345/217/221/345/270/203/351/227/250/347/246/201/351/223/276_v0.1.md +54 -0
- 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
- 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
- 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
- package/docs/mdcg//347/274/272/345/217/243/345/215/225_P0/346/224/266/345/217/243_v0.1.md +270 -270
- 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
- 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
- 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
- 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
- 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
- package/docs/swarm//350/234/202/347/276/244/344/272/222/350/201/224_v0.1.md +704 -704
- 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
- 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
- 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
- package/docs/theory//346/231/272/350/203/275/350/256/2723.4.md +5260 -5260
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- package/dsh/README.md +82 -82
- package/dsh/cordis.yml.example +139 -139
- package/dsh/update-lingshu.bat +11 -11
- package/lib/hooks.js +36 -2
- package/lib/lib/roleplay_web.js +427 -427
- package/md_cg/__init__.py +7 -7
- package/md_cg/audit.py +368 -368
- package/md_cg/autonomy.py +287 -287
- package/md_cg/backfill.py +1327 -1327
- package/md_cg/backfill_bigdomain.py +34 -34
- package/md_cg/bench6_arms.py +410 -410
- package/md_cg/bench6_common.py +230 -230
- package/md_cg/bench6_competitors.py +212 -212
- package/md_cg/bench_axis_domain.py +257 -257
- package/md_cg/bench_blind_comp.py +308 -308
- package/md_cg/bench_en_atoms_public.py +230 -230
- package/md_cg/bench_governance.py +348 -348
- package/md_cg/bench_lme_zh.py +410 -410
- package/md_cg/bench_locomo.py +121 -121
- package/md_cg/bench_locomo_zh.py +450 -450
- package/md_cg/bench_locomo_zh_public.py +147 -147
- package/md_cg/bench_longmem.py +112 -112
- package/md_cg/bench_membench.py +632 -632
- package/md_cg/bench_p0.py +149 -149
- package/md_cg/bench_progressive.py +287 -287
- package/md_cg/bench_role_views.py +238 -238
- package/md_cg/bench_task_ab.py +243 -243
- package/md_cg/bench_task_ab_llm.py +408 -408
- package/md_cg/bench_unified_en.py +204 -204
- package/md_cg/bench_zh_mad.py +601 -601
- package/md_cg/blindspot_tickets.py +123 -123
- package/md_cg/branches.py +285 -285
- package/md_cg/build_postings.py +73 -73
- package/md_cg/ccgc.py +1005 -948
- package/md_cg/census.py +132 -132
- package/md_cg/chain.py +300 -300
- package/md_cg/codeindex.py +531 -531
- package/md_cg/coldverify.py +292 -292
- package/md_cg/comment_gate.py +337 -337
- package/md_cg/cond_compose.py +190 -190
- package/md_cg/cond_facts.py +154 -154
- package/md_cg/cond_template.json +106 -106
- package/md_cg/condition_anchor.py +142 -142
- package/md_cg/conformance.py +726 -726
- package/md_cg/consistency.py +717 -717
- package/md_cg/consolidate.py +1536 -1439
- package/md_cg/corpus.py +110 -110
- package/md_cg/crosscheck.py +1097 -1097
- package/md_cg/crypto.py +437 -437
- package/md_cg/d_meta.py +310 -310
- package/md_cg/datapath.py +334 -334
- package/md_cg/docindex.py +473 -473
- package/md_cg/eval_common.py +575 -575
- package/md_cg/evidence.py +580 -580
- package/md_cg/evolution.py +477 -477
- package/md_cg/export.py +220 -220
- package/md_cg/forgetting.py +581 -581
- package/md_cg/fsutil.py +329 -329
- package/md_cg/hotcache.py +238 -214
- package/md_cg/hyperedge.py +251 -251
- package/md_cg/identity.py +390 -390
- package/md_cg/insight.py +500 -500
- package/md_cg/interop.py +199 -0
- package/md_cg/lexicon/build_cedict_en_zh.py +329 -329
- package/md_cg/lexicon/build_standard_en.py +171 -171
- package/md_cg/lexicon/expand_en_zh.py +211 -211
- package/md_cg/lifecycle.py +272 -272
- package/md_cg/linkref.py +280 -280
- package/md_cg/links.py +622 -622
- package/md_cg/mcp_server.py +129 -32
- package/md_cg/md_whitebox.py +345 -345
- package/md_cg/mdcg.py +176 -117
- package/md_cg/mdcos.py +79 -13
- package/md_cg/metacognition.py +591 -591
- package/md_cg/migrate.py +119 -119
- package/md_cg/migrate_aeis.py +221 -221
- package/md_cg/migrate_roleplay.py +293 -293
- package/md_cg/migrate_wisdom_graph.py +360 -360
- package/md_cg/mreview/__init__.py +25 -25
- package/md_cg/mreview/__main__.py +110 -110
- package/md_cg/mreview/bundle.py +178 -178
- package/md_cg/mreview/candidates.py +262 -262
- package/md_cg/mreview/govern.py +693 -693
- package/md_cg/mreview/locate.py +939 -939
- package/md_cg/mreview/pipeline.py +728 -728
- package/md_cg/mreview/rules/duplication.json +21 -21
- package/md_cg/mreview/rules/field_coverage.json +54 -54
- package/md_cg/mreview/rules/source_license.json +21 -21
- package/md_cg/mreview/rules/template_flow.json +21 -21
- package/md_cg/mreview/ruleset.py +252 -252
- package/md_cg/nodefile.py +575 -575
- package/md_cg/pooling.py +484 -472
- package/md_cg/postings.py +298 -298
- package/md_cg/predict.py +1100 -1100
- package/md_cg/progressive.py +123 -123
- package/md_cg/protect.py +272 -272
- package/md_cg/protocol/md_cg_gate.proto +33 -33
- package/md_cg/protocol.py +372 -372
- package/md_cg/provenance.py +582 -582
- package/md_cg/reach.py +453 -453
- package/md_cg/readcache.py +85 -0
- package/md_cg/refindex.py +833 -833
- package/md_cg/refine.py +604 -604
- package/md_cg/roleviews.py +89 -89
- package/md_cg/routing.py +365 -365
- package/md_cg/scrub.py +852 -852
- package/md_cg/security.py +274 -274
- package/md_cg/self_state.py +1029 -1029
- package/md_cg/selfreport.py +151 -151
- package/md_cg/semantic/__init__.py +10 -10
- package/md_cg/semantic/canonical.py +122 -122
- package/md_cg/semantic/en_normalizer.py +364 -364
- package/md_cg/semantic/en_zh_map.json +28694 -0
- package/md_cg/semantic/export_en_zh_map.py +64 -0
- package/md_cg/semantic/unify.py +45 -0
- package/md_cg/semantic/zh_en_atoms.py +139 -139
- package/md_cg/signer.py +562 -562
- package/md_cg/sources.py +815 -582
- package/md_cg/statushdr.py +179 -179
- package/md_cg/stg.py +48 -37
- package/md_cg/subgraph.py +729 -729
- package/md_cg/sustain.py +1138 -1138
- package/md_cg/tasks.py +470 -470
- package/md_cg/test_action_derive.py +203 -203
- package/md_cg/test_audit_rotate.py +270 -270
- package/md_cg/test_autonomy.py +143 -143
- package/md_cg/test_bench_governance.py +102 -102
- package/md_cg/test_blindspot_tickets.py +166 -166
- package/md_cg/test_branches.py +249 -249
- package/md_cg/test_ccg_perturb.py +184 -184
- package/md_cg/test_ccgc.py +433 -433
- package/md_cg/test_census_prune.py +81 -81
- package/md_cg/test_cond_compose_anchors.py +76 -76
- package/md_cg/test_cond_match.py +165 -165
- package/md_cg/test_condition_anchor.py +81 -81
- package/md_cg/test_d_meta.py +412 -412
- package/md_cg/test_datapath_root.py +199 -199
- package/md_cg/test_en_pipeline.py +166 -166
- package/md_cg/test_gain_gate.py +212 -212
- package/md_cg/test_health_scale.py +173 -173
- package/md_cg/test_hive_ingest.py +285 -0
- package/md_cg/test_hot_cold.py +215 -215
- package/md_cg/test_hyperedge.py +245 -245
- package/md_cg/test_i26_empty_first_write.py +116 -0
- package/md_cg/test_i27_e041_identity.py +128 -0
- package/md_cg/test_i28_hotcache_prodpath.py +122 -0
- package/md_cg/test_identity_attribution.py +147 -147
- package/md_cg/test_index_durability.py +224 -224
- package/md_cg/test_interop.py +93 -0
- package/md_cg/test_lifecycle.py +309 -309
- package/md_cg/test_linkref.py +306 -306
- package/md_cg/test_lock.py +43 -43
- package/md_cg/test_md_access_parity.py +255 -255
- package/md_cg/test_md_writepath.py +345 -345
- package/md_cg/test_mdstore_search_parity.py +160 -0
- package/md_cg/test_mr_m2.py +587 -587
- package/md_cg/test_mr_m3.py +710 -710
- package/md_cg/test_mr_m4.py +485 -485
- package/md_cg/test_p0.py +250 -250
- package/md_cg/test_p1.py +316 -316
- package/md_cg/test_p10_identity.py +173 -173
- package/md_cg/test_p11_consistency.py +233 -233
- package/md_cg/test_p12_metacognition.py +212 -212
- package/md_cg/test_p13_encryption.py +241 -241
- package/md_cg/test_p14_sustain.py +249 -249
- package/md_cg/test_p15_scrub.py +280 -280
- package/md_cg/test_p16_self_state.py +301 -301
- package/md_cg/test_p17_predict.py +354 -354
- package/md_cg/test_p18_whitebox.py +171 -171
- package/md_cg/test_p19_migrate_roleplay.py +149 -149
- package/md_cg/test_p20_evolution.py +315 -315
- package/md_cg/test_p21_tokens.py +293 -270
- package/md_cg/test_p22_theory.py +175 -175
- package/md_cg/test_p23_links.py +311 -311
- package/md_cg/test_p24_evidence.py +227 -227
- package/md_cg/test_p25_weights.py +156 -156
- package/md_cg/test_p26_refindex.py +416 -416
- package/md_cg/test_p27_docindex.py +765 -765
- package/md_cg/test_p28_refcheck.py +305 -305
- package/md_cg/test_p29_session_ingest_export.py +354 -333
- package/md_cg/test_p3.py +11 -2
- package/md_cg/test_p30_maintain.py +330 -330
- package/md_cg/test_p31_insight.py +534 -534
- package/md_cg/test_p32_backfill.py +298 -298
- package/md_cg/test_p33_ccg_wiring.py +293 -293
- package/md_cg/test_p34_crosscheck.py +331 -331
- package/md_cg/test_p35_conditioned_claim.py +252 -252
- package/md_cg/test_p36_kp_align.py +230 -230
- package/md_cg/test_p37_condition_space.py +248 -248
- package/md_cg/test_p38_concurrent_flush.py +102 -0
- package/md_cg/test_p38_contextualize.py +273 -273
- package/md_cg/test_p39_verify_flow.py +113 -0
- package/md_cg/test_p39_vision_evidence.py +369 -369
- package/md_cg/test_p40_refine_worklist.py +241 -241
- package/md_cg/test_p41_evolve_patrol.py +224 -224
- package/md_cg/test_p42_provenance.py +269 -269
- package/md_cg/test_p43_pooling.py +412 -398
- package/md_cg/test_p44_md_whitebox.py +231 -231
- package/md_cg/test_p45_session_identity.py +219 -219
- package/md_cg/test_p46_unit_scope.py +272 -272
- package/md_cg/test_p47_session_view.py +281 -0
- package/md_cg/test_p4_fuzzy.py +223 -223
- package/md_cg/test_p5_semantic.py +226 -226
- package/md_cg/test_p6_consolidate.py +440 -387
- package/md_cg/test_p7_goals_recent.py +202 -202
- package/md_cg/test_p8_subgraph_chain.py +200 -200
- package/md_cg/test_p9_forget_protect.py +231 -231
- package/md_cg/test_predict_beta.py +135 -135
- package/md_cg/test_preflight_failclosed.py +100 -100
- package/md_cg/test_progressive.py +146 -146
- package/md_cg/test_protocol.py +243 -243
- package/md_cg/test_reach.py +378 -378
- package/md_cg/test_reach_keys.py +201 -201
- package/md_cg/test_read_clip.py +141 -141
- package/md_cg/test_readcache_prodpath.py +155 -0
- package/md_cg/test_retr_gates_prodpath.py +140 -0
- package/md_cg/test_retr_s1.py +340 -340
- package/md_cg/test_retr_s1b.py +209 -209
- package/md_cg/test_retr_s3.py +194 -194
- package/md_cg/test_retr_s4.py +163 -163
- package/md_cg/test_retr_s5.py +200 -200
- package/md_cg/test_retr_s6.py +157 -157
- package/md_cg/test_retr_s7.py +384 -384
- package/md_cg/test_retr_s8_time.py +369 -316
- package/md_cg/test_retr_s9_edges.py +286 -286
- package/md_cg/test_retr_s9_entity_ctx.py +175 -175
- package/md_cg/test_review_conformance.py +367 -367
- package/md_cg/test_role_views.py +354 -354
- package/md_cg/test_sem_noise.py +242 -242
- package/md_cg/test_semantic_canonical.py +241 -241
- package/md_cg/test_subproc_encoding.py +192 -192
- package/md_cg/test_sustain_mutual.py +153 -153
- package/md_cg/test_tasks.py +409 -409
- package/md_cg/test_tool_face.py +189 -189
- package/md_cg/test_transfer.py +180 -180
- package/md_cg/test_trust.py +361 -361
- package/md_cg/test_twophase.py +286 -286
- package/md_cg/test_v14_fixes.py +397 -397
- package/md_cg/test_validity_filter.py +280 -280
- package/md_cg/test_verify_answer.py +138 -138
- package/md_cg/test_wisdom_md_store.py +292 -292
- package/md_cg/test_writelimit.py +197 -197
- package/md_cg/test_writepipe.py +214 -214
- package/md_cg/theory.py +273 -273
- package/md_cg/tokens.py +677 -663
- package/md_cg/tool_face.py +260 -260
- package/md_cg/trust.py +986 -950
- package/md_cg/twophase.py +231 -231
- package/md_cg/units.py +667 -667
- package/md_cg/vision_evidence.py +666 -666
- package/md_cg/weights.py +624 -624
- package/md_cg/whitebox.py +527 -527
- package/md_cg/whitebox_kb/__init__.py +37 -37
- package/md_cg/whitebox_kb/aeis_core/__init__.py +42 -42
- package/md_cg/whitebox_kb/aeis_core/semantic.py +280 -280
- package/md_cg/whitebox_kb/aeis_core/textutil.py +13 -13
- package/md_cg/whitebox_kb/engine.py +310 -310
- package/md_cg/whitebox_kb/seed_knowledge//346/231/272/350/203/275/350/256/2723.4.md +5260 -5260
- package/md_cg/whitebox_kb/wisdom/browser_units.py +2631 -2631
- package/md_cg/whitebox_kb/wisdom/causal_discover.py +432 -432
- package/md_cg/whitebox_kb/wisdom/chat_engine.py +1506 -1506
- package/md_cg/whitebox_kb/wisdom/code_solidified.json +6195 -6195
- package/md_cg/whitebox_kb/wisdom/compiler_code_units.py +3033 -3033
- package/md_cg/whitebox_kb/wisdom/condition_algebra.py +112 -112
- package/md_cg/whitebox_kb/wisdom/condition_frame.py +315 -315
- package/md_cg/whitebox_kb/wisdom/condition_kb.py +108 -108
- package/md_cg/whitebox_kb/wisdom/conflict_map.json +4445 -4445
- package/md_cg/whitebox_kb/wisdom/core/lexer.py +512 -512
- package/md_cg/whitebox_kb/wisdom/core/name_checker.py +1023 -1023
- package/md_cg/whitebox_kb/wisdom/cspmn.py +258 -258
- package/md_cg/whitebox_kb/wisdom/csre.py +264 -264
- package/md_cg/whitebox_kb/wisdom/danmaku_audit.py +252 -252
- package/md_cg/whitebox_kb/wisdom/distilled_condition_units.json +6417 -6417
- package/md_cg/whitebox_kb/wisdom/docs/WB-EVAL-20260902b.json +1950 -1950
- package/md_cg/whitebox_kb/wisdom/docs/WB-EVAL-20260902c.json +1296 -1296
- package/md_cg/whitebox_kb/wisdom/docs/whitebox_capability_graph_demo.json +59 -59
- package/md_cg/whitebox_kb/wisdom/graph_db_units.py +3089 -3089
- package/md_cg/whitebox_kb/wisdom/knowledge_points.py +318 -318
- package/md_cg/whitebox_kb/wisdom/md_access.py +470 -470
- package/md_cg/whitebox_kb/wisdom/md_store.py +276 -251
- package/md_cg/whitebox_kb/wisdom/migrate_wisdom.py +476 -476
- package/md_cg/whitebox_kb/wisdom/navigate.py +248 -248
- package/md_cg/whitebox_kb/wisdom/neural_retrieve.py +224 -224
- package/md_cg/whitebox_kb/wisdom/os_units.py +2735 -2735
- package/md_cg/whitebox_kb/wisdom/pattern_separation.py +376 -376
- package/md_cg/whitebox_kb/wisdom/prereq_map.json +364 -364
- package/md_cg/whitebox_kb/wisdom/python_code_units.py +2766 -2766
- package/md_cg/whitebox_kb/wisdom/role_solidified.json +7 -7
- package/md_cg/whitebox_kb/wisdom/route_memory.py +244 -244
- package/md_cg/whitebox_kb/wisdom/scene_reconstruction.py +148 -148
- package/md_cg/whitebox_kb/wisdom/snr_report.json +40 -40
- package/md_cg/whitebox_kb/wisdom/test_code_compose_domains.py +7541 -7541
- package/md_cg/whitebox_kb/wisdom/test_compiler_self_bootstrap.py +354 -354
- package/md_cg/whitebox_kb/wisdom/test_ecosystem_assembly.py +158 -158
- package/md_cg/whitebox_kb/wisdom/test_ecosystem_demos.py +193 -193
- package/md_cg/whitebox_kb/wisdom/test_graph_db.py +292 -292
- package/md_cg/whitebox_kb/wisdom/test_python_self_bootstrap.py +160 -160
- package/md_cg/whitebox_kb/wisdom/trigger_words_index.json +4366 -4366
- package/md_cg/whitebox_kb/wisdom/verifier.py +1297 -1297
- package/md_cg/writelimit.py +356 -356
- package/md_cg/writepipe.py +550 -542
- package/package.json +97 -96
- package/skills/plugin.json +54 -54
- package/skills/skills/designer-perspective/SKILL.md +158 -158
- package/skills/skills/designer-perspective/references/01-observation-position.md +66 -66
- package/skills/skills/designer-perspective/references/02-structure-recognition.md +62 -62
- package/skills/skills/designer-perspective/references/03-direction-judgment.md +55 -55
- package/skills/skills/designer-perspective/references/04-qualification-verdict.md +72 -72
- package/skills/skills/designer-perspective/references/05-condition-attribution.md +74 -74
- package/skills/skills/designer-perspective/scripts/designer.py +545 -545
- package/skills/skills/designer-perspective/tests/cases.jsonl +17 -17
- package/skills/skills/designer-perspective/tests/selftest.py +61 -61
- package/skills/skills/lingshu-browser/SKILL.md +60 -60
- package/skills/skills/lingshu-compiler/SKILL.md +56 -56
- package/skills/skills/lingshu-compiler/units/analyze-type-infer/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/check-name-real/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compile-assign/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compile-expr-tree/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compile-full-pipeline/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compile-func-def/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compile-if-then/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compile-logic-expr/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compile-recursive/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compile-scope/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compile-type-check/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compile-while/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-0010c4bf/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-0355bffb/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-0361708a/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-054a0414/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-05a1691a/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-05eeed1e/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-0622a1f6/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-08b54217/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-0a62b70c/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-0ab24d00/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-0e093688/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-0e82b966/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-0ee9b9b9/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-0f3787e6/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-1028685f/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-11897630/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-16661b9b/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-1f722303/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-25be1262/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-2a76ba07/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-2dbea54a/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-2df52f16/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-2ec2c9d2/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-2f8c8f39/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-38378ac7/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-39457d2e/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-39fb5926/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-47f4fbfa/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-4a8cd1f1/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-4b230b6b/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-4cbbda95/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-4d5a68ff/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-56dc9bdd/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-57e76ebe/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-61ff016b/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-63eae588/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-64c4224b/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-66377955/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-674ab4f6/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-6af76fd6/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-6d979db2/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-6de326c0/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-6f1c0eea/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-724d6c9b/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-7690177f/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-7b229a7d/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-7f471b3a/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-815cad08/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-83c61634/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-8c798c81/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-8dd747ac/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-90324d0a/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-94b8d72d/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-94f12231/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-95937c16/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-98a5625b/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-98b4c42f/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-98e3894a/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-9bdfe4b8/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-9d9b4e83/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-9f7be5ad/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-a6daf076/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-a7995a0c/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-a8399248/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-aabbd099/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-afe169d8/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-b0678bda/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-b09bd196/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-b1396e23/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-b9b31ce0/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-c10264a7/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-cb1e8e4b/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-ccafd438/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-cda9c262/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-ce648068/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-cf5776a4/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-d974e5d3/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-e3979fd3/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-eb1cf2b5/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-ecb30d5b/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-f8c8b24b/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-f99fedbe/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-fa8ff5f7/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-fe1b058d/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/lex-chinese-program/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/lex-dao-de-jing/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/lex-nine-chapters/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/vm-arithmetic/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/vm-array-ops/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/vm-closure-call/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/vm-closure-create/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/vm-compare/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/vm-cond-jump/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/vm-cond-space/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/vm-exception/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/vm-func-call/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/vm-loop-run/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/vm-profiling/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/vm-refcount/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/vm-run-loop/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/vm-short-circuit/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/vm-stack-guard/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/vm-stack-ops/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/vm-trust-accum/SKILL.md +45 -45
- package/skills/skills/lingshu-graph/SKILL.md +63 -63
- package/skills/skills/lingshu-net/SKILL.md +48 -48
- package/skills/skills/lingshu-os/SKILL.md +64 -64
- package/skills/skills/lingshu-pylang/SKILL.md +71 -71
- package/src/bridge.ts +401 -401
- package/src/hooks.ts +38 -2
- package/src/lib/datapath.ts +326 -326
- package/src/lib/mdcg_client.ts +413 -413
- package/src/lib/mutual.ts +428 -428
- package/src/lib/prompt_safety.ts +62 -62
- package/src/lib/python_path.ts +71 -71
- package/src/lib/roleplay_web.ts +932 -932
- package/src/lib/token_store.ts +192 -192
- package/src/tools.ts +212 -212
- package/zcode/AGENTS.md +11 -3
- package/zcode/README.md +41 -41
- /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()
|