@danielmarbach/mnemonic-mcp 0.21.0 → 0.23.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/CHANGELOG.md +25 -0
- package/README.md +13 -3
- package/build/auto-relate.d.ts +9 -0
- package/build/auto-relate.d.ts.map +1 -0
- package/build/auto-relate.js +73 -0
- package/build/auto-relate.js.map +1 -0
- package/build/cache.d.ts +21 -0
- package/build/cache.d.ts.map +1 -1
- package/build/cache.js +54 -4
- package/build/cache.js.map +1 -1
- package/build/index.js +133 -29
- package/build/index.js.map +1 -1
- package/build/lexical.d.ts +36 -0
- package/build/lexical.d.ts.map +1 -1
- package/build/lexical.js +147 -0
- package/build/lexical.js.map +1 -1
- package/build/recall.d.ts +24 -4
- package/build/recall.d.ts.map +1 -1
- package/build/recall.js +74 -6
- package/build/recall.js.map +1 -1
- package/package.json +1 -1
package/build/lexical.d.ts
CHANGED
|
@@ -30,6 +30,41 @@ export declare function containsSubstring(haystack: string, needle: string): boo
|
|
|
30
30
|
* - unigram Jaccard (0.25 weight) — token-level overlap
|
|
31
31
|
*/
|
|
32
32
|
export declare function computeLexicalScore(query: string, projectionText: string): number;
|
|
33
|
+
/**
|
|
34
|
+
* Compute normalized term frequency for a token list.
|
|
35
|
+
*/
|
|
36
|
+
export declare function computeTermFrequency(tokens: string[]): Map<string, number>;
|
|
37
|
+
/**
|
|
38
|
+
* Compute smoothed inverse document frequency for a tokenized corpus.
|
|
39
|
+
*/
|
|
40
|
+
export declare function computeInverseDocumentFrequency(documents: string[][]): Map<string, number>;
|
|
41
|
+
/**
|
|
42
|
+
* Compute cosine similarity between a query and document TF-IDF vectors.
|
|
43
|
+
*/
|
|
44
|
+
export declare function computeTfIdfCosineSimilarity(query: string, document: string, corpus: string[]): number;
|
|
45
|
+
interface PreparedTfIdfDocument {
|
|
46
|
+
id: string;
|
|
47
|
+
text: string;
|
|
48
|
+
tokens: string[];
|
|
49
|
+
}
|
|
50
|
+
export interface PreparedTfIdfCorpus {
|
|
51
|
+
documents: PreparedTfIdfDocument[];
|
|
52
|
+
idf: Map<string, number>;
|
|
53
|
+
}
|
|
54
|
+
export declare function prepareTfIdfCorpus(documents: Array<{
|
|
55
|
+
id: string;
|
|
56
|
+
text: string;
|
|
57
|
+
}>): PreparedTfIdfCorpus;
|
|
58
|
+
/**
|
|
59
|
+
* Rank documents by TF-IDF cosine similarity for a query.
|
|
60
|
+
*/
|
|
61
|
+
export declare function rankDocumentsByTfIdf(query: string, documents: Array<{
|
|
62
|
+
id: string;
|
|
63
|
+
text: string;
|
|
64
|
+
}>, limit: number, preparedCorpus?: PreparedTfIdfCorpus): Array<{
|
|
65
|
+
id: string;
|
|
66
|
+
score: number;
|
|
67
|
+
}>;
|
|
33
68
|
/**
|
|
34
69
|
* Maximum number of candidates to consider for lexical rescue.
|
|
35
70
|
*/
|
|
@@ -50,4 +85,5 @@ export declare const LEXICAL_RESCUE_RESULT_LIMIT = 3;
|
|
|
50
85
|
* OR when there are no semantic results.
|
|
51
86
|
*/
|
|
52
87
|
export declare function shouldTriggerLexicalRescue(topSemanticScore: number | undefined, semanticResultCount: number): boolean;
|
|
88
|
+
export {};
|
|
53
89
|
//# sourceMappingURL=lexical.d.ts.map
|
package/build/lexical.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lexical.d.ts","sourceRoot":"","sources":["../src/lexical.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAMlD;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAE/C;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,MAAM,CAQxE;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAIpE;AAeD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAE3E;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,MAAM,CAkBjF;AAED;;GAEG;AACH,eAAO,MAAM,8BAA8B,KAAK,CAAC;AAEjD;;GAEG;AACH,eAAO,MAAM,wBAAwB,OAAO,CAAC;AAE7C;;GAEG;AACH,eAAO,MAAM,2BAA2B,IAAI,CAAC;AAE7C;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CACxC,gBAAgB,EAAE,MAAM,GAAG,SAAS,EACpC,mBAAmB,EAAE,MAAM,GAC1B,OAAO,CAKT"}
|
|
1
|
+
{"version":3,"file":"lexical.d.ts","sourceRoot":"","sources":["../src/lexical.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAMlD;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAE/C;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,MAAM,CAQxE;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAIpE;AAeD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAE3E;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,MAAM,CAkBjF;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAa1E;AAED;;GAEG;AACH,wBAAgB,+BAA+B,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAgB1F;AAED;;GAEG;AACH,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAgCtG;AAED,UAAU,qBAAqB;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,qBAAqB,EAAE,CAAC;IACnC,GAAG,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC1B;AAED,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,GAC7C,mBAAmB,CAWrB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,EAC9C,KAAK,EAAE,MAAM,EACb,cAAc,CAAC,EAAE,mBAAmB,GACnC,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAsBtC;AAuED;;GAEG;AACH,eAAO,MAAM,8BAA8B,KAAK,CAAC;AAEjD;;GAEG;AACH,eAAO,MAAM,wBAAwB,OAAO,CAAC;AAE7C;;GAEG;AACH,eAAO,MAAM,2BAA2B,IAAI,CAAC;AAE7C;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CACxC,gBAAgB,EAAE,MAAM,GAAG,SAAS,EACpC,mBAAmB,EAAE,MAAM,GAC1B,OAAO,CAKT"}
|
package/build/lexical.js
CHANGED
|
@@ -82,6 +82,153 @@ export function computeLexicalScore(query, projectionText) {
|
|
|
82
82
|
const unigramScore = jaccardSimilarity(queryTokens, projTokens);
|
|
83
83
|
return 0.4 * substringScore + 0.35 * bigramScore + 0.25 * unigramScore;
|
|
84
84
|
}
|
|
85
|
+
/**
|
|
86
|
+
* Compute normalized term frequency for a token list.
|
|
87
|
+
*/
|
|
88
|
+
export function computeTermFrequency(tokens) {
|
|
89
|
+
const frequencies = new Map();
|
|
90
|
+
if (tokens.length === 0)
|
|
91
|
+
return frequencies;
|
|
92
|
+
for (const token of tokens) {
|
|
93
|
+
frequencies.set(token, (frequencies.get(token) ?? 0) + 1);
|
|
94
|
+
}
|
|
95
|
+
for (const [token, count] of frequencies) {
|
|
96
|
+
frequencies.set(token, count / tokens.length);
|
|
97
|
+
}
|
|
98
|
+
return frequencies;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Compute smoothed inverse document frequency for a tokenized corpus.
|
|
102
|
+
*/
|
|
103
|
+
export function computeInverseDocumentFrequency(documents) {
|
|
104
|
+
const idf = new Map();
|
|
105
|
+
if (documents.length === 0)
|
|
106
|
+
return idf;
|
|
107
|
+
const documentFrequencies = new Map();
|
|
108
|
+
for (const document of documents) {
|
|
109
|
+
for (const token of new Set(document)) {
|
|
110
|
+
documentFrequencies.set(token, (documentFrequencies.get(token) ?? 0) + 1);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
for (const [token, frequency] of documentFrequencies) {
|
|
114
|
+
idf.set(token, Math.log((1 + documents.length) / (1 + frequency)) + 1);
|
|
115
|
+
}
|
|
116
|
+
return idf;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Compute cosine similarity between a query and document TF-IDF vectors.
|
|
120
|
+
*/
|
|
121
|
+
export function computeTfIdfCosineSimilarity(query, document, corpus) {
|
|
122
|
+
const corpusTokens = corpus.map((entry) => tokenize(entry));
|
|
123
|
+
const queryTokens = tokenize(query);
|
|
124
|
+
const documentTokens = tokenize(document);
|
|
125
|
+
if (queryTokens.length === 0 || documentTokens.length === 0 || corpusTokens.length === 0) {
|
|
126
|
+
return 0;
|
|
127
|
+
}
|
|
128
|
+
const idf = computeInverseDocumentFrequency(corpusTokens);
|
|
129
|
+
const queryTf = computeTermFrequency(queryTokens);
|
|
130
|
+
const documentTf = computeTermFrequency(documentTokens);
|
|
131
|
+
const vocabulary = new Set([...queryTf.keys(), ...documentTf.keys()]);
|
|
132
|
+
let dotProduct = 0;
|
|
133
|
+
let queryMagnitude = 0;
|
|
134
|
+
let documentMagnitude = 0;
|
|
135
|
+
for (const token of vocabulary) {
|
|
136
|
+
const weight = idf.get(token) ?? 0;
|
|
137
|
+
const queryWeight = (queryTf.get(token) ?? 0) * weight;
|
|
138
|
+
const documentWeight = (documentTf.get(token) ?? 0) * weight;
|
|
139
|
+
dotProduct += queryWeight * documentWeight;
|
|
140
|
+
queryMagnitude += queryWeight * queryWeight;
|
|
141
|
+
documentMagnitude += documentWeight * documentWeight;
|
|
142
|
+
}
|
|
143
|
+
if (queryMagnitude === 0 || documentMagnitude === 0) {
|
|
144
|
+
return 0;
|
|
145
|
+
}
|
|
146
|
+
return dotProduct / (Math.sqrt(queryMagnitude) * Math.sqrt(documentMagnitude));
|
|
147
|
+
}
|
|
148
|
+
export function prepareTfIdfCorpus(documents) {
|
|
149
|
+
const preparedDocuments = documents.map((document) => ({
|
|
150
|
+
id: document.id,
|
|
151
|
+
text: document.text,
|
|
152
|
+
tokens: tokenize(document.text),
|
|
153
|
+
}));
|
|
154
|
+
return {
|
|
155
|
+
documents: preparedDocuments,
|
|
156
|
+
idf: computeInverseDocumentFrequency(preparedDocuments.map((document) => document.tokens)),
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Rank documents by TF-IDF cosine similarity for a query.
|
|
161
|
+
*/
|
|
162
|
+
export function rankDocumentsByTfIdf(query, documents, limit, preparedCorpus) {
|
|
163
|
+
if (limit <= 0 || documents.length === 0) {
|
|
164
|
+
return [];
|
|
165
|
+
}
|
|
166
|
+
const prepared = preparedCorpus ?? prepareTfIdfCorpus(documents);
|
|
167
|
+
const corpus = prepared.documents.map((document) => document.text);
|
|
168
|
+
const queryTokens = tokenize(query);
|
|
169
|
+
const idf = prepared.idf;
|
|
170
|
+
return prepared.documents
|
|
171
|
+
.map((document) => {
|
|
172
|
+
const tfIdfScore = computeTfIdfCosineSimilarityWithPreparedData(queryTokens, document.tokens, idf);
|
|
173
|
+
const coverageScore = computeTfIdfWeightedQueryCoverage(queryTokens, document.tokens, idf);
|
|
174
|
+
const titleScore = computeLexicalScore(query, extractProjectionTitle(document.text));
|
|
175
|
+
return {
|
|
176
|
+
id: document.id,
|
|
177
|
+
score: tfIdfScore + 0.35 * coverageScore + 0.2 * titleScore,
|
|
178
|
+
};
|
|
179
|
+
})
|
|
180
|
+
.sort((a, b) => b.score - a.score)
|
|
181
|
+
.slice(0, limit);
|
|
182
|
+
}
|
|
183
|
+
function computeTfIdfCosineSimilarityWithPreparedData(queryTokens, documentTokens, idf) {
|
|
184
|
+
if (queryTokens.length === 0 || documentTokens.length === 0) {
|
|
185
|
+
return 0;
|
|
186
|
+
}
|
|
187
|
+
const queryTf = computeTermFrequency(queryTokens);
|
|
188
|
+
const documentTf = computeTermFrequency(documentTokens);
|
|
189
|
+
const vocabulary = new Set([...queryTf.keys(), ...documentTf.keys()]);
|
|
190
|
+
let dotProduct = 0;
|
|
191
|
+
let queryMagnitude = 0;
|
|
192
|
+
let documentMagnitude = 0;
|
|
193
|
+
for (const token of vocabulary) {
|
|
194
|
+
const weight = idf.get(token) ?? 0;
|
|
195
|
+
const queryWeight = (queryTf.get(token) ?? 0) * weight;
|
|
196
|
+
const documentWeight = (documentTf.get(token) ?? 0) * weight;
|
|
197
|
+
dotProduct += queryWeight * documentWeight;
|
|
198
|
+
queryMagnitude += queryWeight * queryWeight;
|
|
199
|
+
documentMagnitude += documentWeight * documentWeight;
|
|
200
|
+
}
|
|
201
|
+
if (queryMagnitude === 0 || documentMagnitude === 0) {
|
|
202
|
+
return 0;
|
|
203
|
+
}
|
|
204
|
+
return dotProduct / (Math.sqrt(queryMagnitude) * Math.sqrt(documentMagnitude));
|
|
205
|
+
}
|
|
206
|
+
function computeTfIdfWeightedQueryCoverage(queryTokens, documentTokens, idf) {
|
|
207
|
+
const uniqueQueryTokens = Array.from(new Set(queryTokens));
|
|
208
|
+
if (uniqueQueryTokens.length === 0) {
|
|
209
|
+
return 0;
|
|
210
|
+
}
|
|
211
|
+
const documentTokenSet = new Set(documentTokens);
|
|
212
|
+
let matchedWeight = 0;
|
|
213
|
+
let totalWeight = 0;
|
|
214
|
+
for (const token of uniqueQueryTokens) {
|
|
215
|
+
const weight = idf.get(token) ?? 0;
|
|
216
|
+
totalWeight += weight;
|
|
217
|
+
if (documentTokenSet.has(token)) {
|
|
218
|
+
matchedWeight += weight;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
return totalWeight === 0 ? 0 : matchedWeight / totalWeight;
|
|
222
|
+
}
|
|
223
|
+
function extractProjectionTitle(text) {
|
|
224
|
+
const titleLine = text.split("\n", 1)[0]?.trim();
|
|
225
|
+
if (!titleLine) {
|
|
226
|
+
return "";
|
|
227
|
+
}
|
|
228
|
+
return titleLine.startsWith("Title:")
|
|
229
|
+
? titleLine.slice("Title:".length).trim()
|
|
230
|
+
: titleLine;
|
|
231
|
+
}
|
|
85
232
|
/**
|
|
86
233
|
* Maximum number of candidates to consider for lexical rescue.
|
|
87
234
|
*/
|
package/build/lexical.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lexical.js","sourceRoot":"","sources":["../src/lexical.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"lexical.js","sourceRoot":"","sources":["../src/lexical.ts"],"names":[],"mappings":"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"}
|
package/build/recall.d.ts
CHANGED
|
@@ -3,22 +3,42 @@ import type { EffectiveNoteMetadata } from "./role-suggestions.js";
|
|
|
3
3
|
export interface ScoredRecallCandidate {
|
|
4
4
|
id: string;
|
|
5
5
|
score: number;
|
|
6
|
+
/** Semantic plausibility used to gate canonical explanation promotion. */
|
|
7
|
+
semanticScoreForPromotion?: number;
|
|
6
8
|
boosted: number;
|
|
7
9
|
vault: Vault;
|
|
8
10
|
isCurrentProject: boolean;
|
|
9
11
|
/** Lexical overlap score in [0, 1]. Undefined when not computed. */
|
|
10
12
|
lexicalScore?: number;
|
|
13
|
+
/** Coverage of rarer query tokens across the current candidate set. */
|
|
14
|
+
coverageScore?: number;
|
|
15
|
+
/** Exact contiguous phrase coverage across significant query tokens. */
|
|
16
|
+
phraseScore?: number;
|
|
17
|
+
lifecycle?: "temporary" | "permanent";
|
|
18
|
+
relatedCount?: number;
|
|
19
|
+
connectionDiversity?: number;
|
|
20
|
+
structureScore?: number;
|
|
21
|
+
metadata?: EffectiveNoteMetadata;
|
|
22
|
+
canonicalExplanationScore?: number;
|
|
11
23
|
}
|
|
12
24
|
export declare function computeRecallMetadataBoost(metadata?: EffectiveNoteMetadata): number;
|
|
13
25
|
/**
|
|
14
|
-
* Compute a hybrid score that combines semantic similarity with
|
|
26
|
+
* Compute a hybrid score that combines semantic similarity with additive
|
|
27
|
+
* lexical, coverage, phrase, and canonical explanation signals.
|
|
15
28
|
*
|
|
16
|
-
* The formula is:
|
|
29
|
+
* The formula is:
|
|
30
|
+
* boosted
|
|
31
|
+
* + LEXICAL_HYBRID_WEIGHT * lexical
|
|
32
|
+
* + COVERAGE_HYBRID_WEIGHT * coverage
|
|
33
|
+
* + PHRASE_HYBRID_WEIGHT * phrase
|
|
34
|
+
* + canonicalExplanation
|
|
17
35
|
*
|
|
18
|
-
*
|
|
19
|
-
* overcome a large semantic gap but can reorder close candidates.
|
|
36
|
+
* These additive signals act as tiebreakers and small reranking signals. They
|
|
37
|
+
* cannot overcome a large semantic gap but can reorder close candidates.
|
|
20
38
|
*/
|
|
21
39
|
export declare function computeHybridScore(candidate: ScoredRecallCandidate): number;
|
|
40
|
+
export declare function computeCanonicalExplanationScore(candidate: ScoredRecallCandidate): number;
|
|
41
|
+
export declare function applyCanonicalExplanationPromotion(candidates: ScoredRecallCandidate[]): ScoredRecallCandidate[];
|
|
22
42
|
/**
|
|
23
43
|
* Apply lexical reranking to a set of semantic candidates.
|
|
24
44
|
*
|
package/build/recall.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recall.d.ts","sourceRoot":"","sources":["../src/recall.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"recall.d.ts","sourceRoot":"","sources":["../src/recall.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAcnE,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,0EAA0E;IAC1E,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,KAAK,CAAC;IACb,gBAAgB,EAAE,OAAO,CAAC;IAC1B,oEAAoE;IACpE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,uEAAuE;IACvE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,wEAAwE;IACxE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,WAAW,GAAG,WAAW,CAAC;IACtC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,qBAAqB,CAAC;IACjC,yBAAyB,CAAC,EAAE,MAAM,CAAC;CACpC;AAED,wBAAgB,0BAA0B,CAAC,QAAQ,CAAC,EAAE,qBAAqB,GAAG,MAAM,CAsBnF;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,qBAAqB,GAAG,MAAM,CAM3E;AAED,wBAAgB,gCAAgC,CAAC,SAAS,EAAE,qBAAqB,GAAG,MAAM,CAmBzF;AAED,wBAAgB,kCAAkC,CAAC,UAAU,EAAE,qBAAqB,EAAE,GAAG,qBAAqB,EAAE,CAM/G;AAmCD;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,qBAAqB,EAAE,EACnC,KAAK,EAAE,MAAM,EACb,iBAAiB,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,GACpD,qBAAqB,EAAE,CAezB;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,qBAAqB,EAAE,EAC/B,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,SAAS,GAAG,QAAQ,GAAG,KAAK,GAClC,qBAAqB,EAAE,CAoBzB"}
|
package/build/recall.js
CHANGED
|
@@ -1,10 +1,13 @@
|
|
|
1
|
-
import { computeLexicalScore } from "./lexical.js";
|
|
1
|
+
import { computeLexicalScore, tokenize } from "./lexical.js";
|
|
2
2
|
const RECALL_ALWAYS_LOAD_BOOST = 0.01;
|
|
3
3
|
const RECALL_SUMMARY_BOOST = 0.012;
|
|
4
4
|
const RECALL_DECISION_BOOST = 0.009;
|
|
5
5
|
const RECALL_HIGH_IMPORTANCE_BOOST = 0.006;
|
|
6
6
|
/** Weight applied to lexical score when computing hybrid boosted score. */
|
|
7
7
|
const LEXICAL_HYBRID_WEIGHT = 0.12;
|
|
8
|
+
const COVERAGE_HYBRID_WEIGHT = 0.08;
|
|
9
|
+
const PHRASE_HYBRID_WEIGHT = 0.16;
|
|
10
|
+
const MIN_CANONICAL_EXPLANATION_SCORE = 0.5;
|
|
8
11
|
export function computeRecallMetadataBoost(metadata) {
|
|
9
12
|
if (!metadata) {
|
|
10
13
|
return 0;
|
|
@@ -25,16 +28,76 @@ export function computeRecallMetadataBoost(metadata) {
|
|
|
25
28
|
return boost;
|
|
26
29
|
}
|
|
27
30
|
/**
|
|
28
|
-
* Compute a hybrid score that combines semantic similarity with
|
|
31
|
+
* Compute a hybrid score that combines semantic similarity with additive
|
|
32
|
+
* lexical, coverage, phrase, and canonical explanation signals.
|
|
29
33
|
*
|
|
30
|
-
* The formula is:
|
|
34
|
+
* The formula is:
|
|
35
|
+
* boosted
|
|
36
|
+
* + LEXICAL_HYBRID_WEIGHT * lexical
|
|
37
|
+
* + COVERAGE_HYBRID_WEIGHT * coverage
|
|
38
|
+
* + PHRASE_HYBRID_WEIGHT * phrase
|
|
39
|
+
* + canonicalExplanation
|
|
31
40
|
*
|
|
32
|
-
*
|
|
33
|
-
* overcome a large semantic gap but can reorder close candidates.
|
|
41
|
+
* These additive signals act as tiebreakers and small reranking signals. They
|
|
42
|
+
* cannot overcome a large semantic gap but can reorder close candidates.
|
|
34
43
|
*/
|
|
35
44
|
export function computeHybridScore(candidate) {
|
|
36
45
|
const lexical = candidate.lexicalScore ?? 0;
|
|
37
|
-
|
|
46
|
+
const coverage = candidate.coverageScore ?? 0;
|
|
47
|
+
const phrase = candidate.phraseScore ?? 0;
|
|
48
|
+
const canonical = candidate.canonicalExplanationScore ?? 0;
|
|
49
|
+
return candidate.boosted + LEXICAL_HYBRID_WEIGHT * lexical + COVERAGE_HYBRID_WEIGHT * coverage + PHRASE_HYBRID_WEIGHT * phrase + canonical;
|
|
50
|
+
}
|
|
51
|
+
export function computeCanonicalExplanationScore(candidate) {
|
|
52
|
+
if ((candidate.semanticScoreForPromotion ?? 0) < MIN_CANONICAL_EXPLANATION_SCORE) {
|
|
53
|
+
return 0;
|
|
54
|
+
}
|
|
55
|
+
const permanence = candidate.lifecycle === "permanent" ? 0.05 : 0;
|
|
56
|
+
const role = candidate.metadata?.role === "decision"
|
|
57
|
+
? 0.05
|
|
58
|
+
: candidate.metadata?.role === "context"
|
|
59
|
+
? 0.04
|
|
60
|
+
: candidate.metadata?.role === "summary"
|
|
61
|
+
? 0.02
|
|
62
|
+
: 0;
|
|
63
|
+
const centrality = Math.min(0.05, Math.log((candidate.relatedCount ?? 0) + 1) * 0.02);
|
|
64
|
+
const diversity = Math.min(0.04, (candidate.connectionDiversity ?? 0) * 0.015);
|
|
65
|
+
const structure = Math.min(0.03, candidate.structureScore ?? 0);
|
|
66
|
+
const wording = Math.min(0.01, candidate.lexicalScore ?? 0);
|
|
67
|
+
return permanence + role + centrality + diversity + structure + wording;
|
|
68
|
+
}
|
|
69
|
+
export function applyCanonicalExplanationPromotion(candidates) {
|
|
70
|
+
for (const candidate of candidates) {
|
|
71
|
+
candidate.canonicalExplanationScore = computeCanonicalExplanationScore(candidate);
|
|
72
|
+
}
|
|
73
|
+
return [...candidates].sort((a, b) => computeHybridScore(b) - computeHybridScore(a));
|
|
74
|
+
}
|
|
75
|
+
function computeSignificantPhraseScore(query, candidateText) {
|
|
76
|
+
const phraseTokens = Array.from(new Set(tokenize(query))).filter((token) => token.length >= 4);
|
|
77
|
+
if (phraseTokens.length < 2) {
|
|
78
|
+
return 0;
|
|
79
|
+
}
|
|
80
|
+
const normalizedCandidate = tokenize(candidateText).join(" ");
|
|
81
|
+
return normalizedCandidate.includes(phraseTokens.join(" ")) ? 1 : 0;
|
|
82
|
+
}
|
|
83
|
+
function computeWeightedQueryCoverage(query, candidateText, corpusTexts) {
|
|
84
|
+
const queryTokens = Array.from(new Set(tokenize(query))).filter((token) => token.length >= 4);
|
|
85
|
+
if (queryTokens.length === 0) {
|
|
86
|
+
return 0;
|
|
87
|
+
}
|
|
88
|
+
const candidateTokens = new Set(tokenize(candidateText));
|
|
89
|
+
const corpusTokenSets = corpusTexts.map((text) => new Set(tokenize(text)));
|
|
90
|
+
let matchedWeight = 0;
|
|
91
|
+
let totalWeight = 0;
|
|
92
|
+
for (const token of queryTokens) {
|
|
93
|
+
const documentFrequency = corpusTokenSets.reduce((count, tokens) => count + (tokens.has(token) ? 1 : 0), 0);
|
|
94
|
+
const weight = 1 / Math.max(documentFrequency, 1);
|
|
95
|
+
totalWeight += weight;
|
|
96
|
+
if (candidateTokens.has(token)) {
|
|
97
|
+
matchedWeight += weight;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return totalWeight === 0 ? 0 : matchedWeight / totalWeight;
|
|
38
101
|
}
|
|
39
102
|
/**
|
|
40
103
|
* Apply lexical reranking to a set of semantic candidates.
|
|
@@ -46,10 +109,15 @@ export function computeHybridScore(candidate) {
|
|
|
46
109
|
* undefined and contributes 0 to the hybrid score.
|
|
47
110
|
*/
|
|
48
111
|
export function applyLexicalReranking(candidates, query, getProjectionText) {
|
|
112
|
+
const corpusTexts = candidates
|
|
113
|
+
.map((candidate) => getProjectionText(candidate.id))
|
|
114
|
+
.filter((text) => Boolean(text));
|
|
49
115
|
for (const candidate of candidates) {
|
|
50
116
|
const projText = getProjectionText(candidate.id);
|
|
51
117
|
if (projText) {
|
|
52
118
|
candidate.lexicalScore = computeLexicalScore(query, projText);
|
|
119
|
+
candidate.coverageScore = computeWeightedQueryCoverage(query, projText, corpusTexts);
|
|
120
|
+
candidate.phraseScore = computeSignificantPhraseScore(query, projText);
|
|
53
121
|
}
|
|
54
122
|
}
|
|
55
123
|
return [...candidates].sort((a, b) => computeHybridScore(b) - computeHybridScore(a));
|
package/build/recall.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recall.js","sourceRoot":"","sources":["../src/recall.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"recall.js","sourceRoot":"","sources":["../src/recall.ts"],"names":[],"mappings":"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"}
|