CLAUDE.md: 프롬프트 러닝으로 Claude Code를 최적화하며 배운 모범 사례

이번 글은 Arize AI의 AI 엔지니어인 Priyan Jindal이 작성한 프롬프트 러닝을 활용해 Claude Code를 최적화하고 성능을 11% 향상시킨 내용을 소개합니다.

Priyan은 시스템 프롬프트를 통해 강력한 코딩 에이전트인 Cline을 최적화한 경험을 소개한 바 있는데 이를 더 많은 사람들이 범용적으로 사용하고 있는 Claude Code에 이를 적용해 보았고, 놀라운 결과를 공유 했습니다.

Claude Code는 세계 최고의 코딩 에이전트 중 하나로 평가받습니다. 이는 현재 최첨단 코딩 모델로 꼽히는 Claude Sonnet 3.7(원문은 4-5로 표기되었으나 최신 문맥 반영)을 사용합니다. 실제로 코드 생성 능력을 평가하는 인기 벤치마크인 SWE bench의 리더보드를 지배하고 있는 것을 볼 수 있습니다.

이러한 코딩 에이전트의 성능을 최대한 끌어내려는 개발자로서 사용할 수 있는 워크플로 중 하나는 Claude Code의 시스템 프롬프트를 편집하는 것입니다. CLI를 사용하는 경우, Claude Code CLI--append-system-prompt 태그를 통해 이 기능에 접근할 수 있습니다.

또한 CLAUDE.md 파일을 통해 사용자 정의 규칙을 지정할 수도 있습니다. Claude Code에 대한 모범 사례 가이드에서는 다음과 같이 설명합니다:

"CLAUDE.md는 Claude가 대화를 시작할 때 자동으로 컨텍스트로 가져오는 특수 파일입니다. 따라서 다음 내용을 문서화하기에 이상적인 장소입니다:
- 자주 사용하는 bash 명령어
- 핵심 파일 및 유틸리티 함수
- 코드 스타일 가이드라인
- 테스트 지침
- 리포지토리 에티켓 (예: 브랜치 명명법, merge vs rebase 등)
- 개발 환경 설정 (예: pyenv 사용법, 작동하는 컴파일러)
- 프로젝트에 특화된 예상치 못한 동작이나 경고
- 기타 Claude가 기억하기를 바라는 정보"

이를 통해 Claude Code 호출 시 사용자 정의 지침을 추가할 수 있어, 생성되는 코드에 대해 강력한 제어권을 가질 수 있습니다.

이 블로그 포스트에서는 프롬프트 러닝(Prompt Learning)을 사용하여 SWE Bench에서 Claude Code의 결과를 향상시키는 최적의 사용자 정의 지침 세트를 생성한 방법을 보여드립니다. 도구, 아키텍처, LLM 파인 튜닝(Fine-tuning)을 변경하지 않고, 오직 시스템 프롬프트에 최적의 지침을 추가하는 것만으로 Claude Code를 개선한 방법을 소개합니다.

프롬프트 러닝(Prompt Learning) 개요

프롬프트 러닝은 강화 학습(Reinforcement Learning)에서 영감을 받은 프롬프트 최적화 접근 방식입니다. 이는 쿼리 데이터셋에 대한 에이전트의 수행 능력에 기반하여 프롬프트를 통해 에이전트를 최적화하는 것을 목표로 합니다.

강화 학습과 프롬프트 러닝 모두 출력 생성 및 그에 대한 평가를 기반으로 하는 피드백 루프를 사용하지만, 프롬프트 러닝은 모델의 가중치(weights) 대신 에이전트의 시스템 프롬프트를 업데이트하는 데 중점을 둡니다.

PPO, Q-learning, gradient descent 같은 가중치 업데이트 알고리즘 대신, 프롬프트 러닝은 메타 프롬프팅(Meta-prompting)을 사용하여 프롬프트를 개선합니다. 메타 프롬프팅은 LLM에게 '특정 프롬프트가 얼마나 잘 수행되었는지에 대한 데이터'를 바탕으로 프롬프트를 최적화하도록 요청하는 단순한 작업입니다.

