use embellama::{EmbeddingEngine, EngineConfig, NormalizationMode, PoolingStrategy};
use std::env;
use std::path::PathBuf;
fn main() -> Result<(), Box<dyn std::error::Error>> {
tracing_subscriber::fmt()
.with_env_filter("embellama=info")
.init();
let model_path = env::var("EMBELLAMA_RERANK_MODEL").ok().map_or_else(
|| {
eprintln!("Set EMBELLAMA_RERANK_MODEL environment variable to reranker model path");
eprintln!(
"Example: EMBELLAMA_RERANK_MODEL=/path/to/bge-reranker-v2-m3.gguf cargo run --example reranking"
);
std::process::exit(1);
},
PathBuf::from,
);
println!("Loading reranker model from: {}", model_path.display());
println!("\n--- Pattern 1: Auto-detection ---");
let config = EngineConfig::builder()
.with_model_path(&model_path)
.with_model_name("reranker-auto")
.with_n_seq_max(8)
.build()?;
let engine = EmbeddingEngine::new(config)?;
let query = "What is the capital of France?";
let documents = [
"Paris is the capital and largest city of France.",
"Berlin is the capital of Germany.",
"The weather is nice today.",
"France is a country in Western Europe.",
];
println!("Query: \"{query}\"");
println!("Documents: {}", documents.len());
let results = engine.rerank(Some("reranker-auto"), query, &documents, None, true)?;
println!("\nResults (sorted by relevance):");
for result in &results {
println!(
" [{:.4}] Document {}: \"{}\"",
result.relevance_score, result.index, documents[result.index]
);
}
println!("\n--- Pattern 2: Explicit configuration ---");
let config = EngineConfig::builder()
.with_model_path(&model_path)
.with_model_name("reranker-explicit")
.with_pooling_strategy(PoolingStrategy::Rank)
.with_normalization_mode(NormalizationMode::None)
.with_n_seq_max(8)
.build()?;
let engine = EmbeddingEngine::new(config)?;
let results = engine.rerank(Some("reranker-explicit"), query, &documents, Some(2), true)?;
println!("\nTop 2 results:");
for result in &results {
println!(
" [{:.4}] Document {}: \"{}\"",
result.relevance_score, result.index, documents[result.index]
);
}
let raw_results = engine.rerank(Some("reranker-explicit"), query, &documents, None, false)?;
println!("\nRaw scores (no sigmoid normalization):");
for result in &raw_results {
println!(
" [{:.4}] Document {}: \"{}\"",
result.relevance_score, result.index, documents[result.index]
);
}
println!("\nReranking example completed successfully!");
Ok(())
}