dsh-data-domain-knowledge 0.1.0-alpha.1
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/LICENSE +21 -0
- package/README.md +360 -0
- package/cordis.patch.yml +410 -0
- package/eval/README.md +76 -0
- package/eval/evaluate-retrieval.mjs +121 -0
- package/eval/queries.example.jsonl +2 -0
- package/lib/client.js +111415 -0
- package/lib/types/config-schema.d.ts +35 -0
- package/lib/types/config-schema.d.ts.map +1 -0
- package/lib/types/config-schema.js +34 -0
- package/lib/types/config-schema.js.map +1 -0
- package/lib/types/convert/core-loader.d.ts +32 -0
- package/lib/types/convert/core-loader.d.ts.map +1 -0
- package/lib/types/convert/core-loader.js +60 -0
- package/lib/types/convert/core-loader.js.map +1 -0
- package/lib/types/convert/host.d.ts +88 -0
- package/lib/types/convert/host.d.ts.map +1 -0
- package/lib/types/convert/host.js +479 -0
- package/lib/types/convert/host.js.map +1 -0
- package/lib/types/convert/ingest.d.ts +125 -0
- package/lib/types/convert/ingest.d.ts.map +1 -0
- package/lib/types/convert/ingest.js +228 -0
- package/lib/types/convert/ingest.js.map +1 -0
- package/lib/types/convert/settings-schema.d.ts +18 -0
- package/lib/types/convert/settings-schema.d.ts.map +1 -0
- package/lib/types/convert/settings-schema.js +26 -0
- package/lib/types/convert/settings-schema.js.map +1 -0
- package/lib/types/convert/types.d.ts +46 -0
- package/lib/types/convert/types.d.ts.map +1 -0
- package/lib/types/convert/types.js +41 -0
- package/lib/types/convert/types.js.map +1 -0
- package/lib/types/diagnosis/cards.d.ts +71 -0
- package/lib/types/diagnosis/cards.d.ts.map +1 -0
- package/lib/types/diagnosis/cards.js +482 -0
- package/lib/types/diagnosis/cards.js.map +1 -0
- package/lib/types/diagnosis/problem-classes.d.ts +51 -0
- package/lib/types/diagnosis/problem-classes.d.ts.map +1 -0
- package/lib/types/diagnosis/problem-classes.js +66 -0
- package/lib/types/diagnosis/problem-classes.js.map +1 -0
- package/lib/types/diagnosis/schema.d.ts +65 -0
- package/lib/types/diagnosis/schema.d.ts.map +1 -0
- package/lib/types/diagnosis/schema.js +208 -0
- package/lib/types/diagnosis/schema.js.map +1 -0
- package/lib/types/diagnosis/seed-source.d.ts +20 -0
- package/lib/types/diagnosis/seed-source.d.ts.map +1 -0
- package/lib/types/diagnosis/seed-source.js +96 -0
- package/lib/types/diagnosis/seed-source.js.map +1 -0
- package/lib/types/diagnosis/seed.d.ts +50 -0
- package/lib/types/diagnosis/seed.d.ts.map +1 -0
- package/lib/types/diagnosis/seed.js +242 -0
- package/lib/types/diagnosis/seed.js.map +1 -0
- package/lib/types/diagnosis/store.d.ts +81 -0
- package/lib/types/diagnosis/store.d.ts.map +1 -0
- package/lib/types/diagnosis/store.js +409 -0
- package/lib/types/diagnosis/store.js.map +1 -0
- package/lib/types/diagnosis/types.d.ts +124 -0
- package/lib/types/diagnosis/types.d.ts.map +1 -0
- package/lib/types/diagnosis/types.js +13 -0
- package/lib/types/diagnosis/types.js.map +1 -0
- package/lib/types/directory-picker.d.ts +94 -0
- package/lib/types/directory-picker.d.ts.map +1 -0
- package/lib/types/directory-picker.js +110 -0
- package/lib/types/directory-picker.js.map +1 -0
- package/lib/types/extract-model.d.ts +76 -0
- package/lib/types/extract-model.d.ts.map +1 -0
- package/lib/types/extract-model.js +193 -0
- package/lib/types/extract-model.js.map +1 -0
- package/lib/types/extract.d.ts +121 -0
- package/lib/types/extract.d.ts.map +1 -0
- package/lib/types/extract.js +549 -0
- package/lib/types/extract.js.map +1 -0
- package/lib/types/fts.d.ts +96 -0
- package/lib/types/fts.d.ts.map +1 -0
- package/lib/types/fts.js +184 -0
- package/lib/types/fts.js.map +1 -0
- package/lib/types/index.d.ts +39 -0
- package/lib/types/index.d.ts.map +1 -0
- package/lib/types/index.js +1112 -0
- package/lib/types/index.js.map +1 -0
- package/lib/types/intent/engine.d.ts +108 -0
- package/lib/types/intent/engine.d.ts.map +1 -0
- package/lib/types/intent/engine.js +501 -0
- package/lib/types/intent/engine.js.map +1 -0
- package/lib/types/intent/host.d.ts +88 -0
- package/lib/types/intent/host.d.ts.map +1 -0
- package/lib/types/intent/host.js +389 -0
- package/lib/types/intent/host.js.map +1 -0
- package/lib/types/intent/preset-tools.d.ts +37 -0
- package/lib/types/intent/preset-tools.d.ts.map +1 -0
- package/lib/types/intent/preset-tools.js +45 -0
- package/lib/types/intent/preset-tools.js.map +1 -0
- package/lib/types/intent/settings-schema.d.ts +59 -0
- package/lib/types/intent/settings-schema.d.ts.map +1 -0
- package/lib/types/intent/settings-schema.js +57 -0
- package/lib/types/intent/settings-schema.js.map +1 -0
- package/lib/types/intent/store.d.ts +75 -0
- package/lib/types/intent/store.d.ts.map +1 -0
- package/lib/types/intent/store.js +139 -0
- package/lib/types/intent/store.js.map +1 -0
- package/lib/types/intent/tools.d.ts +63 -0
- package/lib/types/intent/tools.d.ts.map +1 -0
- package/lib/types/intent/tools.js +108 -0
- package/lib/types/intent/tools.js.map +1 -0
- package/lib/types/intent/types.d.ts +189 -0
- package/lib/types/intent/types.d.ts.map +1 -0
- package/lib/types/intent/types.js +62 -0
- package/lib/types/intent/types.js.map +1 -0
- package/lib/types/knowledge-bases.d.ts +266 -0
- package/lib/types/knowledge-bases.d.ts.map +1 -0
- package/lib/types/knowledge-bases.js +1107 -0
- package/lib/types/knowledge-bases.js.map +1 -0
- package/lib/types/layout.d.ts +262 -0
- package/lib/types/layout.d.ts.map +1 -0
- package/lib/types/layout.js +312 -0
- package/lib/types/layout.js.map +1 -0
- package/lib/types/migrate.d.ts +110 -0
- package/lib/types/migrate.d.ts.map +1 -0
- package/lib/types/migrate.js +280 -0
- package/lib/types/migrate.js.map +1 -0
- package/lib/types/recall-rank.d.ts +158 -0
- package/lib/types/recall-rank.d.ts.map +1 -0
- package/lib/types/recall-rank.js +261 -0
- package/lib/types/recall-rank.js.map +1 -0
- package/lib/types/runtime.d.ts +568 -0
- package/lib/types/runtime.d.ts.map +1 -0
- package/lib/types/runtime.js +3045 -0
- package/lib/types/runtime.js.map +1 -0
- package/lib/types/settings-schema.d.ts +117 -0
- package/lib/types/settings-schema.d.ts.map +1 -0
- package/lib/types/settings-schema.js +92 -0
- package/lib/types/settings-schema.js.map +1 -0
- package/lib/types/settings-volatile.d.ts +102 -0
- package/lib/types/settings-volatile.d.ts.map +1 -0
- package/lib/types/settings-volatile.js +114 -0
- package/lib/types/settings-volatile.js.map +1 -0
- package/lib/types/types.d.ts +799 -0
- package/lib/types/types.d.ts.map +1 -0
- package/lib/types/types.js +387 -0
- package/lib/types/types.js.map +1 -0
- package/lib/types/wiki-types.d.ts +68 -0
- package/lib/types/wiki-types.d.ts.map +1 -0
- package/lib/types/wiki-types.js +322 -0
- package/lib/types/wiki-types.js.map +1 -0
- package/package.json +101 -0
- package/preset/tita-data-agent/agent.cordis.yml +376 -0
- package/preset/tita-data-agent/preset.yml +3 -0
- package/python/requirements.txt +8 -0
- package/scripts/doctor.mjs +70 -0
- package/scripts/e2e-pipeline.mjs +355 -0
- package/scripts/install-agent-preset.mjs +92 -0
- package/scripts/setup-embedding.sh +34 -0
- package/scripts/sync-agent-preset.mjs +188 -0
- package/src/client/AgentPresetCard.tsx +247 -0
- package/src/client/DirectoryPicker.tsx +357 -0
- package/src/client/InfoHint.tsx +65 -0
- package/src/client/IntentLogicTab.tsx +185 -0
- package/src/client/IntentTab.tsx +715 -0
- package/src/client/KnowledgeBaseTab.tsx +1454 -0
- package/src/client/KnowledgeGraphView.tsx +306 -0
- package/src/client/KnowledgePanel.tsx +381 -0
- package/src/client/KnowledgeStepRail.tsx +60 -0
- package/src/client/NodeSettings.tsx +392 -0
- package/src/client/PreviewSections.tsx +116 -0
- package/src/client/RecallPanel.tsx +399 -0
- package/src/client/TypeDefinitionDrawer.tsx +215 -0
- package/src/client/WikiFlowCard.tsx +226 -0
- package/src/client/WikiTypeEditor.tsx +332 -0
- package/src/client/agent-preset.ts +121 -0
- package/src/client/arch/AgentArchitectureGraph.tsx +219 -0
- package/src/client/arch/NodeLogicPanel.tsx +133 -0
- package/src/client/arch/ProblemDetailPanel.tsx +88 -0
- package/src/client/arch/model.ts +691 -0
- package/src/client/architecture.css +191 -0
- package/src/client/architecture.tsx +530 -0
- package/src/client/attribution/AttributionGraph.tsx +104 -0
- package/src/client/attribution/AttributionTab.tsx +332 -0
- package/src/client/attribution/CaseView.tsx +102 -0
- package/src/client/attribution/GraphStage.tsx +87 -0
- package/src/client/attribution/RunView.tsx +184 -0
- package/src/client/attribution/StageChrome.tsx +403 -0
- package/src/client/attribution/ViewSwitch.tsx +107 -0
- package/src/client/attribution/graph-options.ts +381 -0
- package/src/client/attribution/model.ts +462 -0
- package/src/client/config-scope.ts +119 -0
- package/src/client/convert/ConvertPanel.tsx +594 -0
- package/src/client/convert/styles.css +138 -0
- package/src/client/convert/styles.ts +49 -0
- package/src/client/format.ts +39 -0
- package/src/client/graph/layout.ts +181 -0
- package/src/client/graph.css +113 -0
- package/src/client/index.ts +98 -0
- package/src/client/problem-domains.ts +114 -0
- package/src/client/styles.css +940 -0
- package/src/client/styles.ts +11 -0
- package/src/client/useFitScale.ts +68 -0
- package/src/config-schema.ts +45 -0
- package/src/convert/core-loader.ts +68 -0
- package/src/convert/host.ts +579 -0
- package/src/convert/ingest.ts +367 -0
- package/src/convert/settings-schema.ts +27 -0
- package/src/convert/types.ts +65 -0
- package/src/diagnosis/cards.ts +498 -0
- package/src/diagnosis/problem-classes.ts +117 -0
- package/src/diagnosis/schema.ts +260 -0
- package/src/diagnosis/seed-source.ts +107 -0
- package/src/diagnosis/seed.ts +291 -0
- package/src/diagnosis/store.ts +432 -0
- package/src/diagnosis/types.ts +152 -0
- package/src/directory-picker.ts +164 -0
- package/src/extract-model.ts +227 -0
- package/src/extract.ts +632 -0
- package/src/fts.ts +203 -0
- package/src/index.ts +1091 -0
- package/src/intent/README.md +63 -0
- package/src/intent/engine.ts +527 -0
- package/src/intent/host.ts +462 -0
- package/src/intent/preset-tools.ts +48 -0
- package/src/intent/settings-schema.ts +63 -0
- package/src/intent/store.ts +143 -0
- package/src/intent/tools.ts +139 -0
- package/src/intent/types.ts +245 -0
- package/src/knowledge-bases.ts +1160 -0
- package/src/layout.ts +350 -0
- package/src/migrate.ts +262 -0
- package/src/python/embedding_worker.py +471 -0
- package/src/recall-rank.ts +299 -0
- package/src/runtime.ts +3069 -0
- package/src/settings-schema.ts +94 -0
- package/src/settings-volatile.ts +122 -0
- package/src/types.ts +1140 -0
- package/src/wiki-types.ts +357 -0
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 召回链路的**纯函数**部分(0031):融合、boost、去冗余、证据抽取。
|
|
3
|
+
*
|
|
4
|
+
* 与 `graph/layout.ts`、`problem-domains.ts` 同一个理由:把不依赖 runtime、不碰磁盘的
|
|
5
|
+
* 那部分单独放,于是它们可以在 `node:test` 里被直接断言。这里的每个函数都对应 0031
|
|
6
|
+
* 的一个设计决定,注释写的是**为什么**,不是做了什么。
|
|
7
|
+
*
|
|
8
|
+
* @module
|
|
9
|
+
*/
|
|
10
|
+
import { segment } from './fts.js';
|
|
11
|
+
/**
|
|
12
|
+
* 名次级融合(Reciprocal Rank Fusion)。
|
|
13
|
+
*
|
|
14
|
+
* **为什么不用分数加权和**:三路的分数是三个不同的量纲 —— 关键词是归一化 BM25、
|
|
15
|
+
* 向量是余弦、图谱是命中分/最大命中分。把它们乘权重相加,等于假设「0.5 的关键词分」
|
|
16
|
+
* 与「0.5 的余弦」一样好,而这个假设没有任何依据。0030 的实际后果就是:向量路输出
|
|
17
|
+
* 常数时,hybrid 的 55% 权重全是噪声,排序退化成 `unitId` 字典序(实测 4 条命中
|
|
18
|
+
* 分数完全相同:`0.2753 = 0.5 × 0.55`)。
|
|
19
|
+
*
|
|
20
|
+
* RRF 只吃**名次**,所以量纲问题从根上消失,而权重变成「我更信哪一路的排序」——
|
|
21
|
+
* 这是一个可以校准、也可以被解释的量。
|
|
22
|
+
*/
|
|
23
|
+
export function rrfFuse(rankings, options) {
|
|
24
|
+
const { k, weights } = options;
|
|
25
|
+
const ranks = new Map();
|
|
26
|
+
const scores = new Map();
|
|
27
|
+
const order = ['fts', 'vector', 'graph'];
|
|
28
|
+
for (const route of order) {
|
|
29
|
+
const list = rankings[route];
|
|
30
|
+
if (!list || list.length === 0)
|
|
31
|
+
continue;
|
|
32
|
+
const weight = weights[route] ?? 0;
|
|
33
|
+
if (weight <= 0)
|
|
34
|
+
continue;
|
|
35
|
+
// 同一路里同一 unitId 只认第一次出现(更好的名次)——重复条目不该把分数抬两次。
|
|
36
|
+
const seen = new Set();
|
|
37
|
+
let rank = 0;
|
|
38
|
+
for (const item of list) {
|
|
39
|
+
if (seen.has(item.unitId))
|
|
40
|
+
continue;
|
|
41
|
+
seen.add(item.unitId);
|
|
42
|
+
rank += 1;
|
|
43
|
+
const entry = ranks.get(item.unitId) ?? {};
|
|
44
|
+
entry[route] = rank;
|
|
45
|
+
ranks.set(item.unitId, entry);
|
|
46
|
+
scores.set(item.unitId, (scores.get(item.unitId) ?? 0) + weight / (k + rank));
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return [...scores.entries()]
|
|
50
|
+
.map(([unitId, score]) => ({ unitId, score, ranks: ranks.get(unitId) ?? {} }))
|
|
51
|
+
.sort((left, right) => right.score - left.score || left.unitId.localeCompare(right.unitId));
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* 图谱作为**boost**,不是第三路。
|
|
55
|
+
*
|
|
56
|
+
* 0009/0014 都把知识图谱定位为**构建产物**(wiki→图谱),没有把它当作召回路线;
|
|
57
|
+
* 而 0030 把它做成第三路时,匹配逻辑与关键词路同源(词面匹配 title / id / 关系词),
|
|
58
|
+
* 等于把关键词路的弱点复制一遍,还多贡献了一份不可比的分数。
|
|
59
|
+
*
|
|
60
|
+
* 现在的语义是:图谱命中的实体及其 1 跳邻居,**只给已经在候选池里的条目**加一个
|
|
61
|
+
* RRF 项。它因此不能凭自己制造候选(那是「路」的权力),只能重排(那是「boost」的
|
|
62
|
+
* 职责)—— 于是它既保留了「命中实体 → 带出邻居」的价值,又不会污染融合。
|
|
63
|
+
*/
|
|
64
|
+
export function graphBoost(fused, graphRanking, options) {
|
|
65
|
+
const weight = options.weights.graph ?? 0;
|
|
66
|
+
if (weight <= 0 || graphRanking.length === 0 || fused.length === 0)
|
|
67
|
+
return { hits: fused, applied: 0 };
|
|
68
|
+
const rankOf = new Map();
|
|
69
|
+
let rank = 0;
|
|
70
|
+
for (const item of graphRanking) {
|
|
71
|
+
if (rankOf.has(item.unitId))
|
|
72
|
+
continue;
|
|
73
|
+
rank += 1;
|
|
74
|
+
rankOf.set(item.unitId, rank);
|
|
75
|
+
}
|
|
76
|
+
let applied = 0;
|
|
77
|
+
const boosted = fused.map(hit => {
|
|
78
|
+
const rank = rankOf.get(hit.unitId);
|
|
79
|
+
if (rank === undefined)
|
|
80
|
+
return hit;
|
|
81
|
+
applied += 1;
|
|
82
|
+
return {
|
|
83
|
+
...hit,
|
|
84
|
+
score: hit.score + weight / (options.k + rank),
|
|
85
|
+
ranks: { ...hit.ranks, graph: rank },
|
|
86
|
+
};
|
|
87
|
+
});
|
|
88
|
+
return { hits: boosted.sort((left, right) => right.score - left.score || left.unitId.localeCompare(right.unitId)), applied };
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* 按阈值裁剪一路的候选,并给出这一路的诊断。
|
|
92
|
+
*
|
|
93
|
+
* 关键词路的分是**相对**归一的(见 `fts.ts` 的量纲说明),所以这里的阈值挡得住
|
|
94
|
+
* 「弱命中」、挡不住「整批都弱」;向量路的分是原始余弦,是绝对的。两者都要如实
|
|
95
|
+
* 写进诊断,不能让人以为「过了阈值」等于「相关」。
|
|
96
|
+
*/
|
|
97
|
+
export function applyThreshold(ranking, threshold) {
|
|
98
|
+
const topScore = ranking.length > 0 ? Math.max(...ranking.map(item => item.score)) : 0;
|
|
99
|
+
const kept = ranking.filter(item => item.score >= threshold);
|
|
100
|
+
return { kept, dropped: ranking.length - kept.length, topScore };
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* 从原文里挑出与查询最相关的若干段,作为**证据片段**。
|
|
104
|
+
*
|
|
105
|
+
* 为什么要有这一步:`context` 原来只带 wiki 卡片,模型要核对原文还得再调一次工具。
|
|
106
|
+
* 把证据放进上下文,「每一个数字都能指回它的口径定义与原始文档」才在上下文层面
|
|
107
|
+
* 成立,而不是靠模型自觉去查。
|
|
108
|
+
*
|
|
109
|
+
* 段落按空行切(Markdown 的自然段),逐段算**查询词覆盖率**,取最高的几段。
|
|
110
|
+
* 覆盖率是绝对的,所以「找不到相关段落」会如实返回空数组,而不是硬塞一段无关文字。
|
|
111
|
+
*/
|
|
112
|
+
export function evidenceExcerpts(sourceId, title, text, queryTerms, options = {}) {
|
|
113
|
+
const maxExcerpts = options.maxExcerpts ?? 2;
|
|
114
|
+
const maxChars = options.maxChars ?? 1200;
|
|
115
|
+
const minCoverage = options.minCoverage ?? 0.15;
|
|
116
|
+
const terms = [...new Set(queryTerms)].filter(term => term.length > 0);
|
|
117
|
+
if (terms.length === 0 || text.trim() === '')
|
|
118
|
+
return [];
|
|
119
|
+
const blocks = [];
|
|
120
|
+
const pattern = /[^\n]*(?:\n(?!\s*\n)[^\n]*)*/g;
|
|
121
|
+
for (const match of text.matchAll(pattern)) {
|
|
122
|
+
const block = match[0];
|
|
123
|
+
if (block.trim().length < 8)
|
|
124
|
+
continue;
|
|
125
|
+
blocks.push({ text: block.trim(), offset: match.index ?? 0 });
|
|
126
|
+
}
|
|
127
|
+
if (blocks.length === 0)
|
|
128
|
+
return [];
|
|
129
|
+
const scored = blocks.map(block => {
|
|
130
|
+
const haystack = block.text.toLowerCase();
|
|
131
|
+
const hit = terms.filter(term => haystack.includes(term)).length;
|
|
132
|
+
return { ...block, coverage: hit / terms.length };
|
|
133
|
+
}).filter(block => block.coverage >= minCoverage);
|
|
134
|
+
return scored
|
|
135
|
+
.sort((left, right) => right.coverage - left.coverage || left.offset - right.offset)
|
|
136
|
+
.slice(0, maxExcerpts)
|
|
137
|
+
.map(block => ({
|
|
138
|
+
sourceId,
|
|
139
|
+
...(title ? { title } : {}),
|
|
140
|
+
excerpt: block.text.length > maxChars ? `${block.text.slice(0, maxChars)}…` : block.text,
|
|
141
|
+
offset: block.offset,
|
|
142
|
+
coverage: Number(block.coverage.toFixed(4)),
|
|
143
|
+
}));
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* 一条 note 进关键词索引的**完整文本**。
|
|
147
|
+
*
|
|
148
|
+
* 它包含三部分:标题、正文、以及**溯源身份**(它引用的 sourceId 与那些来源的标题)。
|
|
149
|
+
* 溯源身份不是锦上添花:图谱降为 boost 之后,「只提到某份来源、没提到任何卡片正文」
|
|
150
|
+
* 的查询再也没有第二条路可走,所以「这份台账派生出了哪些结论」必须由关键词路回答。
|
|
151
|
+
*
|
|
152
|
+
* 这个函数被**两处**共用 —— 建索引时写进去的文本,与召回时算查询词覆盖率的文本。
|
|
153
|
+
* 两处各写一份的话,覆盖率会对着不同的文本算,好命中会被静默丢掉(实测:查 `ledger`
|
|
154
|
+
* 时索引命中了、覆盖率却是 0)。
|
|
155
|
+
*/
|
|
156
|
+
export function noteIndexText(note, titleOf) {
|
|
157
|
+
const titles = note.sourceRefs.map(ref => titleOf(ref) ?? '').filter(Boolean).join(' ');
|
|
158
|
+
const provenance = [note.sourceRefs.join(' '), titles].filter(Boolean).join(' ');
|
|
159
|
+
return provenance ? `${note.title}\n${note.content}\n${provenance}` : `${note.title}\n${note.content}`;
|
|
160
|
+
}
|
|
161
|
+
/** 一段文本的词集合,用于 MMR 的冗余度(Jaccard)。 */
|
|
162
|
+
export function tokenSet(text) {
|
|
163
|
+
return new Set(segment(text));
|
|
164
|
+
}
|
|
165
|
+
function jaccard(left, right) {
|
|
166
|
+
if (left.size === 0 || right.size === 0)
|
|
167
|
+
return 0;
|
|
168
|
+
let shared = 0;
|
|
169
|
+
for (const token of left)
|
|
170
|
+
if (right.has(token))
|
|
171
|
+
shared += 1;
|
|
172
|
+
return shared / (left.size + right.size - shared);
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* 选上下文条目:**每张 wiki 封顶 + MMR 去冗余**。
|
|
176
|
+
*
|
|
177
|
+
* 为什么必须有:0030 的图谱路刻意给同一张 wiki 的分节 note 0.8 的权重,于是 5 条上下文
|
|
178
|
+
* 可以全部来自同一张卡 —— 一屏塞满、信息量为 1。这是「召回质量差」里最容易被忽略的一半:
|
|
179
|
+
* 前 5 条不是「5 条相关」,而是「1 条相关的 5 个片段」。
|
|
180
|
+
*
|
|
181
|
+
* 冗余度用**词集合的 Jaccard**,不用向量:它对编码器是否可用不敏感,因此去冗余在
|
|
182
|
+
* 向量路降级时依然生效 —— 依赖一个可能坏掉的组件的功能,等于把它的可靠性绑在那个组件上。
|
|
183
|
+
*/
|
|
184
|
+
export function selectContext(items, options) {
|
|
185
|
+
const lambda = options.lambda ?? 0.7;
|
|
186
|
+
const perWikiCap = options.perWikiCap ?? 2;
|
|
187
|
+
const pool = [...items].sort((left, right) => options.relevance(right) - options.relevance(left));
|
|
188
|
+
const selected = [];
|
|
189
|
+
const selectedTokens = [];
|
|
190
|
+
const perWiki = new Map();
|
|
191
|
+
const remaining = [...pool];
|
|
192
|
+
while (selected.length < options.limit && remaining.length > 0) {
|
|
193
|
+
let bestIndex = -1;
|
|
194
|
+
let bestValue = Number.NEGATIVE_INFINITY;
|
|
195
|
+
for (let index = 0; index < remaining.length; index += 1) {
|
|
196
|
+
const candidate = remaining[index];
|
|
197
|
+
const wiki = options.wikiKey(candidate);
|
|
198
|
+
if ((perWiki.get(wiki) ?? 0) >= perWikiCap)
|
|
199
|
+
continue;
|
|
200
|
+
const tokens = options.tokens(candidate);
|
|
201
|
+
let redundancy = 0;
|
|
202
|
+
for (const taken of selectedTokens)
|
|
203
|
+
redundancy = Math.max(redundancy, jaccard(tokens, taken));
|
|
204
|
+
const value = lambda * options.relevance(candidate) - (1 - lambda) * redundancy;
|
|
205
|
+
if (value > bestValue) {
|
|
206
|
+
bestValue = value;
|
|
207
|
+
bestIndex = index;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
if (bestIndex < 0)
|
|
211
|
+
break;
|
|
212
|
+
const chosen = remaining.splice(bestIndex, 1)[0];
|
|
213
|
+
selected.push(chosen);
|
|
214
|
+
selectedTokens.push(options.tokens(chosen));
|
|
215
|
+
const wiki = options.wikiKey(chosen);
|
|
216
|
+
perWiki.set(wiki, (perWiki.get(wiki) ?? 0) + 1);
|
|
217
|
+
}
|
|
218
|
+
return selected;
|
|
219
|
+
}
|
|
220
|
+
/** `match` 字段由名次推导:两路及以上命中 = hybrid。 */
|
|
221
|
+
export function matchOf(ranks) {
|
|
222
|
+
const used = ['fts', 'vector', 'graph'].filter(route => ranks[route] !== undefined);
|
|
223
|
+
if (used.length >= 2)
|
|
224
|
+
return 'hybrid';
|
|
225
|
+
return used[0] ?? 'fts';
|
|
226
|
+
}
|
|
227
|
+
/** 展示用的概率:`rerankScore` 是 logit 的 sigmoid。 */
|
|
228
|
+
export function sigmoidLogit(logit) {
|
|
229
|
+
return 1 / (1 + Math.exp(-logit));
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Stage 4:**在 logit 刻度上**过阈值,展示值才做一次 sigmoid。
|
|
233
|
+
*
|
|
234
|
+
* 刻度必须只有一个。cross-encoder 的价值就在于此:它的分是**跨查询可比**的,
|
|
235
|
+
* 所以「低于 0.2 就不要」是一个绝对判据,而关键词/向量的阈值做不到这一点。
|
|
236
|
+
* 0031 落地时这里错了两层:
|
|
237
|
+
*
|
|
238
|
+
* 1. worker 用 `CrossEncoder.predict` 的默认行为,拿到的是 **sigmoid 之后**的值
|
|
239
|
+
* ((0,1)),却按 logit 阈值 0.2 去比 —— 于是 `dropped` 恒为 0,绝对闸门从未生效。
|
|
240
|
+
* 2. Host 又 sigmoid 了一次做展示,把无关文档(logit −10.2)显示成 `0.500`
|
|
241
|
+
* —— 一个「看起来刚好在门槛上」的分数。
|
|
242
|
+
*
|
|
243
|
+
* 现在 worker 返回 logit(`predict_raw`),阈值与排序都在 logit 上,展示只 sigmoid 一次。
|
|
244
|
+
* 这个函数是纯的,所以刻度这件事可以在 `node:test` 里被钉住。
|
|
245
|
+
*/
|
|
246
|
+
export function applyRerank(scores, items, threshold) {
|
|
247
|
+
if (scores.length !== items.length)
|
|
248
|
+
throw new Error(`RERANK_COUNT_INVALID: expected ${items.length}, got ${scores.length}`);
|
|
249
|
+
if (scores.some(value => !Number.isFinite(value)))
|
|
250
|
+
throw new Error('RERANK_SCORE_INVALID: 返回了非有限分数');
|
|
251
|
+
const scored = items.map((item, index) => ({ item, logit: scores[index] }));
|
|
252
|
+
const kept = scored.filter(entry => entry.logit >= threshold);
|
|
253
|
+
return {
|
|
254
|
+
kept: kept
|
|
255
|
+
.map(entry => ({ ...entry.item, rerankScore: sigmoidLogit(entry.logit) }))
|
|
256
|
+
.sort((left, right) => right.rerankScore - left.rerankScore || left.unitId.localeCompare(right.unitId)),
|
|
257
|
+
dropped: scored.length - kept.length,
|
|
258
|
+
topLogit: scored.length > 0 ? Math.max(...scored.map(entry => entry.logit)) : 0,
|
|
259
|
+
};
|
|
260
|
+
}
|
|
261
|
+
//# sourceMappingURL=recall-rank.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recall-rank.js","sourceRoot":"","sources":["../../src/recall-rank.ts"],"names":[],"mappings":"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"}
|