feat: add desktop document search and verified native CPU embeddings
Core CI / core (ubuntu-latest) (push) Failing after 1m22s
Core CI / core (macos-latest) (push) Canceled after 0s
Core CI / core (windows-latest) (push) Canceled after 0s
Core CI / desktop (ubuntu-latest) (push) Successful in 3m46s
Core CI / desktop (macos-latest) (push) Canceled after 0s
Core CI / desktop (windows-latest) (push) Canceled after 0s
Core CI / core (ubuntu-latest) (push) Failing after 1m22s
Core CI / core (macos-latest) (push) Canceled after 0s
Core CI / core (windows-latest) (push) Canceled after 0s
Core CI / desktop (ubuntu-latest) (push) Successful in 3m46s
Core CI / desktop (macos-latest) (push) Canceled after 0s
Core CI / desktop (windows-latest) (push) Canceled after 0s
This commit is contained in:
1 parent
f77112db97
commit
a9b6592330
46 files changed
+10794
-77
No files matched your search
@@ -0,0 +1,71 @@
|
||||
//! Opt-in real-artifact test. Default tests never acquire model/runtime assets.
|
||||
use searchi_semantic::{CpuEmbedder, DIMENSIONS};
|
||||
use std::path::PathBuf;
|
||||
|
||||
#[test]
|
||||
#[ignore = "Requires explicit SEARCHI_MODEL_DIR and SEARCHI_ORT_LIBRARY local assets"]
|
||||
fn real_cpu_model_retrieves_english_and_german_fixture() {
|
||||
let model =
|
||||
PathBuf::from(std::env::var_os("SEARCHI_MODEL_DIR").expect("Set SEARCHI_MODEL_DIR"));
|
||||
let runtime =
|
||||
PathBuf::from(std::env::var_os("SEARCHI_ORT_LIBRARY").expect("Set SEARCHI_ORT_LIBRARY"));
|
||||
let fixture: serde_json::Value =
|
||||
serde_json::from_str(include_str!("../../../tools/semantic-proof/fixture.json")).unwrap();
|
||||
let documents = fixture["documents"].as_array().unwrap();
|
||||
let texts: Vec<_> = documents
|
||||
.iter()
|
||||
.map(|doc| doc["text"].as_str().unwrap())
|
||||
.collect();
|
||||
let mut embedder = CpuEmbedder::load(&model, &runtime, 1).unwrap();
|
||||
let vectors = embedder.encode(&texts).unwrap();
|
||||
assert!(vectors.iter().all(|vector| vector.len() == DIMENSIONS));
|
||||
for vector in &vectors {
|
||||
let norm = vector.iter().map(|v| v * v).sum::<f32>().sqrt();
|
||||
assert!((norm - 1.0).abs() < 1e-5);
|
||||
}
|
||||
let mut correct = 0;
|
||||
for query in fixture["queries"].as_array().unwrap() {
|
||||
let vector = embedder
|
||||
.encode(&[query["text"].as_str().unwrap()])
|
||||
.unwrap()
|
||||
.remove(0);
|
||||
let mut scores: Vec<_> = vectors
|
||||
.iter()
|
||||
.enumerate()
|
||||
.map(|(i, candidate)| {
|
||||
(
|
||||
i,
|
||||
candidate
|
||||
.iter()
|
||||
.zip(&vector)
|
||||
.map(|(a, b)| a * b)
|
||||
.sum::<f32>(),
|
||||
)
|
||||
})
|
||||
.collect();
|
||||
scores.sort_by(|a, b| b.1.total_cmp(&a.1));
|
||||
let rank = scores
|
||||
.iter()
|
||||
.position(|(i, _)| documents[*i]["id"] == query["expected"])
|
||||
.unwrap()
|
||||
+ 1;
|
||||
println!(
|
||||
"{}: expected rank {rank}; top result {}",
|
||||
query["language"], documents[scores[0].0]["id"]
|
||||
);
|
||||
assert!(
|
||||
rank <= 3,
|
||||
"Real model lost expected passage for {}",
|
||||
query["text"]
|
||||
);
|
||||
correct += usize::from(rank == 1);
|
||||
}
|
||||
// This is the measured proof baseline, not the production quality gate.
|
||||
// A known product-release query currently returns the expected result second.
|
||||
assert!(
|
||||
correct >= 5,
|
||||
"Semantic proof regressed below measured 5/6 top-1 baseline"
|
||||
);
|
||||
assert!(embedder.encode(&[" "]).is_err());
|
||||
assert!(embedder.encode(&["x"; 9]).is_err());
|
||||
}
|
||||
Reference in new issue
Block a user