causantic 0.9.4 → 0.10.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 +70 -56
- package/dist/cli/skill-templates.d.ts.map +1 -1
- package/dist/cli/skill-templates.js +11 -8
- package/dist/cli/skill-templates.js.map +1 -1
- package/dist/clusters/cluster-manager.d.ts +16 -0
- package/dist/clusters/cluster-manager.d.ts.map +1 -1
- package/dist/clusters/cluster-manager.js +119 -1
- package/dist/clusters/cluster-manager.js.map +1 -1
- package/dist/config/loader.d.ts +16 -0
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +51 -0
- package/dist/config/loader.js.map +1 -1
- package/dist/config/memory-config.d.ts +26 -0
- package/dist/config/memory-config.d.ts.map +1 -1
- package/dist/config/memory-config.js +22 -0
- package/dist/config/memory-config.js.map +1 -1
- package/dist/eval/experiments/embedding-model-comparison/run-experiment.d.ts +20 -0
- package/dist/eval/experiments/embedding-model-comparison/run-experiment.d.ts.map +1 -0
- package/dist/eval/experiments/embedding-model-comparison/run-experiment.js +289 -0
- package/dist/eval/experiments/embedding-model-comparison/run-experiment.js.map +1 -0
- package/dist/eval/experiments/index-differentiation/alignment-analysis.d.ts +53 -0
- package/dist/eval/experiments/index-differentiation/alignment-analysis.d.ts.map +1 -0
- package/dist/eval/experiments/index-differentiation/alignment-analysis.js +91 -0
- package/dist/eval/experiments/index-differentiation/alignment-analysis.js.map +1 -0
- package/dist/eval/experiments/index-differentiation/discrimination-test.d.ts +24 -0
- package/dist/eval/experiments/index-differentiation/discrimination-test.d.ts.map +1 -0
- package/dist/eval/experiments/index-differentiation/discrimination-test.js +79 -0
- package/dist/eval/experiments/index-differentiation/discrimination-test.js.map +1 -0
- package/dist/eval/experiments/index-differentiation/index.d.ts +11 -0
- package/dist/eval/experiments/index-differentiation/index.d.ts.map +1 -0
- package/dist/eval/experiments/index-differentiation/index.js +8 -0
- package/dist/eval/experiments/index-differentiation/index.js.map +1 -0
- package/dist/eval/experiments/index-differentiation/refinement-test.d.ts +32 -0
- package/dist/eval/experiments/index-differentiation/refinement-test.d.ts.map +1 -0
- package/dist/eval/experiments/index-differentiation/refinement-test.js +203 -0
- package/dist/eval/experiments/index-differentiation/refinement-test.js.map +1 -0
- package/dist/eval/experiments/index-differentiation/run-experiment.d.ts +20 -0
- package/dist/eval/experiments/index-differentiation/run-experiment.d.ts.map +1 -0
- package/dist/eval/experiments/index-differentiation/run-experiment.js +338 -0
- package/dist/eval/experiments/index-differentiation/run-experiment.js.map +1 -0
- package/dist/eval/experiments/index-differentiation/similarity-analysis.d.ts +31 -0
- package/dist/eval/experiments/index-differentiation/similarity-analysis.d.ts.map +1 -0
- package/dist/eval/experiments/index-differentiation/similarity-analysis.js +60 -0
- package/dist/eval/experiments/index-differentiation/similarity-analysis.js.map +1 -0
- package/dist/eval/experiments/index-differentiation/types.d.ts +114 -0
- package/dist/eval/experiments/index-differentiation/types.d.ts.map +1 -0
- package/dist/eval/experiments/index-differentiation/types.js +8 -0
- package/dist/eval/experiments/index-differentiation/types.js.map +1 -0
- package/dist/eval/experiments/index-vs-chunk/jeopardy-experiment.d.ts +19 -0
- package/dist/eval/experiments/index-vs-chunk/jeopardy-experiment.d.ts.map +1 -0
- package/dist/eval/experiments/index-vs-chunk/jeopardy-experiment.js +328 -0
- package/dist/eval/experiments/index-vs-chunk/jeopardy-experiment.js.map +1 -0
- package/dist/eval/experiments/index-vs-chunk/jeopardy-generator.d.ts +27 -0
- package/dist/eval/experiments/index-vs-chunk/jeopardy-generator.d.ts.map +1 -0
- package/dist/eval/experiments/index-vs-chunk/jeopardy-generator.js +154 -0
- package/dist/eval/experiments/index-vs-chunk/jeopardy-generator.js.map +1 -0
- package/dist/eval/experiments/index-vs-chunk/query-generator.d.ts +23 -0
- package/dist/eval/experiments/index-vs-chunk/query-generator.d.ts.map +1 -0
- package/dist/eval/experiments/index-vs-chunk/query-generator.js +113 -0
- package/dist/eval/experiments/index-vs-chunk/query-generator.js.map +1 -0
- package/dist/eval/experiments/index-vs-chunk/run-experiment.d.ts +17 -0
- package/dist/eval/experiments/index-vs-chunk/run-experiment.d.ts.map +1 -0
- package/dist/eval/experiments/index-vs-chunk/run-experiment.js +341 -0
- package/dist/eval/experiments/index-vs-chunk/run-experiment.js.map +1 -0
- package/dist/eval/experiments/index-vs-chunk/types.d.ts +71 -0
- package/dist/eval/experiments/index-vs-chunk/types.d.ts.map +1 -0
- package/dist/eval/experiments/index-vs-chunk/types.js +8 -0
- package/dist/eval/experiments/index-vs-chunk/types.js.map +1 -0
- package/dist/eval/experiments/pipeline-dropout/run-experiment.d.ts +18 -0
- package/dist/eval/experiments/pipeline-dropout/run-experiment.d.ts.map +1 -0
- package/dist/eval/experiments/pipeline-dropout/run-experiment.js +347 -0
- package/dist/eval/experiments/pipeline-dropout/run-experiment.js.map +1 -0
- package/dist/eval/experiments/rescorer-ceiling/analyze-misses.d.ts +17 -0
- package/dist/eval/experiments/rescorer-ceiling/analyze-misses.d.ts.map +1 -0
- package/dist/eval/experiments/rescorer-ceiling/analyze-misses.js +247 -0
- package/dist/eval/experiments/rescorer-ceiling/analyze-misses.js.map +1 -0
- package/dist/eval/experiments/rescorer-ceiling/benchmark-rescorers.d.ts +18 -0
- package/dist/eval/experiments/rescorer-ceiling/benchmark-rescorers.d.ts.map +1 -0
- package/dist/eval/experiments/rescorer-ceiling/benchmark-rescorers.js +443 -0
- package/dist/eval/experiments/rescorer-ceiling/benchmark-rescorers.js.map +1 -0
- package/dist/eval/experiments/rescorer-ceiling/run-experiment.d.ts +16 -0
- package/dist/eval/experiments/rescorer-ceiling/run-experiment.d.ts.map +1 -0
- package/dist/eval/experiments/rescorer-ceiling/run-experiment.js +226 -0
- package/dist/eval/experiments/rescorer-ceiling/run-experiment.js.map +1 -0
- package/dist/index-entries/index-generator.d.ts +74 -0
- package/dist/index-entries/index-generator.d.ts.map +1 -0
- package/dist/index-entries/index-generator.js +323 -0
- package/dist/index-entries/index-generator.js.map +1 -0
- package/dist/index-entries/index-refresher.d.ts +54 -0
- package/dist/index-entries/index-refresher.d.ts.map +1 -0
- package/dist/index-entries/index-refresher.js +203 -0
- package/dist/index-entries/index-refresher.js.map +1 -0
- package/dist/index-entries/index.d.ts +6 -0
- package/dist/index-entries/index.d.ts.map +1 -0
- package/dist/index-entries/index.js +6 -0
- package/dist/index-entries/index.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/ingest/index-entry-hook.d.ts +15 -0
- package/dist/ingest/index-entry-hook.d.ts.map +1 -0
- package/dist/ingest/index-entry-hook.js +84 -0
- package/dist/ingest/index-entry-hook.js.map +1 -0
- package/dist/ingest/ingest-session.d.ts.map +1 -1
- package/dist/ingest/ingest-session.js +72 -18
- package/dist/ingest/ingest-session.js.map +1 -1
- package/dist/ingest/session-state.d.ts +49 -0
- package/dist/ingest/session-state.d.ts.map +1 -0
- package/dist/ingest/session-state.js +158 -0
- package/dist/ingest/session-state.js.map +1 -0
- package/dist/maintenance/scheduler.d.ts.map +1 -1
- package/dist/maintenance/scheduler.js +25 -0
- package/dist/maintenance/scheduler.js.map +1 -1
- package/dist/maintenance/tasks/backfill-index.d.ts +27 -0
- package/dist/maintenance/tasks/backfill-index.d.ts.map +1 -0
- package/dist/maintenance/tasks/backfill-index.js +44 -0
- package/dist/maintenance/tasks/backfill-index.js.map +1 -0
- package/dist/mcp/tools.d.ts +4 -0
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +115 -7
- package/dist/mcp/tools.js.map +1 -1
- package/dist/models/embedder.js +2 -2
- package/dist/models/embedder.js.map +1 -1
- package/dist/models/model-registry.d.ts +2 -0
- package/dist/models/model-registry.d.ts.map +1 -1
- package/dist/models/model-registry.js +15 -0
- package/dist/models/model-registry.js.map +1 -1
- package/dist/repomap/cache.d.ts +58 -0
- package/dist/repomap/cache.d.ts.map +1 -0
- package/dist/repomap/cache.js +101 -0
- package/dist/repomap/cache.js.map +1 -0
- package/dist/repomap/graph.d.ts +54 -0
- package/dist/repomap/graph.d.ts.map +1 -0
- package/dist/repomap/graph.js +113 -0
- package/dist/repomap/graph.js.map +1 -0
- package/dist/repomap/index.d.ts +83 -0
- package/dist/repomap/index.d.ts.map +1 -0
- package/dist/repomap/index.js +99 -0
- package/dist/repomap/index.js.map +1 -0
- package/dist/repomap/parser.d.ts +43 -0
- package/dist/repomap/parser.d.ts.map +1 -0
- package/dist/repomap/parser.js +994 -0
- package/dist/repomap/parser.js.map +1 -0
- package/dist/repomap/regex-parser.d.ts +24 -0
- package/dist/repomap/regex-parser.d.ts.map +1 -0
- package/dist/repomap/regex-parser.js +190 -0
- package/dist/repomap/regex-parser.js.map +1 -0
- package/dist/repomap/renderer.d.ts +40 -0
- package/dist/repomap/renderer.d.ts.map +1 -0
- package/dist/repomap/renderer.js +163 -0
- package/dist/repomap/renderer.js.map +1 -0
- package/dist/repomap/scanner.d.ts +32 -0
- package/dist/repomap/scanner.d.ts.map +1 -0
- package/dist/repomap/scanner.js +171 -0
- package/dist/repomap/scanner.js.map +1 -0
- package/dist/retrieval/chain-assembler.d.ts.map +1 -1
- package/dist/retrieval/chain-assembler.js +22 -3
- package/dist/retrieval/chain-assembler.js.map +1 -1
- package/dist/retrieval/index.d.ts +2 -0
- package/dist/retrieval/index.d.ts.map +1 -1
- package/dist/retrieval/index.js +2 -0
- package/dist/retrieval/index.js.map +1 -1
- package/dist/retrieval/mmr.d.ts +1 -0
- package/dist/retrieval/mmr.d.ts.map +1 -1
- package/dist/retrieval/mmr.js +35 -1
- package/dist/retrieval/mmr.js.map +1 -1
- package/dist/retrieval/search-assembler.d.ts +10 -1
- package/dist/retrieval/search-assembler.d.ts.map +1 -1
- package/dist/retrieval/search-assembler.js +249 -81
- package/dist/retrieval/search-assembler.js.map +1 -1
- package/dist/retrieval/session-reconstructor.d.ts +36 -0
- package/dist/retrieval/session-reconstructor.d.ts.map +1 -1
- package/dist/retrieval/session-reconstructor.js +126 -0
- package/dist/retrieval/session-reconstructor.js.map +1 -1
- package/dist/storage/db.d.ts.map +1 -1
- package/dist/storage/db.js +15 -0
- package/dist/storage/db.js.map +1 -1
- package/dist/storage/index-entry-store.d.ts +71 -0
- package/dist/storage/index-entry-store.d.ts.map +1 -0
- package/dist/storage/index-entry-store.js +275 -0
- package/dist/storage/index-entry-store.js.map +1 -0
- package/dist/storage/index.d.ts +5 -2
- package/dist/storage/index.d.ts.map +1 -1
- package/dist/storage/index.js +5 -1
- package/dist/storage/index.js.map +1 -1
- package/dist/storage/migrations.d.ts.map +1 -1
- package/dist/storage/migrations.js +102 -0
- package/dist/storage/migrations.js.map +1 -1
- package/dist/storage/schema.sql +68 -2
- package/dist/storage/session-state-store.d.ts +61 -0
- package/dist/storage/session-state-store.d.ts.map +1 -0
- package/dist/storage/session-state-store.js +119 -0
- package/dist/storage/session-state-store.js.map +1 -0
- package/dist/storage/types.d.ts +50 -0
- package/dist/storage/types.d.ts.map +1 -1
- package/dist/storage/vector-store.d.ts +17 -2
- package/dist/storage/vector-store.d.ts.map +1 -1
- package/dist/storage/vector-store.js +96 -36
- package/dist/storage/vector-store.js.map +1 -1
- package/package.json +4 -2
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Phase 2b: Entry-to-chunk alignment analysis.
|
|
3
|
+
*
|
|
4
|
+
* Measures how well each index entry's embedding preserves the semantic
|
|
5
|
+
* direction of its source chunk. Complements the discrimination test
|
|
6
|
+
* (Phase 2) which uses the chunk→entry direction.
|
|
7
|
+
*
|
|
8
|
+
* For each entry in a cluster, compute:
|
|
9
|
+
* - Self-alignment: cosine similarity between entry embedding and its own chunk embedding
|
|
10
|
+
* - Sibling alignment: mean cosine similarity between entry embedding and other chunks' embeddings
|
|
11
|
+
* - Alignment gap: self - mean sibling (positive = entry preserves chunk-specific signal)
|
|
12
|
+
*
|
|
13
|
+
* If the gap is small, the LLM summarization shifts the entry into a
|
|
14
|
+
* cluster-generic direction, losing chunk-specific retrievability.
|
|
15
|
+
*/
|
|
16
|
+
import type { ClusterForAnalysis } from './similarity-analysis.js';
|
|
17
|
+
/** Per-entry alignment measurement. */
|
|
18
|
+
export interface EntryAlignment {
|
|
19
|
+
entryId: string;
|
|
20
|
+
/** Cosine similarity between this entry's embedding and its own chunk embedding. */
|
|
21
|
+
selfAlignment: number;
|
|
22
|
+
/** Mean cosine similarity between this entry's embedding and all sibling chunk embeddings. */
|
|
23
|
+
meanSiblingAlignment: number;
|
|
24
|
+
/** self - meanSibling (positive = preserves chunk-specific signal). */
|
|
25
|
+
alignmentGap: number;
|
|
26
|
+
/** Max cosine similarity to any sibling chunk (worst-case confusion). */
|
|
27
|
+
maxSiblingAlignment: number;
|
|
28
|
+
}
|
|
29
|
+
/** Per-cluster alignment summary. */
|
|
30
|
+
export interface ClusterAlignmentResult {
|
|
31
|
+
clusterId: string;
|
|
32
|
+
clusterName: string | null;
|
|
33
|
+
entryCount: number;
|
|
34
|
+
/** Mean self-alignment across all entries. */
|
|
35
|
+
meanSelfAlignment: number;
|
|
36
|
+
/** Mean sibling alignment across all entries. */
|
|
37
|
+
meanSiblingAlignment: number;
|
|
38
|
+
/** Mean alignment gap (self - sibling). */
|
|
39
|
+
meanAlignmentGap: number;
|
|
40
|
+
/** Fraction of entries where self > max sibling (entry points more to own chunk than any sibling). */
|
|
41
|
+
uniquelyAlignedFraction: number;
|
|
42
|
+
/** Per-entry details. */
|
|
43
|
+
perEntry: EntryAlignment[];
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Run alignment analysis for a single cluster.
|
|
47
|
+
*/
|
|
48
|
+
export declare function analyseClusterAlignment(cluster: ClusterForAnalysis): ClusterAlignmentResult;
|
|
49
|
+
/**
|
|
50
|
+
* Run alignment analysis across all eligible clusters.
|
|
51
|
+
*/
|
|
52
|
+
export declare function runAlignmentAnalysis(clusters: ClusterForAnalysis[]): ClusterAlignmentResult[];
|
|
53
|
+
//# sourceMappingURL=alignment-analysis.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"alignment-analysis.d.ts","sourceRoot":"","sources":["../../../../src/eval/experiments/index-differentiation/alignment-analysis.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAEnE,uCAAuC;AACvC,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,oFAAoF;IACpF,aAAa,EAAE,MAAM,CAAC;IACtB,8FAA8F;IAC9F,oBAAoB,EAAE,MAAM,CAAC;IAC7B,uEAAuE;IACvE,YAAY,EAAE,MAAM,CAAC;IACrB,yEAAyE;IACzE,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAED,qCAAqC;AACrC,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,8CAA8C;IAC9C,iBAAiB,EAAE,MAAM,CAAC;IAC1B,iDAAiD;IACjD,oBAAoB,EAAE,MAAM,CAAC;IAC7B,2CAA2C;IAC3C,gBAAgB,EAAE,MAAM,CAAC;IACzB,sGAAsG;IACtG,uBAAuB,EAAE,MAAM,CAAC;IAChC,yBAAyB;IACzB,QAAQ,EAAE,cAAc,EAAE,CAAC;CAC5B;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,kBAAkB,GAC1B,sBAAsB,CAwExB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,kBAAkB,EAAE,GAC7B,sBAAsB,EAAE,CAE1B"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Phase 2b: Entry-to-chunk alignment analysis.
|
|
3
|
+
*
|
|
4
|
+
* Measures how well each index entry's embedding preserves the semantic
|
|
5
|
+
* direction of its source chunk. Complements the discrimination test
|
|
6
|
+
* (Phase 2) which uses the chunk→entry direction.
|
|
7
|
+
*
|
|
8
|
+
* For each entry in a cluster, compute:
|
|
9
|
+
* - Self-alignment: cosine similarity between entry embedding and its own chunk embedding
|
|
10
|
+
* - Sibling alignment: mean cosine similarity between entry embedding and other chunks' embeddings
|
|
11
|
+
* - Alignment gap: self - mean sibling (positive = entry preserves chunk-specific signal)
|
|
12
|
+
*
|
|
13
|
+
* If the gap is small, the LLM summarization shifts the entry into a
|
|
14
|
+
* cluster-generic direction, losing chunk-specific retrievability.
|
|
15
|
+
*/
|
|
16
|
+
import { cosineSimilarity } from '../../../utils/angular-distance.js';
|
|
17
|
+
/**
|
|
18
|
+
* Run alignment analysis for a single cluster.
|
|
19
|
+
*/
|
|
20
|
+
export function analyseClusterAlignment(cluster) {
|
|
21
|
+
const entries = cluster.entries;
|
|
22
|
+
const perEntry = [];
|
|
23
|
+
for (let i = 0; i < entries.length; i++) {
|
|
24
|
+
const entry = entries[i];
|
|
25
|
+
const entryEmb = entry.entryEmbedding;
|
|
26
|
+
const ownChunkEmb = entry.chunkEmbeddings[0];
|
|
27
|
+
if (!ownChunkEmb || ownChunkEmb.length === 0) {
|
|
28
|
+
perEntry.push({
|
|
29
|
+
entryId: entry.entryId,
|
|
30
|
+
selfAlignment: 0,
|
|
31
|
+
meanSiblingAlignment: 0,
|
|
32
|
+
alignmentGap: 0,
|
|
33
|
+
maxSiblingAlignment: 0,
|
|
34
|
+
});
|
|
35
|
+
continue;
|
|
36
|
+
}
|
|
37
|
+
const selfSim = cosineSimilarity(entryEmb, ownChunkEmb);
|
|
38
|
+
// Compute similarity to all sibling chunks
|
|
39
|
+
const siblingChunkEmbs = [];
|
|
40
|
+
for (let j = 0; j < entries.length; j++) {
|
|
41
|
+
if (j === i)
|
|
42
|
+
continue;
|
|
43
|
+
for (const chunkEmb of entries[j].chunkEmbeddings) {
|
|
44
|
+
if (chunkEmb.length > 0)
|
|
45
|
+
siblingChunkEmbs.push(chunkEmb);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
let meanSibSim = 0;
|
|
49
|
+
let maxSibSim = 0;
|
|
50
|
+
if (siblingChunkEmbs.length > 0) {
|
|
51
|
+
const sibSims = siblingChunkEmbs.map((se) => cosineSimilarity(entryEmb, se));
|
|
52
|
+
meanSibSim = sibSims.reduce((a, b) => a + b, 0) / sibSims.length;
|
|
53
|
+
maxSibSim = Math.max(...sibSims);
|
|
54
|
+
}
|
|
55
|
+
perEntry.push({
|
|
56
|
+
entryId: entry.entryId,
|
|
57
|
+
selfAlignment: selfSim,
|
|
58
|
+
meanSiblingAlignment: meanSibSim,
|
|
59
|
+
alignmentGap: selfSim - meanSibSim,
|
|
60
|
+
maxSiblingAlignment: maxSibSim,
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
const valid = perEntry.filter((e) => e.selfAlignment > 0);
|
|
64
|
+
const meanSelf = valid.length > 0
|
|
65
|
+
? valid.reduce((s, e) => s + e.selfAlignment, 0) / valid.length
|
|
66
|
+
: 0;
|
|
67
|
+
const meanSib = valid.length > 0
|
|
68
|
+
? valid.reduce((s, e) => s + e.meanSiblingAlignment, 0) / valid.length
|
|
69
|
+
: 0;
|
|
70
|
+
const meanGap = valid.length > 0
|
|
71
|
+
? valid.reduce((s, e) => s + e.alignmentGap, 0) / valid.length
|
|
72
|
+
: 0;
|
|
73
|
+
const uniquelyAligned = valid.filter((e) => e.selfAlignment > e.maxSiblingAlignment).length;
|
|
74
|
+
return {
|
|
75
|
+
clusterId: cluster.clusterId,
|
|
76
|
+
clusterName: cluster.clusterName,
|
|
77
|
+
entryCount: entries.length,
|
|
78
|
+
meanSelfAlignment: meanSelf,
|
|
79
|
+
meanSiblingAlignment: meanSib,
|
|
80
|
+
meanAlignmentGap: meanGap,
|
|
81
|
+
uniquelyAlignedFraction: valid.length > 0 ? uniquelyAligned / valid.length : 0,
|
|
82
|
+
perEntry,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Run alignment analysis across all eligible clusters.
|
|
87
|
+
*/
|
|
88
|
+
export function runAlignmentAnalysis(clusters) {
|
|
89
|
+
return clusters.map(analyseClusterAlignment);
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=alignment-analysis.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"alignment-analysis.js","sourceRoot":"","sources":["../../../../src/eval/experiments/index-differentiation/alignment-analysis.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAiCtE;;GAEG;AACH,MAAM,UAAU,uBAAuB,CACrC,OAA2B;IAE3B,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAChC,MAAM,QAAQ,GAAqB,EAAE,CAAC;IAEtC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACxC,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QACzB,MAAM,QAAQ,GAAG,KAAK,CAAC,cAAc,CAAC;QACtC,MAAM,WAAW,GAAG,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAE7C,IAAI,CAAC,WAAW,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7C,QAAQ,CAAC,IAAI,CAAC;gBACZ,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,aAAa,EAAE,CAAC;gBAChB,oBAAoB,EAAE,CAAC;gBACvB,YAAY,EAAE,CAAC;gBACf,mBAAmB,EAAE,CAAC;aACvB,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QAED,MAAM,OAAO,GAAG,gBAAgB,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QAExD,2CAA2C;QAC3C,MAAM,gBAAgB,GAAe,EAAE,CAAC;QACxC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACxC,IAAI,CAAC,KAAK,CAAC;gBAAE,SAAS;YACtB,KAAK,MAAM,QAAQ,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC;gBAClD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;oBAAE,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC3D,CAAC;QACH,CAAC;QAED,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChC,MAAM,OAAO,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,gBAAgB,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC;YAC7E,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;YACjE,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC;QACnC,CAAC;QAED,QAAQ,CAAC,IAAI,CAAC;YACZ,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,aAAa,EAAE,OAAO;YACtB,oBAAoB,EAAE,UAAU;YAChC,YAAY,EAAE,OAAO,GAAG,UAAU;YAClC,mBAAmB,EAAE,SAAS;SAC/B,CAAC,CAAC;IACL,CAAC;IAED,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC;IAC1D,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC;QAC/B,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM;QAC/D,CAAC,CAAC,CAAC,CAAC;IACN,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC;QAC9B,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,oBAAoB,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM;QACtE,CAAC,CAAC,CAAC,CAAC;IACN,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC;QAC9B,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM;QAC9D,CAAC,CAAC,CAAC,CAAC;IACN,MAAM,eAAe,GAAG,KAAK,CAAC,MAAM,CAClC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,GAAG,CAAC,CAAC,mBAAmB,CAC/C,CAAC,MAAM,CAAC;IAET,OAAO;QACL,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,UAAU,EAAE,OAAO,CAAC,MAAM;QAC1B,iBAAiB,EAAE,QAAQ;QAC3B,oBAAoB,EAAE,OAAO;QAC7B,gBAAgB,EAAE,OAAO;QACzB,uBAAuB,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,eAAe,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC9E,QAAQ;KACT,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAClC,QAA8B;IAE9B,OAAO,QAAQ,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;AAC/C,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Phase 2: Discrimination test.
|
|
3
|
+
*
|
|
4
|
+
* For each index entry within a cluster, test whether its embedding
|
|
5
|
+
* is more similar to itself than to its cluster siblings.
|
|
6
|
+
*
|
|
7
|
+
* Metric: Mean Reciprocal Rank (MRR) — if we rank cluster entries by
|
|
8
|
+
* similarity to an entry's embedding, what rank does the entry itself get?
|
|
9
|
+
* Perfect discrimination = MRR 1.0 (always rank 1).
|
|
10
|
+
*
|
|
11
|
+
* This tells us: can the search system distinguish between entries in the
|
|
12
|
+
* same topic cluster, or does the compression lose chunk-specific detail?
|
|
13
|
+
*/
|
|
14
|
+
import type { ClusterForAnalysis } from './similarity-analysis.js';
|
|
15
|
+
import type { DiscriminationResult } from './types.js';
|
|
16
|
+
/**
|
|
17
|
+
* Run discrimination test for a single cluster.
|
|
18
|
+
*/
|
|
19
|
+
export declare function testClusterDiscrimination(cluster: ClusterForAnalysis): DiscriminationResult;
|
|
20
|
+
/**
|
|
21
|
+
* Run discrimination test across all eligible clusters.
|
|
22
|
+
*/
|
|
23
|
+
export declare function runDiscriminationTest(clusters: ClusterForAnalysis[]): DiscriminationResult[];
|
|
24
|
+
//# sourceMappingURL=discrimination-test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discrimination-test.d.ts","sourceRoot":"","sources":["../../../../src/eval/experiments/index-differentiation/discrimination-test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAEvD;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,kBAAkB,GAC1B,oBAAoB,CAgEtB;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,kBAAkB,EAAE,GAC7B,oBAAoB,EAAE,CAExB"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Phase 2: Discrimination test.
|
|
3
|
+
*
|
|
4
|
+
* For each index entry within a cluster, test whether its embedding
|
|
5
|
+
* is more similar to itself than to its cluster siblings.
|
|
6
|
+
*
|
|
7
|
+
* Metric: Mean Reciprocal Rank (MRR) — if we rank cluster entries by
|
|
8
|
+
* similarity to an entry's embedding, what rank does the entry itself get?
|
|
9
|
+
* Perfect discrimination = MRR 1.0 (always rank 1).
|
|
10
|
+
*
|
|
11
|
+
* This tells us: can the search system distinguish between entries in the
|
|
12
|
+
* same topic cluster, or does the compression lose chunk-specific detail?
|
|
13
|
+
*/
|
|
14
|
+
import { cosineSimilarity } from '../../../utils/angular-distance.js';
|
|
15
|
+
/**
|
|
16
|
+
* Run discrimination test for a single cluster.
|
|
17
|
+
*/
|
|
18
|
+
export function testClusterDiscrimination(cluster) {
|
|
19
|
+
const entries = cluster.entries;
|
|
20
|
+
const perEntry = [];
|
|
21
|
+
for (let i = 0; i < entries.length; i++) {
|
|
22
|
+
const target = entries[i];
|
|
23
|
+
// Compute similarity of this entry's embedding to all entries' embeddings
|
|
24
|
+
const similarities = entries.map((e, j) => ({
|
|
25
|
+
index: j,
|
|
26
|
+
entryId: e.entryId,
|
|
27
|
+
similarity: cosineSimilarity(target.entryEmbedding, e.entryEmbedding),
|
|
28
|
+
}));
|
|
29
|
+
// Sort descending by similarity
|
|
30
|
+
similarities.sort((a, b) => b.similarity - a.similarity);
|
|
31
|
+
// Find rank of the target entry (self-similarity should be 1.0, rank 1)
|
|
32
|
+
// But we want to test the embedding's ability to discriminate,
|
|
33
|
+
// so we use the *chunk* embedding as the query instead of the entry embedding.
|
|
34
|
+
// This simulates: "given the actual chunk content, can we find the right index entry?"
|
|
35
|
+
const queryEmbedding = target.chunkEmbeddings[0];
|
|
36
|
+
if (!queryEmbedding || queryEmbedding.length === 0) {
|
|
37
|
+
perEntry.push({
|
|
38
|
+
entryId: target.entryId,
|
|
39
|
+
rankAmongSiblings: entries.length,
|
|
40
|
+
correctSimilarity: 0,
|
|
41
|
+
bestSiblingSimilarity: 0,
|
|
42
|
+
});
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
const chunkToEntrySims = entries.map((e, j) => ({
|
|
46
|
+
index: j,
|
|
47
|
+
entryId: e.entryId,
|
|
48
|
+
similarity: cosineSimilarity(queryEmbedding, e.entryEmbedding),
|
|
49
|
+
}));
|
|
50
|
+
chunkToEntrySims.sort((a, b) => b.similarity - a.similarity);
|
|
51
|
+
const rank = chunkToEntrySims.findIndex((s) => s.index === i) + 1;
|
|
52
|
+
const correctSim = chunkToEntrySims.find((s) => s.index === i).similarity;
|
|
53
|
+
const bestSiblingSim = chunkToEntrySims.find((s) => s.index !== i)?.similarity ?? 0;
|
|
54
|
+
perEntry.push({
|
|
55
|
+
entryId: target.entryId,
|
|
56
|
+
rankAmongSiblings: rank,
|
|
57
|
+
correctSimilarity: correctSim,
|
|
58
|
+
bestSiblingSimilarity: bestSiblingSim,
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
const reciprocalRanks = perEntry.map((e) => 1 / e.rankAmongSiblings);
|
|
62
|
+
const mrr = reciprocalRanks.reduce((a, b) => a + b, 0) / reciprocalRanks.length;
|
|
63
|
+
const hitRate = perEntry.filter((e) => e.rankAmongSiblings === 1).length / perEntry.length;
|
|
64
|
+
return {
|
|
65
|
+
clusterId: cluster.clusterId,
|
|
66
|
+
clusterName: cluster.clusterName,
|
|
67
|
+
entryCount: entries.length,
|
|
68
|
+
meanReciprocalRank: mrr,
|
|
69
|
+
hitRate,
|
|
70
|
+
perEntry,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Run discrimination test across all eligible clusters.
|
|
75
|
+
*/
|
|
76
|
+
export function runDiscriminationTest(clusters) {
|
|
77
|
+
return clusters.map(testClusterDiscrimination);
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=discrimination-test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discrimination-test.js","sourceRoot":"","sources":["../../../../src/eval/experiments/index-differentiation/discrimination-test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAItE;;GAEG;AACH,MAAM,UAAU,yBAAyB,CACvC,OAA2B;IAE3B,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAChC,MAAM,QAAQ,GAAqC,EAAE,CAAC;IAEtD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACxC,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QAE1B,0EAA0E;QAC1E,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;YAC1C,KAAK,EAAE,CAAC;YACR,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,UAAU,EAAE,gBAAgB,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC,cAAc,CAAC;SACtE,CAAC,CAAC,CAAC;QAEJ,gCAAgC;QAChC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC;QAEzD,wEAAwE;QACxE,+DAA+D;QAC/D,+EAA+E;QAC/E,uFAAuF;QACvF,MAAM,cAAc,GAAG,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QACjD,IAAI,CAAC,cAAc,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACnD,QAAQ,CAAC,IAAI,CAAC;gBACZ,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,iBAAiB,EAAE,OAAO,CAAC,MAAM;gBACjC,iBAAiB,EAAE,CAAC;gBACpB,qBAAqB,EAAE,CAAC;aACzB,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QAED,MAAM,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;YAC9C,KAAK,EAAE,CAAC;YACR,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,UAAU,EAAE,gBAAgB,CAAC,cAAc,EAAE,CAAC,CAAC,cAAc,CAAC;SAC/D,CAAC,CAAC,CAAC;QAEJ,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC;QAE7D,MAAM,IAAI,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC;QAClE,MAAM,UAAU,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,CAAE,CAAC,UAAU,CAAC;QAC3E,MAAM,cAAc,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,EAAE,UAAU,IAAI,CAAC,CAAC;QAEpF,QAAQ,CAAC,IAAI,CAAC;YACZ,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,iBAAiB,EAAE,IAAI;YACvB,iBAAiB,EAAE,UAAU;YAC7B,qBAAqB,EAAE,cAAc;SACtC,CAAC,CAAC;IACL,CAAC;IAED,MAAM,eAAe,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,iBAAiB,CAAC,CAAC;IACrE,MAAM,GAAG,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,eAAe,CAAC,MAAM,CAAC;IAChF,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,iBAAiB,KAAK,CAAC,CAAC,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;IAE3F,OAAO;QACL,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,UAAU,EAAE,OAAO,CAAC,MAAM;QAC1B,kBAAkB,EAAE,GAAG;QACvB,OAAO;QACP,QAAQ;KACT,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CACnC,QAA8B;IAE9B,OAAO,QAAQ,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;AACjD,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Index entry differentiation experiment — barrel export.
|
|
3
|
+
*/
|
|
4
|
+
export type { ClusterSimilarityResult, DiscriminationResult, RefinementResult, DifferentiationReport, } from './types.js';
|
|
5
|
+
export { runSimilarityAnalysis, analyseCluster } from './similarity-analysis.js';
|
|
6
|
+
export type { ClusterForAnalysis } from './similarity-analysis.js';
|
|
7
|
+
export { runDiscriminationTest, testClusterDiscrimination } from './discrimination-test.js';
|
|
8
|
+
export { runAlignmentAnalysis, analyseClusterAlignment } from './alignment-analysis.js';
|
|
9
|
+
export type { EntryAlignment, ClusterAlignmentResult } from './alignment-analysis.js';
|
|
10
|
+
export { runRefinementTest, testClusterRefinement } from './refinement-test.js';
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/eval/experiments/index-differentiation/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,YAAY,EACV,uBAAuB,EACvB,oBAAoB,EACpB,gBAAgB,EAChB,qBAAqB,GACtB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AACjF,YAAY,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,EAAE,qBAAqB,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AAC5F,OAAO,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AACxF,YAAY,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACtF,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Index entry differentiation experiment — barrel export.
|
|
3
|
+
*/
|
|
4
|
+
export { runSimilarityAnalysis, analyseCluster } from './similarity-analysis.js';
|
|
5
|
+
export { runDiscriminationTest, testClusterDiscrimination } from './discrimination-test.js';
|
|
6
|
+
export { runAlignmentAnalysis, analyseClusterAlignment } from './alignment-analysis.js';
|
|
7
|
+
export { runRefinementTest, testClusterRefinement } from './refinement-test.js';
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/eval/experiments/index-differentiation/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AASH,OAAO,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAEjF,OAAO,EAAE,qBAAqB,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AAC5F,OAAO,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAExF,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Phase 3: Cluster-aware refinement simulation.
|
|
3
|
+
*
|
|
4
|
+
* For clusters with worst discrimination scores, regenerate index entries
|
|
5
|
+
* with a prompt that includes the other entries in the cluster as context.
|
|
6
|
+
* The LLM is asked to emphasize what makes THIS chunk uniquely different.
|
|
7
|
+
*
|
|
8
|
+
* Compare discrimination metrics before and after refinement.
|
|
9
|
+
*/
|
|
10
|
+
import Anthropic from '@anthropic-ai/sdk';
|
|
11
|
+
import { Embedder } from '../../../models/embedder.js';
|
|
12
|
+
import type { IndexEntry } from '../../../storage/types.js';
|
|
13
|
+
import type { ClusterForAnalysis } from './similarity-analysis.js';
|
|
14
|
+
import type { RefinementResult } from './types.js';
|
|
15
|
+
/**
|
|
16
|
+
* Run refinement experiment on a single cluster.
|
|
17
|
+
*
|
|
18
|
+
* For each entry in the cluster:
|
|
19
|
+
* 1. Collect sibling descriptions (all other entries)
|
|
20
|
+
* 2. Re-generate this entry's description with cluster-aware prompt
|
|
21
|
+
* 3. Embed the refined description
|
|
22
|
+
* 4. Compare discrimination metrics
|
|
23
|
+
*/
|
|
24
|
+
export declare function testClusterRefinement(cluster: ClusterForAnalysis, entries: IndexEntry[], chunkContents: Map<string, string>, embedder: Embedder, client: Anthropic, model: string): Promise<RefinementResult>;
|
|
25
|
+
/**
|
|
26
|
+
* Run refinement test on clusters with worst discrimination.
|
|
27
|
+
*
|
|
28
|
+
* @param maxClusters Maximum clusters to refine (LLM cost control)
|
|
29
|
+
*/
|
|
30
|
+
export declare function runRefinementTest(clusters: ClusterForAnalysis[], entries: IndexEntry[], chunkContents: Map<string, string>, discriminationScores: Map<string, number>, // clusterId → MRR
|
|
31
|
+
maxClusters?: number): Promise<RefinementResult[] | null>;
|
|
32
|
+
//# sourceMappingURL=refinement-test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"refinement-test.d.ts","sourceRoot":"","sources":["../../../../src/eval/experiments/index-differentiation/refinement-test.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,SAAS,MAAM,mBAAmB,CAAC;AAE1C,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAGvD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAInE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAkEnD;;;;;;;;GAQG;AACH,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,kBAAkB,EAC3B,OAAO,EAAE,UAAU,EAAE,EACrB,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAClC,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,SAAS,EACjB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,gBAAgB,CAAC,CAyG3B;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,kBAAkB,EAAE,EAC9B,OAAO,EAAE,UAAU,EAAE,EACrB,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAClC,oBAAoB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,kBAAkB;AAC7D,WAAW,GAAE,MAAU,GACtB,OAAO,CAAC,gBAAgB,EAAE,GAAG,IAAI,CAAC,CA0CpC"}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Phase 3: Cluster-aware refinement simulation.
|
|
3
|
+
*
|
|
4
|
+
* For clusters with worst discrimination scores, regenerate index entries
|
|
5
|
+
* with a prompt that includes the other entries in the cluster as context.
|
|
6
|
+
* The LLM is asked to emphasize what makes THIS chunk uniquely different.
|
|
7
|
+
*
|
|
8
|
+
* Compare discrimination metrics before and after refinement.
|
|
9
|
+
*/
|
|
10
|
+
import Anthropic from '@anthropic-ai/sdk';
|
|
11
|
+
import { createSecretStore } from '../../../utils/secret-store.js';
|
|
12
|
+
import { Embedder } from '../../../models/embedder.js';
|
|
13
|
+
import { getModel } from '../../../models/model-registry.js';
|
|
14
|
+
import { getConfig } from '../../../config/memory-config.js';
|
|
15
|
+
import { testClusterDiscrimination } from './discrimination-test.js';
|
|
16
|
+
import { analyseCluster } from './similarity-analysis.js';
|
|
17
|
+
import { cosineSimilarity } from '../../../utils/angular-distance.js';
|
|
18
|
+
/** Max entries to refine per cluster (limits API cost for large clusters). */
|
|
19
|
+
const MAX_ENTRIES_PER_CLUSTER = 50;
|
|
20
|
+
/**
|
|
21
|
+
* Build a refinement prompt that includes cluster context.
|
|
22
|
+
*
|
|
23
|
+
* The key difference from standard generation: the LLM sees the OTHER
|
|
24
|
+
* entries in the cluster and is instructed to emphasize what makes
|
|
25
|
+
* this chunk uniquely different from them.
|
|
26
|
+
*/
|
|
27
|
+
function buildRefinementPrompt(chunkContent, siblingDescriptions, targetTokens) {
|
|
28
|
+
const maxContentChars = 500 * 4; // ~500 tokens
|
|
29
|
+
const truncatedContent = chunkContent.length > maxContentChars
|
|
30
|
+
? chunkContent.slice(0, maxContentChars) + '\n...[truncated]'
|
|
31
|
+
: chunkContent;
|
|
32
|
+
const siblingList = siblingDescriptions
|
|
33
|
+
.map((d, i) => ` ${i + 1}. ${d}`)
|
|
34
|
+
.join('\n');
|
|
35
|
+
return `You are refining a search index description for a memory system. The goal is to make this description MAXIMALLY DISTINGUISHABLE from similar entries in the same topic cluster.
|
|
36
|
+
|
|
37
|
+
## Other entries in this cluster:
|
|
38
|
+
${siblingList}
|
|
39
|
+
|
|
40
|
+
## This chunk's content:
|
|
41
|
+
${truncatedContent}
|
|
42
|
+
|
|
43
|
+
Write a concise description (~${targetTokens} tokens) that:
|
|
44
|
+
- Captures what is UNIQUE about this chunk compared to the cluster siblings above
|
|
45
|
+
- Focuses on specific decisions, file names, error messages, or outcomes that differentiate it
|
|
46
|
+
- Avoids generic terms that would match all entries in this cluster
|
|
47
|
+
- Does NOT include dates, project names, or agent IDs (metadata stored separately)
|
|
48
|
+
|
|
49
|
+
If someone searched for the specific topic of this chunk, your description should match THIS chunk and not the siblings.
|
|
50
|
+
|
|
51
|
+
Description:`;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Get Anthropic client, returning null if unavailable.
|
|
55
|
+
*/
|
|
56
|
+
async function getClient() {
|
|
57
|
+
if (!process.env.ANTHROPIC_API_KEY) {
|
|
58
|
+
try {
|
|
59
|
+
const store = createSecretStore();
|
|
60
|
+
const storedKey = await store.get('anthropic-api-key');
|
|
61
|
+
if (storedKey) {
|
|
62
|
+
process.env.ANTHROPIC_API_KEY = storedKey;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
// Keychain not available
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
if (!process.env.ANTHROPIC_API_KEY)
|
|
70
|
+
return null;
|
|
71
|
+
return new Anthropic();
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Run refinement experiment on a single cluster.
|
|
75
|
+
*
|
|
76
|
+
* For each entry in the cluster:
|
|
77
|
+
* 1. Collect sibling descriptions (all other entries)
|
|
78
|
+
* 2. Re-generate this entry's description with cluster-aware prompt
|
|
79
|
+
* 3. Embed the refined description
|
|
80
|
+
* 4. Compare discrimination metrics
|
|
81
|
+
*/
|
|
82
|
+
export async function testClusterRefinement(cluster, entries, chunkContents, embedder, client, model) {
|
|
83
|
+
const config = getConfig();
|
|
84
|
+
const targetTokens = config.semanticIndex.targetDescriptionTokens;
|
|
85
|
+
// Build entry map for description lookup
|
|
86
|
+
const entryMap = new Map(entries.map((e) => [e.id, e]));
|
|
87
|
+
// Baseline discrimination
|
|
88
|
+
const baselineResult = testClusterDiscrimination(cluster);
|
|
89
|
+
const baselineSimilarity = analyseCluster(cluster);
|
|
90
|
+
// Generate refined descriptions (sample if cluster is large)
|
|
91
|
+
const refinedEntries = [];
|
|
92
|
+
const entriesToRefine = cluster.entries.length > MAX_ENTRIES_PER_CLUSTER
|
|
93
|
+
? cluster.entries.slice(0, MAX_ENTRIES_PER_CLUSTER)
|
|
94
|
+
: cluster.entries;
|
|
95
|
+
for (const entry of entriesToRefine) {
|
|
96
|
+
const indexEntry = entryMap.get(entry.entryId);
|
|
97
|
+
if (!indexEntry)
|
|
98
|
+
continue;
|
|
99
|
+
const chunkId = indexEntry.chunkIds[0];
|
|
100
|
+
const content = chunkContents.get(chunkId);
|
|
101
|
+
if (!content)
|
|
102
|
+
continue;
|
|
103
|
+
// Collect sibling descriptions (cap at 20 nearest to keep prompt manageable)
|
|
104
|
+
const siblingDescs = cluster.entries
|
|
105
|
+
.filter((e) => e.entryId !== entry.entryId)
|
|
106
|
+
.map((e) => {
|
|
107
|
+
const desc = entryMap.get(e.entryId)?.description ?? '';
|
|
108
|
+
const sim = cosineSimilarity(entry.entryEmbedding, e.entryEmbedding);
|
|
109
|
+
return { desc, sim };
|
|
110
|
+
})
|
|
111
|
+
.filter((s) => s.desc.length > 0)
|
|
112
|
+
.sort((a, b) => b.sim - a.sim)
|
|
113
|
+
.slice(0, 20)
|
|
114
|
+
.map((s) => s.desc);
|
|
115
|
+
if (siblingDescs.length === 0)
|
|
116
|
+
continue;
|
|
117
|
+
const prompt = buildRefinementPrompt(content, siblingDescs, targetTokens);
|
|
118
|
+
try {
|
|
119
|
+
const response = await client.messages.create({
|
|
120
|
+
model,
|
|
121
|
+
max_tokens: 300,
|
|
122
|
+
messages: [{ role: 'user', content: prompt }],
|
|
123
|
+
});
|
|
124
|
+
const text = response.content[0].type === 'text' ? response.content[0].text.trim() : '';
|
|
125
|
+
if (!text)
|
|
126
|
+
continue;
|
|
127
|
+
const embedResult = await embedder.embed(text, false);
|
|
128
|
+
refinedEntries.push({
|
|
129
|
+
entryId: entry.entryId,
|
|
130
|
+
original: indexEntry.description,
|
|
131
|
+
refined: text,
|
|
132
|
+
embedding: embedResult.embedding,
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
catch (error) {
|
|
136
|
+
console.warn(` Refinement failed for ${entry.entryId}: ${error.message}`);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
// Build refined cluster for discrimination test
|
|
140
|
+
const refinedCluster = {
|
|
141
|
+
...cluster,
|
|
142
|
+
entries: cluster.entries.map((e) => {
|
|
143
|
+
const refined = refinedEntries.find((r) => r.entryId === e.entryId);
|
|
144
|
+
return {
|
|
145
|
+
...e,
|
|
146
|
+
entryEmbedding: refined?.embedding ?? e.entryEmbedding,
|
|
147
|
+
};
|
|
148
|
+
}),
|
|
149
|
+
};
|
|
150
|
+
const refinedDiscrimination = testClusterDiscrimination(refinedCluster);
|
|
151
|
+
const refinedSimilarity = analyseCluster(refinedCluster);
|
|
152
|
+
return {
|
|
153
|
+
clusterId: cluster.clusterId,
|
|
154
|
+
clusterName: cluster.clusterName,
|
|
155
|
+
entryCount: cluster.entries.length,
|
|
156
|
+
baselineMRR: baselineResult.meanReciprocalRank,
|
|
157
|
+
refinedMRR: refinedDiscrimination.meanReciprocalRank,
|
|
158
|
+
baselineHitRate: baselineResult.hitRate,
|
|
159
|
+
refinedHitRate: refinedDiscrimination.hitRate,
|
|
160
|
+
compressionRatioDelta: refinedSimilarity.compressionRatio - baselineSimilarity.compressionRatio,
|
|
161
|
+
sampleRefinements: refinedEntries.slice(0, 3).map((r) => ({
|
|
162
|
+
entryId: r.entryId,
|
|
163
|
+
original: r.original,
|
|
164
|
+
refined: r.refined,
|
|
165
|
+
})),
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Run refinement test on clusters with worst discrimination.
|
|
170
|
+
*
|
|
171
|
+
* @param maxClusters Maximum clusters to refine (LLM cost control)
|
|
172
|
+
*/
|
|
173
|
+
export async function runRefinementTest(clusters, entries, chunkContents, discriminationScores, // clusterId → MRR
|
|
174
|
+
maxClusters = 5) {
|
|
175
|
+
const client = await getClient();
|
|
176
|
+
if (!client) {
|
|
177
|
+
console.log(' No API key available, skipping refinement test');
|
|
178
|
+
return null;
|
|
179
|
+
}
|
|
180
|
+
const config = getConfig();
|
|
181
|
+
const embedder = new Embedder();
|
|
182
|
+
await embedder.load(getModel(config.embeddingModel));
|
|
183
|
+
try {
|
|
184
|
+
// Select clusters with worst discrimination
|
|
185
|
+
const ranked = [...discriminationScores.entries()]
|
|
186
|
+
.sort(([, a], [, b]) => a - b)
|
|
187
|
+
.slice(0, maxClusters);
|
|
188
|
+
const results = [];
|
|
189
|
+
for (const [clusterId] of ranked) {
|
|
190
|
+
const cluster = clusters.find((c) => c.clusterId === clusterId);
|
|
191
|
+
if (!cluster)
|
|
192
|
+
continue;
|
|
193
|
+
console.log(` Refining cluster ${clusterId} (${cluster.clusterName ?? 'unnamed'}, MRR=${discriminationScores.get(clusterId)?.toFixed(3)})`);
|
|
194
|
+
const result = await testClusterRefinement(cluster, entries, chunkContents, embedder, client, config.clusterRefreshModel);
|
|
195
|
+
results.push(result);
|
|
196
|
+
}
|
|
197
|
+
return results;
|
|
198
|
+
}
|
|
199
|
+
finally {
|
|
200
|
+
await embedder.dispose();
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
//# sourceMappingURL=refinement-test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"refinement-test.js","sourceRoot":"","sources":["../../../../src/eval/experiments/index-differentiation/refinement-test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Index Entry Differentiation Experiment
|
|
3
|
+
*
|
|
4
|
+
* Tests whether semantic index entries within the same topic cluster are
|
|
5
|
+
* too similar to each other, reducing the search system's ability to
|
|
6
|
+
* discriminate between chunks covering the same topic.
|
|
7
|
+
*
|
|
8
|
+
* Three phases:
|
|
9
|
+
* 1. Similarity analysis — do entries converge more than raw chunks?
|
|
10
|
+
* 2. Discrimination test — can we find the right entry among siblings?
|
|
11
|
+
* 3. Refinement simulation — does cluster-aware regeneration help?
|
|
12
|
+
*
|
|
13
|
+
* Usage:
|
|
14
|
+
* npx tsx src/eval/experiments/index-differentiation/run-experiment.ts [--refine] [--max-clusters N]
|
|
15
|
+
*
|
|
16
|
+
* Requires: populated index entries and chunk cluster assignments.
|
|
17
|
+
* Run `npx causantic maintenance run backfill-index` first if needed.
|
|
18
|
+
*/
|
|
19
|
+
export {};
|
|
20
|
+
//# sourceMappingURL=run-experiment.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-experiment.d.ts","sourceRoot":"","sources":["../../../../src/eval/experiments/index-differentiation/run-experiment.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG"}
|