프롬프트 러닝이 정말 특별한 이유는 단순히 스칼라(점수) 보상 대신 LLM 평가(LLM Evals)를 메타 프롬프트의 피드백으로 사용한다는 점입니다. 모든 롤아웃(에이전트의 출력 생성)마다, 우리는 LLM에게 출력이 맞거나 틀렸는지, 그리고 어디서 개선이 이루어질 수 있는지 묻습니다. 이를 통해 메타 프롬프트 LLM은 에이전트의 시스템 프롬프트를 최적화하는 방법에 대해 정보에 입각한 가이드된 결정을 내릴 수 있습니다.

(프롬프트 러닝에 대한 더 자세한 설명은 [이 블로그]를 참조하세요. LLM 평가와 메타 프롬프팅에 대해 깊이 다룹니다.)

SWE Bench Lite 정보

SWE Bench Lite는 코딩 모델/에이전트를 평가하는 데 사용되는 인기 있는 벤치마크입니다. 이는 Django, matplotlib 등 인기 있는 오픈 소스 Python 리포지토리의 실제 Github 이슈 300개로 구성됩니다. 코딩 모델/에이전트가 이 Github 이슈들을 해결할 수 있는지 테스트합니다.

우리는 SWE Bench Lite의 데이터를 사용하여 최적화 도구(optimizer)를 훈련하고, 최적화의 각 반복(iteration) 단계에서 Claude Code를 평가했습니다.

Claude Code에 프롬프트 러닝 적용하기

Claude Code를 최적화하기 위해 프롬프트 러닝을 적용한 정확한 방법은 다음과 같습니다.

1단계: 훈련/테스트 데이터 분할 (Train/Test Split)

먼저 SWE Bench Lite를 훈련 세트와 테스트 세트로 나눕니다. 약 절반은 최적화 도구 훈련(및 새 프롬프트 생성)에 사용하고, 나머지 절반은 프롬프트 최적화가 더 나은 솔루션으로 이어지는지 테스트하는 데 사용합니다.

중요: Claude Code의 경우, 두 가지 다른 방식의 훈련/테스트 분할을 사용했습니다.

1. 리포지토리별 분할 (Split by Repo)

6개의 Python 리포지토리에서 나온 모든 이슈를 훈련용으로, 나머지 6개 리포지토리의 모든 이슈를 테스트용으로 선택했습니다. 이 분할은 Claude Code의 일반적인 코딩 능력을 향상시킬 수 있는지 확인하는 데 도움이 됩니다. 훈련용 6개 리포지토리에만 특화된 규칙이 테스트용 리포지토리에는 도움이 되지 않도록 하여 과적합(Overfitting)을 방지합니다.

  • Train Repos:

'django/django',
'pytest-dev/pytest',
'sphinx-doc/sphinx',
'astropy/astropy',
'psf/requests',
'pylint-dev/pylint'
  • Test Repos:

'sympy/sympy',
'matplotlib/matplotlib',
'scikit-learn/scikit learn',
'pydata/xarray',
'mwaskom/seaborn',
'pallets/flask'

2. 리포지토리 내 분할

이 분할에서는 SWE Bench Lite의 모든 Django 이슈(114개)를 선택하여 타임스탬프를 기준으로 훈련 및 테스트 세트로 나눴습니다. 동기는 간단합니다. 개발자가 매일 같은 코드베이스에서 작업한다면, Claude Code가 해당 리포지토리에서 더 잘 작동하기를 원할 것입니다. 과거 이슈와 정답 솔루션으로 시스템 프롬프트를 훈련함으로써, Claude Code에게 해당 코드베이스가 어떻게 진화하는지(패턴, 컨벤션, 흔한 실수 등)에 대한 맥락을 제공하여 동일한 리포지토리의 미래 이슈에 대해 더 강력한 패치를 생성하도록 합니다.

기억해 둘 점: 두 분할은 서로 다른 것을 테스트합니다. 분할 1은 Python 리포지토리를 기준으로 나누어 Claude Code의 일반적인 코딩 능력 향상 여부를 테스트합니다. 분할 2는 더 실용적인 개발자 워크플로를 테스트합니다. 즉, Claude Code 호출을 사용자의 리포지토리에 국한(localize)시키고, 같은 코드베이스의 이전 이슈를 기반으로 해당 코드베이스의 문제를 더 잘 해결하도록 훈련할 수 있는지 확인합니다.

