Search

pass@k - k번 중 한 번이라도 정답을 생성했는가?

Number
17

pass@k - k번 중 한 번이라도 정답을 생성했는가?

개요

pass@kk번 시도했을 때 한 번이라도 정답을 생성했는지를 보는 평가 지표입니다.
한 번만 맞추면 되는 문제에 적합합니다.
예: 코드 생성(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 = 3pass@3
num repetition = 5pass@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) 이 더 좋은 성능을 보여, 더 적절한 구조임을 확인했습니다.