use async_trait::async_trait;
use langchainrust::evaluation::*;
struct StaticPredictor(&'static str);
#[async_trait]
impl Predictor for StaticPredictor {
async fn predict(&self, _input: &str) -> Result<String, EvalError> {
Ok(self.0.to_string())
}
}
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let dataset = match std::env::args().nth(1) {
Some(path) => Dataset::from_jsonl(&path).await?,
None => Dataset::new(vec![
Example::new("2+2?", "4"),
Example::new("法国首都是哪?", "巴黎"),
]),
};
if dataset.is_empty() {
println!("数据集为空,没有可评测的样例。");
return Ok(());
}
let runner = EvalRunner::new(vec![Box::new(ExactMatch), Box::new(StringDistance)]);
let report = runner.run(&dataset, &StaticPredictor("4")).await?;
println!("=== 逐条结果(含原文) ===");
for ex in &report.per_example {
println!(
"[{}] input={:?} prediction={:?} scores={:?}",
ex.index, ex.input, ex.prediction, ex.scores
);
}
println!("=== 汇总(均值 ± 标准差) ===");
for (name, s) in &report.summary {
println!(
"{name}: mean={:.3} std={:.3} count={}",
s.mean, s.std, s.count
);
}
if !report.failures.is_empty() {
println!("=== 失败记录(逐条容错) ===");
for f in &report.failures {
println!("[{}] {}: {}", f.index, f.stage, f.error);
}
}
let evaluator = ExactMatch;
let result = evaluator.eval("What language?", "Rust", "Rust").await?;
println!("ExactMatch (相同): score = {}", result.value);
let result = evaluator.eval("What language?", "Rust", "Python").await?;
println!("ExactMatch (不同): score = {}", result.value);
Ok(())
}