TRENDSHIFT DEEP DIVE · MICROSOFT

SkillOpt
LLM 스킬을 신경망처럼 훈련시키다

microsoft/SkillOpt — 모델 가중치는 얼려둔 채, 자연어 스킬 문서(best_skill.md)를 에폭·러닝레이트·검증 게이트로 최적화하는 텍스트 공간 옵티마이저. Python 85.9%·HTML 13.0%·Shell 1.1%, MIT.

1프로젝트 한 줄 요약

SkillOpt가 한마디로 뭔지부터.

핵심 메시지

"모델 가중치는 얼린 채,
스킬 문서(.md)를 신경망 학습처럼 최적화한다."

SkillOpt는 마이크로소프트 리서치가 공개한 텍스트 공간 옵티마이저(text-space optimizer)다. 가중치를 학습하는 게 아니라, 에이전트에게 주는 스킬 문서(자연어 마크다운)를 학습한다. 롤아웃 → 반추 → 패치 집계 → 선택 → 적용 → 검증 게이트로 이어지는 루프를 에폭·러닝레이트·스케줄러·검증 게이트로 돌린다.

최종 산출물은 한 장의 best_skill.md — 다른 에이전트가 그대로 갖다 붙이면 같은 효과를 내는 재사용 가능한 자연어 가중치다.

한 줄 정의
text-space optimizer (텍스트 공간 옵티마이저)
파라미터 공간 대신 "자연어 문서 공간"에서 경사 하강을 흉내내는 옵티마이저. 그래디언트는 LLM이 만든 편집 패치(edit patch)이고, 옵티마이저 스텝은 패치를 문서에 적용하는 것이다.

레포 트리에서 확인 가능한 사실:

2왜 지금 주목받는가

트렌딩 이유 + 경쟁 제품 대비 강점.

지난 1년간 "프롬프트 최적화" 영역에는 이미 강력한 선행 연구가 있었다 — 스탠퍼드의 DSPy(파이프라인 자동 컴파일), TextGrad(텍스트 그래디언트), PromptBreeder(돌연변이 기반 진화)가 대표 주자다. 그런데 SkillOpt는 한 발 다른 각도로 들어왔다.

차별점 1

"가중치는 얼린다, 스킬만 학습한다"

RLHF·DPO·GRPO 같은 가중치 학습은 한 번 돌리는 데 수십만 달러가 든다. SkillOpt는 GPT-4o·Claude·Qwen이 그대로 동결된 상태에서 스킬 문서만 학습한다. 모델을 못 건드리는 클로즈드 API 환경에서도 그대로 적용된다.

차별점 2

"DL 사용자라면 즉시 직관이 통한다"

DSPy는 자체 컴파일러 모델을, PromptBreeder는 진화 알고리즘 어휘를 쓴다. SkillOpt는 정확히 딥러닝 메탈모델을 그대로 빌려왔다 — epoch, batch_size, learning_rate, lr_scheduler(cosine/linear/constant), gradient clipping, slow update(=momentum), meta skill(=meta-learning)까지. 그래서 ML 엔지니어가 처음 보고 5분 만에 하이퍼파라미터를 튜닝할 수 있다.

차별점 3

"검증 게이트로 catastrophic forgetting 방지"

단순 진화 알고리즘은 좋아 보이는 변이를 그대로 받아들이다 보면 직전 에폭에서 얻은 성능이 깨진다. SkillOpt는 매 스텝마다 selection split(검증셋)에서 점수 비교 후 통과해야만 패치를 채택하고, 에폭 경계에서는 slow update로 직전 에폭과 종단적(longitudinal) 비교까지 한다. ML에서 검증된 메커니즘 그대로다.

차별점 4

"6개 벤치마크에서 검증된 일반성"

QA(SearchQA), 임바디드 에이전트(ALFWorld), 문서 QA(DocVQA), 수학(LiveMathematicianBench), 코드 생성(SpreadsheetBench), 툴 사용 QA(OfficeQA) — 도메인이 완전히 다른 6개 작업에서 동일한 옵티마이저가 동작한다. 새 벤치마크 추가는 skillopt/envs/_template/ 디렉토리 복사로 시작할 수 있다.

