단 한 푼도 쓰기 전에 60줄의 하네스(Harness)로 코딩 모델 평가하기
요약
비용을 들이지 않고 코딩 모델의 성능을 검증할 수 있는 60줄 규모의 가벼운 Python 평가 하네스 구축 방법을 소개합니다. 고정된 작업 세트와 결정론적 검증을 통해 모델의 성능을 객관적인 합격/불합격 지표로 확인할 수 있습니다.
핵심 포인트
- 채팅 UI를 통한 주관적 평가 대신 결정론적 검증 방식 권장
- OpenAI 호환 엔드포인트를 지원하여 다양한 모델에 적용 가능
- Python 표준 라이브러리만 사용하여 구현이 매우 간편함
- 모델 실행 시 보안을 위해 컨테이너 환경 사용 권장
이번 주 DEV의 모든 이들이 에이전트(agents), 오케스트레이션(orchestration), 그리고 멀티 에이전트 파이프라인(multi-agent pipelines)에 대해 이야기하고 있습니다. 하지만 그 모든 것에 앞서 지루하지만 중요한 질문이 하나 있습니다. 당신이 선택한 모델이 실제로 당신의 작업을 수행할 수 있는가? 우리 대부분은 채팅 UI에 프롬프트(prompt)를 붙여넣고, 출력물을 뚫어지게 쳐다보며 "괜찮아 보이네"라고 말하며 이 질문에 답합니다. 그것은 평가(evaluation)가 아닙니다. 만약 유료 API를 대상으로 반복 작업을 수행한다면, 결정을 내리는 동안 돈이 천천히 새어나가는 것이기도 합니다.
여기 제가 사용하는 더 저렴한 패턴이 있습니다. 결정론적 검증(deterministic checks)이 포함된 아주 작고 고정된 작업 세트를 만들어, 어떤 OpenAI 호환 엔드포인트(endpoint)에 대해서도 실행하는 것입니다. 설정하는 데 오후 한나절이면 충분하고, 무료 티어(free tier)를 대상으로 실행하면 비용이 전혀 들지 않으며, 느낌(vibe) 대신 합격/불합격(pass/fail) 표를 제공합니다.
아이디어
프롬프트 회귀 하네스(prompt regression harness)는 세 부분으로 구성됩니다:
- 고정된 작업(Fixed tasks) — 당신이 실제로 모델에게 요청하는 내용을 나타내는 몇 가지 작은 코딩 프롬프트.
- 결정론적 검증(Deterministic verification) — 생성된 각 답변을 추출하여 실제
assert문을 통해 실행합니다. 사람이 눈을 가늘게 뜨고 확인할 필요가 없습니다. - 반복 가능성(Repeatability) —
temperature: 0설정으로 각 작업을 N번 실행하고 통과율(pass rate)을 보고합니다. 운 좋게 한 번 잘 나온 생성 결과가 점수에 포함되어서는 안 됩니다.
이 하네스는 OpenAI chat-completions 형식을 따르기 때문에, 유료 API, llama.cpp 또는 vLLM과 같은 로컬 서버, 또는 호스팅된 무료 티어 등 거의 무엇이든 대상으로 지정할 수 있습니다.
하네스
표준 라이브러리(Stdlib)만 사용하는 Python입니다. model_harness.py로 저장하세요:
#!/usr/bin/env python3
"""작은 고정 작업 세트에 대해 코딩 모델을 평가합니다.
...
```
(?:python)?\s*\n(.*?)
```", text, re.S)
return blocks[0] if blocks else text
def run_once(task):
...
로컬 서버를 대상으로 실행한 다음, 호스팅된 엔드포인트를 대상으로 실행하여 표를 비교해 보세요. 작업들은 의도적으로 사소하게 구성되었습니다. 이것은 시작점이지 벤치마크(benchmark)가 아닙니다. 지난 한 달 동안 실제로 사용했던 프롬프트로 이것들을 교체하면 점수가 의미를 갖기 시작할 것입니다.
안전 주의 사항 (Safety note): 이 코드는 모델이 생성한 코드를 실행합니다. 단순한 연습용 작업(toy tasks)을 넘어선 경우에는 네트워크와 자격 증명(credentials)이 없는 컨테이너(container)나 일회용 VM 내부에서 서브프로세스(subprocess)를 실행하십시오.
무료 티어(Free tier)의 활용처
고지 사항: 이 기사는 MonkeyCode의 제품 홍보의 일환으로 작성되었습니다.
이 워크플로우를 위한 한 가지 실용적인 엔드포인트(endpoint) 옵션은 현재 무료 모델 액세스와 무료 서버 옵션을 제공하는 MonkeyCode입니다. 이러한 조합은 바로 위에서 설명한 단계에 진정으로 유용합니다. 즉, 프롬프트와 작업 정의를 반복(iterating)하면서 수많은 호출(calls)을 발생시키지만, 아직 어떤 모델에 비용을 지불할 가치가 있는지 결정하지 못한 단계 말입니다. 하네스(harness)를 비용이 들지 않는 엔드포인트로 지정한다는 것은 실험 예산이 달러가 아닌 시간이 된다는 것을 의미합니다. 해당 문서에 따라 LLM_BASE_URL, LLM_API_KEY, LLM_MODEL을 설정하면 위의 스크립트가 변경 없이 작동합니다.
두 가지 솔직한 주의 사항이 있습니다: 무료 티어는 할당량(quotas), 모델 라인업 또는 가용성을 변경할 수 있으므로, 여기에 적힌 내용보다는 현재 약관을 진실의 근거(source of truth)로 간주하십시오. 그리고 데이터 정책을 확인하지 않은 채, 무료든 유료든 제3자 엔드포인트를 통해 독점적인 코드나 비밀 정보(secrets)를 전송하지 마십시오.
결정 테이블: 단계별 적합한 엔드포인트
| 단계 | 무료 호스팅 티어 (Free hosted tier) | 유료 API (Paid API) | 자체 호스팅 / 로컬 (Self-hosted / local) |
|---|---|---|---|
| 모델이 작업에 적합한지 탐색하는 단계 | ✅ 가장 적합 — 실험당 한계 비용(marginal cost) 제로 | 반복 횟수가 많을 경우 낭비적임 | 이미 GPU를 보유하고 있다면 좋음 |
| ... |
한계점 (Limitations)
- 적은 샘플은 거짓말을 합니다 (Small samples lie). 3개의 태스크를 3번씩 실행하는 것은 통계적으로 거의 아무런 정보도 주지 못합니다. 초기 점수는 방향성을 나타내는 지표로만 취급하고, 실제로 관찰되는 실패 사례로부터 태스크 세트를 확장해 나가세요.
- 테스트 통과가 곧 좋은 코드를 의미하지는 않습니다 (Passing tests ≠ good code). 모델은 읽기 어렵고 유지보수가 불가능한 출력을 내놓으면서도 단언문(asserts)을 통과할 수 있습니다. 실제로 배포할 코드라면 반드시 인간의 검토(human review)를 추가하세요.
- 데이터 오염(Contamination)은 실재합니다. FizzBuzz와 같은 고전적인 태스크는 거의 확실히 학습 데이터에 포함되어 있으며, 이는 여러분의 새롭고 비공개적인 태스크와 비교했을 때 점수를 부풀리는 결과를 초래합니다.
- 온도(Temperature) 0이 결정론(determinism)을 보장하지는 않습니다. 서비스 제공업체는 실행 및 버전에 따라 다른 출력을 반환할 수 있으며 실제로 그렇게 합니다. 주기적으로 재실행하고 모델 이름 및 날짜와 함께 결과를 기록하세요.
- 무료 티어(Free-tier)의 가용성은 변할 수 있습니다. 내일 당장 사라졌을 때 타격이 클 만한 작업에 무료 엔드포인트(endpoint)를 하드코딩하지 마세요.
이 방법을 건너뛰어야 할 대상
이미 평가 프레임워크(적절한 벤치마크 스위트나 LLM 판정 파이프라인 등)를 갖추고 있다면, 이 방식은 오히려 성능 저하(downgrade)가 될 것입니다. 만약 여러분의 결정 기준이 순수하게 프로덕션 지연 시간(latency)이나 컴플라이언스(compliance)에 관한 것이라면, 장난스러운 통과율(pass rates)은 답을 줄 수 없습니다. 그리고 만약 모델에게 평생 단 한 번의 질문만 던질 계획이라면, 그냥 채팅 UI를 사용하세요.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기