from promptflow.core import tool from typing import List @tool def match(answer: List[str], ground_truth: List[str]): exact_match = 0 partial_match = 0 if is_match(answer, ground_truth, ignore_case=True, ignore_order=True, allow_partial=False): exact_match = 1 if is_match(answer, ground_truth, ignore_case=True, ignore_order=True, allow_partial=True): partial_match = 1 return {"exact_match": exact_match, "partial_match": partial_match, "answer": answer, "ground_truth": ground_truth} def is_match( answer: List[str], ground_truth: List[str], ignore_case: bool, ignore_order: bool, allow_partial: bool) -> bool: if ignore_case: answer = [a.lower() for a in answer] ground_truth = [g.lower() for g in ground_truth] if ignore_order: answer.sort() ground_truth.sort() if allow_partial: x = [a for a in answer if a in ground_truth] return x == answer return answer == ground_truth