비유

모델을 가르치는 두 가지 방법: ① 학생의 뇌(=가중치)를 수술해서 똑똑하게 만든다(RLHF) ② 학생의 머리는 그대로 두고, 옆에 두는 참고 노트를 계속 다듬는다(SkillOpt). 후자는 학생을 갈아끼워도 노트 그대로 재사용된다.

3기술 스택 전체 지도

pyproject.toml과 requirements.txt에서 추출한 진짜 의존성.

3.1 코어 — 옵티마이저 본체

SkillOpt 자체는 의존성이 놀랍도록 가볍다. pyproject.toml[project] dependencies를 보면 6개뿐이다.

# pyproject.toml — 핵심 의존성
openai >= 1.30.0          # OpenAI / Azure OpenAI SDK
pyyaml >= 6.0             # config YAML 파싱
numpy >= 1.24.0           # 점수/배치 산술
openpyxl >= 3.1.0         # SpreadsheetBench용 .xlsx 처리
azure-identity >= 1.15.0  # Azure CLI / Managed Identity 인증
azure-core >= 1.30.0      # Azure 트랜스포트
httpx >= 0.27.0           # 비동기 HTTP

여기엔 PyTorch도, transformers도, 어떤 ML 프레임워크도 없다. 이게 핵심이다 — SkillOpt는 학습 알고리즘이지만 모델을 학습시키는 게 아니라 텍스트 문서를 학습시키기 때문에, 텐서 라이브러리가 필요 없다. 모든 "그래디언트"는 LLM 호출의 결과로 나오는 문자열 패치다.

3.2 모델 백엔드 — 다중 LLM 라우터

skillopt/model/ 디렉토리는 옵티마이저와 타겟에 서로 다른 모델을 자유롭게 꽂을 수 있게 추상화한다.

패턴
optimizer / target 분리 (옵티마이저-타겟 분리)
큰 모델(gpt-5.5, claude)이 옵티마이저 역할로 트레일을 분석하고 패치를 만들고, 작은/빠른 모델이 타겟 역할로 실제 작업을 수행한다. ML로 치면 "큰 선생 모델이 작은 학생 모델의 프롬프트를 다듬는" 구조.

3.3 옵티마이저 모듈 — 진짜 핵심

skillopt/optimizer/는 SGD 옵티마이저와 일대일 대응되는 파일들이다.

skillopt/optimizer/
├── clip.py            # gradient clipping = 편집 개수 캡
├── lr_autonomous.py   # LR을 LLM이 자율적으로 결정하는 모드
├── meta_skill.py      # 메타 학습 메모리 (에폭 간 전략)
├── rewrite.py         # 전체 재작성 모드 (patch 대신)
├── scheduler.py       # cosine / linear / constant LR 스케줄러
├── select.py          # top-k 패치 선택 = gradient clipping
├── skill.py           # 스킬 문서 객체 + 적용 로직
├── slow_update.py     # 에폭 경계 종단 비교 (= momentum)
└── update_modes.py    # patch / rewrite_from_suggestions / full_rewrite_minibatch

3.4 그래디언트(반추) 모듈

skillopt/gradient/는 LLM이 트레일을 보고 "이 부분 고쳐"라는 패치를 만드는 부분이다.

3.5 환경(envs) — 벤치마크별 어댑터

