콘텐츠로 이동

6주차: 인스트럭션 튜닝

Phase 26주차중급강의일: 2026-04-07

왜 6주차에서 인스트럭션 튜닝이 중심인가

섹션 제목: “왜 6주차에서 인스트럭션 튜닝이 중심인가”

5주차에서 컨텍스트를 깨끗하게 유지하는 법을 배웠다 — auto-compaction, fresh context, 상태 파일. 하지만 컨텍스트가 깨끗해도, 에이전트가 같은 실수를 반복하면 소용이 없다.

이번 주의 핵심 질문: 에이전트의 행동을 모델 가중치 변경 없이 교정할 수 있는가?

답은 “인스트럭션 튜닝” — 모델을 바꾸지 않고 환경(instruction file)을 바꿔서 행동을 교정한다. 4주차 Ralph 루프의 AGENTS.md(누적 학습)가 수동적 기록이었다면, 이번 주의 PROMPT.md/CLAUDE.md 튜닝은 능동적 제약 설계다.

7주차(멀티에이전트)로 넘어가면 에이전트마다 다른 PROMPT.md와 퍼미션이 필요하다. 그 전에 단일 에이전트의 행동을 정밀하게 제어하는 기술을 먼저 익힌다.


Ralph 루프에서 에이전트가 반복적인 실수를 하면, 모델 가중치를 재훈련하지 않고 PROMPT.md에 구체적이고 결정론적인 지시를 추가하여 행동을 교정한다.

