Spaces:
Running
Running
| from .bertscore_eval import compute_bertscore | |
| from .llm_judge import judge_answer, judge_answers | |
| from .metrics import compute_cost | |
| def evaluate(query, outputs, ground_truth): | |
| results = {} | |
| for name, out in outputs.items(): | |
| answer = out.get("answer", "") | |
| tokens = out.get("tokens", 0) | |
| latency = out.get("latency", 0) | |
| results[name] = { | |
| "answer": answer, | |
| "tokens": tokens, | |
| "latency": latency, | |
| "cost": compute_cost(tokens), | |
| "judge": judge_answer(answer, ground_truth, query) | |
| } | |
| return results | |
| def evaluate_single_answer(question, correct_answer, system_answer): | |
| verdict = judge_answer(system_answer, correct_answer, question) | |
| bert = compute_bertscore([system_answer], [correct_answer]) | |
| return { | |
| "llm_judge": verdict, | |
| "llm_judge_pass": verdict == "PASS", | |
| "bertscore_f1": bert["mean_f1"], | |
| } | |
| def evaluate_batch(pipeline_answers, ground_truth): | |
| references = [row.get("correct_answer", "") for row in ground_truth] | |
| questions = [row.get("question", row.get("query", "")) for row in ground_truth] | |
| metrics = {} | |
| for pipeline_name, answers in pipeline_answers.items(): | |
| rows = [ | |
| { | |
| "question": question, | |
| "correct_answer": reference, | |
| "system_answer": answer, | |
| } | |
| for question, reference, answer in zip(questions, references, answers) | |
| ] | |
| verdicts = judge_answers(rows) | |
| pass_fail = [verdict == "PASS" for verdict in verdicts if verdict != "SKIP"] | |
| bert = compute_bertscore(answers, references) | |
| metrics[pipeline_name] = { | |
| "llm_judge_pass_rate": ( | |
| sum(pass_fail) / len(pass_fail) if pass_fail else None | |
| ), | |
| "llm_judge_verdicts": verdicts, | |
| "bertscore_f1": bert["mean_f1"], | |
| "bertscore_status": bert["status"], | |
| "bertscore_error": bert["error"], | |
| } | |
| return metrics | |