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 Name → Retrieval Tool 순서로 검색
◦
검색 후 답변 생성
개선 효과
•
프롬프트를 수정한 뒤 다시 평가를 실행하자
•
모든 항목이 통과하며 평균 점수가 100점으로 향상되었습니다.
핵심 정리
•
E2E Evaluation은 에이전트의 최종 답변 품질을 직접 검증하는 방식입니다.
•
Golden Dataset과 LLM as a Judge를 조합하면 자동 평가가 가능합니다.
•
LangSmith Evaluate를 활용하면 데이터셋 기반 실험과 점수 확인이 편리합니다.
•
에이전트가 기대대로 동작하지 않으면, 평가 결과와 trace를 보고 프롬프트와 툴 사용 전략을 개선할 수 있습니다.
•
이번 강의의 핵심은 정확한 최종 답변을 만들었는지 평가하고, 그 결과를 기반으로 에이전트를 개선하는 과정입니다.