@vivantel/virage-reranker-cross-encoder 0.1.23 → 0.1.25
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/dist/reranker.d.ts +3 -2
- package/dist/reranker.d.ts.map +1 -1
- package/dist/reranker.js +26 -40
- package/dist/reranker.js.map +1 -1
- package/dist/reranker.test.js +51 -47
- package/dist/reranker.test.js.map +1 -1
- package/package.json +3 -3
package/dist/reranker.d.ts
CHANGED
|
@@ -15,9 +15,10 @@ export declare class CrossEncoderReranker implements Reranker {
|
|
|
15
15
|
private readonly modelId;
|
|
16
16
|
private readonly defaultTopK;
|
|
17
17
|
private readonly minScore;
|
|
18
|
-
private
|
|
18
|
+
private _tokenizer;
|
|
19
|
+
private _model;
|
|
19
20
|
constructor(options?: CrossEncoderRerankerOptions);
|
|
20
|
-
private
|
|
21
|
+
private load;
|
|
21
22
|
rerank(query: string, candidates: VectorSearchResult[], topK?: number): Promise<VectorSearchResult[]>;
|
|
22
23
|
}
|
|
23
24
|
//# sourceMappingURL=reranker.d.ts.map
|
package/dist/reranker.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reranker.d.ts","sourceRoot":"","sources":["../src/reranker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAE1E,MAAM,WAAW,2BAA2B;IAC1C,yEAAyE;IACzE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mEAAmE;IACnE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;
|
|
1
|
+
{"version":3,"file":"reranker.d.ts","sourceRoot":"","sources":["../src/reranker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAE1E,MAAM,WAAW,2BAA2B;IAC1C,yEAAyE;IACzE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mEAAmE;IACnE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAcD,qBAAa,oBAAqB,YAAW,QAAQ;IACnD,QAAQ,CAAC,IAAI,mBAAmB;IAEhC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,UAAU,CAA0B;IAC5C,OAAO,CAAC,MAAM,CAA4C;gBAE9C,OAAO,GAAE,2BAAgC;YAMvC,IAAI;IAoBZ,MAAM,CACV,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,kBAAkB,EAAE,EAChC,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC,kBAAkB,EAAE,CAAC;CA+BjC"}
|
package/dist/reranker.js
CHANGED
|
@@ -3,62 +3,48 @@ export class CrossEncoderReranker {
|
|
|
3
3
|
modelId;
|
|
4
4
|
defaultTopK;
|
|
5
5
|
minScore;
|
|
6
|
-
|
|
6
|
+
_tokenizer = null;
|
|
7
|
+
_model = null;
|
|
7
8
|
constructor(options = {}) {
|
|
8
9
|
this.modelId = options.model ?? "Xenova/ms-marco-MiniLM-L-6-v2";
|
|
9
10
|
this.defaultTopK = options.topK ?? 5;
|
|
10
11
|
this.minScore = options.minScore ?? 0;
|
|
11
12
|
}
|
|
12
|
-
async
|
|
13
|
-
if (!this.
|
|
14
|
-
const {
|
|
15
|
-
this.
|
|
13
|
+
async load() {
|
|
14
|
+
if (!this._tokenizer || !this._model) {
|
|
15
|
+
const { AutoTokenizer, AutoModelForSequenceClassification } = await import("@huggingface/transformers");
|
|
16
|
+
this._tokenizer = (await AutoTokenizer.from_pretrained(this.modelId));
|
|
17
|
+
this._model = (await AutoModelForSequenceClassification.from_pretrained(this.modelId, {
|
|
16
18
|
dtype: "fp32",
|
|
17
19
|
}));
|
|
18
20
|
}
|
|
19
|
-
return this.
|
|
21
|
+
return { tokenizer: this._tokenizer, model: this._model };
|
|
20
22
|
}
|
|
21
23
|
async rerank(query, candidates, topK) {
|
|
22
24
|
if (candidates.length === 0)
|
|
23
25
|
return [];
|
|
24
26
|
const k = topK ?? this.defaultTopK;
|
|
25
|
-
const
|
|
26
|
-
const inputs = candidates.map((c) => ({
|
|
27
|
-
text: query,
|
|
28
|
-
text_pair: c.content,
|
|
29
|
-
}));
|
|
30
|
-
// Request raw logits (no sigmoid/softmax) so scores are not saturated at 1.0
|
|
31
|
-
// for all inputs. The ms-marco cross-encoder produces logits in roughly [-10, 10];
|
|
32
|
-
// normalizing within the batch gives meaningful relative similarities.
|
|
33
|
-
const outputs = await pipe._call(inputs, {
|
|
34
|
-
function_to_apply: "none",
|
|
35
|
-
});
|
|
36
|
-
// Extract raw logit for each candidate
|
|
37
|
-
const indexed = candidates.map((c, i) => {
|
|
38
|
-
const result = Array.isArray(outputs) ? outputs[i] : undefined;
|
|
39
|
-
const raw = Array.isArray(result) ? result[0] : result;
|
|
40
|
-
const typed = raw;
|
|
41
|
-
return { c, logit: typed?.score };
|
|
42
|
-
});
|
|
43
|
-
// If the pipeline returned no usable scores, preserve original order and similarities
|
|
44
|
-
if (!indexed.some((x) => x.logit !== undefined)) {
|
|
45
|
-
return candidates.slice(0, k).map((c) => ({ ...c }));
|
|
46
|
-
}
|
|
47
|
-
// Sort by logit descending (higher raw score = more relevant)
|
|
48
|
-
indexed.sort((a, b) => (b.logit ?? b.c.similarity) - (a.logit ?? a.c.similarity));
|
|
49
|
-
const top = indexed.slice(0, k);
|
|
50
|
-
// Apply sigmoid to convert raw logits to calibrated relevance probabilities.
|
|
51
|
-
// sigmoid(logit) ≈ P(relevant | query, doc) for ms-marco cross-encoders:
|
|
52
|
-
// logit +8 → ~100%, logit +2 → ~88%, logit -2 → ~12%, logit -8 → ~0%
|
|
53
|
-
// This gives absolute scores so irrelevant queries don't saturate at 100%.
|
|
27
|
+
const { tokenizer, model } = await this.load();
|
|
54
28
|
const sigmoid = (x) => 1 / (1 + Math.exp(-x));
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
29
|
+
// Score each candidate independently — ms-marco cross-encoders output a
|
|
30
|
+
// single relevance logit per (query, document) pair.
|
|
31
|
+
const scored = await Promise.all(candidates.map(async (c) => {
|
|
32
|
+
const inputs = tokenizer(query, {
|
|
33
|
+
text_pair: c.content,
|
|
34
|
+
padding: true,
|
|
35
|
+
truncation: true,
|
|
36
|
+
});
|
|
37
|
+
const output = await model(inputs);
|
|
38
|
+
const logit = output.logits.data[0];
|
|
39
|
+
return { c, similarity: sigmoid(logit) };
|
|
58
40
|
}));
|
|
41
|
+
scored.sort((a, b) => b.similarity - a.similarity);
|
|
42
|
+
const top = scored
|
|
43
|
+
.slice(0, k)
|
|
44
|
+
.map(({ c, similarity }) => ({ ...c, similarity }));
|
|
59
45
|
return this.minScore > 0
|
|
60
|
-
?
|
|
61
|
-
:
|
|
46
|
+
? top.filter((r) => r.similarity >= this.minScore)
|
|
47
|
+
: top;
|
|
62
48
|
}
|
|
63
49
|
}
|
|
64
50
|
//# sourceMappingURL=reranker.js.map
|
package/dist/reranker.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reranker.js","sourceRoot":"","sources":["../src/reranker.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"reranker.js","sourceRoot":"","sources":["../src/reranker.ts"],"names":[],"mappings":"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"}
|
package/dist/reranker.test.js
CHANGED
|
@@ -1,31 +1,40 @@
|
|
|
1
1
|
import { describe, it, expect, vi, beforeEach } from "vitest";
|
|
2
2
|
import { CrossEncoderReranker } from "./reranker.js";
|
|
3
3
|
import { createReranker } from "./index.js";
|
|
4
|
-
const
|
|
5
|
-
const
|
|
4
|
+
const mockTokenize = vi.fn().mockReturnValue({});
|
|
5
|
+
const mockModelCall = vi.fn();
|
|
6
|
+
const mockFromPretrainedTokenizer = vi.fn().mockResolvedValue(mockTokenize);
|
|
7
|
+
const mockFromPretrainedModel = vi.fn().mockResolvedValue(mockModelCall);
|
|
6
8
|
vi.mock("@huggingface/transformers", () => ({
|
|
7
|
-
|
|
9
|
+
AutoTokenizer: { from_pretrained: mockFromPretrainedTokenizer },
|
|
10
|
+
AutoModelForSequenceClassification: {
|
|
11
|
+
from_pretrained: mockFromPretrainedModel,
|
|
12
|
+
},
|
|
8
13
|
}));
|
|
9
14
|
function makeCandidate(id, content, similarity = 0.5) {
|
|
10
15
|
return { id, content, similarity, metadata: {} };
|
|
11
16
|
}
|
|
12
17
|
describe("CrossEncoderReranker", () => {
|
|
13
18
|
beforeEach(() => {
|
|
14
|
-
|
|
15
|
-
|
|
19
|
+
mockModelCall.mockReset();
|
|
20
|
+
mockFromPretrainedTokenizer.mockClear();
|
|
21
|
+
mockFromPretrainedModel.mockClear();
|
|
22
|
+
mockTokenize.mockClear();
|
|
16
23
|
});
|
|
17
24
|
it("returns empty array immediately when no candidates given", async () => {
|
|
18
25
|
const reranker = new CrossEncoderReranker();
|
|
19
26
|
const result = await reranker.rerank("some query", []);
|
|
20
27
|
expect(result).toEqual([]);
|
|
21
|
-
expect(
|
|
28
|
+
expect(mockModelCall).not.toHaveBeenCalled();
|
|
22
29
|
});
|
|
23
|
-
it("
|
|
30
|
+
it("tokenizes each candidate as a query/document pair", async () => {
|
|
24
31
|
const reranker = new CrossEncoderReranker();
|
|
25
|
-
|
|
26
|
-
await reranker.rerank("
|
|
27
|
-
expect(
|
|
28
|
-
|
|
32
|
+
mockModelCall.mockResolvedValue({ logits: { data: [5.2] } });
|
|
33
|
+
await reranker.rerank("my query", [makeCandidate("a", "some text")]);
|
|
34
|
+
expect(mockTokenize).toHaveBeenCalledWith("my query", {
|
|
35
|
+
text_pair: "some text",
|
|
36
|
+
padding: true,
|
|
37
|
+
truncation: true,
|
|
29
38
|
});
|
|
30
39
|
});
|
|
31
40
|
it("reorders candidates by raw logit descending", async () => {
|
|
@@ -36,11 +45,10 @@ describe("CrossEncoderReranker", () => {
|
|
|
36
45
|
makeCandidate("c", "medium relevance", 0.5),
|
|
37
46
|
];
|
|
38
47
|
// Raw logits (not sigmoid/softmax) — higher = more relevant
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
]);
|
|
48
|
+
mockModelCall
|
|
49
|
+
.mockResolvedValueOnce({ logits: { data: [-3.0] } }) // a: not relevant
|
|
50
|
+
.mockResolvedValueOnce({ logits: { data: [8.5] } }) // b: highly relevant
|
|
51
|
+
.mockResolvedValueOnce({ logits: { data: [2.1] } }); // c: somewhat relevant
|
|
44
52
|
const result = await reranker.rerank("query", candidates);
|
|
45
53
|
expect(result.map((r) => r.id)).toEqual(["b", "c", "a"]);
|
|
46
54
|
});
|
|
@@ -51,11 +59,10 @@ describe("CrossEncoderReranker", () => {
|
|
|
51
59
|
makeCandidate("b", "high", 0.3),
|
|
52
60
|
makeCandidate("c", "mid", 0.5),
|
|
53
61
|
];
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
]);
|
|
62
|
+
mockModelCall
|
|
63
|
+
.mockResolvedValueOnce({ logits: { data: [0.1] } }) // a: sigmoid(0.1) ≈ 0.525
|
|
64
|
+
.mockResolvedValueOnce({ logits: { data: [0.9] } }) // b: sigmoid(0.9) ≈ 0.711
|
|
65
|
+
.mockResolvedValueOnce({ logits: { data: [0.5] } }); // c: sigmoid(0.5) ≈ 0.622
|
|
59
66
|
const result = await reranker.rerank("query", candidates);
|
|
60
67
|
// Order: b > c > a
|
|
61
68
|
expect(result[0].id).toBe("b");
|
|
@@ -69,7 +76,7 @@ describe("CrossEncoderReranker", () => {
|
|
|
69
76
|
it("single result gets sigmoid-calibrated similarity (not forced to 1)", async () => {
|
|
70
77
|
const reranker = new CrossEncoderReranker();
|
|
71
78
|
const candidates = [makeCandidate("x", "some content", 0.5)];
|
|
72
|
-
|
|
79
|
+
mockModelCall.mockResolvedValue({ logits: { data: [7.3] } });
|
|
73
80
|
const result = await reranker.rerank("query", candidates);
|
|
74
81
|
// sigmoid(7.3) ≈ 0.9993 — very high but not exactly 1
|
|
75
82
|
expect(result[0].similarity).toBeCloseTo(1 / (1 + Math.exp(-7.3)), 5);
|
|
@@ -78,7 +85,7 @@ describe("CrossEncoderReranker", () => {
|
|
|
78
85
|
it("assigns near-zero similarity to highly negative logit", async () => {
|
|
79
86
|
const reranker = new CrossEncoderReranker();
|
|
80
87
|
const candidates = [makeCandidate("x", "irrelevant content", 0.5)];
|
|
81
|
-
|
|
88
|
+
mockModelCall.mockResolvedValue({ logits: { data: [-8] } });
|
|
82
89
|
const result = await reranker.rerank("query", candidates);
|
|
83
90
|
// sigmoid(-8) ≈ 0.000335 — clearly not relevant
|
|
84
91
|
expect(result[0].similarity).toBeLessThan(0.01);
|
|
@@ -90,7 +97,9 @@ describe("CrossEncoderReranker", () => {
|
|
|
90
97
|
makeCandidate("b", "irrelevant", 0.3),
|
|
91
98
|
];
|
|
92
99
|
// sigmoid(2) ≈ 0.88, sigmoid(-2) ≈ 0.12 — only "a" passes minScore 0.5
|
|
93
|
-
|
|
100
|
+
mockModelCall
|
|
101
|
+
.mockResolvedValueOnce({ logits: { data: [2] } })
|
|
102
|
+
.mockResolvedValueOnce({ logits: { data: [-2] } });
|
|
94
103
|
const result = await reranker.rerank("query", candidates);
|
|
95
104
|
expect(result).toHaveLength(1);
|
|
96
105
|
expect(result[0].id).toBe("a");
|
|
@@ -102,11 +111,10 @@ describe("CrossEncoderReranker", () => {
|
|
|
102
111
|
makeCandidate("b", "b"),
|
|
103
112
|
makeCandidate("c", "c"),
|
|
104
113
|
];
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
]);
|
|
114
|
+
mockModelCall
|
|
115
|
+
.mockResolvedValueOnce({ logits: { data: [9.0] } })
|
|
116
|
+
.mockResolvedValueOnce({ logits: { data: [8.0] } })
|
|
117
|
+
.mockResolvedValueOnce({ logits: { data: [7.0] } });
|
|
110
118
|
const result = await reranker.rerank("query", candidates);
|
|
111
119
|
expect(result).toHaveLength(2);
|
|
112
120
|
});
|
|
@@ -117,33 +125,29 @@ describe("CrossEncoderReranker", () => {
|
|
|
117
125
|
makeCandidate("b", "b"),
|
|
118
126
|
makeCandidate("c", "c"),
|
|
119
127
|
];
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
]);
|
|
128
|
+
mockModelCall
|
|
129
|
+
.mockResolvedValueOnce({ logits: { data: [9.0] } })
|
|
130
|
+
.mockResolvedValueOnce({ logits: { data: [8.0] } })
|
|
131
|
+
.mockResolvedValueOnce({ logits: { data: [7.0] } });
|
|
125
132
|
const result = await reranker.rerank("query", candidates, 1);
|
|
126
133
|
expect(result).toHaveLength(1);
|
|
127
134
|
});
|
|
128
|
-
it("lazily initialises and caches the
|
|
135
|
+
it("lazily initialises and caches the model across calls", async () => {
|
|
129
136
|
const reranker = new CrossEncoderReranker();
|
|
130
|
-
|
|
137
|
+
mockModelCall.mockResolvedValue({ logits: { data: [0.5] } });
|
|
131
138
|
await reranker.rerank("q1", [makeCandidate("a", "text")]);
|
|
132
139
|
await reranker.rerank("q2", [makeCandidate("b", "text")]);
|
|
133
|
-
expect(
|
|
140
|
+
expect(mockFromPretrainedTokenizer).toHaveBeenCalledTimes(1);
|
|
141
|
+
expect(mockFromPretrainedModel).toHaveBeenCalledTimes(1);
|
|
134
142
|
});
|
|
135
|
-
it("forwards custom model to
|
|
143
|
+
it("forwards custom model to AutoModelForSequenceClassification", async () => {
|
|
136
144
|
const reranker = new CrossEncoderReranker({ model: "custom/model-v1" });
|
|
137
|
-
|
|
145
|
+
mockModelCall.mockResolvedValue({ logits: { data: [0.5] } });
|
|
138
146
|
await reranker.rerank("q", [makeCandidate("a", "text")]);
|
|
139
|
-
expect(
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
const candidates = [makeCandidate("a", "content", 0.42)];
|
|
144
|
-
mockCall.mockResolvedValue("unexpected non-array");
|
|
145
|
-
const result = await reranker.rerank("q", candidates);
|
|
146
|
-
expect(result[0].similarity).toBe(0.42);
|
|
147
|
+
expect(mockFromPretrainedTokenizer).toHaveBeenCalledWith("custom/model-v1");
|
|
148
|
+
expect(mockFromPretrainedModel).toHaveBeenCalledWith("custom/model-v1", {
|
|
149
|
+
dtype: "fp32",
|
|
150
|
+
});
|
|
147
151
|
});
|
|
148
152
|
it("exposes name 'cross-encoder'", () => {
|
|
149
153
|
expect(new CrossEncoderReranker().name).toBe("cross-encoder");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reranker.test.js","sourceRoot":"","sources":["../src/reranker.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAE9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE5C,MAAM,
|
|
1
|
+
{"version":3,"file":"reranker.test.js","sourceRoot":"","sources":["../src/reranker.test.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vivantel/virage-reranker-cross-encoder",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.25",
|
|
4
4
|
"description": "Local cross-encoder re-ranker for Virage (ONNX, no API key required)",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -40,13 +40,13 @@
|
|
|
40
40
|
"directory": "packages/virage-reranker-cross-encoder"
|
|
41
41
|
},
|
|
42
42
|
"dependencies": {
|
|
43
|
-
"@huggingface/transformers": "^
|
|
43
|
+
"@huggingface/transformers": "^4.0.0"
|
|
44
44
|
},
|
|
45
45
|
"peerDependencies": {
|
|
46
46
|
"@vivantel/virage-core": "*"
|
|
47
47
|
},
|
|
48
48
|
"devDependencies": {
|
|
49
|
-
"@vivantel/virage-core": "0.2.
|
|
49
|
+
"@vivantel/virage-core": "0.2.47",
|
|
50
50
|
"@types/node": "^25.9.3",
|
|
51
51
|
"typescript": "^6.0.3",
|
|
52
52
|
"vitest": "^4.1.9"
|