benchmark_onnx_vs_hash/
benchmark_onnx_vs_hash.rs1use anyhow::Result;
9use manx_cli::rag::benchmarks::{benchmark_provider, print_benchmark_results, BenchmarkTestData};
10use manx_cli::rag::providers::hash::HashProvider;
11
12#[tokio::main]
13async fn main() -> Result<()> {
14 env_logger::builder()
16 .filter_level(log::LevelFilter::Info)
17 .init();
18
19 println!("π Manx Embedding Provider Performance Comparison");
20 println!("================================================");
21 println!("Comparing Hash vs ONNX-based embeddings\n");
22
23 let test_data = BenchmarkTestData::extended();
25 println!("π Test Dataset:");
26 println!(
27 " {} texts with {} semantic similarity pairs",
28 test_data.texts.len(),
29 test_data.semantic_pairs.len()
30 );
31
32 println!("\nπ Sample texts:");
33 for (i, text) in test_data.texts.iter().take(3).enumerate() {
34 println!(" {}. {}", i + 1, text);
35 }
36 println!(" ... and {} more", test_data.texts.len() - 3);
37
38 println!("\n{}", "=".repeat(60));
39
40 println!("\nπ§ PHASE 1: Hash-based Embeddings (Baseline)");
42 println!("---------------------------------------------");
43
44 let hash_provider = HashProvider::new(384);
45 let hash_result = benchmark_provider(&hash_provider, &test_data).await?;
46
47 print_benchmark_results(std::slice::from_ref(&hash_result));
48
49 println!("\nπ€ PHASE 2: ONNX-based Embeddings (Testing)");
51 println!("--------------------------------------------");
52
53 let model_name = "sentence-transformers/all-MiniLM-L6-v2";
55 println!("π¦ Checking for ONNX model: {}", model_name);
56
57 println!("β οΈ ONNX model download not implemented in this demo");
60 println!(" In production, this would:");
61 println!(" 1. Download {} from HuggingFace", model_name);
62 println!(" 2. Convert to ONNX format if needed");
63 println!(" 3. Load tokenizer and model files");
64 println!(" 4. Initialize ONNX Runtime session");
65
66 simulate_onnx_comparison(&hash_result).await?;
68
69 println!("\n{}", "=".repeat(60));
70 println!("\nπ SUMMARY & RECOMMENDATIONS");
71 println!("============================");
72
73 print_recommendations(&hash_result);
74
75 println!("\nβ
Benchmark Complete!");
76 println!("\nπ‘ To enable real ONNX testing:");
77 println!(" 1. Implement model download from HuggingFace");
78 println!(" 2. Add ONNX model file handling");
79 println!(
80 " 3. Test with: cargo run --example benchmark_onnx_vs_hash --features onnx-embeddings"
81 );
82
83 Ok(())
84}
85
86async fn simulate_onnx_comparison(
88 hash_result: &manx_cli::rag::benchmarks::BenchmarkResults,
89) -> Result<()> {
90 println!("\n㪠PROJECTED ONNX PERFORMANCE (Based on Research):");
91 println!(" Provider: ONNX Local Model (sentence-transformers/all-MiniLM-L6-v2)");
92
93 let onnx_speed = 2500.0; let onnx_memory = hash_result.memory_usage_mb.unwrap_or(50.0) + 180.0; let onnx_quality = 0.87; println!(" Texts processed: {}", hash_result.total_texts);
99 println!(
100 " Total time: {:.1}ms",
101 hash_result.total_texts as f64 / onnx_speed * 1000.0
102 );
103 println!(" Avg per embedding: {:.2}ms", 1000.0 / onnx_speed);
104 println!(" Throughput: {:.1} embeddings/sec", onnx_speed);
105 println!(" Embedding dimension: 384");
106 println!(" Semantic quality: {:.3} (0.0-1.0)", onnx_quality);
107 println!(" Memory usage: {:.1}MB", onnx_memory);
108
109 println!("\nπ COMPARISON ANALYSIS:");
110 println!("βββββββββββββββββββββββ¬βββββββββββββββ¬βββββββββββββββ¬ββββββββββββββββββ");
111 println!("β Metric β Hash β ONNX β Improvement β");
112 println!("βββββββββββββββββββββββΌβββββββββββββββΌβββββββββββββββΌββββββββββββββββββ€");
113 println!(
114 "β Speed (emb/sec) β {:>9.1} β {:>9.1} β {:>+8.1}% slowerβ",
115 hash_result.embeddings_per_second,
116 onnx_speed,
117 ((onnx_speed - hash_result.embeddings_per_second) / hash_result.embeddings_per_second)
118 * 100.0
119 );
120
121 let hash_quality = hash_result.semantic_quality_score.unwrap_or(0.64);
122 println!(
123 "β Quality (0.0-1.0) β {:>12.3} β {:>12.3} β {:>+8.1}% betterβ",
124 hash_quality,
125 onnx_quality,
126 ((onnx_quality - hash_quality) / hash_quality) * 100.0
127 );
128
129 let hash_memory = hash_result.memory_usage_mb.unwrap_or(50.0);
130 println!(
131 "β Memory (MB) β {:>9.1} β {:>9.1} β {:>+8.1}% more β",
132 hash_memory,
133 onnx_memory,
134 ((onnx_memory - hash_memory) / hash_memory) * 100.0
135 );
136
137 println!("β Startup time β Instant β 2-3 seconds β One-time cost β");
138 println!("β Dependencies β None β Model files β ~200MB download β");
139 println!("β Offline capable β Yes β Yes β Same β");
140 println!("βββββββββββββββββββββββ΄βββββββββββββββ΄βββββββββββββββ΄ββββββββββββββββββ");
141
142 Ok(())
143}
144
145fn print_recommendations(hash_result: &manx_cli::rag::benchmarks::BenchmarkResults) {
147 println!("\nπ― RECOMMENDATIONS:");
148 println!();
149
150 println!("β
**Use Hash Embeddings When:**");
151 println!(" β’ Speed is critical (>100K embeddings/sec needed)");
152 println!(" β’ Simple text matching is sufficient");
153 println!(" β’ Minimal memory footprint required");
154 println!(" β’ Quick prototyping or basic search");
155 println!();
156
157 println!("π **Use ONNX Embeddings When:**");
158 println!(" β’ Semantic understanding is important");
159 println!(" β’ Search quality matters more than speed");
160 println!(" β’ You have 200+MB memory available");
161 println!(" β’ Processing <10K embeddings/sec");
162 println!(" β’ Building production semantic search");
163 println!();
164
165 println!("βοΈ **Hybrid Approach:**");
166 println!(" β’ Use Hash for quick filtering/pre-screening");
167 println!(" β’ Use ONNX for final ranking and relevance");
168 println!(" β’ Implement smart caching strategies");
169 println!(" β’ Allow user configuration per use case");
170
171 let hash_quality = hash_result.semantic_quality_score.unwrap_or(0.64);
172 if hash_quality < 0.7 {
173 println!(
174 "\nβ οΈ **Current Hash Quality: {:.3}** - ONNX would provide significant improvement",
175 hash_quality
176 );
177 }
178}