Expand description
Recall Evaluation for ANN Indexes
Tools for evaluating the quality of Approximate Nearest Neighbor (ANN) indexes by comparing their results against ground truth exact search.
§Features
- Ground Truth Generation: Generate exact search results for comparison
- Recall@k Calculation: Measure how many true nearest neighbors are found
- Precision@k: Measure accuracy of retrieved results
- nDCG@k: Normalized Discounted Cumulative Gain for ranking quality
- Configuration Comparison: Compare different index configurations
§Example
use oxify_vector::recall_eval::{RecallEvaluator, EvaluationConfig};
use oxify_vector::{HnswIndex, HnswConfig, SearchConfig, VectorSearchIndex};
use std::collections::HashMap;
// Create test dataset
let mut embeddings = HashMap::new();
for i in 0..1000 {
let vec = vec![i as f32 * 0.01, (i * 2) as f32 * 0.01, (i * 3) as f32 * 0.01];
embeddings.insert(format!("doc{}", i), vec);
}
// Build exact and approximate indexes
let mut exact_index = VectorSearchIndex::new(SearchConfig::default());
exact_index.build(&embeddings)?;
let mut hnsw_index = HnswIndex::new(HnswConfig::default());
hnsw_index.build(&embeddings)?;
// Evaluate recall
let config = EvaluationConfig::default();
let evaluator = RecallEvaluator::new(config);
let query = vec![0.5, 1.0, 1.5];
let metrics = evaluator.evaluate_single_query(
&query,
|q, k| exact_index.search(q, k),
|q, k| hnsw_index.search(q, k),
)?;
// metrics is a Vec<QueryMetrics>, one for each k value
for m in &metrics {
println!("Recall@{}: {:.2}%", m.k, m.recall_at_k * 100.0);
println!("Precision@{}: {:.2}%", m.k, m.precision_at_k * 100.0);
}Structs§
- Aggregated
Metrics - Aggregated evaluation metrics across multiple queries
- Evaluation
Config - Evaluation configuration
- Query
Metrics - Evaluation metrics for a single query
- Recall
Evaluator - Recall evaluator for comparing ANN and exact search