Search

e2e Evaluation - 정확한 답변을 생성했는가?

Number
10

e2e Evaluation - 정확한 답변을 생성했는가?

강의 개요

이번 강의는 사내 문서 기반 QnA 에이전트정확한 최종 답변(final answer) 을 생성했는지 평가하는 E2E Evaluation 방법을 다룹니다.
평가 방식은 LLM as a Judge를 사용하며, LangSmith에 데이터셋을 업로드하고 Evaluator를 만들어 점수를 산출합니다.
평가 결과를 바탕으로 에이전트의 프롬프트와 동작 방식을 개선하는 흐름까지 실습합니다.

평가 대상: 사내 문서 기반 QnA 에이전트

에이전트 동작 방식

사용자의 질문이 들어오면 먼저 FAQ를 확인합니다.
FAQ에 답이 있으면 바로 답변합니다.
FAQ에 없으면 다른 문서들을 검색(Retrieval) 해서 답변합니다.

평가 목적

에이전트가 최종적으로 정확한 답변을 생성했는지 확인합니다.
단순히 중간 단계가 아니라, 마지막 출력 결과가 정답과 얼마나 일치하는지를 봅니다.

Golden Dataset 준비

샘플드 골든 데이터셋

이전 강의에서 만든 전체 골든 데이터셋 중 일부를 추려 Sampled Golden Dataset을 사용합니다.
각 문서마다 질문을 2개씩 추출했고, FAQ 포함 총 14개 샘플로 평가를 진행합니다.
목적은 모델 성능 비교가 아니라, 평가 방법론 학습에 있습니다.

LangSmith 업로드

1.
LangSmith의 Datasets & Experiments 메뉴로 이동
2.
Dataset 추가 및 업로드
3.
데이터셋 이름, 설명 작성
4.
메타데이터에 source 정보 포함
5.
생성 후 UI에서 질문 / 답변 / 소스를 확인

평가자(Evaluator) 설계

is_final_answer_correct Evaluator

평가자는 is_final_answer_correct라는 이름으로 만듭니다.
방식은 LLM 기반 채점이며, 프롬프트를 통해 정답 여부를 판정합니다.
평가자는 다음 정보를 입력으로 받습니다.
input: 질문
output: 에이전트가 생성한 답변
reference output: 골든 데이터셋의 정답

평가 기준

Factually accurate: 정답(ground truth)과 사실적으로 일치하는가
No contradiction: 정답과 반대되는 내용을 포함하지 않는가
Allow extra content: 정답보다 약간 더 많은 정보가 있어도, 모순이 없으면 허용
위 3가지 조건이 모두 만족되면 정답(1), 아니면 오답(0) 으로 판단

점수 형식

LangSmith UI에서 평균 점수를 내기 위해 true/false 대신 1/0 으로 출력하도록 구성합니다.
평가 결과와 함께 reasoning(판단 근거) 도 남겨 LLM 채점 품질을 높입니다.

RunAgentCompletion 래퍼의 필요성

왜 래퍼가 필요한가?

에이전트는 실행 시 여러 중간 메시지(tool message, AI message 등) 를 거칩니다.
단순히 agent.invoke()를 쓰면 최종 응답이 아닌 중간 단계를 평가할 수 있습니다.
따라서 최종 메시지(final answer) 만 추출하는 래퍼가 필요합니다.

LangSmith 평가 함수 관련 이슈

LangSmith에는 evaluate()와 비동기 버전인 aevaluate()가 있지만,
aevaluate()를 사용하면 코드에서 작성한 evaluator 결과가 UI에 정상 반영되지 않는 문제가 있었습니다.
그래서 이번 실습에서는 evaluate() 를 사용합니다.

래퍼의 역할

입력 질문을 받아 에이전트를 실행하고,
반환된 메시지 목록에서 마지막 메시지의 content 를 최종 답변으로 추출합니다.
이 최종 답변을 Evaluator에 넘겨 평가합니다.

평가 프롬프트 구성

역할 부여

Evaluator에게 teacher / grader 같은 페르소나를 부여합니다.
학생의 답변을 채점하는 형태로 만들어, 더 안정적인 평가를 유도합니다.

프롬프트의 핵심 요소

질문
학생의 답변(시스템 출력)
정답(ground truth / reference output)
평가 기준:
사실 일치 여부
정답과의 모순 여부
정답 범위 내 추가 정보 허용 여부
최종 출력:
correctness = 1 또는 0
판단 이유(reasoning)

평가 실행 절차

1. 데이터셋 불러오기

LangSmith 클라이언트 초기화
업로드한 데이터셋을 이름 또는 ID로 불러옵니다.
데이터셋 구조는 key-value pair 형식입니다.

2. Evaluator 정의

IsFinalAnswerCorrect evaluator를 함수 형태로 작성
내부에서 LLM with structured output 을 사용해 정답 여부를 판단
모델은 예시로 Claude Opus 4.6 를 사용

3. 에이전트 실행 함수 작성

run_agent_to_completion(input) 형태의 래퍼 작성
질문을 HumanMessage로 넣어 에이전트를 실행
반환값에서 마지막 메시지 content 를 추출

4. LangSmith Evaluate 실행

아래와 같은 형태로 실행합니다.
ls_client.evaluate( run_agent_to_completion, data="데이터셋 이름", evaluators=[is_final_answer_correct], max_concurrency=2 )
Python
복사
max_concurrency는 동시에 실행할 개수입니다.
너무 크게 잡으면 토큰/레이트 리밋에 걸릴 수 있어 주의합니다.

평가 결과 확인

초기 결과

처음 평가했을 때 일부 질문에서 0점이 나왔고, 평균 점수는 약 0.79였습니다.
문제가 된 사례들을 트레이스로 확인해 보니,
도구를 사용하지 않고 바로 답변한 경우
즉, 에이전트가 검색 도구를 제대로 호출하지 않은 경우가 있었습니다.

문제 원인 분석

시스템 프롬프트가 너무 약해서 에이전트가 툴을 언제 어떻게 써야 하는지 명확히 알지 못했습니다.
결과적으로 FAQ 확인이나 문서 검색 대신 임의로 답변 생성을 해버린 케이스가 발생했습니다.

에이전트 개선

프롬프트 수정

시스템 프롬프트를 더 구체적으로 작성합니다.
예:
회사 정책 관련 질문에 답하는 AI 어시스턴트라고 명시
FAQ 먼저 확인
FAQ에 있으면 Provide Context 기반으로 답변
FAQ에 없으면 Get Document NameRetrieval Tool 순서로 검색
검색 후 답변 생성

개선 효과

프롬프트를 수정한 뒤 다시 평가를 실행하자
모든 항목이 통과하며 평균 점수가 100점으로 향상되었습니다.

핵심 정리

E2E Evaluation은 에이전트의 최종 답변 품질을 직접 검증하는 방식입니다.
Golden DatasetLLM as a Judge를 조합하면 자동 평가가 가능합니다.
LangSmith Evaluate를 활용하면 데이터셋 기반 실험과 점수 확인이 편리합니다.
에이전트가 기대대로 동작하지 않으면, 평가 결과와 trace를 보고 프롬프트와 툴 사용 전략을 개선할 수 있습니다.
이번 강의의 핵심은 정확한 최종 답변을 만들었는지 평가하고, 그 결과를 기반으로 에이전트를 개선하는 과정입니다.