
Snowflake는 자사 코드 저장소에서 코딩 에이전트를 평가하는 벤치마크 SnowPR을 만들었다. 실제로 병합된 풀 리퀘스트(PR) 65건을 과제로 삼고, 각 PR에 포함된 숨은 테스트를 Snowflake의 Bazel 빌드 환경에서 실행해 결과를 판정한다.
공개 벤치마크는 대체로 오픈소스 프로젝트의 작업을 사용한다. Snowflake는 이런 점수가 자사 엔지니어들이 매일 다루는 코드에서 어떤 에이전트가 잘 작동하는지 보여주지 못한다고 설명한다. 회사의 모노레포에는 테스트 코드를 제외하고도 소스 파일 6만3,000개와 코드 1,700만 줄이 있으며, 대부분 Java와 C++로 작성돼 하나의 Bazel 빌드 그래프를 이룬다. SnowPR의 과제 65건 가운데 62건이 이 저장소에서, 나머지 3건은 개발자 도구용 Go 저장소에서 나왔다.
각 과제에서 에이전트는 PR 변경 전의 코드와 구현할 내용에 대한 설명을 받는다. PR에 딸린 숨은 테스트는 에이전트에게 공개되지 않는다. 새로 추가된 테스트가 통과하고 기존 테스트도 계속 통과해야 과제를 해결한 것으로 인정한다. Snowflake는 자체 원격 빌드 팜에서 테스트를 실행하며, 65개 과제의 채점에는 Bazel 타깃 147개와 새 동작을 검증하는 테스트 676개, 회귀 테스트 2,890개가 쓰였다. 채점 대상 테스트가 모두 통과해야 한 번의 시도가 성공이다.
Snowflake는 SnowPR을 외부 에이전트 비교뿐 아니라 자체 코딩 에이전트 Cortex Code의 시험대로도 사용했다. Cortex Code의 두 모드와 Cursor, OpenAI Codex, Anthropic Claude Code를 가능한 한 같은 모델 조건에서 비교했다. REM mode는 에이전트의 파일·셸·검색·SQL 작업을 하나의 REPL 도구 안에서 Python 함수로 제공하는 방식이다. 현재 내부용이며 고객에게는 제공되지 않는다. Code mode는 파일·셸·코드 검색 도구만 제공한다(문서).
각 에이전트는 모든 과제를 세 번씩 시도했다. pass@1은 전체 시도 중 통과한 비율이고, pass@3은 한 번 이상 해결한 과제의 비율이다. Snowflake가 비교한 일곱 에이전트는 opus-5를 네 가지 하네스에서, haiku-5.5를 세 가지 하네스에서 실행한 조합이다.
opus-5를 사용했을 때 네 하네스의 통과율은 84.1~85.1%로 비슷했다. Snowflake는 65개 과제로는 이 정도 차이를 판별하기 어렵다고 설명했다. 비용은 달랐다. 시도당 REM mode는 $6.34, Claude Code는 $6.51, Cursor는 $6.93, Cortex Code의 code mode는 $8.19였다. REM mode는 code mode보다 비용이 23% 낮고 새 토큰 사용량도 14% 적었으며, 한 번 이상 해결한 과제 수는 65개 중 62개로 가장 많았다. 새 토큰은 캐시에서 제공되지 않은 입력과 출력의 합이다.
haiku-5.5에서도 REM mode는 시도당 $0.24에 70.8%의 통과율을 기록했다. Claude Code는 $0.26에 64.1%였다. Codex의 통과율은 74.4%였지만, Snowflake는 65개 과제만으로는 그 차이를 판별하기 어렵고 비용은 거의 9배라고 밝혔다. 모델에 따른 차이는 더 컸다. opus-5를 쓴 에이전트는 모두 haiku-5.5를 쓴 에이전트보다 통과율이 10~21%포인트 높았다.
SnowPR 과제는 공개 벤치마크의 과제보다 규모가 크고 여러 모듈에 걸쳐 있다. Snowflake는 테스트 코드가 아닌 소스만 비교했을 때 모노레포가 SWE-bench 평균 저장소보다 파일 수는 21배, 코드 줄 수는 39배 많다고 밝혔다. 과제의 기준 수정은 평균 4.0개 파일과 262줄을 바꾸며, SWE-bench는 평균 1.7개 파일과 33줄이다. 34개 과제는 두 개 이상의 모듈을 건드린다. 파일은 작업 대상이 되는 코드가 있는 폴더까지 중앙값 기준 아홉 단계 깊이에 있다.
Java와 C++는 하나의 Bazel 그래프에 속한다. C++ 과제는 에이전트가 시작하기 전에 원격 빌드 팜에서 약 2만1,700개의 빌드 작업을 수행하고 메모리 32GB를 필요로 한다. 제어 영역의 테스트 대부분은 코드와 분리된 공용 테스트 트리에 있다. 33개 과제에서는 채점 테스트가 별도 트리에 있고, 30개 과제의 채점은 둘 이상의 Bazel 타깃을 거친다. 39개 과제의 테스트는 Snowflake 메타데이터를 저장하는 FoundationDB를 직접 실행한다.
Snowflake는 벤치마크에 넣을 PR을 고르는 과정에도 여러 검증 단계를 뒀다. 가장 큰 후보 선별 작업에서는 한 달 동안 병합된 변경 1만3,965건을 간단한 규칙으로 4,218건까지 줄였다. 이후 자체 GPU에서 실행한 오픈 웨이트 언어 모델이 추론 난도와 채점 가능성을 평가했다. 모델은 테스트가 실제 동작 대신 대리 지표를 확인하거나, 정확한 문구를 고정하거나, 설명만으로 지정할 수 없는 내용을 요구하는 PR을 걸렀다. AI 에이전트가 상위 후보 384건을 살폈고 84건이 통과했으며, 사람 검토자가 이 후보들로 만든 모든 과제를 확인했다. 언어 모델은 과제를 고르는 필터로만 쓰였고 점수를 계산하지 않았다. 이후 51개 과제에서 모델이 예측한 통과율과 실제 통과율의 상관관계는 Spearman +0.18에 그쳤다.
새 과제는 PR의 주된 변경을 검증하는 테스트 사례를 하나 이상 포함하고, 회귀 테스트도 10개 이상 갖춰야 한다. PR에 테스트가 부족하면 실제 수정 전후로 통과하는 기존 테스트를 추가하거나 해당 PR을 제외했다. 배포 전에는 실제 수정본이 테스트를 통과하고 빈 변경은 실패하는지 확인한다. 자동 검사 11개와 적대적 검토도 거쳤다. 적대적 검토에서는 49개 과제에서 84건의 문제를 찾았고, 그중 8건은 배포를 막을 수준이었다. 과제 설명도 측정 결과에 영향을 줬다. 같은 숨은 테스트와 수정본을 사용했는데도, 한 엔지니어가 작성한 설명에서는 에이전트 10개의 시도 중 83%가 통과했고 다른 설명에서는 57%가 통과했다.
Snowflake는 변경된 코드와 연관된 테스트를 Bazel에 그대로 질의하기 어렵다고 덧붙였다. 실제 과제 하나에서 해당 질의는 제어 영역의 테스트 타깃 2만4,028개 중 2만3,946개를 반환했다. 에이전트가 수정한 작업 트리는 원격 캐시를 놓치기 때문에, 이 테스트를 매 시도마다 모두 실행하면 비용이 커진다. 이에 따라 SnowPR은 PR에 포함된 테스트를 기준으로 채점한다.
과제 특성에 따른 통과율도 비교했다. 일곱 에이전트의 평균으로, Java와 C++를 함께 바꾸는 두 과제의 통과율은 55%였다. Java만 바꾸는 과제는 80%였다. 소스 파일을 세 개 이상 바꾸는 과제는 70%로, 한두 개 파일을 바꾸는 과제의 89%보다 낮았다. FoundationDB를 사용하는 테스트의 통과율은 75%, 사용하지 않는 테스트는 83%였다. 에이전트가 절반 미만의 시도에서 통과한 10개 과제 가운데 8개가 FoundationDB 테스트를 포함했다. 반면 C++만 바꾸는 과제는 76%, Java 과제는 80%로 차이가 크지 않았다. Snowflake는 언어 자체보다 Java와 C++를 넘나드는 작업이 어려운 것으로 해석했다. 사전에 어렵다고 분류한 43개 과제에서도 에이전트는 시도의 74%를 통과했다.
SnowPR과 공개 벤치마크의 구성은 다음과 같다.
| 벤치마크 | 과제 수 | 코드베이스 | 언어 | 통과 판정 |
|---|---|---|---|---|
| SWE-bench (2023) | 2,294 | 12개 프로젝트 | Python | 숨은 테스트 |
| SWE-bench Verified (2024) | 500 | 12개 프로젝트 | Python | 숨은 테스트, 사람 검토 |
| Multi-SWE-bench (2025) | 1,632 | 39개 프로젝트 | 7개 (Java 128, C++ 129) | 숨은 테스트 |
| SWE-PolyBench (2025) | 2,110 | 21개 프로젝트 | 4개 (Java 165) | 숨은 테스트, 올바른 코드를 찾았는지 확인 |
| SWE-bench-Live (2025) | 1,319 | 93개 프로젝트 | 7개 이상 | 숨은 테스트, 과제를 지속적으로 추가 |
| SWE Atlas (2026) | 284 | 11 + 10개 프로젝트 | Go, TypeScript, Python, C | 자동 검사 후 언어 모델이 체크리스트 평가 |
| SnowPR (2026) | 65 | 저장소 2개: Bazel 모노레포 62개 과제, Go 개발자 도구 저장소 3개 과제 | Java, C++, Go | Bazel에서 실행하는 숨은 테스트 |
Snowflake는 현재 SnowPR에 포함되지 않은 엔드투엔드 테스트도 과제로 추가하고 싶다고 밝혔다. Snowfort는 실제 Snowflake를 정확히 복제한 환경에서 테스트를 실행하는 프레임워크로, 테스트를 포함해 배포되는 PR의 약 4분의 1을 다루지만 과제 환경에서 아직 실행할 수 없다. 회사는 과제를 약 200개로 늘리면 7%포인트 차이도 판별할 수 있을 것으로 본다. 또 자체 GPU에서 실행하는 오픈 모델을 REM mode로 평가하고, 테스트만으로는 판정하기 어려운 설계나 설명의 명료성에는 사람 검토 사례를 기준으로 보정한 언어 모델 평가를 더할 계획이다. 리팩터링, 테스트 작성, 코드베이스 질문 답변도 아직 SnowPR이 측정하지 않는 작업이다.
Snowflake는 병합된 PR과 테스트 기록이 있는 팀이라면 자체적으로 SnowPR과 비슷한 벤치마크를 만들 수 있다고 설명한다. 이 벤치마크는 에이전트뿐 아니라 평가 과제 자체도 충분히 검증해야 한다는 점을 보여준다고 덧붙였다.
댓글 (0)
로그인하면 이 기사에 내 생각을 남길 수 있어요