DocumentNDCGEvaluator

DocumentNDCGEvaluator

DocumentNDCGEvaluator는 정답 레이블(ground truth)을 기준으로 Haystack 파이프라인이 검색한 문서를 평가해요. 정답 문서가 검색된 문서 목록에서 몇 번째 순위에 나타나는지 확인하죠. 이 지표를 정규화 할인 누적 이득, NDCG(Normalized Discounted Cumulative Gain)라고 불러요.

출처: 문서

본문

  • 파이프라인에서의 일반적인 위치: 단독으로, 또는 평가 파이프라인 안에서 사용해요. Evaluator의 입력을 생성한 별도의 파이프라인 뒤에서 사용하는 것이 일반적이에요.
  • 필수 실행 변수: ground_truth_documents(질문별 정답 문서 목록을 담은 리스트), retrieved_documents(질문별 검색 문서 목록을 담은 리스트)
  • 출력 변수: 딕셔너리 — score(0.01.0 사이의 NDCG 값), individual_scores(검색 문서 목록과 정답 문서 목록의 입력 쌍 각각에 대한 0.01.0 사이의 개별 NDCG 값 리스트)

개요 (Overview)

DocumentNDCGEvaluator 컴포넌트를 사용해 RAG 파이프라인 같은 Haystack 파이프라인이 검색한 문서를 정답 레이블과 비교해 평가할 수 있어요. NDCG가 높을수록 좋으며, 관련 문서가 검색 결과 목록의 앞쪽에 나타난다는 뜻이에요.

정답 문서에 점수(score)가 있다면, NDCG가 높을수록 점수가 높은 문서가 검색 결과 목록의 앞쪽에 온다는 뜻이에요. 정답 문서에 점수가 없다면 이진 관련성(binary relevance)을 가정해요. 즉 모든 정답 문서가 동등하게 관련 있다고 보며, 목록에서의 순서는 NDCG에 영향을 주지 않아요.

DocumentNDCGEvaluator를 초기화하는 데 필요한 파라미터는 없어요.

단독 사용 (On its own)

쿼리에 대해 검색된 문서를 평가하는 예시예요. 정답 문서는 2개, 검색된 문서는 3개예요. 모든 정답 문서가 검색되었지만, 관련 없는 문서 하나가 정답 문서 중 하나보다 높은 순위에 있어 NDCG 점수가 낮아졌어요.

from haystack import Document
from haystack.components.evaluators import DocumentNDCGEvaluator

evaluator = DocumentNDCGEvaluator()
result = evaluator.run(
    ground_truth_documents=[
        [Document(content="France", score=1.0), Document(content="Paris", score=0.5)],
    ],
    retrieved_documents=[
        [
            Document(content="France"),
            Document(content="Germany"),
            Document(content="Paris"),
        ],
    ],
)
print(result["individual_scores"])
# [0.9502344167898356]
print(result["score"])
# 0.9502344167898356

파이프라인에서 사용 (In a pipeline)

DocumentNDCGEvaluator와 DocumentMRREvaluator를 파이프라인에서 함께 사용해 검색된 문서를 평가하고 정답 문서와 비교하는 예시예요. 개별 컴포넌트를 각각 실행하는 대신 파이프라인을 실행하면 한 번에 여러 지표를 계산하기 쉬워져요.

from haystack import Document, Pipeline
from haystack.components.evaluators import DocumentMRREvaluator, DocumentNDCGEvaluator

pipeline = Pipeline()
pipeline.add_component("ndcg_evaluator", DocumentNDCGEvaluator())
pipeline.add_component("mrr_evaluator", DocumentMRREvaluator())

ground_truth_documents = [
    [Document(content="France", score=1.0), Document(content="Paris", score=0.5)],
]
retrieved_documents = [
    [
        Document(content="France"),
        Document(content="Germany"),
        Document(content="Paris"),
    ],
]

result = pipeline.run(
    {
        "ndcg_evaluator": {
            "ground_truth_documents": ground_truth_documents,
            "retrieved_documents": retrieved_documents,
        },
        "mrr_evaluator": {
            "ground_truth_documents": ground_truth_documents,
            "retrieved_documents": retrieved_documents,
        },
    },
)

for evaluator in result:
    print(result[evaluator]["score"])
# 1.0
# 0.9502344167898356

더 알아보기 (Learn more)