2단계: 훈련 세트에서 Claude Code 실행

두 번째로, 훈련 예제에 대해 Claude Code를 실행하여 훈련 세트의 각 Github 이슈에 대한 솔루션 패치를 생성합니다. 이 패치들은 이슈 내용을 프롬프트로 하여 리포지토리에서 Claude Code를 실행하고, git diff를 실행하여 리포지토리에 변경된 모든 사항을 추출하여 형성됩니다. 우리는 Phoenix experiments를 사용하여 데이터셋에 대해 Claude Code를 쉽게 실행하고 평가(4단계)를 설정했습니다.

3단계: 단위 테스트(Unit Tests) 실행

Claude Code가 생성한 모든 솔루션 패치에 대해, SWE Bench가 제공하는 단위 테스트를 실행하여 솔루션의 통과/실패 여부를 결정합니다. 이를 통해 점수를 생성합니다(통과 1, 실패 0).

4단계: LLM 피드백 생성

최적화를 가속하기 위해, LLM에게 Claude Code의 솔루션을 평가하도록 요청하여 LLM 피드백을 생성합니다.

(참고용: 평가 프롬프트)

단계인 메타 프롬프팅이 더 나은 프롬프트를 생성하도록 안내합니다. 단순히 메타 프롬프트에게 "6개 테스트 통과, 4개 실패"라고 말하는 대신, 다음과 같은 질문에 답하는 강력한 피드백을 생성합니다:

  • 솔루션이 개념적 수준에서 옳았는가/틀렸는가?

  • 테스트가 통과/실패한 이유는 무엇인가? 특정 뉘앙스 때문인가, 아니면 전체 솔루션이 맞거나 틀려서인가?

  • (Claude Code가 틀렸다면) 왜 올바른 접근 방식 대신 이 접근 방식을 취했는가?

요청하신 블로그 게시물의 한국어 번역본입니다. 기술적인 문맥을 살려 자연스럽게 번역했습니다.


CLAUDE.md: 프롬프트 러닝으로 Claude Code를 최적화하며 배운 모범 사례

프롬프트 러닝(우리의 프롬프트 최적화 기능)에 대한 지난 포스팅에서, 우리는 시스템 프롬프트를 통해 강력한 코딩 에이전트인 Cline을 최적화했습니다. 이번에는 여러분 중 더 많은 분에게 익숙할 Claude Code에 이를 적용해 보았고, 놀라운 결과를 확인했습니다.

Claude Code는 세계 최고의 코딩 에이전트 중 하나로 평가받습니다. 이는 현재 최첨단 코딩 모델로 꼽히는 Claude Sonnet 3.7(원문은 4-5로 표기되었으나 최신 문맥 반영)을 사용합니다. 실제로 코드 생성 능력을 평가하는 인기 벤치마크인 SWE bench의 리더보드를 지배하고 있는 것을 볼 수 있습니다.

이러한 코딩 에이전트의 성능을 최대한 끌어내려는 개발자로서 사용할 수 있는 워크플로 중 하나는 Claude Code의 시스템 프롬프트를 편집하는 것입니다. CLI를 사용하는 경우, Claude Code CLI--append-system-prompt 태그를 통해 이 기능에 접근할 수 있습니다.

또한 CLAUDE.md 파일을 통해 사용자 정의 규칙을 지정할 수도 있습니다. Claude Code에 대한 모범 사례 가이드에서는 다음과 같이 설명합니다:

"CLAUDE.md는 Claude가 대화를 시작할 때 자동으로 컨텍스트로 가져오는 특수 파일입니다. 따라서 다음 내용을 문서화하기에 이상적인 장소입니다:

  • 자주 사용하는 bash 명령어

  • 핵심 파일 및 유틸리티 함수

  • 코드 스타일 가이드라인

  • 테스트 지침

  • 리포지토리 에티켓 (예: 브랜치 명명법, merge vs rebase 등)

  • 개발 환경 설정 (예: pyenv 사용법, 작동하는 컴파일러)

  • 프로젝트에 특화된 예상치 못한 동작이나 경고

  • 기타 Claude가 기억하기를 바라는 정보"

