feat: Add reranking functionality to Jina client
- Added a new `rerank` function to the Jina client for reranking documents. - Added a new `RerankParams` struct to define parameters for reranking. - Added unit tests for the new `rerank` function. - Updated the example script to demonstrate reranking. - Improved error handling and added more comprehensive logging.
This commit is contained in:
@@ -11,3 +11,12 @@ embeddings := jina_client.create_embeddings(
|
||||
) or { panic('Error while creating embeddings: ${err}') }
|
||||
|
||||
println('Created embeddings: ${embeddings}')
|
||||
|
||||
rerank_result := jina_client.rerank(
|
||||
model: .reranker_v2_base_multilingual
|
||||
query: 'skincare products'
|
||||
documents: ['Product A', 'Product B', 'Product C']
|
||||
top_n: 2
|
||||
) or { panic('Error while reranking: ${err}') }
|
||||
|
||||
println('Rerank result: ${rerank_result}')
|
||||
|
||||
@@ -47,6 +47,44 @@ pub fn (mut j Jina) create_embeddings(params CreateEmbeddingParams) !ModelEmbedd
|
||||
return parse_model_embedding_output(response)!
|
||||
}
|
||||
|
||||
@[params]
|
||||
pub struct RerankParams {
|
||||
pub mut:
|
||||
model JinaRerankModel @[required]
|
||||
query string @[required]
|
||||
documents []string @[required]
|
||||
top_n ?int // Optional: Number of top results to return
|
||||
return_documents ?bool // Optional: Flag to determine if the documents should be returned
|
||||
}
|
||||
|
||||
// Rerank documents based on a query
|
||||
pub fn (mut j Jina) rerank(params RerankParams) !RankingOutput {
|
||||
mut rank_input := RerankInput{
|
||||
model: params.model.to_string()
|
||||
query: params.query
|
||||
documents: params.documents
|
||||
}
|
||||
|
||||
if v := params.top_n {
|
||||
rank_input.top_n = v
|
||||
}
|
||||
|
||||
if v := params.return_documents {
|
||||
rank_input.return_documents = v
|
||||
}
|
||||
|
||||
req := httpconnection.Request{
|
||||
method: .post
|
||||
prefix: 'v1/rerank'
|
||||
dataformat: .json
|
||||
data: json.encode(rank_input)
|
||||
}
|
||||
|
||||
mut httpclient := j.httpclient()!
|
||||
response := httpclient.post_json_str(req)!
|
||||
return json.decode(RankingOutput, response)!
|
||||
}
|
||||
|
||||
// // Create embeddings with a TextDoc input
|
||||
// pub fn (mut j Jina) create_embeddings_with_docs(args TextEmbeddingInput) !ModelEmbeddingOutput {
|
||||
|
||||
|
||||
@@ -1,11 +1,14 @@
|
||||
module jina
|
||||
|
||||
import time
|
||||
|
||||
fn setup_client() !&Jina {
|
||||
mut client := get()!
|
||||
return client
|
||||
}
|
||||
|
||||
fn test_create_embeddings() {
|
||||
time.sleep(1 * time.second)
|
||||
mut client := setup_client()!
|
||||
embeddings := client.create_embeddings(
|
||||
input: ['Hello', 'World']
|
||||
@@ -17,3 +20,17 @@ fn test_create_embeddings() {
|
||||
assert embeddings.object == 'list' // Check the object type
|
||||
assert embeddings.model == 'jina-embeddings-v3'
|
||||
}
|
||||
|
||||
fn test_rerank() {
|
||||
time.sleep(1 * time.second)
|
||||
mut client := setup_client()!
|
||||
rerank_result := client.rerank(
|
||||
model: .reranker_v2_base_multilingual
|
||||
query: 'skincare products'
|
||||
documents: ['Product A', 'Product B', 'Product C']
|
||||
top_n: 2
|
||||
) or { panic('Error while reranking: ${err}') }
|
||||
|
||||
assert rerank_result.results.len == 2
|
||||
assert rerank_result.model == 'jina-reranker-v2-base-multilingual'
|
||||
}
|
||||
|
||||
@@ -2,38 +2,6 @@ module jina
|
||||
|
||||
import json
|
||||
|
||||
// RankAPIInput represents the input for reranking requests
|
||||
// model:
|
||||
// jina-reranker-v2-base-multilingual, 278M
|
||||
// jina-reranker-v1-base-en, 137M
|
||||
// jina-reranker-v1-tiny-en, 33M
|
||||
// jina-reranker-v1-turbo-en, 38M
|
||||
// jina-colbert-v1-en, 137M
|
||||
pub struct RankAPIInputRAW {
|
||||
pub mut:
|
||||
model string @[required]
|
||||
query string @[required]
|
||||
documents []string @[required]
|
||||
top_n int // Optional: Number of top results to return
|
||||
}
|
||||
|
||||
// RankingOutput represents the response from reranking requests
|
||||
pub struct RankingOutput {
|
||||
pub mut:
|
||||
model string
|
||||
results []RankResult
|
||||
usage Usage
|
||||
object string
|
||||
}
|
||||
|
||||
// RankResult represents a single reranking result
|
||||
pub struct RankResult {
|
||||
pub mut:
|
||||
document string
|
||||
index int
|
||||
relevance_score f64
|
||||
}
|
||||
|
||||
// ClassificationAPIInput represents the input for classification requests
|
||||
pub struct ClassificationAPIInput {
|
||||
pub mut:
|
||||
|
||||
67
lib/clients/jina/rank_api.v
Normal file
67
lib/clients/jina/rank_api.v
Normal file
@@ -0,0 +1,67 @@
|
||||
module jina
|
||||
|
||||
import json
|
||||
|
||||
pub enum JinaRerankModel {
|
||||
reranker_v2_base_multilingual // 278M
|
||||
reranker_v1_base_en // 137M
|
||||
reranker_v1_tiny_en // 33M
|
||||
reranker_v1_turbo_en // 38M
|
||||
colbert_v1_en // 137M
|
||||
}
|
||||
|
||||
// RankAPIInput represents the input for reranking requests
|
||||
pub struct RerankInput {
|
||||
pub mut:
|
||||
model string @[required] // Model name
|
||||
query string @[required] // Query text
|
||||
documents []string @[required] // Document texts
|
||||
top_n ?int // Optional: Number of top results to return
|
||||
return_documents ?bool // Optional: Flag to determine if the documents should be returned
|
||||
}
|
||||
|
||||
// RankingOutput represents the response from reranking requests
|
||||
pub struct RankingOutput {
|
||||
pub mut:
|
||||
model string
|
||||
results []RankResult
|
||||
usage Usage
|
||||
object string
|
||||
}
|
||||
|
||||
// RankResult represents a single reranking result
|
||||
pub struct RankResult {
|
||||
pub mut:
|
||||
document RankDocument
|
||||
index int
|
||||
relevance_score f64
|
||||
}
|
||||
|
||||
// RankDocument represents a single document for reranking
|
||||
pub struct RankDocument {
|
||||
pub mut:
|
||||
text string
|
||||
}
|
||||
|
||||
// to_string converts a JinaRerankModel enum to its string representation as expected by the Jina API
|
||||
pub fn (m JinaRerankModel) to_string() string {
|
||||
return match m {
|
||||
.reranker_v2_base_multilingual { 'jina-reranker-v2-base-multilingual' }
|
||||
.reranker_v1_base_en { 'jina-reranker-v1-base-en' }
|
||||
.reranker_v1_tiny_en { 'jina-reranker-v1-tiny-en' }
|
||||
.reranker_v1_turbo_en { 'jina-reranker-v1-turbo-en' }
|
||||
.colbert_v1_en { 'jina-colbert-v1-en' }
|
||||
}
|
||||
}
|
||||
|
||||
// from_string converts a string to a JinaRerankModel enum, returning an error if the string is invalid
|
||||
pub fn jina_rerank_model_from_string(s string) !JinaRerankModel {
|
||||
return match s {
|
||||
'jina-reranker-v2-base-multilingual' { JinaRerankModel.reranker_v2_base_multilingual }
|
||||
'jina-reranker-v1-base-en' { JinaRerankModel.reranker_v1_base_en }
|
||||
'jina-reranker-v1-tiny-en' { JinaRerankModel.reranker_v1_tiny_en }
|
||||
'jina-reranker-v1-turbo-en' { JinaRerankModel.reranker_v1_turbo_en }
|
||||
'jina-colbert-v1-en' { JinaRerankModel.colbert_v1_en }
|
||||
else { error('Invalid JinaRerankModel string: ${s}') }
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user