import json from tqdm.auto import tqdm from config import MODEL_NAME from evaluation.evaluation_utils import llm_structured_retry from search import rrf, text_search, vector_search # noqa: F401 (re-exported for notebooks) def generate_ground_truth( doc, llm_client, data_gen_instructions, Questions ): user_prompt = json.dumps(doc) out, usage = llm_structured_retry( llm_client, data_gen_instructions, user_prompt, Questions ) results = [] for q in out.questions: results.append({ "question": q, "answer": doc['answer'], "document": doc["id"] }) return results, usage def compute_relevance(q, search_function): doc_id = q["document"] results = search_function(query=q["question"]) relevance = [] for d in results: relevance.append(int(d["id"] == doc_id)) return relevance def compute_relevance_total(ground_truth, search_function): relevance_total = [] for q in tqdm(ground_truth): relevance = compute_relevance(q, search_function) relevance_total.append(relevance) return relevance_total def hit_rate(relevance): cnt = 0 for line in relevance: if 1 in line: cnt = cnt + 1 return cnt / len(relevance) def mrr(relevance): total_score = 0.0 for line in relevance: for rank in range(len(line)): if line[rank] == 1: total_score = total_score + 1 / (rank + 1) break return total_score / len(relevance) def evaluate(ground_truth, search_function): relevance_total = compute_relevance_total(ground_truth, search_function) return { "hit_rate": hit_rate(relevance_total), "mrr": mrr(relevance_total), } def search_boosts(query, question_boost, answer_boost, index, num_results=5): boost_dict = { "question": question_boost, "answer": answer_boost, } return index.search( query, num_results=num_results, boost_dict=boost_dict, ) def generate_rag_answer(rec, doc_idx, assistant): question = rec["question"] doc_id = rec["document"] original_doc = doc_idx[doc_id] answer_llm = assistant.rag(question) answer_orig = original_doc["answer"] result = { "question": question, "answer_llm": answer_llm, "answer_orig": answer_orig, "document": doc_id, } return result def evaluate_aqa( question, answer_orig, answer_llm, llm_client, aqa_judge_instructions, aqa_judge_prompt, AnswerEvaluation, model=MODEL_NAME ): prompt = aqa_judge_prompt.format( question=question, answer_orig=answer_orig, answer_llm=answer_llm ) result, usage = llm_structured_retry( llm_client, aqa_judge_instructions, prompt, AnswerEvaluation, model=model, ) return result, usage def judge_record( rec, llm_client, aqa_judge_instructions, aqa_judge_prompt, AnswerEvaluation, ): eval_result, usage = evaluate_aqa( rec["question"], rec["answer_orig"], rec["answer_llm"], llm_client, aqa_judge_instructions, aqa_judge_prompt, AnswerEvaluation, ) result = { "question": rec["question"], "document": rec["document"], "score": eval_result.score, "reasoning": eval_result.reasoning, } return result, usage