1"""Convenience function for RAG evaluation."""
2
3from __future__ import annotations
4
5from typing import Any
6
7from lexigram.ai.rag.evaluation.answer import (
8 AnswerFaithfulnessEvaluator,
9 AnswerRelevanceEvaluator,
10)
11from lexigram.ai.rag.evaluation.base import EvaluatorBase
12from lexigram.ai.rag.evaluation.context import ContextRelevanceEvaluator
13from lexigram.ai.rag.evaluation.evaluator import RAGEvaluator
14from lexigram.ai.rag.evaluation.hallucination import HallucinationDetector
15from lexigram.ai.rag.evaluation.retrieval import (
16 RetrievalPrecisionEvaluator,
17 RetrievalRecallEvaluator,
18)
19from lexigram.ai.rag.evaluation.types import RAGEvaluationReport
20
21
22async def evaluate_rag(
23 query: str,
24 retrieved_docs: list[Any],
25 generated_answer: str,
26 reference_answer: str | None = None,
27 llm_client: Any = None,
28 evaluators: list[EvaluatorBase] | None = None,
29 **kwargs: Any,
30) -> RAGEvaluationReport:
31 """Convenience function for RAG evaluation.
32
33 Args:
34 query: The query.
35 retrieved_docs: Retrieved documents.
36 generated_answer: Generated answer.
37 reference_answer: Optional ground truth.
38 llm_client: Optional LLM client for LLM-based metrics.
39 evaluators: Optional custom evaluators.
40 **kwargs: Additional parameters.
41
42 Returns:
43 Evaluation report.
44 """
45 if evaluators is None:
46 evaluators = []
47
48 # Add basic retrieval metrics if relevant docs provided
49 if "relevant_doc_ids" in kwargs:
50 evaluators.append(RetrievalPrecisionEvaluator())
51 evaluators.append(RetrievalRecallEvaluator())
52
53 # Add LLM-based metrics if LLM client provided
54 if llm_client is not None:
55 evaluators.append(AnswerRelevanceEvaluator(llm_client))
56 evaluators.append(AnswerFaithfulnessEvaluator(llm_client))
57 evaluators.append(ContextRelevanceEvaluator(llm_client))
58 evaluators.append(HallucinationDetector(llm_client))
59
60 evaluator = RAGEvaluator(evaluators=evaluators)
61 return await evaluator.evaluate(
62 query=query,
63 retrieved_docs=retrieved_docs,
64 generated_answer=generated_answer,
65 reference_answer=reference_answer,
66 **kwargs,
67 )