이를 통해 Claude Code 호출 시 사용자 정의 지침을 추가할 수 있어, 생성되는 코드에 대해 강력한 제어권을 가질 수 있습니다.

이 블로그 포스트에서는 프롬프트 러닝(Prompt Learning)을 사용하여 SWE Bench에서 Claude Code의 결과를 향상시키는 최적의 사용자 정의 지침 세트를 생성한 방법을 보여드립니다. 도구, 아키텍처, LLM 파인 튜닝(Fine-tuning)을 변경하지 않고, 오직 시스템 프롬프트에 최적의 지침을 추가하는 것만으로 Claude Code를 개선한 방법을 소개합니다.

프롬프트 러닝(Prompt Learning) 개요

프롬프트 러닝은 강화 학습(Reinforcement Learning)에서 영감을 받은 프롬프트 최적화 접근 방식입니다. 이는 쿼리 데이터셋에 대한 에이전트의 수행 능력에 기반하여 프롬프트를 통해 에이전트를 최적화하는 것을 목표로 합니다.

강화 학습과 프롬프트 러닝 모두 출력 생성 및 그에 대한 평가를 기반으로 하는 피드백 루프를 사용하지만, 프롬프트 러닝은 모델의 가중치(weights) 대신 에이전트의 시스템 프롬프트를 업데이트하는 데 중점을 둡니다.

PPO, Q-learning, 경사 하강법(gradient descent) 같은 가중치 업데이트 알고리즘 대신, 프롬프트 러닝은 메타 프롬프팅(Meta-prompting)을 사용하여 프롬프트를 개선합니다. 메타 프롬프팅은 LLM에게 '특정 프롬프트가 얼마나 잘 수행되었는지에 대한 데이터'를 바탕으로 프롬프트를 최적화하도록 요청하는 단순한 작업입니다.

프롬프트 러닝이 정말 특별한 이유는 단순히 스칼라(점수) 보상 대신 LLM 평가(LLM Evals)를 메타 프롬프트의 피드백으로 사용한다는 점입니다. 모든 롤아웃(에이전트의 출력 생성)마다, 우리는 LLM에게 출력이 맞거나 틀렸는지, 그리고 어디서 개선이 이루어질 수 있는지 묻습니다. 이를 통해 메타 프롬프트 LLM은 에이전트의 시스템 프롬프트를 최적화하는 방법에 대해 정보에 입각한 가이드된 결정을 내릴 수 있습니다.

(프롬프트 러닝에 대한 더 자세한 설명은 [이 블로그]를 참조하세요. LLM 평가와 메타 프롬프팅에 대해 깊이 다룹니다.)

SWE Bench Lite 정보 (선택한 벤치마크)

참고로 SWE bench 논문과 SWE Bench 리더보드를 확인해 보세요. SWE Bench Lite는 코딩 모델/에이전트를 평가하는 데 사용되는 인기 있는 벤치마크입니다. 이는 Django, matplotlib 등 인기 있는 오픈 소스 Python 리포지토리의 실제 Github 이슈 300개로 구성됩니다. 코딩 모델/에이전트가 이 Github 이슈들을 해결할 수 있는지 테스트합니다.

우리는 SWE Bench Lite의 데이터를 사용하여 최적화 도구(optimizer)를 훈련하고, 최적화의 각 반복(iteration) 단계에서 Claude Code를 평가했습니다.

Claude Code에 프롬프트 러닝 적용하기

Claude Code를 최적화하기 위해 프롬프트 러닝을 적용한 정확한 방법은 다음과 같습니다.

1단계: 훈련/테스트 데이터 분할 (Train/Test Split)

먼저 SWE Bench Lite를 훈련 세트와 테스트 세트로 나눕니다. 약 절반은 최적화 도구 훈련(및 새 프롬프트 생성)에 사용하고, 나머지 절반은 프롬프트 최적화가 더 나은 솔루션으로 이어지는지 테스트하는 데 사용합니다.

중요: Claude Code의 경우, 두 가지 다른 방식의 훈련/테스트 분할을 사용했습니다.