INSTRUCTION TUNING PROCESS
1. 반복 오류 패턴 식별
2. 오류의 구체적 원인 분석
3. 결정론적 제약 문구 작성
4. PROMPT.md 영구 섹션에 추가
5. 다음 루프에서 효과 검증
# [영구 제약 — 절대 무시하지 말 것]
## ⚠️ 알려진 함정 (Instructional Tuning)
### 1. 존재하지 않는 함수 호출 금지
- `utils.parse_json()`은 이 프로젝트에 없음
- 반드시 `json.loads()`를 직접 사용할 것
- 추가일: 2026-04-02 (루프 #47에서 반복 오류 발생)
### 2. 테스트 없이 커밋 금지
- `git commit` 전 반드시 `pytest tests/ -q` 통과 필수
- CI가 실패하면 자동 rollback됨
### 3. 타입 힌트 필수
- 모든 함수는 Python 타입 힌트 포함
- `def add(a, b):``def add(a: int, b: int) -> int:`
---
# [현재 태스크]
...

Instruction 파일 설계 원칙 — 2,500개 레포에서 배운 교훈

섹션 제목: “Instruction 파일 설계 원칙 — 2,500개 레포에서 배운 교훈”

GitHub Blog의 2,500개 오픈소스 레포 분석(2026)과 ETH Zurich의 AGENTbench 연구가 instruction 파일의 성공 요인과 안티패턴을 실증적으로 밝혀냈다.

성공하는 instruction 파일의 5요소

섹션 제목: “성공하는 instruction 파일의 5요소”
  1. 실행 가능한 명령을 앞에pnpm test --coverage 같은 구체적 명령(플래그 포함)을 파일 상단에 배치
  2. 산문보다 코드 예시 — “타입 안전하게 작성하라”보다 def add(a: int, b: int) -> int: 예시가 효과적
  3. 명확한 경계 — 절대 건드리면 안 되는 파일/디렉토리를 명시
  4. 구체적 스택 버전 — “Python 사용”이 아니라 “Python 3.12, FastAPI 0.115, Pydantic v2”
  5. 6대 영역 커버 — 빌드 명령, 테스트, 프로젝트 구조, 코딩 스타일, git 워크플로우, 금지 사항
Tier의미예시
Always Do매번 반드시 실행”커밋 전 pytest 실행”, “타입 힌트 필수”
Ask First실행 전 확인 요청”DB 스키마 변경 시 사람에게 확인”, “외부 API 키 수정 시 확인”
Never Do절대 금지.env 파일 커밋 금지”, “main 브랜치 직접 푸시 금지”

AGENTIF 벤치마크(Tsinghua, 2025)는 추가적 문제를 지적한다: 기존 instruction-following 연구는 평균 45단어의 짧은 합성 인스트럭션으로 평가하지만, 실전 에이전틱 태스크의 인스트럭션은 수백~수천 단어다. 짧은 벤치마크에서 잘 따르는 모델이 긴 실전 인스트럭션에서도 잘 따른다는 보장이 없다 — 200줄 CLAUDE.md의 효과를 평가할 때 이 점을 기억하라.

CLAUDE.md는 매 세션, 매 턴마다 시스템 프롬프트에 주입된다. 따라서 토큰 예산이 있다:

  • 시스템 프롬프트가 이미 ~50개 instruction을 차지
  • 사용자 instruction budget: ~150-200개 (약 200줄)
  • 이 예산을 초과하면 에이전트가 핵심 지시를 무시하기 시작

Pruning 테스트: 각 줄에 대해 “이걸 빼면 Claude가 실수하나?” 자문하라. 아니면 삭제.

포함해야 할 것: 빌드/테스트 명령, 비표준 코딩 규칙, 아키텍처 결정 사항, 금지 목록 제외해야 할 것: 표준 언어 규칙(린터가 처리), 자주 변하는 정보, 긴 튜토리얼

200줄 제한을 해결하면서 도메인 지식을 활용하는 방법이 Skills다:

저장소로딩 시점용도
CLAUDE.md매 세션 자동프로젝트 공통 규칙 (200줄 이하)
.claude/skills/*.md관련 태스크일 때 on-demand도메인 특화 지식

예: API 컨벤션, 배포 절차, DB 마이그레이션 규칙 등은 매번 로딩할 필요 없다. .claude/skills/ 디렉토리에 분리하면 필요할 때만 로딩되어 토큰을 절약하면서도 전문 지식을 활용할 수 있다.

SkillReducer 연구(arXiv:2603.29919)는 도구 설명을 48% 압축했을 때 오히려 품질이 2.8% 향상되는 “less-is-more” 효과를 발견했다. 정보를 줄이면 에이전트가 핵심에 집중한다.


지표측정 방법
반복 오류율동일 오류 발생 횟수 / 전체 루프 수
평균 루프 횟수태스크 완료까지 필요한 루프 수
컨텍스트 효율불필요한 탐색에 낭비되는 토큰 비율

출력 스타일과 인지 모드 — 제로 설정 인스트럭션 튜닝

섹션 제목: “출력 스타일과 인지 모드 — 제로 설정 인스트럭션 튜닝”

PROMPT.md에 제약을 추가하는 것은 맞춤 간판을 설치하는 것과 같다. 반면 Claude Code의 **출력 스타일(Output Styles)**은 에이전트에 미리 내장된 모드 전환 스위치다. 설정 비용 없이 에이전트의 행동 패턴을 바꿀 수 있다.

핵심 통찰: 출력 스타일은 톤을 바꾸는 것이 아니라 인지 모드를 바꾼다. 같은 태스크를 주더라도 스타일에 따라 에이전트가 문제에 접근하는 방식 자체가 달라진다.

Terminal window
claude --output-style explanatory "이 함수의 에러 핸들링을 개선해줘"

에이전트가 코드를 수정하면서 왜 이렇게 바꾸는지 이유를 설명한다. PR에 reasoning이 이미 포함되므로 리뷰어가 결정만 검증하면 된다.

적합 상황: 팀 온보딩, 주니어 엔지니어의 낯선 코드베이스 작업, 코드 리뷰 시간 단축이 필요할 때

Boris Cherny의 팀은 주니어 엔지니어가 낯선 서비스에서 작업할 때 Explanatory를 기본값으로 설정한다. 결과: PR 리뷰 시간이 단축되었다 — 코드에 reasoning이 이미 붙어 있으므로 리뷰어가 결정을 재구성할 필요가 없다.

출력 스타일이 방향을 바꾼다면, effort level은 깊이를 조절한다.

Level용도비용예시
low단순 조회, 타입 확인최소claude --effort low "이 함수의 반환 타입?"
medium일반적인 코드 수정보통claude --effort medium "테스트 추가"
high아키텍처 설계, 복잡한 디버깅높음claude --effort high "비동기 리팩터링 설계"
max최대 추론 깊이 (Opus 4.6 전용)최대 (10x+)claude --effort max "보안 취약점 분석"

Ralph 루프에서 effort level의 실전 활용: 루프 초반(탐색 단계)에는 low로 빠르게 시도하고, 핵심 구현 단계에서 high로 전환하면 토큰 비용을 최적화할 수 있다.

Custom Output Style — 프로젝트별 인지 모드

섹션 제목: “Custom Output Style — 프로젝트별 인지 모드”

내장 스타일(Explanatory/Learning/Concise)로 부족하면 커스텀 스타일을 만들 수 있다:

Terminal window
# 새 커스텀 스타일 생성
claude /output-style:new

생성된 Markdown 파일의 frontmatter에서 keep-coding-instructions: true/false로 기존 코딩 지시를 유지할지 완전 교체할지 제어한다. 이것은 PROMPT.md보다 더 깊은 레벨의 인스트럭션 튜닝 — 시스템 프롬프트의 코딩 관련 부분 자체를 교체한다.

PROMPT.md 튜닝 vs 출력 스타일 — 언제 무엇을 쓰는가

섹션 제목: “PROMPT.md 튜닝 vs 출력 스타일 — 언제 무엇을 쓰는가”
항목PROMPT.md 인스트럭션 튜닝출력 스타일 + Effort Level
설정 비용높음 — 오류 분석 → 문구 작성 → 효과 검증제로 — CLI 플래그 하나
커스터마이징무한 — 프로젝트 고유 제약 자유 기술제한적 — 프리셋 목록에서 선택
지속성영구 — 파일에 기록, git 추적세션 단위 — 매번 지정 필요
Sign 메타포현장에서 직접 세운 맞춤 간판공장에서 미리 설치된 모드 전환 스위치
적합 상황프로젝트 고유의 반복 오류 교정범용적 행동 패턴 변경

Hooks — CLAUDE.md의 한계를 넘는 결정론적 시행

섹션 제목: “Hooks — CLAUDE.md의 한계를 넘는 결정론적 시행”

CLAUDE.md는 advisory — 약 80% 확률로 따른다. 100% 시행이 필요하면 Hook을 사용한다.

Hook은 도구 호출, 세션 이벤트 등에 셸 명령/HTTP/LLM 판단을 트리거하는 자동화 메커니즘이다. ~/.claude/settings.json 또는 프로젝트 .claude/settings.json에 정의한다.

타입동작용도
command셸 명령 실행auto-format, 린트 체크, 로그 기록
httpHTTP endpoint POST외부 서비스 알림, CI 트리거
promptLLM(Haiku)에 판단 위임”태스크 완료 여부” 자동 판단
agentSubagent가 파일 읽기/명령 실행”테스트 통과 여부” 복합 검증

실전 예시: PostToolUse로 자동 포맷팅

섹션 제목: “실전 예시: PostToolUse로 자동 포맷팅”
{
"hooks": {
"PostToolUse": [{
"matcher": "Write",
"command": "npx prettier --write $CLAUDE_FILE_PATH"
}]
}
}

이 Hook은 Claude가 파일을 쓸 때마다 Prettier를 자동 실행한다. CLAUDE.md에 “Prettier 형식을 따르라”고 쓰는 것보다 100% 확실하다.

Stop Hook으로 Ralph 루프 자동 완료 검증

섹션 제목: “Stop Hook으로 Ralph 루프 자동 완료 검증”
{
"hooks": {
"Stop": [{
"type": "prompt",
"prompt": "모든 태스크가 완료되었는가? fix_plan.md에서 미완료 항목을 확인하라.",
"model": "haiku"
}]
}
}

prompt 타입 Hook은 Haiku 모델에 판단을 위임한다. "ok": false를 반환하면 에이전트가 계속 작업한다. Ralph 루프의 수동 검증을 자동화하는 핵심 패턴이다.


Instruction 파일은 모든 AI 코딩 도구의 공통 패턴이지만, 구현은 도구마다 다르다:

도구파일계층특이점
Claude CodeCLAUDE.md5레벨 + Skills@import, advisory(~80%), Hook으로 보완
Cursor.cursor/rules/디렉토리 기반.cursorrules에서 이전, glob 패턴 매칭
Windsurf.windsurf/rules/디렉토리 기반Cascade 엔진이 자동 맥락 탐지
Codex CLIAGENTS.md도구 중립60,000+ 레포 채택, 25+ 에이전트 호환
GitHub Copilot.github/copilot-instructions.md단일 + 경로별조직 수준 GA (2026-04), excludeAgent 지원
Gemini CLIGEMINI.md계층적 탐색AGENTS.md도 읽음, 1M 컨텍스트
JetBrains Junie.junie/guidelines.md단일 파일IntelliJ 플랫폼 통합

GitHub Copilot은 2026년 4월에 조직 수준 custom instructions를 GA로 출시했다. 관리자가 .github 레포에 기본 인스트럭션을 설정하면 조직 내 모든 레포에 적용된다. 또한 .github/instructions/*.instructions.md 형식으로 경로별 인스트럭션(YAML frontmatter + glob 패턴)도 지원하여, 파일 유형별로 다른 규칙을 적용할 수 있다.


  1. CLAUDE.md에 “테스트 없이 커밋하지 마라”라고 쓰는 것과 Hook으로 PreToolUse: Bash(git commit*)pytest 실행을 강제하는 것의 차이는? 어느 쪽이 더 효과적이고, 왜?
  2. ETH Zurich 연구에서 LLM이 생성한 instruction 파일이 오히려 해로운 이유를 설명하라. “아키텍처 개요를 넣으면 도움이 될 것 같은데 왜 안 되는가?”
  3. Sign Fatigue는 어떤 시점에서 발생하는가? PROMPT.md가 몇 줄을 넘으면 효과가 역전되기 시작할 것으로 예상하는가? SkillReducer 연구와 연결하여 논하라.
  4. 출력 스타일(Explanatory/Learning/Concise)은 에이전트의 인지 모드를 바꾼다고 했다. “인지 모드를 바꾼다”는 것이 기술적으로 무슨 의미인가? 시스템 프롬프트의 어떤 부분이 변경되는 것인가?
  5. 7주차 멀티에이전트에서 에이전트마다 다른 PROMPT.md를 주어야 한다면, 공통 부분과 역할별 부분을 어떻게 분리 설계할 것인가?
  6. Cursor는 /Generate Cursor Rules로 AI 기반 규칙 자동 생성을 도입했다. ETH Zurich 연구의 “LLM 생성 instruction은 해롭다” 발견과 어떻게 양립할 수 있는가? “AI가 초안을 쓰고 인간이 큐레이션한다”는 접근법의 장단점을 논하라.

  1. 오류 패턴 분석

    이전 랩의 실행 로그를 log_analyzer.py(Lab 06 참조)로 분석하여 반복 오류 상위 5개를 추출한다.

  2. 3-tier Boundary 설계

    추출된 오류를 Always Do / Ask First / Never Do로 분류하고, PROMPT.md에 구조화된 인스트럭션 섹션을 추가한다.

  3. Hook 설정

    Never Do 항목 중 하나를 PreToolUse Hook으로 구현하여 100% 시행을 보장한다. settings.json에 추가.

  4. A/B 테스트

    동일한 태스크를 인스트럭션 추가 전/후로 실행하여 루프 횟수, 토큰 사용량, 반복 오류율을 비교한다. Lab 06의 ab_test.py를 활용.

  5. Lab 06 연결

    위 실험 결과를 바탕으로 Lab 06의 4개 요구사항(분석 보고서, PROMPT.md, 비교 실험, 그래프)을 완성한다.

제출 마감: 2026-04-14 23:59

요구사항:

  1. 반복 오류 분석 보고서 (최소 3가지 패턴, 3-tier 분류 포함)
  2. 고도화된 PROMPT.md (인스트럭션 섹션 + Always Do / Never Do 구조)
  3. 튜닝 전/후 비교 실험 결과 (A/B 테스트)
  4. 인스트럭션 효과 정량 측정 그래프

  1. 인스트럭션 튜닝 = 간판 설치 + 정리: 추가만이 아니라 Sign Fatigue를 방지하기 위한 정리와 우선순위 재조정 포함
  2. LLM으로 instruction 파일을 생성하지 마라: ETH Zurich 연구 — 성공률 3% 감소, 비용 20% 증가. 인간이 “추론만으로 알 수 없는 정보”만 직접 작성
  3. CLAUDE.md 200줄 이하: instruction budget ~150-200개. Pruning 테스트로 불필요한 줄 제거
  4. Skills로 분리: 도메인 지식은 .claude/skills/에 on-demand 로딩. SkillReducer의 less-is-more 효과
  5. Advisory vs Deterministic: CLAUDE.md(~80% 준수) + Hook(100% 시행). 중요도에 따라 레벨 선택
  6. 5레벨 계층: 전역 → 프로젝트 → 로컬 → 부모 디렉토리 → 자식 디렉토리. 가장 가까운 것이 우선
  7. Karpathy Guidelines: 가정 명시 → 단순함 우선 → 외과적 변경 → 목표 중심 실행. PROMPT.md 인스트럭션의 실전 카탈로그 → 참고자료
  8. AGENTS.md는 AAIF 표준 — 146+ 기업이 참여하는 Linux Foundation 산하 표준. 60,000+ 레포 채택. Claude Code는 아직 미지원이므로 CLAUDE.md와 이원화 필요.
  9. 3중 방어(defense-in-depth) — Advisory(CLAUDE.md, ~80%) + Deterministic(Hook, 100%) + Sandboxing. Denylist 우회 사례(2026-03)가 다층 방어의 필요성을 실증.