Feature: Add Jina AI Rerank Retriever (#3898)

This commit is contained in:
Nguyễn Đức Hùng
2025-01-20 19:33:42 +07:00
committed by GitHub
parent 5c9f17814b
commit 9c2203be62
3 changed files with 185 additions and 0 deletions
@@ -0,0 +1,51 @@
import { Callbacks } from '@langchain/core/callbacks/manager'
import { Document } from '@langchain/core/documents'
import axios from 'axios'
import { BaseDocumentCompressor } from 'langchain/retrievers/document_compressors'
export class JinaRerank extends BaseDocumentCompressor {
private jinaAPIKey: string
private readonly JINA_RERANK_API_URL = 'https://api.jina.ai/v1/rerank'
private model: string = 'jina-reranker-v2-base-multilingual'
private readonly topN: number
constructor(jinaAPIKey: string, model: string, topN: number) {
super()
this.jinaAPIKey = jinaAPIKey
this.model = model
this.topN = topN
}
async compressDocuments(
documents: Document<Record<string, any>>[],
query: string,
_?: Callbacks | undefined
): Promise<Document<Record<string, any>>[]> {
if (documents.length === 0) {
return []
}
const config = {
headers: {
Authorization: `Bearer ${this.jinaAPIKey}`,
'Content-Type': 'application/json'
}
}
const data = {
model: this.model,
query: query,
documents: documents.map((doc) => doc.pageContent),
top_n: this.topN
}
try {
let returnedDocs = await axios.post(this.JINA_RERANK_API_URL, data, config)
const finalResults: Document<Record<string, any>>[] = []
returnedDocs.data.results.forEach((result: any) => {
const doc = documents[result.index]
doc.metadata.relevance_score = result.relevance_score
finalResults.push(doc)
})
return finalResults
} catch (error) {
return documents
}
}
}