pass@k - k번 중 한 번이라도 정답을 생성했는가?
개요
•
pass@k는 k번 시도했을 때 한 번이라도 정답을 생성했는지를 보는 평가 지표입니다.
•
한 번만 맞추면 되는 문제에 적합합니다.
•
예: 코드 생성(Codex 계열 문제), 수학 문제, 마케팅 콘텐츠 생성 등
◦
여러 번 생성해도 되며, 그중 하나만 괜찮으면 성공인 상황에 잘 맞습니다.
왜 마케팅 콘텐츠 에이전트에 pass@k를 적용하나?
•
마케팅 콘텐츠는 여러 후보를 생성한 뒤, 그중 가장 좋은 결과를 선택하는 방식이 유용합니다.
•
고객 요청에 대해 한 번의 답변만 내는 것이 아니라,
◦
여러 개의 에이전트 출력을 병렬 생성하고
◦
이를 **취합(aggregation)**해서
◦
가장 적절한 결과를 최종 답변으로 내놓는 구조를 실험합니다.
•
이때 몇 개의 후보를 병렬로 생성할지(k) 를 바꿔가며 성능을 비교합니다.
에이전트 구성
•
사용 모델: 좋은 오퍼스 4.6 모델
•
흐름:
1.
검색(Search) 수행
2.
검색 결과를 바탕으로 마케팅 문구 제안
•
에이전트 페르소나:
◦
시니어 마케팅 카피라이터
◦
소속: Top Creative Agency
•
프롬프트에 포함한 요구사항:
◦
마케팅 콘텐츠는 고객 요구사항을 충족해야 함
◦
트렌드, 경쟁자, 잠재 고객, 산업 벤치마크 등을 고려할 것
◦
Tavily Search 등을 통해 관련 정보를 참고할 것
pass@k 평가 방식
•
기존 평가 방식처럼 래퍼(wrapper) 를 사용해 실행 결과를 수집합니다.
•
각 시도에 대해 정확도(0/1) 를 측정합니다.
•
pass@k는 여러 번의 생성 결과 중 하나라도 정답이면 성공으로 계산합니다.
•
즉, 점수 계산 시 any를 봅니다.
◦
1 1 1 → 성공
◦
0 1 0 → 성공
◦
1 0 0 → 성공
◦
한 번이라도 1이면 최종적으로 1점
•
반면 모든 시도가 맞아야 하는 지표와는 다릅니다.
◦
예: 1 1 1 1 1 0은 pass@k 관점에서 다르게 해석됨
◦
핵심은 “한 번이라도 맞았는가” 입니다.
데이터셋 준비
•
이번 실습에서는 CSV 대신 Claude Code를 활용해 데이터셋을 준비했습니다.
•
구성 요소:
◦
질문: 고객의 요청사항
◦
정답 기준: 합격 기준
•
총 10개 예제를 준비했습니다.
•
데이터셋 생성 방식:
◦
기존 데이터셋이 있으면 사용
◦
없으면 새로 생성
•
생성 시:
◦
데이터셋 이름
◦
설명
을 설정합니다.
•
예제 리스트를 반복문으로 돌며 create example로 추가합니다.
•
CSV를 사용하는 경우에도 pandas 등으로 읽어 같은 방식으로 추가할 수 있습니다.
실험 결과: pass@3 vs pass@5
•
실험 조건:
◦
num repetition = 3 → pass@3
◦
num repetition = 5 → pass@5
•
평가 결과:
◦
pass@3 = 0.8
◦
pass@5 = 0.9
•
해석:
◦
5개 후보를 생성하는 것이 3개보다 더 좋은 성능을 보임
◦
약 10%p 이상의 차이가 있으므로, 이 경우에는 5개 병렬 생성이 더 바람직하다고 결론낼 수 있습니다.
LangGraph로 구현하는 방식
1. Create Agent 방식
•
create agent에 다음 요소를 넣어 간단히 에이전트를 생성:
◦
툴(tools)
◦
LLM
◦
시스템 프롬프트
•
장점: 구현이 간단함
2. State / Node / Edge 방식
•
상태(State), 노드(Node), 엣지(Edge) 를 직접 관리해 구성
•
장점:
◦
원하는 흐름을 세밀하게 제어 가능
◦
특정 에이전트 실행 후 다른 에이전트를 실행하는 등 개발자가 흐름을 직접 설계하기 좋음
Fanout + Aggregation 구조
Fanout
•
Fanout은 여러 워커(worker) 를 생성하는 단계입니다.
•
각 워커는:
◦
상태에 들어 있는 고객 요청(Question) 을 바탕으로
◦
위에서 정의한 Copywriter Agent를 호출합니다.
•
결과는 리스트 형태로 모입니다.
Aggregation
•
Aggregation은 여러 후보 중에서 성공한 것들만 골라 최종 답변을 만드는 단계입니다.
•
SQL의 aggregation처럼, 여러 결과를 모아 하나의 결론을 내리는 방식입니다.
•
여기서는 크리에이티브 디렉터 역할을 부여해:
◦
카피라이터가 아니라
◦
상급자 입장에서 후보를 평가
◦
기준에 맞는 가장 좋은 결과를 선택하도록 합니다.
워크플로우 구조
•
Worker Nodes가 여러 개 생성됩니다.
•
실질적으로는 5개의 워커를 돌린 구조입니다.
•
이는 pass@5가 더 높은 성능을 보였기 때문에 선택한 설정입니다.
•
LangSmith UI에서 보면:
◦
LLM 호출이 총 5번 기록됩니다.
◦
트레이싱에서 5개의 실행을 확인할 수 있습니다.
더 직관적인 구현 방식
•
Fanout으로 묶는 대신,
◦
각 워커를 개별 노드로 만들고
◦
Start에서 각각 연결하는 방식도 가능합니다.
•
장점:
◦
에이전트 도식도가 더 직관적으로 보임
◦
흐름을 한눈에 파악하기 쉬움
핵심 정리
•
pass@k는 “k번 중 한 번이라도 정답을 생성했는가”를 평가하는 지표입니다.
•
여러 후보를 생성한 뒤 하나를 고르는 작업에 특히 적합합니다.
•
이번 예제에서는:
◦
마케팅 콘텐츠 에이전트
◦
병렬 생성(Fanout)
◦
후보 취합(Aggregation)
◦
pass@3 vs pass@5 비교
를 통해 평가했습니다.
•
결과적으로 5개 후보를 생성하는 설정(pass@5) 이 더 좋은 성능을 보여, 더 적절한 구조임을 확인했습니다.