필요할 때만 불러오는 도메인 지식
"Don't put everything in the system prompt. Load on demand."
"system prompt에 전부 넣기"의 함정
skill이 20개 있고 각각 꽤 자세하게 작성되어 있습니다: pdf-processing(PDF 읽는 법), code-review(review 체크리스트), git-workflow(자주 쓰는 git 패턴)... 직관적인 방법: 전부 system prompt에 붙여 넣어 모델이 언제든 참조하게 합니다.
결과:
- 호출마다 15-30K 입력 token을 소모합니다 (문제가 어떤 skill도 필요하지 않더라도).
- 모델의 주의가 분산됩니다—긴 system prompt에서 언급된 규칙은 복종도가 떨어집니다.
- skill 하나를 바꾸면 모든 이전 대화의 캐시가 무효화됩니다.
s05의 방법은 이것을 2계층으로 나누는 것입니다.
2계층 아키텍처
Layer 1 · 저렴함: system prompt에는 skill 이름과 한 줄 설명만 넣습니다 (각각 약 100 token). 20개 skill = 2K token, 수용 가능합니다.
# 시스템 프롬프트의 skill 목록
Skills available:
- pdf: Process PDF files. Extract text, tables, metadata.
- code-review: Systematic code review checklist.
- git-workflow: Common git branching and rebase patterns.
Layer 2 · 필요할 때: 모델이 특정 skill을 사용하려 할 때 load_skill(name="pdf")를 호출하면 전체 skill 본문(5-10K token일 수 있음)이 tool_result를 통해 context에 로드됩니다. 사용하지 않는 skill은 token이 하나도 로드되지 않습니다.
# tool_result에 전체 skill이 반환됩니다
<skill name="pdf">
Step 1: Use pdfplumber for extraction...
Step 2: Handle OCR fallback when needed...
Step 3: Structure output as Markdown table...
</skill>
token 비용 비교
실제 시나리오로 테스트해봅니다. 20개 skill이 있고 각 본문 평균 3000 token이라고 가정합니다. 사용자가 질문을 하면 (예: "로그인 API의 버그를 수정해줘")—이 문제는 아마 어떤 skill도 필요하지 않습니다.
SKILL.md 형식
skill 파일은 YAML frontmatter + 본문으로 구성됩니다:
--- name: pdf description: Process PDF files. Extract text, tables, metadata. tags: document,parsing --- Step 1: Use pdfplumber for extraction. Handle multi-column layouts... Step 2: For scanned PDFs, fall back to OCR via tesseract...
frontmatter는 Layer 1에 사용되고(name/description/tags), 본문은 Layer 2에 사용됩니다. 이 방식은 정적 블로그(Jekyll, Hugo)에서 영감을 받았으며 익숙한 사람이라면 한 눈에 이해됩니다.