Medium
클로드 스킬을 안정적으로 불러오는 방법
Claude Code 스킬의 자동 활성화 성공률을 UserPromptSubmit 훅으로 20%에서 84%까지 끌어올린 실측 실험 기록.
핵심 요약
Claude Code 스킬은 description 기반 자율 활성화가 기본이지만 실제 성공률은 20% 수준에 그친다. 저자는 forced-eval(강제 평가), llm-eval(API 사전 평가), simple(단순 지시), none(훅 없음) 4가지 UserPromptSubmit 훅을 SQLite 기반 테스트 프레임워크로 200회 이상 측정했다. 강제 평가 훅이 각 스킬에 YES/NO + 이유 를 먼저 출력시키고 Skill() 호출을 의무화해 84% 로 가장 일관됐고, LLM 평가 훅은 80%에 비용 10% 절감·속도 17% 향상이지만 특정 프롬프트에서 0/10으로 처참하게 실패했다. 핵심 원리는 "평가 → 활성화 → 구현" 이라는 약속 이행 메커니즘(commitment mechanism) 으로 모델이 평가 단계를 스킵하지 못하게 만드는 데 있다.
스킬 활성화는 선언된 규칙이 아니라 측정 가능한 확률 분포다. description 만 잘 쓰면 알아서 호출될 거라는 가정을 버리고, UserPromptSubmit 훅으로 "평가 → 활성화 → 구현" 3단계를 강제하는 파이프라인으로 읽어라.
실무 AI 에이전트에서 스킬/툴 호출이 50% 확률로 누락되면 그냥 쓸 수 없다. 이 글은:
- 단순 지시문 훅의 한계를 200회 이상 벤치마크로 정량 증명
- 성공률 20% → 84% 로 끌어올리는 구체 스크립트 공개
- 훅 방식별 비용/지연시간/변동성 트레이드오프까지 측정
면접에서 "LLM의 비결정성을 어떻게 다뤘나"를 수치와 메커니즘으로 답할 수 있게 해준다.
학습 포인트
면접 답변으로 연결할 학습 포인트입니다.
강제 평가 훅
UserPromptSubmit 훅으로 Claude 에게 응답 전 3단계를 강제한다:
- EVALUATE: 각 스킬에 대해
[skill-name] - YES/NO - [이유]출력 - ACTIVATE: YES 인 스킬은 즉시
Skill(name)도구 호출 - IMPLEMENT: 활성화 완료 후에만 실제 구현
#!/bin/bash
# .claude/hooks/skill-forced-eval-hook.sh
cat <<'EOF'
INSTRUCTION: MANDATORY SKILL ACTIVATION SEQUENCE
Step 1 - EVALUATE: [skill-name] - YES/NO - [reason]
Step 2 - ACTIVATE: Use Skill(name) for EACH relevant skill NOW
Step 3 - IMPLEMENT: Only after Step 2 is complete.
CRITICAL: You MUST call Skill() in Step 2.
EOF
MANDATORY, CRITICAL, WORTHLESS 같은 강한 어조가 모델이 단계를 건너뛰지 못하게 한다.
"프롬프트에 지시만 잘 적으면 모델이 알아서 한다" 고 믿는 것. 단순 지시문 훅은 여러 스킬이 필요한 복합 프롬프트에서 0% 로 무너진다. 실행을 별도 단계로 분리해야 약속 이행이 발생한다.
4가지 훅 비교
Haiku 4.5 기준으로 5개 프롬프트 × 10회 반복 측정 결과를 요약하면:
| 훅 방식 | 성공률 | 비용/프롬프트 | 지연 | 특징 |
|---|---|---|---|---|
| 훅 없음 | 낮음 | 기준 | 기준 | 스킬 거의 무시 |
| 단순 지시문 | ~20% | 낮음 | 빠름 | "동전 던지기" |
| 강제 평가 | 84% | $0.0673 | 5.4s | 가장 일관적 |
| LLM 평가 | 80% | $0.0606 | 5.0s | 처참한 실패 구간 존재 |
LLM 평가는 서버 액션 테스트에서 100%를 찍기도 하지만, 폼/라우트 복합 프롬프트에서 svelte5-runes 를 10회 연속 누락(0/10) 했다.
성공률 평균만 보고 LLM 평가(80%)와 강제 평가(84%)를 "비슷하다" 고 결론 내는 것. 실제로는 최악 구간의 분산이 더 중요하다. LLM 평가는 특정 프롬프트에서 0% 로 떨어져 프로덕션에서는 쓸 수 없다.
약속 이행 메커니즘
왜 강제 평가가 단순 지시문보다 4배 잘 되는가?
- 작업 보여주기: 각 스킬 적합성을 명시적으로 출력 하게 해 평가를 스킵할 수 없게 만든다
- 공개 약속: 응답 안에
YES라고 적은 이상 다음 단계에서Skill()호출을 빼면 자기모순이 된다 - 실행 분리: 평가 출력과
Skill()호출을 서로 다른 단계로 강제해 모델이 "구현으로 바로 점프" 하지 못한다
"스킬을 실제로 활성화하지 않는다면 앞선 평가는 아무런 가치가 없다" — 이 문장이 훅 안에 들어 있다는 점 자체가 설계 포인트.
설정 파일 예시:
{
"hooks": {
"UserPromptSubmit": [
{ "hooks": [
{ "type": "command",
"command": ".claude/hooks/skill-forced-eval-hook.sh" }
] }
]
}
}
훅을 정보 제공용 가이드로만 쓰는 것. 강제력의 핵심은 프로세스 분해와 명시적 출력 요구이지, 단순히 "스킬을 꼭 써라" 라고 부탁하는 어조 강도가 아니다.
읽는 순서
- 1이론
Claude Code의
UserPromptSubmit훅 스펙과Skill()도구 호출 흐름을 공식 문서로 확인하고, "commitment mechanism" 이 왜 LLM 비결정성을 줄이는지 한 줄 요약을 적어보세요. - 2구현
작은 프로젝트에
.claude/hooks/skill-forced-eval-hook.sh와.claude/settings.json을 추가해 직접 훅을 붙여보고, 동일 프롬프트를 10번 실행해Skill()호출 누락 여부를 세어보세요. - 3실무
forced-eval/llm-eval/simple세 가지 훅을 같은 프롬프트 세트로 비교 측정해, 성공률·지연·비용·최악 구간을 표로 정리해 어떤 조건에서 어떤 훅을 고를지 기준을 만드세요. - 4설명
동료에게 "우리 AI 에이전트에서 스킬 호출이 불안정한데 어떻게 안정화할래?" 라는 질문에 5분 이내로 수치(20% → 84%)와 3단계 메커니즘을 들어 설명해보세요.
면접 연결 질문
[감점 답변] "프롬프트를 더 명확히 쓴다", "description 을 잘 적는다" 수준에서 멈추면 감점. [좋은 답변] ① 현재 성공률을 먼저 정량 측정(SQLite + 반복 실행), ② 모델이 스킵할 수 없게 평가·활성화·구현을 별도 단계로 분해, ③ 각 단계의 출력을 강제(각 스킬에 YES/NO 출력 후 Skill() 호출 의무화), ④ 훅 방식별 비용·지연·최악 구간 분산을 함께 측정해 선택. 단순 지시문 20% vs 강제 평가 84% 같은 수치와 트레이드오프까지 언급.
[감점 답변] "성공률이 4%p 높아서" 로 끝내면 얕은 답. [좋은 답변] 평균이 아니라 분산과 최악 케이스를 근거로 들어야 한다. LLM 평가는 80% 평균이지만 폼/라우트 복합 프롬프트에서 0/10 으로 완전히 무너진다. 반면 강제 평가는 84% 이면서 구간별 편차가 작고 외부 API 의존이 없다(키 관리·네트워크 장애 면역). 비용 10% 절감은 프로덕션 신뢰성 대비 미미한 이득.
[감점 답변] "모델이 말을 더 잘 들어서" 같은 애매한 설명. [좋은 답변] 강한 어조 자체보다 약속 이행(commitment) 메커니즘이 본질. 각 스킬에 대해 YES/NO + 이유 를 먼저 출력시키면 모델 자신의 응답이 후속 행동의 제약 조건이 된다. 강한 어조는 평가 단계를 스킵하지 못하게 하는 보조 장치. 트레이드오프는 응답 길이/토큰 비용 증가.
자기 점검
"어조가 약해서" 가 주원인이라고 생각하는 것. 실제는 평가·활성화·구현을 분리하지 않아 모델이 바로 구현 단계로 점프하기 때문.
2단계를 빼도 1단계의 평가가 남으니 괜찮다고 보는 것. 평가만 있고 실행이 없으면 평가 자체가 무가치해지며, 이게 바로 단순 지시문 훅의 실패 원인이다.