대부분의 벤치마크는 dataloader.py + rollout.py + evaluator.py + adapter.py + skills/initial.md + prompts/*.md 패턴을 따른다. 단, alfworld는 예외evaluator.py 대신 reflect.py를 사용하고 vendor/ 디렉토리를 포함한다. 신규 벤치마크는 _template/를 복사해 100줄 정도면 추가된다.

3.6 옵션 의존성

3.7 프론트엔드/대시보드

skillopt_webui/Gradio 한 패키지로 만든 모니터링 대시보드다 (포트 7860, --share 옵션으로 공개 링크 생성). 별도 React/Vue 없음. 프로젝트 페이지 index.html은 mkdocs-material로 빌드되어 microsoft.github.io/SkillOpt에 배포된다.

4아키텍처 심화 분석

ASCII 시스템 구조도 + 핵심 설계 패턴.

4.1 전체 학습 루프 — 한 장에 그린 SGD

공식 문서 docs/guide/training-loop.md의 의사 코드를 그대로 ASCII로 옮기면 이렇다.

┌──────────────────────────────────────────────────────────────┐
│                  SkillOpt Training Loop                       │
├──────────────────────────────────────────────────────────────┤
│                                                              │
│  for epoch in range(num_epochs):       # ← 4 epochs 기본       │
│    for step in range(steps_per_epoch): # ← batch_size=40       │
│                                                              │
│      ① Rollout    (Forward Pass)                              │
│        target_model(task, skill.md) → trajectory + score      │
│                                                              │
│      ② Reflect    (Backward Pass)                             │
│        optimizer_model(failed_trajs) → edit patches           │
│                                                              │
│      ③ Aggregate                                              │
│        cluster similar patches → merged patches               │
│                                                              │
│      ④ Select     (Gradient Clipping)                         │
│        top_k(patches, k=learning_rate) ← 기본 LR=4             │
│                                                              │
│      ⑤ Update                                                 │
│        apply(skill.md, selected_patches) → skill_v(t+1).md    │
│                                                              │
│      ⑥ Gate       (Validation)                                │
│        if score(skill_v+1, val) > score(skill_v, val):        │
│          accept                                              │
│        else:                                                 │
│          reject (← early stopping like)                       │
│                                                              │
│  ───── Epoch Boundary ─────                                  │
│      ⓐ Slow Update  (= Momentum)                              │
│        compare skill_epoch_t vs skill_epoch_t-1 on same tasks │
│        → 종단 가이던스를 스킬에 주입                              │
│                                                              │
│      ⓑ Meta Skill  (= Meta-Learning)                          │
│        optimizer reflects on what changed this epoch          │
│        → cross-epoch 전략 메모리 누적                            │
└──────────────────────────────────────────────────────────────┘

4.2 디렉토리 책임 매핑

scripts/train.py
    │
    ▼
skillopt/engine/trainer.py   ← 메인 루프 오케스트레이션
    │
    ├──▶ skillopt/envs/<benchmark>/rollout.py     [① Rollout]
    │       └──▶ skillopt/model/router.py         (LLM 호출)
    │
    ├──▶ skillopt/gradient/reflect.py             [② Reflect]
    ├──▶ skillopt/gradient/aggregate.py           [③ Aggregate]
    │
    ├──▶ skillopt/optimizer/select.py + clip.py   [④ Select]
    │       └──▶ skillopt/optimizer/scheduler.py  (cosine LR)
    │
    ├──▶ skillopt/optimizer/skill.py              [⑤ Update]
    │       └──▶ skillopt/optimizer/update_modes.py
    │
    └──▶ skillopt/evaluation/gate.py              [⑥ Gate]

  ── 에폭 끝 ──
    ├──▶ skillopt/optimizer/slow_update.py        [ⓐ Slow Update]
    └──▶ skillopt/optimizer/meta_skill.py         [ⓑ Meta Skill]

4.3 핵심 설계 패턴 5가지

패턴 1

Frozen LLM + Trainable Skill

가중치 동결 + 문서 학습. GPU 메모리·학습 인프라 제로. gpt-5.5·claude-3.5-sonnet·Qwen3.5-4B 어느 백엔드든 동일하게 동작한다.

패턴 2

Edit Patch as Gradient

그래디언트가 실수 텐서가 아니라 구조화된 편집 패치(JSON). 패치는 "addition/modification/deletion" 타입을 가지고, 의미가 비슷하면 머지된다. analyst_workers=16으로 병렬 반추.

패턴 3

Validation-Gated Update (검증 게이트)

모든 스텝이 자동 채택되는 게 아니라, evaluation/gate.py가 검증 분할에서 점수를 재고 통과해야 채택. 통과 못 하면 reject → 직전 스킬로 롤백. 초기 탐색은 공격적, 후반 갱신은 보수적이라는 코사인 LR과 시너지.

패턴 4

Slow Update = Momentum

에폭 경계에서 직전 에폭과 같은 샘플 20개(slow_update_samples)로 롤아웃하고 improved/regressed/persistent_fail/stable_success로 분류 → 종단 가이드를 스킬에 주입. catastrophic forgetting 방지용 모멘텀이다.

패턴 5

Meta Skill — 옵티마이저 자체의 메모리

일반 ML 모멘텀이 가중치 업데이트 방향을 기억한다면, 메타 스킬은 옵티마이저의 전략을 기억한다. "이전 에폭에서 X 같은 편집은 reject 됐다 → 비슷한 시도 자제" 같은 메타 노트를 누적해서 다음 반추 단계에 컨텍스트로 제공.

5디렉토리 구조 해부

레포 트리(46 commit 시점)에서 직접 추출한 실제 구조.

SkillOpt/
├── README.md
├── pyproject.toml          # 빌드 설정, 의존성, 콘솔 스크립트
├── requirements.txt
├── mkdocs.yml              # 문서 사이트 빌드 설정
├── index.html              # 프로젝트 페이지 (mkdocs로 합쳐짐)
├── .env.example            # API 키 템플릿
│
├── configs/                # YAML 기반 하이퍼파라미터
│   ├── _base_/default.yaml         # 모든 벤치마크의 베이스
│   ├── searchqa/default.yaml
│   ├── alfworld/default.yaml
│   ├── docvqa/default.yaml
│   ├── livemathematicianbench/default.yaml
│   ├── officeqa/default.yaml
│   └── spreadsheetbench/default.yaml
│
├── docs/                   # mkdocs 사이트 소스
│   ├── index.md
│   ├── guide/              # installation, training-loop, dl-analogy …
│   └── reference/          # api, cli, config
│
├── scripts/                # CLI 진입점
│   ├── train.py            # 메인 학습 스크립트
│   ├── eval_only.py        # 학습된 스킬 평가만
│   └── run_*.sh            # 벤치마크별 셸 헬퍼
│
├── skillopt/               # 코어 패키지
│   ├── config.py           # YAML 로더 + _base_ 인헤리턴스
│   ├── types.py            # 도메인 타입 정의
│   │
│   ├── engine/trainer.py   # 메인 트레이닝 루프
│   │
│   ├── model/              # LLM 백엔드 추상화
│   │   ├── router.py
│   │   ├── azure_openai.py, claude_backend.py
│   │   ├── qwen_backend.py, codex_backend.py
│   │   └── codex_harness.py
│   │
│   ├── gradient/           # = backward pass
│   │   ├── reflect.py      # 트레일 → 편집 패치
│   │   └── aggregate.py    # 패치 머지
│   │
│   ├── optimizer/          # = SGD optimizer
│   │   ├── skill.py, select.py, clip.py
│   │   ├── scheduler.py    # cosine / linear / constant
│   │   ├── lr_autonomous.py
│   │   ├── meta_skill.py, slow_update.py
│   │   ├── update_modes.py, rewrite.py
│   │
│   ├── evaluation/gate.py  # 검증 게이트
│   │
│   ├── envs/               # 벤치마크별 어댑터
│   │   ├── _template/      # 신규 벤치마크 시작점
│   │   ├── alfworld/
│   │   │   ├── adapter.py, dataloader.py, rollout.py
│   │   │   ├── reflect.py
│   │   │   ├── prompts/    # analyst_*.md, rollout_*.md
│   │   │   ├── skills/initial.md
│   │   │   └── vendor/     # ALFWorld 본가 코드 베포
│   │   ├── searchqa/
│   │   ├── docvqa/
│   │   ├── livemathematicianbench/
│   │   ├── officeqa/
│   │   │   └── tool_runtime.py    # 툴 사용 QA 전용
│   │   └── spreadsheetbench/
│   │       ├── codegen_agent.py, react_agent.py
│   │       └── executor.py        # 코드 실행 샌드박스
│   │
│   ├── prompts/            # 공용 프롬프트 (분석가/머지/메타)
│   │   ├── analyst_*.md
│   │   ├── merge_*.md
│   │   ├── meta_skill.md
│   │   └── lr_autonomous.md
│   │
│   └── utils/              # json_utils, scoring
│
├── skillopt_webui/         # Gradio 대시보드
│   ├── __main__.py, app.py
│
└── skillopt-assets/        # 논문 그림, 로고, 데모 png
한눈에 보이는 설계 신호
"문서/프롬프트 = 일급 시민" 설계

가장 인상적인 건 prompts/ 디렉토리에 analyst_success.md·analyst_error.md·merge_final.md·meta_skill.md 같은 마크다운 프롬프트가 그 자체로 코드와 동급으로 관리된다는 점. 환경별로도 envs/<name>/prompts/가 따로 있다. 이건 "프롬프트도 코드"라는 문화의 살아있는 예다.

6학습 포인트

이 레포에서 진짜 배워갈 만한 기술별 인사이트.

6.1 DL 메탈모델을 LLM에 그대로 매핑하기

이 레포의 가장 큰 교훈은 익숙한 추상을 새 영역에 그대로 옮겨도 작동한다는 것이다. docs/guide/dl-analogy.md의 매핑 표를 한국어로 옮기면:

대응표
Deep Learning ↔ SkillOpt
• model weights → 스킬 문서(.md)
• forward pass → rollout (target이 작업 실행)
• loss function → 작업 평가기
• backpropagation → reflect (분석가 LLM)
• gradients → edit patches
• gradient aggregation → patch aggregation
• gradient clipping → edit selection (max edits cap)
• learning rate → 스텝당 최대 편집 수
• LR scheduler → cosine / linear / constant
• SGD step → 스킬에 패치 적용
• validation set → selection split
• early stopping → gate patience
• momentum → slow update
• meta-learning → meta skill
• checkpointing → 스텝마다 skill snapshot
• transfer learning → 다른 벤치마크 스킬을 seed로

6.2 ML 실험에서 검증된 직관이 그대로 이식된다

문서가 직접 말하는 "전이되는 직관"과 "전이 안 되는 직관":

전이됨
DL에서 검증된 것들

코사인 스케줄 > 상수 — DL과 동일하게 코사인 어닐링이 수렴에 유리
중간 LR(4~16)이 최적 — 너무 작으면 학습 느림, 너무 크면 노이즈
슬로우 업데이트가 catastrophic forgetting 방지
메타 스킬 메모리가 옵티마이저의 반추 품질을 올림

전이 안 됨
DL 직관이 깨지는 부분

배치 크기 ≠ 좋음 — API 비용 때문에 큰 롤아웃 배치는 수익체감
에폭 많이 ≠ 좋음 — 스킬은 신경망보다 빨리 수렴, 보통 2~4 에폭이면 충분

6.3 Config 인헤리턴스 패턴 (mmdetection 스타일)

configs/_base_/default.yaml을 모든 벤치마크가 상속하는 패턴 — mmcv·detectron2 같은 비전 프레임워크에서 익숙한 그 구조다. configs/searchqa/default.yaml은 첫 줄이 _base_: ../_base_/default.yaml로 시작하고, 위에서 필요한 값만 오버라이드한다.

6.4 "옵티마이저 모델 ≠ 타겟 모델" 분리

설정의 model.optimizermodel.target이 분리돼 있어, 큰 모델로 학습한 스킬을 작은 모델에 배포하는 시나리오가 자연스럽게 가능하다. 옵티마이저는 GPT-5.5, 타겟은 Qwen3.5-4B 같은 조합도 OK.

6.5 LLM as Judge / LLM as Optimizer 패턴

skillopt/prompts/에 있는 analyst_success.md, analyst_error.md, analyst_*_rewrite.md, analyst_*_full_rewrite.md 3단 구성은 한 가지 작업을 3가지 "편집 강도"로 다룰 수 있게 한 정교한 프롬프트 엔지니어링 사례다. 분석 깊이가 다른 프롬프트를 여러 버전으로 두고 동적 선택하는 패턴.

6.6 자율 LR — LLM이 자기 LR을 정하는 모드

optimizer/lr_autonomous.py + prompts/lr_autonomous.md가 흥미롭다. lr_control_mode: autonomous로 두면, 일반적인 코사인 스케줄러가 아니라 옵티마이저 LLM 자신이 현재 진행 상황을 보고 다음 스텝의 LR을 제안한다. "메타 옵티마이저"가 하이퍼파라미터를 자기조절하는 셈.

7하드웨어/시스템 요구사항

실제로 돌리려면 뭐가 필요한가.

필수

Python 3.10 이상

pyproject.tomlrequires-python = ">=3.10". 3.10/3.11/3.12 분류자만 명시. Walrus operator, structural pattern matching 등 신문법 사용 추정.

필수

LLM 엔드포인트 (셋 중 하나)

Azure OpenAI (권장), OpenAI 직접, Anthropic Claude 중 하나의 API 키 또는 Azure CLI 인증. .env.example에 모든 변수가 정리돼 있다. 학습 한 번에 LLM 호출이 수천 번 발생하므로 비용을 사전에 가늠해야 한다 — batch_size=40, 4 epochs, 6개 작업 평균 분석 라운드 3회 기준 적게 잡아도 수만 토큰 × 수백 스텝.

선택

로컬 GPU + vLLM (Qwen 백엔드)

Qwen/Qwen3.5-4B 등 로컬 모델을 타겟으로 쓰려면 vLLM 서버 + 4B급은 24GB VRAM(예: RTX 4090), 더 큰 모델은 A100/H100급 필요. 옵티마이저는 클라우드(GPT/Claude), 타겟은 로컬 Qwen 같은 하이브리드 구성이 비용 최적.

선택

ALFWorld 벤치마크용 데이터

pip install -e ".[alfworld]"alfworld-download 명령으로 데이터셋 받음. SearchQA·DocVQA 등은 데이터 자동 포함이 아니라 사용자가 직접 train/val/test 분할 JSON을 준비해야 한다(README 명시).

선택

SpreadsheetBench용 샌드박스

코드 생성 작업이라 spreadsheetbench/executor.py가 생성된 Python을 안전 실행해야 함. openpyxl로 .xlsx 검증. 별도 컨테이너 권장.

비유

SkillOpt는 PyTorch보다 scikit-learn 같은 무게감이다. GPU 없이도 코드는 돌아간다. 다만 진짜 비용은 OpenAI/Claude API 청구서로 나간다. "1 epoch ≈ 한 끼 점심값"이라는 농담이 통하는 카테고리.

8직접 해볼 수 있는 실습 과제

난이도별 5개 — 위에서 아래로 차근차근.

난이도 ★☆☆☆☆

실습 1 — 빈 스킬을 SearchQA에 한 번 돌리기

configs/searchqa/default.yamltrain.num_epochs를 1, batch_size를 8, train_size를 32로 줄여 가벼운 실행. outputs/<run>/skills/skill_v0001.md빈 스킬에서 어떻게 자라는지를 diff로 본다. 학습 포인트: rollout → reflect → gate 전체 사이클을 한 번 직접 보기.

난이도 ★★☆☆☆

실습 2 — ALFWorld 초기 스킬 진단

skillopt/envs/alfworld/skills/initial.md를 읽고, "Common Mistakes to Avoid" 섹션의 항목 하나를 일부러 삭제한 뒤 학습 돌리기. 옵티마이저가 삭제한 항목을 다시 발견해서 추가하는지 관찰. 학습 포인트: 반추(reflect) 능력의 실체.

난이도 ★★★☆☆

실습 3 — LR 스케줄러 비교 실험

같은 시드(train.seed=42)로 lr_schedulerconstant, linear, cosine, autonomous 4종 돌려서 history.json의 단계별 검증 점수를 플롯. DL에서 봤던 곡선과 비슷한 패턴이 나오는지 확인. 학습 포인트: 하이퍼파라미터가 LLM 영역에서도 ML과 똑같이 작동한다는 직관.

난이도 ★★★★☆

실습 4 — 새 벤치마크 추가 (한국어 QA)

skillopt/envs/_template/kor_qa/로 복사하고, KorQuAD 데이터를 dataloader.py로 로드. evaluator.py는 정답 문자열 부분 일치(F1) 기준으로 작성. configs/kor_qa/default.yaml 추가. 학습 포인트: 옵티마이저는 그대로, 환경 어댑터만 갈아끼우면 새 도메인에 옮겨가는 추상화의 힘.

난이도 ★★★★★

실습 5 — 옵티마이저-타겟 비대칭 배포

옵티마이저는 클라우드 GPT-4o, 타겟은 로컬 vLLM의 Qwen3.5-4B로 학습. 학습이 끝난 best_skill.md를 다시 더 작은 Qwen2.5-1.5B에 그대로 붙여 평가 — 학습 때보다 작은 모델에서 얼마나 성능이 유지되는지 측정. 학습 포인트: "자연어 가중치"의 모델 간 전이 가능성을 실증.

9관련 기술 심화 학습 로드맵

SkillOpt를 깊이 이해하려면 어디부터 봐야 하나 — 4주 코스.

1주차

딥러닝 옵티마이저 다시 보기

SGD → Momentum → Adam의 진화, learning rate scheduling(cosine annealing, warmup), gradient clipping, early stopping, validation-based selection의 ML 이론. 추천 자료: "Deep Learning" (Goodfellow et al.) 8장, fast.ai 코사인 스케줄러 노트. 매핑 표를 외워두면 SkillOpt 코드가 즉시 읽힌다.

2주차

프롬프트 옵티마이저 선행 연구

DSPy(Khattab et al., Stanford) — 파이프라인 자동 컴파일, BootstrapFewShot/MIPROv2. TextGrad(Yuksekgonul et al.) — LLM이 "텍스트 그래디언트" 생성. PromptBreeder(DeepMind) — 자기진화 프롬프트. OPRO(Google) — Optimization by PROmpting. SkillOpt가 이들과 어떻게 다른지 비교 노트 작성.

3주차

LLM 에이전트 평가 벤치마크

SkillOpt가 지원하는 6개 벤치마크의 원본 논문 읽기 — ALFWorld(임바디드 텍스트 게임), SearchQA(open-domain QA), DocVQA(문서 VQA), SpreadsheetBench(코드+표 작업). 평가 메트릭의 차이 — F1, exact match, success rate, pass@1 — 이 옵티마이저 동작에 어떻게 영향을 주는지.

4주차

메타학습 + 자율 에이전트

SkillOpt의 Meta Skill은 MAML(Model-Agnostic Meta-Learning) 직계가 아니지만 같은 가족. Karpathy의 "LLM OS" 강연, Anthropic의 "Building effective agents" 글, Microsoft의 AutoGen·Magentic-One 코드를 함께 읽으면 SkillOpt가 큰 그림의 어디에 위치하는지 보인다.

10핵심 키워드 사전

SkillOpt를 읽다 막힐 만한 용어 한 묶음.

용어 01
skill document (스킬 문서)
에이전트에게 주는 마크다운 형식의 프롬프트. SkillOpt가 "학습하는" 대상. DL의 모델 가중치에 대응.
용어 02
rollout (롤아웃)
현재 스킬을 들고 타겟 모델이 작업을 실행하는 과정. 한 작업당 trajectory(궤적) + score(점수) 산출. = forward pass.
용어 03
reflect / analyst (반추 / 분석가)
실패한(또는 성공한) 트레일을 옵티마이저 LLM이 읽고 "이렇게 고쳐"라는 편집 패치를 만드는 단계. = backward pass.
용어 04
edit patch (편집 패치)
스킬 문서를 어떻게 바꿀지 적은 구조화된 제안. addition/modification/deletion 3종. = gradient.
용어 05
aggregate (집계 / 머지)
의미가 비슷한 패치를 합쳐 중복 편집을 방지. 계층적 머지(hierarchical merge) 사용.
용어 06
learning_rate (러닝레이트)
SkillOpt에서는 "한 스텝에 최대 몇 개 편집을 적용할지". 기본 4, 최소 2. cosine 스케줄러로 감소시킴. = gradient clipping cap.
용어 07
gate (게이트)
패치 적용 후 검증셋에서 점수가 떨어지면 reject하는 검증 메커니즘. = validation-based selection + early stopping.
용어 08
slow update (슬로우 업데이트)
에폭 경계에서 직전 에폭과 같은 샘플을 다시 롤아웃 → 개선/회귀/계속 실패/계속 성공으로 분류 → 가이드 텍스트를 스킬에 주입. = momentum / catastrophic forgetting 방지.
용어 09
meta skill (메타 스킬)
옵티마이저 자신의 전략을 누적하는 메타 메모리. 다음 에폭 반추 단계에 컨텍스트로 제공. = meta-learning.
용어 10
update_modes (업데이트 모드)
패치 적용 방식 3가지: patch(국지적 편집), rewrite_from_suggestions(제안 기반 재작성), full_rewrite_minibatch(전체 재작성). 후자로 갈수록 LR이 높다.
용어 11
optimizer vs target (옵티마이저 / 타겟)
큰 모델 = 옵티마이저(반추·머지·메타), 작은/빠른 모델 = 타겟(롤아웃). 비대칭 배포로 비용 최적화.
용어 12
frozen LLM (얼린 LLM)
가중치를 절대 갱신하지 않는 LLM. SkillOpt가 학습하는 건 모델이 아니라 그 옆의 스킬 문서다.
용어 13
selection split (선택 분할)
학습 분할과 별개로 게이트 검증에 쓰는 데이터셋. DL의 validation set과 동일. 설정 키: split_mode, split_seed: 42.
용어 14
best_skill.md (베스트 스킬 마크다운)
학습이 끝났을 때 가장 검증 점수가 좋았던 스킬 문서. 이게 곧 "배포 가능한 산출물". 다른 에이전트에 그대로 붙여 쓸 수 있다.
용어 15
codex_harness (코덱스 하네스)
OpenAI Codex CLI를 sandbox 모드로 실행하는 래퍼. workspace-write, 네트워크 차단, 승인 정책까지 세밀 제어. SpreadsheetBench·SWEBench류 코드 실행 작업용.

11참고 링크

레포 + 논문 + 관련 선행 연구.

SkillOpt 본가

관련 선행 연구

SkillOpt가 사용하는 벤치마크

옵티마이저 메탈모델 학습용

실용 가이드

지금 시도해볼 만한 것들

  1. 레포를 클론하고 docs/guide/dl-analogy.md부터 본다. 매핑 표 한 장이면 코드 전체가 즉시 읽힌다. 코드 디렉토리를 열기 전에 이 한 페이지를 먼저 머리에 박는 게 가장 효율적이다.
  2. configs/_base_/default.yaml을 통째로 외운다. 모든 하이퍼파라미터가 여기 한 파일에 모여 있다. 이걸 한 번 읽으면 SkillOpt의 "노브"가 몇 개인지 손에 잡힌다 — learning_rate, lr_scheduler, batch_size, use_slow_update, use_meta_skill, skill_update_mode.
  3. 가장 작은 환경 — searchqa — 으로 batch_size=8, num_epochs=1 미니 학습을 한 번 끝까지 돌려본다. outputs 디렉토리의 skills/skill_v0001.md ~ skill_vXXXX.md를 git diff처럼 비교하면, 스킬이 "자라는 모양"이 눈에 보인다. 이 한 번의 실험이 백 페이지 논문보다 강력하다.
  4. 자기 도메인 작업에 같은 패턴을 적용해본다. 꼭 SkillOpt를 그대로 쓸 필요는 없다 — "롤아웃 + 반추 + 게이트 + 롱텀 종단 비교"라는 4박자만 자기 워크플로(이메일 답장, 분석 보고서 작성, 코드 리뷰…)에 옮겨도 즉시 가치가 난다.
  5. best_skill.md를 다른 모델에 붙여서 전이 가능성을 확인한다. GPT-4o로 학습한 스킬을 Claude-3.5-Sonnet에 그대로 붙여 평가 — 자연어 가중치가 모델 간에 얼마나 옮겨가는지 직접 측정해보면 이 패러다임의 한계와 강점이 동시에 보인다.
원문 · microsoft/SkillOpt README + docs/guide/* + configs/*.yaml + pyproject.toml, 2026-05-28 · github.com/microsoft/SkillOpt