FaithfulnessEvaluator

FaithfulnessEvaluator

FaithfulnessEvaluator는 LLM을 사용해 생성된 답변이 제공된 맥락에서 추론될 수 있는지 평가해요. 정답 레이블(ground truth)이 필요 없어요. 이 지표를 충실도(faithfulness)라고 하며, 때로는 근거성(groundedness) 또는 환각(hallucination)이라고도 불러요.

출처: 문서

본문

  • 파이프라인에서의 일반적인 위치: 단독으로, 또는 평가 파이프라인 안에서 사용해요. Evaluator의 입력을 생성한 별도의 파이프라인 뒤에서 사용하는 것이 일반적이에요.
  • 필수 실행 변수: questions(질문 리스트), contexts(질문별 맥락 리스트를 담은 리스트. 맥락은 문서 내용이에요), predicted_answers(예측 답변 리스트. 예: RAG 파이프라인의 Generator 출력)
  • 출력 변수: 딕셔너리 — score(모든 질문에 대한 평균 충실도 점수, 0.01.0), individual_scores(질문·맥락 목록·예측 답변의 입력 삼중항 각각에 대한 0.01.0 사이의 개별 충실도 점수 리스트), results(statements, statement_scores, score, status 키를 가진 딕셔너리 리스트. 각 예측 답변에서 LLM이 추출한 문장, 문장별 충실도 점수(0 또는 1), 해당 답변의 평균 점수, 그리고 유효한 결과이면 evaluated, 실패한 평가이면 error가 담겨요)

FaithfulnessEvaluator 컴포넌트를 사용하면 정답 레이블 없이도 RAG 파이프라인 같은 Haystack 파이프라인이 검색한 문서를 평가할 수 있어요. 이 컴포넌트는 생성된 답변을 문장으로 나누고, 각 문장을 LLM으로 제공된 맥락과 대조해 확인해요. 충실도 점수가 높을수록 좋으며, 생성된 답변의 더 많은 문장이 맥락에서 추론될 수 있다는 뜻이에요. 충실도 점수는 RAG 파이프라인의 Generator가 얼마나 자주, 언제 환각을 일으키는지 더 잘 이해하는 데 사용할 수 있어요.

파라미터 (Parameters)

이 Evaluator의 기본 모델은 gpt-5-mini예요. 초기화 시 chat_generator 파라미터로 모델을 덮어쓸 수 있어요. 이 값은 JSON 객체를 반환하도록 설정된 Chat Generator 인스턴스여야 해요. 예를 들어 OpenAIChatGenerator를 사용할 때는 generation_kwargs에 {"response_format": {"type": "json_object"}}를 전달해야 해요.

OpenAI가 아닌 자체 Chat Generator로 Evaluator를 초기화하지 않는다면, 유효한 OpenAI API 키를 OPENAI_API_KEY 환경 변수로 설정해야 해요. 자세한 내용은 비밀 관리 시크릿 매니지먼트 문서 페이지를 참고하세요.

두 가지 다른 선택적 초기화 파라미터는 다음과 같아요.

  • raise_on_failure: True면 API 호출 실패 시 예외를 발생시켜요.
  • progress_bar: 평가 중 진행 표시줄을 보여줄지 여부예요.

FaithfulnessEvaluator에는 선택적 examples 파라미터가 있어요. FaithfulnessEvaluator의 예상 입력·출력 형식에 맞는 few-shot 예시를 전달하는 데 사용해요. 이 예시들은 LLM에 보내는 프롬프트에 포함돼요. 따라서 예시가 많아지면 프롬프트의 토큰 수가 늘어나 각 요청의 비용이 올라가요. 더 많은 토큰을 희생하더라도 평가 품질을 높이고 싶다면 예시를 추가하는 것이 도움이 돼요.

각 예시는 inputs와 outputs 키를 가진 딕셔너리여야 해요. inputs는 questions, contexts, predicted_answers 키를 가진 딕셔너리여야 해요. outputs는 statements와 statement_scores를 가진 딕셔너리여야 해요. 예상 형식은 다음과 같아요.

[
    {
        "inputs": {
            "questions": "What is the capital of Italy?",
            "contexts": ["Rome is the capital of Italy."],
            "predicted_answers": "Rome is the capital of Italy with more than 4 million inhabitants.",
        },
        "outputs": {
            "statements": [
                "Rome is the capital of Italy.",
                "Rome has more than 4 million inhabitants.",
            ],
            "statement_scores": [1, 0],
        },
    },
]

사용법 (Usage)

단독 사용 (On its own)

제공된 질문과 맥락을 바탕으로 생성된 예측 답변을 FaithfulnessEvaluator 컴포넌트로 평가하는 예시예요. FaithfulnessEvaluator는 답변에서 두 문장을 감지했는데 그중 하나만 맞아서 0.5점을 반환해요.

from haystack.components.evaluators import FaithfulnessEvaluator

questions = ["Who created the Python language?"]
contexts = [
    [
        "Python, created by Guido van Rossum in the late 1980s, is a high-level general-purpose programming language. Its design philosophy emphasizes code readability, and its language constructs aim to help programmers write clear, logical code for both small and large-scale software projects.",
    ],
]
predicted_answers = [
    "Python is a high-level general-purpose programming language that was created by George Lucas.",
]
evaluator = FaithfulnessEvaluator()
result = evaluator.run(
    questions=questions,
    contexts=contexts,
    predicted_answers=predicted_answers,
)

print(result["individual_scores"])
# [0.5]
print(result["score"])
# 0.5
print(result["results"])
# [{'statements': ['Python is a high-level general-purpose programming language.',
# 'Python was created by George Lucas.'], 'statement_scores': [1, 0], 'status': 'evaluated', 'score': 0.5}]

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

FaithfulnessEvaluator와 ContextRelevanceEvaluator를 파이프라인에서 사용해, RAG 파이프라인이 제공된 질문에 대해 받은 예측 답변과 맥락(문서 내용)을 평가하는 예시예요. 개별 컴포넌트를 각각 실행하는 대신 파이프라인을 실행하면 한 번에 여러 지표를 계산하기 쉬워져요.

from haystack import Pipeline
from haystack.components.evaluators import (
    ContextRelevanceEvaluator,
    FaithfulnessEvaluator,
)

pipeline = Pipeline()
context_relevance_evaluator = ContextRelevanceEvaluator()
faithfulness_evaluator = FaithfulnessEvaluator()
pipeline.add_component("context_relevance_evaluator", context_relevance_evaluator)
pipeline.add_component("faithfulness_evaluator", faithfulness_evaluator)

questions = ["Who created the Python language?"]
contexts = [
    [
        "Python, created by Guido van Rossum in the late 1980s, is a high-level general-purpose programming language. Its design philosophy emphasizes code readability, and its language constructs aim to help programmers write clear, logical code for both small and large-scale software projects.",
    ],
]
predicted_answers = [
    "Python is a high-level general-purpose programming language that was created by George Lucas.",
]

result = pipeline.run(
    {
        "context_relevance_evaluator": {"questions": questions, "contexts": contexts},
        "faithfulness_evaluator": {
            "questions": questions,
            "contexts": contexts,
            "predicted_answers": predicted_answers,
        },
    },
)

for evaluator in result:
    print(result[evaluator]["individual_scores"])
# ...
# [0.5]
for evaluator in result:
    print(result[evaluator]["score"])
#
# 0.5

더 알아보기 (Learn more)