AnswerExactMatchEvaluator

AnswerExactMatchEvaluator

AnswerExactMatchEvaluator는 Haystack 파이프라인이 예측한 답변을 정답(ground truth) 라벨과 비교해 평가해요. 예측 답변이 정답과 문자 단위로 정확히 일치하는지 확인하죠. 이 지표를 exact match라고 부릅니다.

파이프라인에서 가장 흔한 위치: 단독으로, 또는 평가 파이프라인에서 사용. Evaluator의 입력을 생성한 별도의 파이프라인 뒤에 둠 필수 run 변수: ground_truth_answers(정답 문자열 목록), predicted_answers(평가할 예측 답변 문자열 목록) 출력 변수: 다음을 담은 딕셔너리:

  • score: 예측 답변 중 어느 하나라도 정답과 일치한 질문의 비율을 나타내는 0.0~1.0 숫자
  • individual_scores: 0과 1의 목록. 1은 예측 답변이 정답 중 하나와 일치했음을 의미

API reference: Evaluators GitHub link: https://github.com/deepset-ai/haystack/blob/main/haystack/components/evaluators/answer_exact_match.py Package name: haystack-ai

출처: 문서

본문

Overview

AnswerExactMatchEvaluator 컴포넌트로 Haystack 파이프라인(추출형 질의응답 파이프라인 같은)이 예측한 답변을 정답 라벨과 비교해 평가할 수 있어요. AnswerExactMatchEvaluator는 예측 답변이 정답과 정확히 일치하는지 확인하기 때문이죠. RAG 파이프라인처럼 LLM이 생성한 답변을 평가하기에는 적합하지 않아요. 그런 경우 FaithfulnessEvaluator나 SASEvaluator를 사용하세요.

AnswerExactMatchEvaluator를 초기화할 때 필요한 파라미터는 없습니다.

한 번에 하나의 예측 답변만 하나의 정답과 비교된다는 점을 기억하세요. 이 컴포넌트는 같은 질문에 대한 여러 정답이나, 같은 질문에 대해 예측된 여러 답변을 지원하지 않아요.

Usage

On its own

아래는 AnswerExactMatchEvaluator 컴포넌트로 두 답변을 평가해 정답과 비교하는 예시예요.

from haystack.components.evaluators import AnswerExactMatchEvaluator

evaluator = AnswerExactMatchEvaluator()
result = evaluator.run(
    ground_truth_answers=["Berlin", "Paris"],
    predicted_answers=["Berlin", "Lyon"],
)
print(result["individual_scores"])
# [1, 0]
print(result["score"])
# 0.5

In a pipeline

아래는 파이프라인에서 AnswerExactMatchEvaluator와 SASEvaluator를 사용해 두 답변을 평가하고 정답과 비교하는 예시예요. 개별 컴포넌트 대신 파이프라인을 실행하면 두 개 이상의 지표를 계산하기가 더 간단해집니다.

from haystack import Pipeline
from haystack.components.evaluators import AnswerExactMatchEvaluator
from haystack.components.evaluators import SASEvaluator

pipeline = Pipeline()
em_evaluator = AnswerExactMatchEvaluator()
sas_evaluator = SASEvaluator()
pipeline.add_component("em_evaluator", em_evaluator)
pipeline.add_component("sas_evaluator", sas_evaluator)

ground_truth_answers = ["Berlin", "Paris"]
predicted_answers = ["Berlin", "Lyon"]
result = pipeline.run(
    {
        "em_evaluator": {
            "ground_truth_answers": ground_truth_answers,
            "predicted_answers": predicted_answers,
        },
        "sas_evaluator": {
            "ground_truth_answers": ground_truth_answers,
            "predicted_answers": predicted_answers,
        },
    },
)
for evaluator in result:
    print(result[evaluator]["individual_scores"])
# [1, 0]
# [1.0, 0.5174766182899475]
for evaluator in result:
    print(result[evaluator]["score"])
# 0.5
# 0.7587383091449738

더 알아보기 (Learn more)