Skip to content

Commit a5d11ff

Browse files
authored
Merge pull request #6777 from uinstinct/reranker-scores-error
fix: case when reranker returns invalid scores array
2 parents 30d3982 + 4e18180 commit a5d11ff

3 files changed

Lines changed: 28 additions & 7 deletions

File tree

core/context/providers/DocsContextProvider.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,13 @@ class DocsContextProvider extends BaseContextProvider {
4343
try {
4444
const scores = await reranker.rerank(fullInput, chunksCopy);
4545

46-
chunksCopy.sort(
47-
(a, b) => scores[chunksCopy.indexOf(b)] - scores[chunksCopy.indexOf(a)],
48-
);
46+
if (Array.isArray(scores)) {
47+
// reranker model has returned a valid array
48+
chunksCopy.sort(
49+
(a, b) =>
50+
scores[chunksCopy.indexOf(b)] - scores[chunksCopy.indexOf(a)],
51+
);
52+
}
4953

5054
chunksCopy = chunksCopy.splice(
5155
0,

core/context/retrieval/pipelines/RerankerRetrievalPipeline.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ export default class RerankerRetrievalPipeline extends BaseRetrievalPipeline {
2727

2828
let embeddingsChunks: Chunk[] = [];
2929
try {
30-
embeddingsChunks = !!config.selectedModelByRole.embed
30+
embeddingsChunks = Boolean(config.selectedModelByRole.embed)
3131
? await this.retrieveEmbeddings(input, nRetrieve)
3232
: [];
3333
} catch (error) {
@@ -116,7 +116,7 @@ export default class RerankerRetrievalPipeline extends BaseRetrievalPipeline {
116116
const chunkIndexMap = new Map<Chunk, number>();
117117
chunks.forEach((chunk, idx) => chunkIndexMap.set(chunk, idx));
118118

119-
results.sort(
119+
results?.sort(
120120
(a, b) => scores[chunkIndexMap.get(b)!] - scores[chunkIndexMap.get(a)!],
121121
);
122122
results = results.slice(0, this.options.nFinal);

core/llm/llms/Voyage.ts

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,21 @@
1-
import { Chunk, LLMOptions } from "../../index.js";
1+
import { z } from "zod";
22

3+
import { Chunk, LLMOptions } from "../../index.js";
34
import OpenAI from "./OpenAI.js";
45

6+
/**used to check a valid response from voyage is received
7+
* reference: https://docs.voyageai.com/reference/reranker-api
8+
*/
9+
const VoyageRerankSuccessResponseSchema = z.object({
10+
data: z.array(
11+
z.object({
12+
index: z.number(),
13+
relevance_score: z.number(),
14+
document: z.string(),
15+
}),
16+
),
17+
});
18+
519
class Voyage extends OpenAI {
620
static providerName = "voyage";
721
static defaultOptions: Partial<LLMOptions> | undefined = {
@@ -36,7 +50,10 @@ class Voyage extends OpenAI {
3650
const data = (await resp.json()) as {
3751
data: Array<{ index: number; relevance_score: number }>;
3852
};
39-
const results = data.data.sort((a, b) => a.index - b.index);
53+
54+
const parsedData = VoyageRerankSuccessResponseSchema.parse(data);
55+
56+
const results = parsedData.data.sort((a, b) => a.index - b.index);
4057
return results.map((result) => result.relevance_score);
4158
}
4259
}

0 commit comments

Comments
 (0)