1. 리포지토리별 분할 (Split by Repo) 6개의 Python 리포지토리에서 나온 모든 이슈를 훈련용으로, 나머지 6개 리포지토리의 모든 이슈를 테스트용으로 선택했습니다. 이 분할은 Claude Code의 일반적인 코딩 능력을 향상시킬 수 있는지 확인하는 데 도움이 됩니다. 훈련용 6개 리포지토리에만 특화된 규칙이 테스트용 리포지토리에는 도움이 되지 않도록 하여 과적합(Overfitting)을 방지합니다.

  • Train Repos: 'django/django','pytest-dev/pytest','sphinx-doc/sphinx','astropy/astropy','psf/requests','pylint-dev/pylint'

  • Test Repos: 'sympy/sympy','matplotlib/matplotlib','scikit-learn/scikit-learn','pydata/xarray','mwaskom/seaborn','pallets/flask'

2. 리포지토리 내 분할 (Split within Repo) 이 분할에서는 SWE Bench Lite의 모든 Django 이슈(114개)를 선택하여 타임스탬프를 기준으로 훈련 및 테스트 세트로 나눴습니다. 동기는 간단합니다. 개발자가 매일 같은 코드베이스에서 작업한다면, Claude Code가 해당 리포지토리에서 더 잘 작동하기를 원할 것입니다. 과거 이슈와 정답 솔루션으로 시스템 프롬프트를 훈련함으로써, Claude Code에게 해당 코드베이스가 어떻게 진화하는지(패턴, 컨벤션, 흔한 실수 등)에 대한 맥락을 제공하여 동일한 리포지토리의 미래 이슈에 대해 더 강력한 패치를 생성하도록 합니다.

기억해 둘 점: 두 분할은 서로 다른 것을 테스트합니다. 분할 1은 Python 리포지토리를 기준으로 나누어 Claude Code의 일반적인 코딩 능력 향상 여부를 테스트합니다. 분할 2는 더 실용적인 개발자 워크플로를 테스트합니다. 즉, Claude Code 호출을 사용자의 리포지토리에 국한(localize)시키고, 같은 코드베이스의 이전 이슈를 기반으로 해당 코드베이스의 문제를 더 잘 해결하도록 훈련할 수 있는지 확인합니다.

2단계: 훈련 세트에서 Claude Code 실행

두 번째로, 훈련 예제에 대해 Claude Code를 실행하여 훈련 세트의 각 Github 이슈에 대한 솔루션 패치를 생성합니다. 이 패치들은 이슈 내용을 프롬프트로 하여 리포지토리에서 Claude Code를 실행하고, git diff를 실행하여 리포지토리에 변경된 모든 사항을 추출하여 형성됩니다. 우리는 Phoenix experiments를 사용하여 데이터셋에 대해 Claude Code를 쉽게 실행하고 평가(4단계)를 설정했습니다.

3단계: 단위 테스트(Unit Tests) 실행

Claude Code가 생성한 모든 솔루션 패치에 대해, SWE Bench가 제공하는 단위 테스트를 실행하여 솔루션의 통과/실패 여부를 결정합니다. 이를 통해 점수를 생성합니다(통과 1, 실패 0).

4단계: LLM 피드백 생성

최적화를 가속하기 위해, LLM에게 Claude Code의 솔루션을 평가하도록 요청하여 LLM 피드백을 생성합니다.

(참고용: 전체 평가자(evaluator) 프롬프트) 이 단계는 최적화를 위한 더 풍부한 피드백을 제공합니다. 이는 다음 단계인 메타 프롬프팅이 더 나은 프롬프트를 생성하도록 안내합니다. 단순히 메타 프롬프트에게 "6개 테스트 통과, 4개 실패"라고 말하는 대신, 다음과 같은 질문에 답하는 강력한 피드백을 생성합니다:

  • 솔루션이 개념적 수준에서 옳았는가/틀렸는가?

  • 테스트가 통과/실패한 이유는 무엇인가? 특정 뉘앙스 때문인가, 아니면 전체 솔루션이 맞거나 틀려서인가?

  • (Claude Code가 틀렸다면) 왜 올바른 접근 방식 대신 이 접근 방식을 취했는가?

