@@ -20,6 +20,7 @@ use writer_cli::stylometry::features::lengths;
2020use writer_cli:: stylometry:: features:: punctuation:: PunctuationStats ;
2121use writer_cli:: stylometry:: features:: readability:: ReadabilityStats ;
2222use writer_cli:: stylometry:: fingerprint:: StylometricFingerprint ;
23+ use writer_cli:: stylometry:: relevance;
2324
2425use crate :: config;
2526use crate :: error:: AppError ;
@@ -59,6 +60,7 @@ struct EvalRecord {
5960 questions_per_1k : f64 ,
6061 exclamations_per_1k : f64 ,
6162 canon_leakage_score : f64 ,
63+ prompt_relevance : f64 ,
6264 // Generation config
6365 system_prompt_enabled : bool ,
6466 prompt_wrapping_enabled : bool ,
@@ -82,6 +84,7 @@ struct EvalSummary {
8284 mean_questions_per_1k : f64 ,
8385 mean_exclamations_per_1k : f64 ,
8486 mean_canon_leakage : f64 ,
87+ mean_prompt_relevance : f64 ,
8588 raw_mode : bool ,
8689 adapter_used : bool ,
8790 model : String ,
@@ -245,6 +248,7 @@ pub async fn run(
245248 let punct = PunctuationStats :: compute ( & text) ;
246249 let read = ReadabilityStats :: compute ( & text) ;
247250 let canon_leakage = compute_canon_leakage ( & text, & prompt_entry. text , & leakage_lexicon) ;
251+ let prompt_rel = relevance:: score ( & prompt_entry. text , & text) ;
248252
249253 let record = EvalRecord {
250254 prompt : prompt_entry. text . clone ( ) ,
@@ -258,6 +262,7 @@ pub async fn run(
258262 questions_per_1k : punct. questions_per_1k ,
259263 exclamations_per_1k : punct. exclamations_per_1k ,
260264 canon_leakage_score : canon_leakage,
265+ prompt_relevance : prompt_rel,
261266 system_prompt_enabled : system. is_some ( ) ,
262267 prompt_wrapping_enabled : !raw,
263268 raw_mode : raw,
@@ -329,6 +334,10 @@ pub async fn run(
329334 summary. mean_questions_per_1k, summary. mean_exclamations_per_1k
330335 ) ;
331336 println ! ( " mean canon leakage: {:.3}" , summary. mean_canon_leakage) ;
337+ println ! (
338+ " mean prompt relevance: {:.3}" ,
339+ summary. mean_prompt_relevance
340+ ) ;
332341 println ! ( "\n results: {}" , output_dir. display( ) . to_string( ) . dimmed( ) ) ;
333342 } else {
334343 crate :: output:: print_success_or ( ctx, & summary, |_| { } ) ;
@@ -425,13 +434,13 @@ fn contains_whole_word(needle: &str, haystack: &str) -> bool {
425434
426435fn write_csv ( path : & Path , records : & [ EvalRecord ] ) -> Result < ( ) , AppError > {
427436 let mut out = String :: new ( ) ;
428- out. push_str ( "prompt,category,seed,style_distance,sentence_length_mean,sentence_length_sd,fk_grade,questions_per_1k,exclamations_per_1k,canon_leakage_score,system_prompt,prompt_wrapping,raw_mode,adapter,n_candidates,model\n " ) ;
437+ out. push_str ( "prompt,category,seed,style_distance,sentence_length_mean,sentence_length_sd,fk_grade,questions_per_1k,exclamations_per_1k,canon_leakage_score,prompt_relevance, system_prompt,prompt_wrapping,raw_mode,adapter,n_candidates,model\n " ) ;
429438
430439 for r in records {
431440 // CSV-escape the prompt
432441 let prompt_escaped = r. prompt . replace ( '"' , "\" \" " ) ;
433442 out. push_str ( & format ! (
434- "\" {}\" ,\" {}\" ,{},{:.4},{:.2},{:.2},{:.2},{:.2},{:.2},{:.4},{},{},{},{},{},{}\n " ,
443+ "\" {}\" ,\" {}\" ,{},{:.4},{:.2},{:.2},{:.2},{:.2},{:.2},{:.4},{:.4},{ },{},{},{},{},{}\n " ,
435444 prompt_escaped,
436445 r. category,
437446 r. seed,
@@ -442,6 +451,7 @@ fn write_csv(path: &Path, records: &[EvalRecord]) -> Result<(), AppError> {
442451 r. questions_per_1k,
443452 r. exclamations_per_1k,
444453 r. canon_leakage_score,
454+ r. prompt_relevance,
445455 r. system_prompt_enabled,
446456 r. prompt_wrapping_enabled,
447457 r. raw_mode,
@@ -477,6 +487,7 @@ fn compute_summary(
477487 mean_questions_per_1k : 0.0 ,
478488 mean_exclamations_per_1k : 0.0 ,
479489 mean_canon_leakage : 0.0 ,
490+ mean_prompt_relevance : 0.0 ,
480491 raw_mode : raw,
481492 adapter_used : adapter,
482493 model : model_id. to_string ( ) ,
@@ -507,6 +518,7 @@ fn compute_summary(
507518 mean_questions_per_1k : records. iter ( ) . map ( |r| r. questions_per_1k ) . sum :: < f64 > ( ) / n,
508519 mean_exclamations_per_1k : records. iter ( ) . map ( |r| r. exclamations_per_1k ) . sum :: < f64 > ( ) / n,
509520 mean_canon_leakage : records. iter ( ) . map ( |r| r. canon_leakage_score ) . sum :: < f64 > ( ) / n,
521+ mean_prompt_relevance : records. iter ( ) . map ( |r| r. prompt_relevance ) . sum :: < f64 > ( ) / n,
510522 raw_mode : raw,
511523 adapter_used : adapter,
512524 model : model_id. to_string ( ) ,
0 commit comments