use anyhow::Result;
use std::path::Path;
use swiftide::query::evaluators::ragas;
use crate::{indexing::build_query_pipeline, repository::Repository, storage};
pub async fn evaluate_query_pipeline(
repository: &Repository,
input: Option<&Path>,
output: &Path,
questions: Option<&[String]>,
record_ground_truth: bool,
) -> Result<()> {
let dataset: ragas::EvaluationDataSet = if let Some(input) = input {
println!("Reading dataset from file: {}", input.display());
std::fs::read_to_string(input)?.parse()?
} else if let Some(questions) = questions {
println!("Generation evaluations for {} questions", questions.len());
questions.into()
} else {
anyhow::bail!("Either input or questions must be provided")
};
tracing::info!("Setting up evaluator");
let ragas = ragas::Ragas::from_prepared_questions(dataset);
tracing::info!("Building query pipeline");
let pipeline = build_query_pipeline(
repository,
&storage::get_duckdb(repository),
Some(Box::new(ragas.clone())),
)?;
tracing::info!("Querying all questions");
pipeline.query_all(ragas.questions().await).await?;
if record_ground_truth {
tracing::info!("Recording ground truth");
ragas.record_answers_as_ground_truth().await;
}
tracing::info!("Writing evaluation results to file");
let json = ragas.to_json().await;
if let Some(parent) = output.parent() {
let _ = std::fs::create_dir_all(parent);
}
std::fs::write(output, json)?;
Ok(())
}