5단계: 메타 프롬프팅으로 시스템 프롬프트 최적화

훈련 데이터가 완전히 구축되면, 이제 이것을 메타 프롬프트에 입력하여 최적화된 프롬프트 생성을 요청할 수 있습니다.

여기서 "규칙(rules)"이란 CLAUDE.md--append-system-prompt를 통해 제공하는 모든 것을 의미합니다.

6단계: 새로운 규칙으로 테스트 세트에서 Claude Code 실행

루프의 마지막 단계는 메타 프롬프팅 단계 후 구축된 최적화된 규칙을 사용하여 테스트 데이터에서 Claude Code를 테스트하는 것입니다. 이를 통해 Claude Code가 개선되었는지, 얼마나 개선되었는지 알 수 있습니다.

7단계: 반복

SWE Bench 정확도가 정체되거나 최대치에 도달할 때까지, 또는 API 비용이 특정 임계값에 도달할 때까지 이 루프를 반복합니다.

결과

다음은 두 가지 훈련/테스트 분할에 대한 결과입니다. 리포지토리별(By-Repo) 분할과 리포지토리 내(In-Repo) 분할의 중요한 차이를 놓치셨다면 위 내용을 다시 참조해 주세요.

By-Repo

우리는 Claude Code의 테스트 정확도를 5.19% 높일 수 있었습니다. 리포지토리별 분할 결과는 훈련 세트에 없는 리포지토리의 이슈가 테스트 세트에 포함되어 있으므로, Claude Code의 일반적인 코드 생성 능력(codegen abilities)을 향상시켰음을 나타냅니다.

In-Repo

리포지토리 내 테스트에서는 훨씬 더 큰 폭인 +10.87%의 향상을 보였습니다. 이는 동일한 Python 리포지토리의 이슈를 사용하여 Claude Code를 훈련하고 테스트했기 때문에 예상된 결과입니다. 이 결과를 보고 과적합(Overfitting)이라고 생각할 수 있습니다. 하지만 이 작업의 목표는 Claude Code의 프롬프트를 테스트와 동일한 리포지토리에 맞춰 훈련하는 것이었습니다. 앞서 언급했듯이, 이는 개발자의 워크플로를 모방합니다. 이 경우 특정 리포지토리에 대한 "과적합"은 사실 목표입니다. 이를 통해 Claude Code가 생성하는 코드를 여러분이 작업하는 특정 코드베이스에 맞춤화할 수 있기 때문입니다!

최종 요점

  1. 프롬프트 최적화는 최상위 코딩 에이전트도 의미 있게 개선합니다. Claude Code는 이미 가장 강력한 코딩 모델(Claude Sonnet)을 사용하지만, 시스템 프롬프트만 최적화했음에도 일반 코딩 성능에서 5% 이상의 향상을 얻었고, 단일 리포지토리에 특화했을 때는 더 큰 향상을 보였습니다.

  2. 리포지토리별 최적화는 실용적인 초능력입니다. 매일 같은 코드베이스에서 작업한다면, 프롬프트 러닝을 통해 Claude Code가 해당 리포지토리의 패턴, 규범, 특징, 컨벤션을 내면화하도록 훈련하여 약 +11% 더 나은 코드를 작성하게 할 수 있습니다! 벤치마킹 관점에서는 "과적합"처럼 보이는 것이 실제 업무 흐름에서는 강점이 됩니다.

  3. 성능 향상을 위해 모델, 도구, 아키텍처를 수정할 필요가 없습니다. 모든 개선은 파인 튜닝, 재교육, 맞춤형 인프라 없이 오직 Claude Code에 제공되는 지침(instructions)을 정제함으로써 이루어졌습니다. 실제 성능 데이터에 기반한 더 나은 프롬프트만 있으면 됩니다.

  4. LLM 평가는 스칼라 보상보다 풍부한 학습 신호를 제공합니다. 패치가 왜 성공했거나 실패했는지 설명함으로써, LLM 피드백은 메타 최적화 도구가 단순히 무작위로 프롬프트 변형을 탐색하는 대신 실제 실패 원인(API 오해, 에지 케이스 누락, 리포지토리 구조에 대한 잘못된 가정 등)을 목표로 삼도록 합니다.

  5. 메타 프롬프팅은 시스템 프롬프트를 노출하는 모든 에이전트에 확장 가능합니다. Claude Code, Cline, 맞춤형 코딩 에이전트, RAG 어시스턴트, 사내 개발자 도구 등 편집 가능한 프롬프트가 있는 모든 것은 이 정확한 루프를 사용하여 최적화할 수 있습니다.

