Source code for autorag.schema.metricinput
from dataclasses import dataclass
from typing import Optional, List, Dict, Callable, Any, Union
import numpy as np
import pandas as pd
[docs]
@dataclass
class MetricInput:
query: Optional[str] = None
queries: Optional[List[str]] = None
retrieval_gt_contents: Optional[List[List[str]]] = None
retrieved_contents: Optional[List[str]] = None
retrieval_gt: Optional[List[List[str]]] = None
retrieved_ids: Optional[List[str]] = None
prompt: Optional[str] = None
generated_texts: Optional[str] = None
generation_gt: Optional[List[str]] = None
generated_log_probs: Optional[List[float]] = None
[docs]
def is_fields_notnone(self, fields_to_check: List[str]) -> bool:
for field in fields_to_check:
actual_value = getattr(self, field)
if actual_value is None:
return False
try:
if not type_checks.get(type(actual_value), lambda _: False)(
actual_value
):
return False
except Exception:
return False
return True
[docs]
@classmethod
def from_dataframe(cls, qa_data: pd.DataFrame) -> List["MetricInput"]:
"""
Convert a pandas DataFrame into a list of MetricInput instances.
qa_data: pd.DataFrame: qa_data DataFrame containing metric data.
:returns: List[MetricInput]: List of MetricInput objects created from DataFrame rows.
"""
instances = []
for _, row in qa_data.iterrows():
instance = cls()
for attr_name in cls.__annotations__:
if attr_name in row:
value = row[attr_name]
if isinstance(value, str):
setattr(
instance,
attr_name,
value.strip() if value.strip() != "" else None,
)
elif isinstance(value, list):
setattr(instance, attr_name, value if len(value) > 0 else None)
else:
setattr(instance, attr_name, value)
instances.append(instance)
return instances
@staticmethod
def _check_list(lst_or_arr: Union[List[Any], np.ndarray]) -> bool:
if isinstance(lst_or_arr, np.ndarray):
lst_or_arr = lst_or_arr.flatten().tolist()
if len(lst_or_arr) == 0:
return False
for item in lst_or_arr:
if item is None:
return False
item_type = type(item)
if item_type in type_checks:
if not type_checks[item_type](item):
return False
else:
return False
return True
type_checks: Dict[type, Callable[[Any], bool]] = {
str: lambda x: len(x.strip()) > 0,
list: MetricInput._check_list,
np.ndarray: MetricInput._check_list,
int: lambda _: True,
float: lambda _: True,
}