@furongjun1999/dsh-memory 0.4.8 → 0.4.10
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 +54 -26
- package/codebuddy/CODEBUDDY.md +196 -195
- package/codebuddy/README.md +13 -1
- package/codebuddy/mcp.json +9 -0
- 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 -0
- package/docs/README.md +1 -1
- package/docs/discipline/harnesses.yaml +18 -7
- package/docs/discipline/templates/full.md.tmpl +4 -3
- package/docs/experiments/linkref_backfill/candidates_20260917.json +726 -0
- package/docs/experiments/linkref_backfill/candidates_internal_20260917.json +602 -0
- package/docs/experiments/linkref_backfill/candidates_internal_v2.json +603 -0
- package/docs/experiments/linkref_backfill/candidates_secret_20260917.json +884 -0
- package/docs/experiments/linkref_backfill/candidates_secret_v2.json +789 -0
- package/docs/hive//345/244/232/347/253/257harness/351/200/232/344/277/241/345/245/221/347/272/246_v0.1.md +42 -0
- 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 -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 -0
- package/docs/hive//347/234/237/345/256/236/345/272/223/347/253/257/345/210/260/347/253/257/345/256/236/346/265/213_S1b/344/270/216/345/217/254/345/233/236/346/235/203/350/241/241_v0.1.md +57 -0
- package/docs/hive//347/234/237/345/256/236/345/272/223/347/253/257/345/210/260/347/253/257/345/256/236/346/265/213_S7/345/200/222/346/216/222/345/200/231/351/200/211/345/261/202_v0.1.md +126 -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 -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 -0
- package/docs/mdcg/README/350/257/246/347/273/206/347/211/210_v0.4.5.md +631 -625
- package/docs/mdcg//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_/345/245/221/347/272/246_v0.1.md +82 -0
- 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 -0
- 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 +47 -45
- package/docs/mdcg//345/255/220/344/273/243/347/220/206/351/205/215/347/275/256/346/240/207/345/207/{206_v0.4.md → 206_v0.5.md} +92 -4
- 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 -0
- package/docs/mdcg//347/216/257/344/272/214_/347/231/275/347/256/261/345/241/253/345/205/205/346/265/201/346/260/264/347/272/277_v0.1.md +31 -0
- package/docs/mdcg//350/267/250/347/253/257/351/252/214/350/257/201/344/270/216/345/220/214/346/255/245/345/215/217/350/256/256_v0.1.md +93 -0
- 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 +2 -2
- 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 +3 -3
- 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 +2 -2
- 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 +434 -433
- package/docs//347/201/265/346/236/242/350/207/252/346/210/221/346/224/271/350/277/233/345/267/245/344/275/234/350/256/241/345/210/222_/345/244/226/351/203/250/347/240/224/347/251/266/347/263/273/345/210/227/345/220/270/346/224/266_v1_20260919.md +286 -0
- package/dsh/README.md +33 -0
- package/dsh/cordis.yml.example +13 -7
- package/dsh/hive-mcp-probe.mjs +94 -0
- package/dsh/hive-mcp.example.yml +62 -0
- package/dsh/update-lingshu.bat +11 -0
- package/dsh/update-lingshu.ps1 +337 -0
- package/lib/hooks.d.ts +3 -0
- package/lib/hooks.js +17 -23
- package/lib/index.d.ts +4 -2
- package/lib/index.js +29 -6
- package/lib/lib/datapath.d.ts +76 -1
- package/lib/lib/datapath.js +199 -13
- package/lib/lib/mdcg_client.d.ts +40 -3
- package/lib/lib/mdcg_client.js +46 -22
- package/lib/lib/mutual.js +4 -4
- package/lib/lib/token_store.js +4 -5
- package/md_cg/audit.py +17 -2
- package/md_cg/autonomy.py +86 -15
- package/md_cg/backfill.py +36 -1
- package/md_cg/backfill_bigdomain.py +34 -0
- package/md_cg/bench6_arms.py +28 -1
- package/md_cg/bench6_common.py +10 -1
- package/md_cg/bench6_competitors.py +6 -1
- package/md_cg/bench_axis_domain.py +9 -1
- package/md_cg/bench_blind_comp.py +7 -1
- package/md_cg/bench_en_atoms_public.py +9 -0
- package/md_cg/bench_governance.py +348 -0
- package/md_cg/bench_lme_zh.py +16 -1
- package/md_cg/bench_locomo.py +2 -1
- package/md_cg/bench_locomo_zh.py +16 -1
- package/md_cg/bench_locomo_zh_public.py +4 -1
- package/md_cg/bench_longmem.py +2 -1
- package/md_cg/bench_membench.py +27 -1
- package/md_cg/bench_p0.py +4 -1
- package/md_cg/bench_progressive.py +13 -1
- package/md_cg/bench_role_views.py +238 -0
- package/md_cg/bench_task_ab.py +8 -1
- package/md_cg/bench_task_ab_llm.py +13 -1
- package/md_cg/bench_unified_en.py +6 -1
- package/md_cg/bench_zh_mad.py +20 -1
- package/md_cg/blindspot_tickets.py +123 -0
- package/md_cg/branches.py +12 -1
- package/md_cg/build_postings.py +73 -0
- package/md_cg/ccgc.py +67 -2
- package/md_cg/census.py +5 -1
- package/md_cg/chain.py +24 -3
- package/md_cg/codeindex.py +134 -17
- package/md_cg/coldverify.py +265 -0
- package/md_cg/comment_gate.py +338 -0
- package/md_cg/cond_compose.py +190 -0
- package/md_cg/cond_facts.py +155 -0
- package/md_cg/cond_template.json +107 -0
- package/md_cg/condition_anchor.py +143 -0
- package/md_cg/conformance.py +69 -4
- package/md_cg/consistency.py +24 -1
- package/md_cg/consolidate.py +53 -2
- package/md_cg/corpus.py +4 -0
- package/md_cg/crosscheck.py +42 -2
- package/md_cg/crypto.py +35 -1
- package/md_cg/d_meta.py +310 -0
- package/md_cg/datapath.py +201 -26
- package/md_cg/docindex.py +122 -1
- package/md_cg/eval_common.py +29 -1
- package/md_cg/evidence.py +27 -1
- package/md_cg/evolution.py +21 -1
- package/md_cg/export.py +11 -1
- package/md_cg/forgetting.py +23 -1
- package/md_cg/fsutil.py +18 -1
- package/md_cg/hotcache.py +214 -0
- package/md_cg/hyperedge.py +251 -0
- package/md_cg/identity.py +18 -1
- package/md_cg/insight.py +17 -1
- package/md_cg/lexicon/build_cedict_en_zh.py +9 -0
- package/md_cg/lexicon/build_standard_en.py +171 -168
- package/md_cg/lexicon/expand_en_zh.py +6 -0
- package/md_cg/lifecycle.py +12 -1
- package/md_cg/linkref.py +281 -0
- package/md_cg/links.py +29 -1
- package/md_cg/mcp_server.py +362 -43
- package/md_cg/md_whitebox.py +53 -1
- package/md_cg/mdcg.py +1003 -27
- package/md_cg/mdcos.py +558 -36
- package/md_cg/metacognition.py +37 -2
- package/md_cg/migrate.py +4 -0
- package/md_cg/migrate_aeis.py +221 -213
- package/md_cg/migrate_roleplay.py +8 -0
- package/md_cg/migrate_wisdom_graph.py +14 -1
- package/md_cg/mreview/__main__.py +3 -0
- package/md_cg/mreview/bundle.py +8 -0
- package/md_cg/mreview/candidates.py +9 -0
- package/md_cg/mreview/govern.py +21 -1
- package/md_cg/mreview/locate.py +34 -0
- package/md_cg/mreview/pipeline.py +29 -1
- package/md_cg/mreview/ruleset.py +16 -1
- package/md_cg/nodefile.py +233 -3
- package/md_cg/pooling.py +23 -1
- package/md_cg/postings.py +298 -0
- package/md_cg/predict.py +89 -9
- package/md_cg/progressive.py +3 -0
- package/md_cg/protect.py +14 -1
- package/md_cg/protocol.py +372 -0
- package/md_cg/provenance.py +262 -0
- package/md_cg/reach.py +453 -0
- package/md_cg/refindex.py +47 -2
- package/md_cg/refine.py +20 -1
- package/md_cg/roleviews.py +89 -0
- package/md_cg/routing.py +76 -0
- package/md_cg/scrub.py +63 -2
- package/md_cg/security.py +26 -1
- package/md_cg/self_state.py +64 -1
- package/md_cg/selfreport.py +151 -0
- package/md_cg/semantic/canonical.py +5 -0
- package/md_cg/semantic/en_normalizer.py +364 -355
- package/md_cg/semantic/zh_en_atoms.py +139 -136
- package/md_cg/signer.py +41 -1
- package/md_cg/sources.py +583 -547
- package/md_cg/statushdr.py +179 -0
- package/md_cg/stg.py +59 -18
- package/md_cg/subgraph.py +23 -0
- package/md_cg/sustain.py +56 -1
- package/md_cg/tasks.py +26 -2
- package/md_cg/test_autonomy.py +26 -0
- package/md_cg/test_bench_governance.py +102 -0
- package/md_cg/test_blindspot_tickets.py +166 -0
- package/md_cg/test_ccgc.py +10 -0
- package/md_cg/test_codeindex.py +338 -0
- package/md_cg/test_comment_gate.py +187 -0
- package/md_cg/test_cond_compose_anchors.py +76 -0
- package/md_cg/test_condition_anchor.py +82 -0
- package/md_cg/test_d_meta.py +412 -0
- package/md_cg/test_datapath_root.py +188 -0
- package/md_cg/test_gain_gate.py +47 -1
- package/md_cg/test_hot_cold.py +187 -0
- package/md_cg/test_hyperedge.py +245 -0
- package/md_cg/test_linkref.py +306 -0
- package/md_cg/test_md_access_parity.py +15 -3
- package/md_cg/test_mr_m1.py +108 -18
- package/md_cg/test_mr_m3.py +8 -1
- package/md_cg/test_p26_refindex.py +49 -20
- package/md_cg/test_p27_docindex.py +236 -2
- package/md_cg/test_p2_mcp.py +1 -1
- package/md_cg/test_p31_insight.py +24 -0
- package/md_cg/test_p44_md_whitebox.py +14 -1
- package/md_cg/test_protocol.py +243 -0
- package/md_cg/test_reach.py +378 -0
- package/md_cg/test_reach_keys.py +201 -0
- package/md_cg/test_reach_meta_exits.py +145 -0
- package/md_cg/test_read_clip.py +8 -4
- package/md_cg/test_retr_s1.py +340 -0
- package/md_cg/test_retr_s1b.py +209 -0
- package/md_cg/test_retr_s3.py +194 -0
- package/md_cg/test_retr_s4.py +163 -0
- package/md_cg/test_retr_s5.py +200 -0
- package/md_cg/test_retr_s6.py +157 -0
- package/md_cg/test_retr_s7.py +385 -0
- package/md_cg/test_retr_s8_time.py +316 -0
- package/md_cg/test_retr_s9_edges.py +286 -0
- package/md_cg/test_retr_s9_entity_ctx.py +175 -0
- package/md_cg/test_review_conformance.py +59 -2
- package/md_cg/test_role_views.py +354 -0
- package/md_cg/test_subproc_encoding.py +188 -0
- package/md_cg/test_trust.py +361 -0
- package/md_cg/test_units_poll.py +71 -0
- package/md_cg/test_v14_fixes.py +397 -0
- package/md_cg/test_validity_filter.py +280 -0
- package/md_cg/test_wisdom_md_store.py +7 -3
- package/md_cg/test_writepipe.py +5 -1
- package/md_cg/theory.py +16 -1
- package/md_cg/tokens.py +40 -8
- package/md_cg/tool_face.py +13 -2
- package/md_cg/trust.py +943 -0
- package/md_cg/twophase.py +12 -1
- package/md_cg/units.py +132 -10
- package/md_cg/vision_evidence.py +24 -1
- package/md_cg/weights.py +24 -1
- package/md_cg/whitebox.py +32 -1
- package/md_cg/whitebox_kb/data/verify_cache.json +21210 -365
- package/md_cg/whitebox_kb/data/verify_savings.jsonl +5078 -0
- package/md_cg/whitebox_kb/wisdom/audit_log/chain_heat.json +10 -10
- package/md_cg/whitebox_kb/wisdom/code_compose.py +113 -6
- package/md_cg/whitebox_kb/wisdom/code_solidified.json +1 -1
- package/md_cg/whitebox_kb/wisdom/verifier.py +340 -55
- package/md_cg/whitebox_kb/wisdom/wisdom-book-cloud.db +0 -0
- package/md_cg/writelimit.py +18 -4
- package/md_cg/writepipe.py +178 -7
- package/package.json +2 -2
- package/skills/skills/designer-perspective/scripts/__pycache__/designer.cpython-310.pyc +0 -0
- package/skills/skills/designer-perspective/scripts/designer.py +17 -1
- package/skills/skills/designer-perspective/tests/selftest.py +3 -1
- package/src/hooks.ts +17 -21
- package/src/index.ts +33 -6
- package/src/lib/datapath.ts +211 -13
- package/src/lib/mdcg_client.ts +64 -25
- package/src/lib/mutual.ts +411 -411
- package/src/lib/token_store.ts +4 -5
- package/zcode/AGENTS.md +196 -195
- package/zcode/README.md +4 -0
- package/md_cg/whitebox_kb/wisdom/wisdom-book-cloud.db-shm +0 -0
- package/md_cg/whitebox_kb/wisdom/wisdom-book-cloud.db-wal +0 -0
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# 多端 harness 通信契约 v0.1
|
|
2
|
+
|
|
3
|
+
**目标**:验证不卡死在任何单一端。任何具备"读共享目录 + 回执"能力的端都可充当验证方;无端认领时由内部独立复核通道顶上,两者并账。
|
|
4
|
+
|
|
5
|
+
## 1 投放(我方 → 任何验证端)
|
|
6
|
+
- **位置**:`hive/interop/<iter_id>/request.json`(与 `note-unit-review.json` 并列)
|
|
7
|
+
- **必填字段**:`kind=verify-request`、`iter_id`、`branch`、`candidate_commit`、`claim_signal`、`claim_min`、`created_ts`
|
|
8
|
+
- **认领信号(二选一即可)**:
|
|
9
|
+
1. 写 `hive/interop/<iter_id>/picked.json`(`{"verify_id": "<iter_id>", "picked_ts": <unix>}`);
|
|
10
|
+
2. 在 `hive/interop/_receipts_ledger.tsv` 追加一条引用该 `iter_id` 的回执(历史端走的就是这条)。
|
|
11
|
+
|
|
12
|
+
## 2 认领时限与升级(机械执行)
|
|
13
|
+
- 由 `_coord/multiport.py sweep` 每 300s 执行一次:
|
|
14
|
+
- 有认领信号 → `claimed`(记录 `claimed_via`);
|
|
15
|
+
- 超 `claim_min`(默认 10 分钟)仍无 → `escalated`,**自动转入内部独立复核通道**(`md_cg.units` 自足式作业);
|
|
16
|
+
- 状态落在 `hive/interop/_dispatch_ledger.tsv`(列:ts/iter/branch/commit/status/claim_by/claimed_via/note)。
|
|
17
|
+
|
|
18
|
+
## 3 双通道并账
|
|
19
|
+
- 同一候选可同时对外投放、对内复核;两侧 verdict 都写入台账;
|
|
20
|
+
- **外部回执到达即补验并追加记录**,不因内部通道已过而丢弃外部证据。
|
|
21
|
+
|
|
22
|
+
## 4 水位与事实来源
|
|
23
|
+
- 事实来源优先级:`note-receipt-*.json` → `_receipts_ledger.tsv` → 各端自报 state/heartbeat;
|
|
24
|
+
- 水位推进以**台账 + 认领记录**为准,不以任一端的口头报告为准。
|
|
25
|
+
|
|
26
|
+
## 5 硬约束
|
|
27
|
+
- 验证方**不得**改写被验证仓的源码与测试;jobs 写入属通道例外;
|
|
28
|
+
- 我方**不得**用内部通道伪装外部 PASS:内部通道结论在台账中标注 `via=internal`,与外部 `via=<provider>` 区分。
|
|
29
|
+
|
|
30
|
+
## 6 结算与升级(机械执行)
|
|
31
|
+
- **状态机**:`offered` →(窗口内认领)`claimed`;→(超 `claim_min`)`escalated` →(内部独立复核)`internal-verified`;被后继版本顶替的候选标 `superseded`。
|
|
32
|
+
- **`_coord/multiport.py dispatch`**:结算 `offered`/`escalated` 条目,读该 iter 的 `note-unit-review.json` 口径:
|
|
33
|
+
- `verdict=ACCEPT` → `internal-verified`,`claimed_via=internal:ACCEPT`(**仅内部口径,不冒外部 PASS**);
|
|
34
|
+
- `REJECT/DEFER/BLINDSPOT/未解析` → 保持待处理并提示重做候选;**不得**记为 verified。
|
|
35
|
+
- **`supersede --iter <id> --note <原因>`**:内部复核判 REJECT 且已有后继版本时使用,并在该 iter 目录写 `note-supersede.json`(`verdict_of_record` / `reason` / `superseded_by` / `superseding_commit`)。
|
|
36
|
+
- **纠正义务**:若 `request.json` 曾声明的 `unit_review.verdict` 与 note 实际不符,必须如实更正并把历史写入 `verdict_history`;隐瞒即等同伪造通过。
|
|
37
|
+
- **实现要点(历史实例,2026-09-18)**:协作脚本里的仓库路径必须显式绝对——曾用 `dirname³(__file__)`,脚本位于 `_coord/` 时解析到用户主目录,导致 note 永远读不到、状态永远停在 `escalated`(表现为"对方没回执")。凡"读不到 note",先核对路径解析,再怀疑对方。
|
|
38
|
+
|
|
39
|
+
## 7 一眼可见的投放索引
|
|
40
|
+
- `_coord/multiport.py status --index hive/interop/_offers_index.md` 生成 `hive/interop/_offers_index.md`(**机生成,勿手改**);
|
|
41
|
+
- 任何验证端只读这一个文件即可知道:有哪些候选、分支/commit、状态、认领方式、备注;
|
|
42
|
+
- 索引与账本同源(`_dispatch_ledger.tsv`);**账本是唯一事实来源,索引只是视图**。
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# 检索收敛口径实测与 S1b 设计(真实库 12,149 节点,只读)
|
|
2
|
+
|
|
3
|
+
> 目的:为「重接检索线路」的价值边界提供**实测**依据,并据此确定下一个核心任务(S1b)。
|
|
4
|
+
> 全部为只读测量(`MdCG(真实库)` + 抽样分类),未对真实库做任何写入。
|
|
5
|
+
|
|
6
|
+
## 1. 两条收敛口径的实测对比
|
|
7
|
+
|
|
8
|
+
| 口径 | 键 | 覆盖率 | 收敛强度 | 证据 |
|
|
9
|
+
| --- | --- | --- | --- | --- |
|
|
10
|
+
| **粗:14 大域**(本轮 S1 已落地) | `big_domain_classify`(关键词表) | 已标注 **58.3%**;无域信号 41.7% | 域内 ∪ 未标注 ≈ **44%~52% kept(约 2 倍)** | 240 节点抽样:binary 140 / tier2 +6 / 仍无标签 94 |
|
|
11
|
+
| **细:路由桶**(写入侧已建好) | `bucket_dir(route_key(...))` | **91.1% 节点有非 orphan 桶**(11,063 / 12,149) | **期望扫描 2.1%**(1,066 桶,最大桶 10.1%) | 全库统计 |
|
|
12
|
+
|
|
13
|
+
细口径的桶形如 `cond_感知系统_d94e90d2`、`cond_letta-code_f5190c71`、`cond_graphrag_f0f8d2e7` —— 是
|
|
14
|
+
**来源/项目级域**(来自 `domain:` 标签或 `observation_position`),比 14 大域精细得多。
|
|
15
|
+
|
|
16
|
+
## 2. 现状(代码事实)
|
|
17
|
+
|
|
18
|
+
`MdCG.search()` **已经有 T0/T1 桶路**:当调用方传入 `context` 时,
|
|
19
|
+
`route_bucket = bucket_dir(route_key(ctx, ctx.get("tags")))`,优先只在同桶内 LIKE 检索(T0),
|
|
20
|
+
不足再桶内全扫(T1),仍不足才落 T2/T3 全库。
|
|
21
|
+
|
|
22
|
+
**缺的只有一环**:不传 `context` 的普通 `search(q)` 没有桶 → 直接全表扫描。
|
|
23
|
+
(审计「偏差 5:桶路由依赖人工标签」在**自动沉淀的库**上成立;本真实库 91% 有桶,桶路是健康的。)
|
|
24
|
+
|
|
25
|
+
## 3. S1b 设计(下一个核心任务)
|
|
26
|
+
|
|
27
|
+
**目标**:让 `search(q)` 在**没有 context** 时也能吃到细口径收敛。
|
|
28
|
+
|
|
29
|
+
1. **桶规模表**(索引内即可构建,缓存):`bucket → 节点数`(本库 1,066 桶)。
|
|
30
|
+
2. **query 侧键推断**:把 query 扩展词与每个桶的可读前缀做 `domain_similarity`(已有:包含取长度比 + bigram Jaccard),
|
|
31
|
+
取 top-k 个键(`MDCG_BUCKET_TOPK`,默认 3)且要求 `sim ≥ MDCG_BUCKET_MIN_SIM`。
|
|
32
|
+
3. **收敛**:候选 = 命中桶内节点 ∪ **orphan/无桶节点**(召回安全,本库 orphan 仅 8.9%)∪ 未标桶节点。
|
|
33
|
+
4. **兜底**:命中不足 `min_results` → 回退全库(与 S1 同款规则)。
|
|
34
|
+
5. **开关**:`MDCG_GATE_S1B_BUCKET`(默认 0、显式 =1);审计 `meta.gates.s1b = {keys, kept, dropped}`。
|
|
35
|
+
|
|
36
|
+
**预期收益(按本库实测推算)**:query 命中具体桶时 kept ≈ 该桶(期望 2.1%) + orphan(8.9%) ≈ **11%**
|
|
37
|
+
→ 约 **9 倍**;命中大桶时 ~19% → 5 倍;命中不到任何桶时自动回退(不劣化)。
|
|
38
|
+
|
|
39
|
+
## 4. 边界
|
|
40
|
+
|
|
41
|
+
- 不改写入侧(桶已由 `route_key` 在写入时建好);
|
|
42
|
+
- 不放松召回安全:orphan/无桶节点恒留兜底,命中不足即回退;
|
|
43
|
+
- 与 S1(14 大域)可叠加:S1 先按大域收敛,S1b 再按桶收敛(两者都有兜底)。
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
# 检索路径与认知结构契约 v0.1
|
|
2
|
+
|
|
3
|
+
> 立约动因:外部审计(2026-09-19)发现「认知结构全部入库,但检索路径不调用它们」——
|
|
4
|
+
> 五条偏差经本侧逐行核对**全部成立**(证据见 §1)。缺的不是能力,是**「结构如何参与检索」的契约**。
|
|
5
|
+
> 本文件就是把这份契约写下来,作为重接线路(retrieval rewire)的判据。
|
|
6
|
+
|
|
7
|
+
## 1. 审计核对(本侧逐行验证,origin/main 口径)
|
|
8
|
+
|
|
9
|
+
| # | 审计结论 | 核对证据 | 判定 |
|
|
10
|
+
| --- | --- | --- | --- |
|
|
11
|
+
| 1 | edges 图建了但检索不走图 | `md_cg/mdcg.py::search()` 候选 = `self.index["nodes"].values()` 全枚举(L1506-1511)→ `_read_many` 全读(L1574/L1601-1613)→ `_like` 子串 + bigram;全路径**零** edges 引用 | 成立 |
|
|
12
|
+
| 2 | condition_space 是后置过滤 | `judge_qualification` 只在 `_emit` 内、且对 `scored[:k]` **排序后**逐条判定(L1670-1679);扫描与打分已全部付出 | 成立 |
|
|
13
|
+
| 3 | 五层只是分类标签 | `layer` 仅作候选构建时的等值过滤(L1507);打分不含层级先验;负记忆只在结果尾部附加条目(L1681-1692),不抑制正候选 | 成立 |
|
|
14
|
+
| 4 | 大域先验只进元数据 | `big_domain_classify` / `big_domain_score_breakdown` 算出后只传入 `_emit` 的 meta(L1542-1543 → L1711-1712),不参与候选收敛 | 成立 |
|
|
15
|
+
| 5 | 桶路由依赖人工标签 | `routing.route_key`:tags 首个 `domain:` → 否则 `observation_position` 归一化 → 否则 `ORPHAN`(L55-67);DSH 自动沉淀不打 `domain:` → 多落 orphan | 成立(observation_position 一档属降级回退) |
|
|
16
|
+
|
|
17
|
+
共同主线:**认知结构被实现成「数据结构」而不是「计算路径」** —— 存进去、建起来,但检索时不用。
|
|
18
|
+
|
|
19
|
+
## 2. 目标形态:检索 = 六阶段逐级收敛(而非全扫后过滤)
|
|
20
|
+
|
|
21
|
+
```
|
|
22
|
+
情境输入(query, context)
|
|
23
|
+
↓ S1 大域先验收敛 terms → big_domain_classify → 域集合;候选 = 该域节点 ∪ ORPHAN 兜底
|
|
24
|
+
↓ S2 条件空间前置门控 condition_space 硬槽(time_window/observation_position/存在约束)不匹配 → 不进候选
|
|
25
|
+
↓ S3 图扩散激活 以 (S1∩S2) 命中为种子,沿 edges 双向扩散 N 跳、按跳数衰减;不走全表
|
|
26
|
+
↓ S4 层级激活优先级 anchor/self 初始激活值加成(认知优先级,不是过滤)
|
|
27
|
+
↓ S5 负记忆抑制 rejected/unresolved 命中 → 对相关正候选乘性降权(抑制信号)
|
|
28
|
+
↓ S6 一致性交叉验证 对最终 top-k 做 crosscheck(复用 md_cg/crosscheck.py)
|
|
29
|
+
输出: 激活子集 + 分阶段审计计数
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
**每一步都在缩小范围**:触碰节点数应从「N(全库)」降到「域内 ∩ 条件匹配 ∩ 邻域」。
|
|
33
|
+
|
|
34
|
+
## 3. 各阶段契约(输入 / 输出 / 不变量 / 失败模式)
|
|
35
|
+
|
|
36
|
+
### S1 大域先验收敛
|
|
37
|
+
- 输入:`terms`(`expand_query_terms` 结果)、节点 frontmatter 的**域标签**
|
|
38
|
+
- 输出:`domains`(top-1 或 top-m,由 `big_domain_score_breakdown` 阈值决定)
|
|
39
|
+
- 依赖:**节点侧域标签**。现状只有 query 侧分类器,节点侧无域字段 → 需写入侧推断并持久化 `big_domain`(内容 → `big_domain_classify`),历史节点由回填器补齐
|
|
40
|
+
- 不变量:域收敛**不得丢召回**——ORPHAN/未标域节点必须留在兜底池;域内候选 < `min_results` 时自动放行兜底
|
|
41
|
+
- 失败模式:域分类错误 → 兜底路径必须能救回
|
|
42
|
+
|
|
43
|
+
### S2 条件空间前置门控
|
|
44
|
+
- 输入:`condition_space`(每节点已存)、`context`(调用方情境)
|
|
45
|
+
- 输出:通过门控的候选(**不读正文**即可判定:只用 frontmatter)
|
|
46
|
+
- 只前移**可判定的硬槽**:`time_window` / `observation_position` / 存在约束;语义类判定仍留 `judge_qualification`(后置,因需正文)
|
|
47
|
+
- 不变量:只剔除「明确不匹配」;**信息不足一律放行**(宁多勿漏)
|
|
48
|
+
|
|
49
|
+
### S3 图扩散激活
|
|
50
|
+
- 输入:种子集合、`edges`(出边在 `fm.edges`;白箱 KB 的 `edges` 表按 source/target 双索引)
|
|
51
|
+
- 输出:激活集合 + 激活值(种子 1.0,第 n 跳 × 衰减^n)
|
|
52
|
+
- 不变量:扩散**不得引入未通过 S2 门控**的节点;边方向/关系类型权重可配
|
|
53
|
+
- 失败模式:图稀疏(实测 142 节点 / 87 边)→ 覆盖不足,必须保留域内 LIKE 兜底
|
|
54
|
+
|
|
55
|
+
### S4 层级激活优先级
|
|
56
|
+
- 初始激活值加成:`anchor`/`self` > `structural` > `knowledge` > `contextual`(顺序可配)
|
|
57
|
+
- 不变量:只影响初始值/排序,不把不合格节点拉回
|
|
58
|
+
|
|
59
|
+
### S5 负记忆抑制
|
|
60
|
+
- `rejected`/`unresolved` 命中查询 → 对与其 `edges` 相邻或词面高度重叠的正候选乘性降权(`w ← w × (1-λ)`)
|
|
61
|
+
- 保留现有行为:负记忆仍作为结果条目返回(便于调用方感知),但不再与正候选同权
|
|
62
|
+
|
|
63
|
+
### S6 一致性交叉验证
|
|
64
|
+
- 复用 `md_cg/crosscheck.py`;对 top-k 输出 verdict 摘要,不进主排序
|
|
65
|
+
|
|
66
|
+
## 4. 开关与回退(缺一不可)
|
|
67
|
+
|
|
68
|
+
| 开关 | 默认 | 作用 |
|
|
69
|
+
| --- | --- | --- |
|
|
70
|
+
| `MDCG_RETRIEVAL_PIPELINE` | **0** | 总开关;关 = 与现状等价(回归必须全绿) |
|
|
71
|
+
| `MDCG_GATE_S1_DOMAIN` | 0 | 大域收敛 |
|
|
72
|
+
| `MDCG_GATE_S2_COND` | 0 | 条件前置门控 |
|
|
73
|
+
| `MDCG_GATE_S3_SPREAD` | 0 | 图扩散(`MDCG_SPREAD_HOPS`、`MDCG_SPREAD_DECAY`) |
|
|
74
|
+
| `MDCG_GATE_S4_LAYER` | 0 | 层级优先级(`MDCG_LAYER_BOOST`) |
|
|
75
|
+
| `MDCG_GATE_S5_NEG` | 0 | 负记忆抑制(`MDCG_NEG_LAMBDA`) |
|
|
76
|
+
|
|
77
|
+
规则:**默认关**;每阶段可单独开,便于逐项验证与归因;总开关关时 `search()` 走原路径。
|
|
78
|
+
|
|
79
|
+
## 5. 验收判据(每阶段都要过)
|
|
80
|
+
|
|
81
|
+
1. **等价性**:开关关 → `scripts/run_tests.py md_cg` 全绿,且返回与现状一致(快照对比);
|
|
82
|
+
2. **有效性**:开关开 → `meta.scanned` 显著下降(阶段目标:S1 ≤1/10,S2 再砍,S3 只碰邻域),既有召回用例不劣化;
|
|
83
|
+
3. **可审计**:`meta` 增加分阶段计数(`domains/gate_in/gate_out/spread_hops/activated/suppressed`),供编外复核端逐项核对;
|
|
84
|
+
4. **落地判据不变**:内部独立复核 ACCEPT ∧ 零删除 ∧ 干净树回归绿 ∧ 逐候选可回退提交。
|
|
85
|
+
|
|
86
|
+
## 6. 里程碑与分支纪律
|
|
87
|
+
|
|
88
|
+
- 每阶段独立分支、独立复核、独立落地;落地后在 `origin/main` 打 `core-*` 标签;
|
|
89
|
+
- 探索分支随任务完结即回收(≤10 条,见 `hive/interop/note-branch-discipline.md`)。
|
|
90
|
+
|
|
91
|
+
## 7. 边界(不做的事)
|
|
92
|
+
|
|
93
|
+
- **不**用 FTS5/倒排表替代认知路径(那会让灵枢退化为普通搜索引擎,并掩盖机制失效);倒排只可作 S1/S3 之后的**候选内**加速;
|
|
94
|
+
- **不**改写入侧语义(只补 `big_domain` 域标签这类检索所需的最小元数据);
|
|
95
|
+
- **不**在默认路径上启用新行为(先 flag 化、逐项验证、再讨论默认开启)。
|
|
96
|
+
|
|
97
|
+
## 8. 首期范围(S1 + S2)
|
|
98
|
+
|
|
99
|
+
1. 写入侧:`add()` / `_write_node` 存 `big_domain`(内容 → `routing.big_domain_classify`);新增幂等回填器 `md_cg/backfill_bigdomain.py`(支持 `--dry-run`);
|
|
100
|
+
2. 读路径:`search()` 增加 S1 收敛与 S2 门控(flag 控),输出分阶段审计计数;
|
|
101
|
+
3. 测试:等价性快照 + 收敛率(`scanned` 下降)+ 召回不劣化;
|
|
102
|
+
4. S3~S5 依次跟进(各自独立落地)。
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# 真实库端到端实测:S1b 的收益与召回权衡(2026-09-19)
|
|
2
|
+
|
|
3
|
+
> 方法:把真实库 **完整拷贝**到临时目录(12,249 文件 / 1,446 MB,源库零写入),在拷贝上做开关对照实测。
|
|
4
|
+
> 库:`D:/Program Files/2_ai/AEIS/data/mdcg` → 拷贝 `C:/Users/FuRongJun/.mdcg/_store_copy`(12,149 节点)。
|
|
5
|
+
|
|
6
|
+
## 1. 基线(全关):每个查询都扫全库
|
|
7
|
+
|
|
8
|
+
| 查询 | scanned | tier | 用时 |
|
|
9
|
+
| --- | --- | --- | --- |
|
|
10
|
+
| 感知系统 记忆 节点 | 12,149 | T2_global_like | 2.87s |
|
|
11
|
+
| graphrag 图谱 检索 | 12,149 | T2_global_like | 2.14s |
|
|
12
|
+
| whitebox 白箱 条件 | 12,149 | T2_global_like | 3.70s |
|
|
13
|
+
| 贝塞尔 曲线 工程 应力 | 12,149 | T2_global_like | 2.05s |
|
|
14
|
+
|
|
15
|
+
→ **外部审计的「全表扫描」在生产库上被实测复现**(每查询 2–3.7 秒、12,149 节点全读)。
|
|
16
|
+
|
|
17
|
+
## 2. S1b 开启(无需回填、零写入):5.5–10.4 倍更少节点、3–8 倍更快
|
|
18
|
+
|
|
19
|
+
| 查询 | scanned | 减少 | S1b 用时 | 命中的桶 |
|
|
20
|
+
| --- | --- | --- | --- | --- |
|
|
21
|
+
| 感知系统 记忆 节点 | 2,217 | 5.5× | 0.86s | cond_感知系统 / cond_复杂系统 / cond_动力学系统 |
|
|
22
|
+
| graphrag 图谱 检索 | 1,733 | 7.0× | 0.55s | cond_graphrag / cond_graphiti |
|
|
23
|
+
| whitebox 白箱 条件 | 1,497 | 8.1× | 0.60s | cond_whitebox_kb / cond_whitebox_py / cond_条件论 |
|
|
24
|
+
| 贝塞尔 曲线 工程 应力 | 1,170 | 10.4× | 0.25s | cond_工程学 |
|
|
25
|
+
|
|
26
|
+
**这是 S1b 的核心价值,而且不需要任何写入/回填**(桶在写入侧已建好,91.1% 节点有桶)。
|
|
27
|
+
|
|
28
|
+
## 3. 但:召回集合发生了变化(必须如实报告)
|
|
29
|
+
|
|
30
|
+
以「全关的全表扫描 top-10」为参照,S1b 的 **召回一致率只有 1/4**:4 个查询里 3 个的 top-10 组成不同
|
|
31
|
+
(条数相同,但成员不同)——**被丢弃的异桶节点里,确实有词法高分命中**。
|
|
32
|
+
|
|
33
|
+
**速度/召回权衡曲线(在拷贝上实测)**:
|
|
34
|
+
|
|
35
|
+
| topk / min_sim | 平均 scanned | 召回一致 | 平均用时 |
|
|
36
|
+
| --- | --- | --- | --- |
|
|
37
|
+
| 1 / 0.20 | 1,579 | 1/4 | 0.55s |
|
|
38
|
+
| 1 / 0.50 | 1,579 | 1/4 | 0.55s |
|
|
39
|
+
| 3 / 0.34(默认) | 1,654 | 1/4 | 0.56s |
|
|
40
|
+
| 6 / 0.20 | 1,686 | 1/4 | 0.57s |
|
|
41
|
+
| 10 / 0.20 | 1,687 | 1/4 | 0.57s |
|
|
42
|
+
|
|
43
|
+
结论:**放宽 topk / 降低 min_sim 几乎不改善召回一致,也不明显增加扫描** —— 说明丢掉的命中不在「更大的桶集合」里,
|
|
44
|
+
而在**桶键推断没匹配上的桶**里(`domain_similarity` 对「查询词 ↔ 桶键」的匹配能力有限),且 kept 集合被
|
|
45
|
+
**orphan/无桶兜底池**主导(本库 orphan 约 1,086 节点)。
|
|
46
|
+
|
|
47
|
+
## 4. 诚实结论与建议
|
|
48
|
+
|
|
49
|
+
1. **S1b 是一个「快模式」**:约 **7–8 倍更少扫描、4–6 倍更快**,但**不保证与全表扫描同结果**。
|
|
50
|
+
因此它必须保持 flag 默认关(现状如此),且**不建议**作为唯一检索路径启用——
|
|
51
|
+
这正是「域收敛不得丢召回」这条不变量在真实库上的边界。
|
|
52
|
+
2. **要同时拿到速度与等价召回**,缺的是一层**廉价高精度候选生成器**:即把「词 → 命中节点」做成
|
|
53
|
+
**倒排/发布表**(词项索引),这样不必读遍所有文件就能取出词法命中,再交给既有路径排序。
|
|
54
|
+
契约 §7 允许「倒排只作 S1/S3 之后的候选内加速」——这是该层的正确定位(不是用它替代认知路径)。
|
|
55
|
+
3. 该倒排层的建设成本在**索引 schema + 写入/重建维护**,属下一个里程碑级别的工作;
|
|
56
|
+
在它落地前,建议 S1b 只作为**可选加速**(默认关),并在启用时把 `meta.gates.s1b` 与
|
|
57
|
+
`covered_neg` 一并暴露给调用方,让调用方知道「本次是加速模式」。
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
# 真实库端到端实测:S7 倒排候选层(候选内加速 + 零召回损失)(2026-09-19)
|
|
2
|
+
|
|
3
|
+
> 方法:**真实库直连** `D:/Program Files/2_ai/AEIS/data/mdcg`(12,150 节点 / 1,446 MB),
|
|
4
|
+
> 只写派生索引 `_postings.json` + `_postings_meta.json`,**不改任何节点内容**。
|
|
5
|
+
> 旧的全库拷贝 `_store_copy` 已删除(不再使用拷贝)。
|
|
6
|
+
> 实测期间该库正被注释补全流水线**持续改写**(1 分钟内 1,395 个节点文件 mtime 变化),
|
|
7
|
+
> 这恰好把「快照过期」语义一起测了。
|
|
8
|
+
|
|
9
|
+
## 1 基线(全关):每个查询都扫全库
|
|
10
|
+
|
|
11
|
+
| 查询 | scanned | tier | 用时 |
|
|
12
|
+
| --- | --- | --- | --- |
|
|
13
|
+
| 感知系统 记忆 节点 | 12,150 | T2_global_like | 2.76s |
|
|
14
|
+
| graphrag 图谱 检索 | 12,150 | T2_global_like | 2.10s |
|
|
15
|
+
| whitebox 白箱 条件 | 12,150 | T2_global_like | 3.60s |
|
|
16
|
+
| 贝塞尔 曲线 工程 应力 | 12,150 | T2_global_like | 2.00s |
|
|
17
|
+
| 泽塔欧米伽轴不存在的词 | 12,150 | T2_global_like | 3.19s |
|
|
18
|
+
| 阿 | 12,150 | T2_global_like | 1.74s |
|
|
19
|
+
|
|
20
|
+
构建发布表:**12,150 节点 / 201,650 词项 / 3,125,856 倒排条目 / 75.7 MB JSON / 6.5s**(幂等)。
|
|
21
|
+
快照指纹校验开销:**0.064s**(1,074 个节点目录 + 索引文件各一次 stat,不重读节点)。
|
|
22
|
+
|
|
23
|
+
## 2 候选窄化(`MDCG_S7_FRESHNESS=skip`,离线对照:假设快照新鲜)
|
|
24
|
+
|
|
25
|
+
| 查询 | scanned | 缩减 | 用时 | S7 审计 |
|
|
26
|
+
| --- | --- | --- | --- | --- |
|
|
27
|
+
| 感知系统 记忆 节点 | 12,150 | 1.0× | 2.70s | `single_char_term` 回退 |
|
|
28
|
+
| graphrag 图谱 检索 | 933 | 13.0× | 1.49s | `cands=933` |
|
|
29
|
+
| whitebox 白箱 条件 | 11,499 | 1.06× | 3.65s | `cands=11499` |
|
|
30
|
+
| 贝塞尔 曲线 工程 应力 | 723 | 16.8× | **0.45s(4.4× 快)** | `cands=723` |
|
|
31
|
+
| 泽塔欧米伽轴不存在的词 | 7,167 | 1.7× | 2.62s | `cands=7167` |
|
|
32
|
+
| 阿 | 12,150 | 1.0× | 1.81s | `single_char_term` 回退 |
|
|
33
|
+
|
|
34
|
+
## 3 等价证据(这是 S7 存在的理由)
|
|
35
|
+
|
|
36
|
+
以「逐条 (id, 分数, 次序)」为判据:
|
|
37
|
+
|
|
38
|
+
- **`RESULT_PARITY 6/6`**:`results` 与全表扫描**逐条相同,含次序**。
|
|
39
|
+
- `pre_cap`(命中集规模)与 `cap/candidates/tier/cut_order` 亦一致。
|
|
40
|
+
- 唯一允许的差异是 `scanned`(正是加速本身)。
|
|
41
|
+
|
|
42
|
+
两个必须点名的**真实缺陷**(均已在本次落地中修掉,并有不通过即红的用例):
|
|
43
|
+
|
|
44
|
+
1. **并列同分的次序**:候选曾按`集合`迭代序取出,而集合迭代序随进程哈希随机化而变
|
|
45
|
+
→ 同分同重要性的条目次序会与全表不一致、甚至**逐个进程不同**。
|
|
46
|
+
修法:窄化时**保持索引原序**(候选集是过滤,不是重排)。
|
|
47
|
+
*证据*:`test_retr_s7` 第 12 节(3 个同内容同重要性节点,断言次序一致)。
|
|
48
|
+
2. **组合退化(S7×S3)**:S7 曾把`窄化后的 entries`当作 S3 扩散的 allowed 集,
|
|
49
|
+
而 S3 的目标恰恰是「词面无交集、只沿 edges 可达」的节点 → S7+S3 会把 S3 的扩散清空。
|
|
50
|
+
修法:S3 的 allowed 恒取「S1/S2 门控后的全量候选」;S7 只做 T2 的加速器。
|
|
51
|
+
*证据*:`test_retr_s7` 第 11 节(临时还原该行 → 用例立即红:`expanded 2→0`)。
|
|
52
|
+
|
|
53
|
+
**独立复核(编外验证单元)REJECT 的三条,均已修并补直接证据:**
|
|
54
|
+
|
|
55
|
+
3. **组合退化(S7×语义路)**:`MDCG_SEMANTIC=1` 时「frontmatter 有 semantic 的节点」在
|
|
56
|
+
`_like` 之外**无条件入池**,而该标志**只在节点文件里**(索引快照无此键)→
|
|
57
|
+
候选阶段无法识别 → 窄化会漏读语义节点、丢召回。
|
|
58
|
+
修法:语义路开启时 S7 一律不窄化(`reason=semantic_on`,审计可见)。
|
|
59
|
+
*证据*:`test_retr_s7` 第 13b 节(含"无词面交集的语义节点 s2 仍入池"断言)。
|
|
60
|
+
4. **自证式断言**:第 7 节原有一句 `check(..., True)`(恒真,等于没断言)。
|
|
61
|
+
修法:改为真断言「全量有命中 ∧ 0 < 候选数 < 全量命中数」——
|
|
62
|
+
该用例必须真的走在"窄化后命中不足 → T3 恢复全量"的路径上。
|
|
63
|
+
5. **根目录自污染(根级节点)**:`_postings*.json` 就写在库根目录;
|
|
64
|
+
若用"根目录 mtime"判过期,快照刚建就被自己的写入改旧。
|
|
65
|
+
修法:根级路径(path 无目录)改为**逐文件记 mtime**(`file_mtimes`),
|
|
66
|
+
`dir_mtimes` 不再含空目录键。*证据*:`test_retr_s7` 第 15 节
|
|
67
|
+
(自身派生文件写入后仍新鲜;改写根级节点 → `root_file_touched`)。
|
|
68
|
+
(注:现行 `_scan_nodes` 只扫 `<layer>/**.md`,根级节点本不会进索引;
|
|
69
|
+
此修复是**防御性**的,成本为零。)
|
|
70
|
+
|
|
71
|
+
## 4 真实行为(`MDCG_S7_FRESHNESS=auto`,默认):过期即回退,绝不丢召回
|
|
72
|
+
|
|
73
|
+
| 查询 | scanned(基线→skip→auto) | auto 的 s7 审计 |
|
|
74
|
+
| --- | --- | --- |
|
|
75
|
+
| graphrag 图谱 检索 | 12,150 → 933 → **933** | 快照仍新鲜 → 窄化 |
|
|
76
|
+
| whitebox 白箱 条件 | 12,150 → 11,499 → 12,150 | `stale_index:dir_touched` → 回退 |
|
|
77
|
+
| 贝塞尔 曲线 工程 应力 | 12,150 → 723 → 12,150 | `stale_index:dir_touched` → 回退 |
|
|
78
|
+
|
|
79
|
+
**auto 模式下逐条一致仍是 6/6。** 语义是「宁可慢,不可丢召回」:
|
|
80
|
+
注释流水线正在批量改写节点时,发布表秒级过期,查询自动落回全量;
|
|
81
|
+
库安静下来后立即恢复窄化。
|
|
82
|
+
|
|
83
|
+
## 5 设计要点
|
|
84
|
+
|
|
85
|
+
1. **候选 ⊇ 真命中**:每词取其**全部 bigram 的发布列表交集**,各词并集;
|
|
86
|
+
再交既有 `_like` 精确过滤 → 召回与全表一致(契约 §7「候选内加速」定位)。
|
|
87
|
+
实测反证:某查询 `cands=934`、真命中 873,`hits - cands = 0`。
|
|
88
|
+
2. **快照指纹**(节点数 + 节点目录 mtime + 索引文件 mtime / 0.064s):
|
|
89
|
+
节点写入走 `fsutil.atomic_write`(temp + `os.replace`),目录 mtime 必然变化,
|
|
90
|
+
故 O(目录数) 次 stat 即可判定过期。
|
|
91
|
+
3. **T3 兜底还原**:T2 未达阈值时强制恢复全量候选,并把 `scanned` 口径还原为
|
|
92
|
+
「从未窄化」(弃读量另记 `attempted`,诚实计量)。
|
|
93
|
+
4. **抽样构建不算新鲜**:`--limit` 只索引部分节点,故**不写**快照指纹
|
|
94
|
+
→ 检索一律回退(防「静默漏召回」)。
|
|
95
|
+
|
|
96
|
+
## 6 诚实结论与局限
|
|
97
|
+
|
|
98
|
+
1. **收益与查询选择性成正比**:`贝塞尔 曲线 工程 应力` 4.4× 更快(0.45s vs 2.00s)、
|
|
99
|
+
`graphrag 图谱 检索` 1.4×;而 `whitebox 白箱 条件` 只降 6%(该查询含极常见 2-gram
|
|
100
|
+
「条件」,11,499 个节点确实含它——候选集**本来就是**真命中集,不是实现问题)。
|
|
101
|
+
2. **无 IDF 加权**:候选是「各词并集」,任一常见词就会把候选推到接近全库。
|
|
102
|
+
下一步可加「按词稀有度分层 + 提前剪枝」,但**不得**改为交集(`_like` 是任一词命中)。
|
|
103
|
+
3. **单字词会让整条查询回退**:如「感知系统 记忆 节点」经同义词组展开得到单字词「库」
|
|
104
|
+
→ 无法用 bigram 表达 → 整查询回退全量(安全但不加速)。
|
|
105
|
+
要覆盖单字词,需要字符级索引(下一里程碑)。
|
|
106
|
+
4. **持续写入的库上会频繁过期**:批量改写期间 S7 落回基线;这是**正确性优先**的取舍,
|
|
107
|
+
不是失效。要长期吃到加速,需要**写入路径的增量维护(dirty 集)**——v1 未接
|
|
108
|
+
(每次写都 load+save 75MB 不可接受),当前用 `--if-stale` 重建守候。
|
|
109
|
+
|
|
110
|
+
## 7 开关与审计
|
|
111
|
+
|
|
112
|
+
| 环境变量 | 默认 | 作用 |
|
|
113
|
+
| --- | --- | --- |
|
|
114
|
+
| `MDCG_RETRIEVAL_PIPELINE` | 关 | 父开关(不开则 S7 代码路径不进入) |
|
|
115
|
+
| `MDCG_GATE_S7_POSTINGS` | 关 | S7 子开关,**必须显式 =1** |
|
|
116
|
+
| `MDCG_S7_FRESHNESS` | `auto` | `skip` 仅供离线对照实测(跳过指纹校验) |
|
|
117
|
+
| `MDCG_SEMANTIC` | 关 | =1 时 S7 自动让位(`reason=semantic_on`):语义节点面无法在候选阶段识别 |
|
|
118
|
+
|
|
119
|
+
审计:`meta.gates.s7`,键位 `cands`(窄化后候选数)/ `in`(门控后全量)/ `terms`(查询词数)
|
|
120
|
+
/ `reason`(`single_char_term` / `no_index` / `no_module` / `no_snapshot` / `no_candidate`
|
|
121
|
+
/ `semantic_on`(`MDCG_SEMANTIC=1` 时不窄化)
|
|
122
|
+
/ `stale_index:<dir_touched|node_count_changed|dirs_changed|index_touched|no_meta|root_file_touched|root_files_changed>`)
|
|
123
|
+
/ `fallback`(`full_scan` / `no_candidate` / `t3_full`)/ `attempted`(T3 兜底时被弃读量)。
|
|
124
|
+
|
|
125
|
+
运维:`python -X utf8 -m md_cg.build_postings --root <库根> --if-stale`(过期才重建,供守候环调用);
|
|
126
|
+
`--stats` 打印规模与 `stale_reason`。发布表是**派生索引**,可随时删除/重建,不影响节点。
|