이 글이 우리에게 전달하는 3가지 인사이트

이 기술 블로그는 단순히 "Claude 성능을 올리는 법"을 넘어, 앞으로 우리가 AI와 어떻게 일해야 하는지에 대한 중요한 단서를 제공합니다.

1. '파인 튜닝(Fine-tuning)'의 시대에서 '컨텍스트 엔지니어링'의 시대로

과거에는 특정 도메인에 강한 AI를 만들기 위해 모델 자체를 재학습(Fine-tuning)시키는 것이 정석처럼 여겨졌습니다. 하지만 이는 비용이 많이 들고 업데이트가 느립니다.

이 실험은 **"잘 깎은 시스템 프롬프트(CLAUDE.md) 하나가 어설픈 파인 튜닝보다 낫다"**는 것을 증명합니다. 이를 **'Soft Fine-tuning'**이라고 부를 수 있겠습니다.

  • 전통적 방식: 모델의 가중치(뇌 구조)를 바꿈 → 비쌈, 어려움.

  • 새로운 방식: 모델에게 주는 지침(업무 매뉴얼)을 정교화함 → 싸고, 빠르고, 즉시 수정 가능.

이제 개발 팀의 경쟁력은 "얼마나 좋은 모델을 쓰느냐"보다 **"우리 팀의 암묵지(Implicit Knowledge)를 얼마나 정교하게 텍스트화하여 AI에게 주입하느냐"**에 달려 있습니다.

2. '과적합(Overfitting)'은 더 이상 나쁜 단어가 아니다

머신러닝 개론에서 과적합은 피해야 할 1순위 대상입니다. 하지만 **Agentic Workflow(AI 에이전트 업무)**에서는 정반대입니다.

우리는 '모든 코드를 잘 짜는 제너럴한 개발자'가 필요한 게 아니라, **'우리 회사의 레거시 코드와 독특한 아키텍처를 꿰뚫고 있는 동료'**가 필요합니다.

  • 원문의 **+10.87% 성능 향상(In-Repo Split)**은 AI를 우리 프로젝트에 '과적합' 시켰을 때 비로소 **진정한 팀원(Team Member)**으로서 기능한다는 것을 보여줍니다.

  • 즉, AI에게 범용적인 베스트 프랙티스를 강요하기보다, **"우리 팀은 이렇게 해"**라는 고집스러운 컨벤션을 학습시키는 것이 생산성에 훨씬 유리합니다.

3. '수동 프롬프트 러닝'을 실무에 적용하는 법

원문에서는 자동화된 파이프라인을 구축했지만, 당장 개인이 이를 따라 하긴 어렵습니다. 하지만 **'수동 프롬프트 러닝 루프'**는 당장 오늘부터 실천할 수 있습니다.

[실무 적용 3단계 루프]

  1. 실패 기록: Claude가 코드를 잘못 짰거나, 스타일을 어겼을 때 화내고 끝내지 마세요.

  2. 원인 분석(LLM Eval): Claude에게 되물어보세요. "네가 왜 틀렸다고 생각하니? 이걸 맞추려면 CLAUDE.md에 어떤 문구가 추가되었어야 했을까?"

  3. 규칙 업데이트: 그 답변을 정제하여 CLAUDE.md에 한 줄을 추가합니다.

이 과정을 통해 여러분의 CLAUDE.md는 팀의 실패 경험을 먹고 자라는 **'살아있는 문서(Living Documentation)'**가 됩니다. 이것이 쌓이면 시니어 개발자의 코드 리뷰 시간을 획기적으로 줄여줄 것입니다.


추가로 궁금한 점이 있거나, 이 내용을 바탕으로 귀하의 프로젝트에 CLAUDE.md를 설정하는 방법이 궁금하다면 언제든지 물어봐 주세요.