|
1 | 1 | use std::{collections::HashMap, time::Instant};
|
2 | 2 |
|
| 3 | +#[cfg(feature = "rayon")] |
| 4 | +use rayon::prelude::*; |
| 5 | + |
3 | 6 | use anyhow::Result;
|
4 | 7 | use async_trait::async_trait;
|
5 | 8 | use colored::Colorize;
|
@@ -89,13 +92,25 @@ impl VectorStore for NaiveVectorStore {
|
89 | 92 | println!("[{}] {} (top {})", "rag".bold(), query, top_k);
|
90 | 93 |
|
91 | 94 | let query_vector = self.embedder.embeddings(query).await?;
|
92 |
| - let mut distances = vec![]; |
93 | 95 | let mut results = vec![];
|
94 | 96 |
|
95 |
| - // TODO: parallelize? |
96 |
| - for (doc_name, doc_embedding) in &self.embeddings { |
97 |
| - distances.push((doc_name, metrics::cosine(&query_vector, doc_embedding))); |
98 |
| - } |
| 97 | + #[cfg(feature = "rayon")] |
| 98 | + let mut distances: Vec<(&String, f64)> = self |
| 99 | + .embeddings |
| 100 | + .par_iter() |
| 101 | + .map(|(doc_name, doc_embedding)| { |
| 102 | + (doc_name, metrics::cosine(&query_vector, doc_embedding)) |
| 103 | + }) |
| 104 | + .collect(); |
| 105 | + |
| 106 | + #[cfg(not(feature = "rayon"))] |
| 107 | + let mut distances = { |
| 108 | + let mut distances = vec![]; |
| 109 | + for (doc_name, doc_embedding) in &self.embeddings { |
| 110 | + distances.push((doc_name, metrics::cosine(&query_vector, doc_embedding))); |
| 111 | + } |
| 112 | + distances |
| 113 | + }; |
99 | 114 |
|
100 | 115 | distances.sort_by(|(_, a), (_, b)| a.partial_cmp(b).unwrap());
|
101 | 116 |
|
|
0 commit comments