같은 코드 생성 워크플로우를 복제해 한쪽에는 내부 배포한 Qwen3.6-27B를, 다른 쪽에는 Claude Sonnet 4.6을 연결했습니다. 첫 결과는 2,488초와 84초였습니다. 반복 횟수와 출력 상한을 맞추자 2,488초가 약 100초가 됐습니다. 모델은 그대로였습니다. 무엇을 재고 있었는지, 그리고 조건을 맞춘 뒤에 무엇이 남았는지 정리합니다.
30배라는 숫자에는 모델 말고도 여러 개가 들어 있었습니다
6월 24일, 같은 워크플로우에 두 모델을 각각 연결하고 실제 동작을 비교하기 시작했습니다.
첫 결과는 Qwen 2,488초, Sonnet 84초였습니다. 숫자만 보면 한쪽이 30배쯤 느리다고 적고 넘어가기 쉽습니다.
실행 기록을 열어봤습니다. Qwen 쪽은 긴 출력을 만든 뒤 품질 판정을 거쳐 새 후보를 만드는 과정을 반복하고 있었습니다.
2,488초 안에는 한 번의 모델 응답 속도만 있지 않았습니다. 출력량, 반복 횟수, 판정과 도구 대기 시간이 전부 들어 있었습니다.
2,488초 = 모델 추론 시간
+ 더 긴 출력을 만든 시간
+ 품질 재작성 회차
+ 판정기 호출 대기
+ 도구 대기
이름은 모델 비교였는데, 실제로 비교하고 있던 것은 모델과 하네스 설정을 합친 두 실행이었습니다.
6편에서 설정 탐색기를 만들었다고 실험 조건이 자동으로 공정해지지는 않습니다. 자동 탐색은 다음 설정 후보를 찾는 장치이고, 벤치마크는 비교할 두 실행의 조건을 명시적으로 고정하는 작업입니다. 서로 다른 일입니다.
두 모델에 같은 질문을 보내면 입력은 같아 보입니다. 그 아래에서 달라지는 것이 많습니다. 공급자별 기본 출력 상한이 다를 수 있고, 한쪽만 품질 재시도를 여러 번 거칠 수 있습니다. 도구 결과를 빈 응답으로 받으면 같은 도구를 반복해서 부를 수도 있습니다. 최종 답의 길이가 다르면 생성 시간뿐 아니라 판정 시간도 함께 달라집니다.
상한을 맞추자 2,488초가 100초가 됐습니다
같은 범위에서 다시 보기 위해 반복 상한을 1로, 출력 토큰 상한을 4,096으로 맞췄습니다.
Qwen의 실행 시간이 약 100초로 줄었습니다. 모델은 바꾸지 않았는데 25분의 1이 됐습니다.
이 결과가 두 모델의 속도가 같다는 뜻은 아닙니다. 처음의 30배를 모델 추론 속도라고 부를 수 없다는 뜻입니다. 품질 재시도를 허용한 실행과 한 번만 생성한 실행은 애초에 서로 다른 실험이었습니다.
4,096토큰이 정답인 것도 아닙니다. 긴 답이 필요한 과제라면 부족할 수 있습니다. 그래서 특정 상한을 옳은 값으로 고르는 대신, 두 모델에 같은 상한을 적용하고 실제로 상한에 닿았는지를 기록에 남겼습니다.
이 대목이 모델 도입을 검토하는 조직에서 가장 자주 어긋나는 자리입니다. 후보 모델을 각자의 기본 설정으로 돌려보고 시간을 비교하면, 그 표는 모델이 아니라 기본 설정을 비교한 표입니다. 기본값은 공급자마다 다르고, 대체로 그 차이가 모델 차이보다 큽니다.
짧게 끝난 실행이 잘한 것인지 덜 한 것인지 구분되지 않았습니다
상한을 맞추고 나서도 총시간 하나로 비교하려니 다시 막혔습니다.
어떤 실행은 빨리 끝났는데, 그것이 효율적이어서인지 상한에 걸려 중간에 멈춰서인지 숫자만 봐서는 알 수 없었습니다.
그래서 총시간을 나눴습니다. 모델 호출, 품질 재시도, 도구 호출이 각각 몇 번 일어났는지와 입력·출력 토큰을 함께 봤습니다. 종료 이유가 정상 완료인지 반복 상한인지 출력 상한인지도 갈랐습니다.
5편에서 호출 횟수를 세 종류로 나눠둔 것이 여기서 쓰였습니다. 나눠두지 않았다면 이 비교는 총시간 표에서 멈췄을 것입니다.
빠르다는 관측은 그 자체로는 좋은 소식도 나쁜 소식도 아닙니다. 왜 끝났는지를 같이 봐야 방향이 정해집니다.
조건을 맞춘 뒤에 남은 차이는 30배가 아니라 두 배였습니다
통제된 설정으로 도구를 쓰지 않는 여섯 개의 실무 분석·전략 과제를 다시 실행했습니다. 원격근무, B2B SaaS 진입 전략, 데이터 프로젝트 실패, 앱 마케팅, 스마트팩토리 로드맵, 이탈 개선처럼 코드 생성과는 성격이 다른 과제였습니다.
두 경로의 판정 모델은 Claude Sonnet 4.6으로 고정했습니다.
판정 점수 두 모델 모두 0.92~1.00 과제별 차이 0.01~0.05
실행 시간 Qwen 73~92초 Sonnet 38~52초
이 과제 묶음에서 품질 점수 차이는 크지 않았습니다. 실행 시간 차이는 반복해서 나타났고, 같은 설정과 여섯 과제 안에서 Qwen이 대체로 두 배가량 오래 걸렸습니다.
30배에서 두 배로 줄어든 것이 아닙니다. 30배는 애초에 다른 것을 재고 있던 숫자였고, 두 배는 조건을 맞춘 뒤 처음 잰 숫자입니다.
평균 하나로 결론 내지도 않았습니다. 특정 과제에서만 도구 루프가 길어질 수 있고, 공급자 부하와 네트워크 상태도 달라집니다. 과제별 분포와 최댓값, 반복 실행의 중앙값과 편차를 함께 봐야 느린 몇 건이 평균을 끌어올렸는지 지속적인 차이인지 알 수 있습니다.
모델이 헤매는 것처럼 보였는데 도구 결과 계약 문제였습니다
앞의 여섯 과제에 도구를 연결하지 않은 이유가 있습니다. 도구 조건을 한 실험에 섞으면 호출 선택과 외부 응답 시간이 모델 생성 시간에 더해집니다.
도구를 쓰는 비교는 따로 나눴습니다. 여기서 확인해야 했던 것은 두 모델에 같은 도구 계약이 전달되는지였습니다.
그 과정에서 이런 경우를 봤습니다. 도구가 예외 없이 끝났는데 빈 문자열을 반환했고, 하네스가 그것을 성공으로 기록했습니다. 모델은 필요한 정보를 못 얻은 채 같은 도구를 다시 불렀습니다.
로그에는 모델이 같은 호출을 반복하는 것으로 남습니다. 모델이 헤매는 것처럼 보이지만 원인은 도구 결과 계약에 있었습니다.
이런 실행이 벤치마크에 섞이면 모델의 판단력 차이로 기록됩니다. 그래서 비교용 도구는 결과를 나눴습니다.
성공 (사용할 결과 있음) ↔ 정상 응답이지만 결과 없음
일시 오류 (다시 시도 가능) ↔ 영구 오류 (입력을 고쳐야 함)
모델에 전달하는 관측과 하네스가 기록하는 상태가 같은 의미를 가져야, 모델마다 다른 오류 대응 방식이 벤치마크에 섞이지 않습니다.
도구 공개 방식도 맞췄습니다. 한쪽만 전체 도구 스키마를 처음부터 보고 다른 쪽은 검색을 거쳐야 한다면 모델 호출 조건이 이미 다릅니다. 연결 도구와 공개 방식, 검색 결과를 고정하고 실제 호출까지 같은 경로로 이어지는지 확인했습니다.
모델을 평가하는 자리에서 나온 이상 행동은 먼저 도구와 계약 쪽을 의심해볼 만합니다. 모델은 자기가 받은 관측에 대해 합리적으로 행동하는 경우가 많고, 그 관측을 만든 것은 저희 코드입니다.
말할 수 있는 범위를 문장으로 적어두고 끝냈습니다
이 실험으로 확인한 것을 그대로 적으면 이렇습니다.
고정한 하네스 설정과 도구를 쓰지 않는 여섯 개의 실무 과제에서, 두 모델의 판정 점수는 비슷했고 실행 시간 차이가 반복해서 관찰됐습니다.
여기서 더 나가지 않았습니다. 판정기가 비교 대상 중 한쪽과 같은 모델 계열이고, 과제 수가 여섯 개입니다. 일반적인 모델 순위로 확장할 근거가 없습니다.
비교 결과를 쓸 때 결론 문장과 함께 그 문장이 성립하는 조건을 같이 적어두면 나중에 그 표가 혼자 돌아다니는 것을 조금은 막을 수 있습니다.
벤치마크는 모델의 시험이 아니라 하네스의 시험이었습니다
실험 전에는 설정 스냅샷을 고정하고, 실행 중에는 단계별 시간과 반복 이유, 토큰과 도구 결과를 기록하고, 실행 후에는 같은 판정기로 평가했습니다.
그 과정에서 나온 것이 모델 차이만은 아니었습니다. 과도한 품질 재시도, 잘못 분류된 도구 결과, 필요 이상으로 큰 출력 상한이 함께 보였습니다.
전부 저희 쪽 문제였습니다.
모델 두 개를 나란히 놓자 하네스가 무엇을 설명하지 못하는지가 먼저 드러났습니다. 느린 이유를 모델 추론, 공급자 대기, 도구 사용, 품질 재작성으로 나눌 수 없으면 모델 차이도 읽히지 않습니다. 벤치마크가 모델 이름 두 개와 시간 표를 만드는 작업이 아니었던 이유입니다.
이 실험을 정리할 무렵 다음 문제가 보였습니다. 한 실행의 설정을 잘 고정하는 것과, 다음 실행에 무엇을 넘길지는 별개입니다. 같은 실패와 같은 교정을 매번 처음부터 반복하지 않으려면 대화 전체가 아니라 재사용할 가치가 있는 작은 상태를 적절한 범위에 남겨야 합니다. 다음 편에서는 실행 안의 작업 메모와 실행 사이의 기억을 나눈 과정을 다룹니다.
이전 편 → 검증셋을 떼어뒀다고 믿었는데 아니었습니다 (6편)

