Phase 0 — 골든 평가셋 + 모델 사다리
byOPUS 플랜(ReferenceSources/.../plans/online-lora-...-byOPUS.md) Phase 0.
이후 모든 변경(무학습 레버·LoRA·DPO)의 회귀 게이트이자, 모델 선택의 측정 도구.
구성
| 파일 | 역할 |
|---|---|
golden.jsonl |
골든셋(현재 40문항). 5 카테고리 |
run_eval.py |
러너 — 카테고리별 채점 + fabrication rate + 회귀 비교 |
models.json |
모델 사다리 정의(4B→8B→14B→35B) |
results/ |
실행 결과 JSON(회귀 baseline) |
카테고리 (무엇을 측정하나)
| 카테고리 | 측정 | 채점 |
|---|---|---|
nl2sql |
자연어→SQL (production SQL_SYSTEM_PROMPT 그대로) |
필수 substring 포함 + 금지패턴(time_bucket, sub_area trap) 미포함 |
tool_call |
의도→도구 라우팅 | 도구명 일치 |
abstain |
헛소리방지 — 근거 없을 때 거부 | 거부표현 有 + 창작 無 → fabrication_rate 산출 |
scaffold |
사고 패턴 — 제어판단 5단계 절차 | 제어변수→현재값→설정치→제약→판단 순서 준수 |
grounding |
컨텍스트 충실 추출 | 정답 토큰 포함 |
abstain/scaffold가 LoRA로 가려는 "헛소리방지·운전자 사고패턴"의 직접 지표.
실행
cd mcp-server/eval
# 1) 오프라인 구조검증 (LLM 불필요)
python run_eval.py --lint
# 2) 단일 모델 (vLLM :8001 떠 있어야 함)
python run_eval.py --model Qwen3-8B --base-url http://localhost:8001/v1
# 3) 모델 사다리 — 한 번에 하나씩 띄우는 환경이면 현재 rung만 --model 로 반복,
# 결과는 results/ 에 모델명으로 쌓임. 여러 rung을 다른 포트로 동시에 띄우면:
python run_eval.py --models models.json
# 4) 회귀 비교 (이전 결과 대비 PASS→FAIL 검출)
python run_eval.py --model Qwen3-8B --baseline results/qwen3-8b_2026XXXX.json
디코딩은 Phase 1 결정성 원칙대로 temperature=0, seed=42 고정(옵션으로 변경 가능).
모델 선택 게이트 (Phase 0.4)
- 같은 골든셋·프롬프트로 사다리를 돌려 합격선 넘는 最小 dense 모델 채택.
- 권장 합격선(초안, 데이터로 조정): overall ≥ 90%, fabrication_rate ≤ 5%, tool_call ≥ 95%, scaffold ≥ 90%. 미달 시 한 단계 큰 rung으로.
- 대형(35B)은 합격 기준선 + 교사/judge 용도로 보존.
키우기
- 40 → 50~100문항으로 확장(특히 abstain·scaffold). 한 줄 = 한 문항(JSONL).
- 채점 프롬프트(TOOL_ROUTING/GROUNDING/SCAFFOLD)는 Phase 2 Verifier·Rule 코퍼스의 초안 — 여기서 다듬어 그대로 승격.