harness๋ ๋ฌด์์ธ๊ฐ?
harness = โ๋ชจ๋ธ์ โ๋งํ๋ ๋โ์์ โ์ผํ๋ ์์คํ โ์ผ๋ก ๋ฐ๊พธ๋ ์คํ ํ๋ ์(์ค์บํด๋ฉ)โ
AI ์์ด์ ํธ ๋ถ์ผ์์ harness๋ ๋ชจ๋ธ(LLM) ์์ฒด๊ฐ ์๋๋ผ, ๋ชจ๋ธ์ด ๋๊ตฌ๋ฅผ ์ฐ๊ณ , ์์ ์ ์ชผ๊ฐ๊ณ , ๊ฒ์ฆํ๊ณ , ์ธ์ ์ด ๋๊ฒจ๋ ์ด์ด์ ์ผํ๋๋ก ๋ง๋๋ ์ฃผ๋ณ ์คํ ํ๊ฒฝ + ์ด์ ๊ท์จ์ ๋ฌถ์ด์ ๋ถ๋ฅด๋ ๋ง์ด๋ค. ์ฒ์ ์ด ๋จ์ด๋ฅผ ๋ค์ผ๋ฉด ๋ณดํต ์ด๋ฐ ์์ โํต์ฌ ์๋ฌธโ์ด ์์ฐ์ค๋ฝ๊ฒ ์๊ธด๋ค:
- โ์์ด์ ํธ ์๊ธฐํ ๋ harness๊ฐ ์ ๊ฐ์๊ธฐ ๋์ค์ง?โ
- โ์ด๊ฒ ๊ณต์ ์ฉ์ด์ธ๊ฐ, ๊ทธ๋ฅ ๋๊ฐ ํธํ๊ฒ ์ฐ๋ ๋ง์ธ๊ฐ?โ Anthropic ๊ธ์ ์ด ํผ๋์ ๊ฝค ์ ์ ๋ฆฌํด์ค๋ค. ๊ทธ๋ค์ด ๋งํ๋ harness๋ โํด์ ๋ถ์ด๋ ์ฝ๋โ ์์ค์ด ์๋๋ผ ์ค๋ ๋ฌ๋ฆฌ๋(long-running) ์์ ์ ๋๊น์ง ์์ฃผํ๊ฒ ๋ง๋๋ ์์ ํ๋ ์์ ๊ฐ๊น๋ค.
โ๊ทธ๋ฆผ์์ Model์ ์ ์ธํ ๋๋จธ์งโ๊ฐ harness์ผ๊น?
๊ตฌ๊ธ์ agent runtime ๊ทธ๋ฆผ์ ๋ณด๋ฉด Model ์/์์ Orchestration, Memory, Tools ๊ฐ์ ๊ตฌ์ฑ์์๊ฐ ๋ถ์ด ์๋ค.
์ด ๊ตฌ์กฐ๋ฅผ ๋ณด๋ ์๊ฐ ๋ค์ ์ง๋ฌธ์ผ๋ก ์ด์ด์ง๋ค:
๊ทธ๋ ๋ค๋ฉด ์ค๋ฌด์์ ๋งํ๋ harness๋, ์ ๊ทธ๋ฆผ์์ Model์ ๋นผ๊ณ ๋๋จธ์ง(Agent Runtime) ์ ์ฒด๋ฅผ ๊ฐ๋ฆฌํจ๋ค๊ณ ์ดํดํด๋ ๋ ๊น? ๋๋ถ๋ถ์ ๋ํ/๋ฌธ๋งฅ์์ ๋ต์ Yes๋ค. harness์ ๋ณดํต ํฌํจ๋๋ ๋ฒ์๋ ์๋์ฒ๋ผ ์ ๋ฆฌ๋๋ค.
- Orchestration: ๊ณํ โ ์คํ โ ๊ด์ฐฐ โ ๋ค์ ํ๋(๋ฃจํ), ์ฌ์๋/๋ถ๊ธฐ, ์ข ๋ฃ ์กฐ๊ฑด
- Memory / State: short/long-term ์ ์ฅ, ์ฒดํฌํฌ์ธํธ, ์ธ์ ๋ธ๋ฆฌ์ง(๋ค์ ์ธ์ ์ด ์ฝ์ ์ ์๋ ํํ)
- Tools: ๊ฒ์/DB/์ฝ๋/๋ธ๋ผ์ฐ์ ์๋ํ ๋ฑ ์๋ฐ ์ฐ๊ฒฐ, ํด ํธ์ถ ์ ์ฑ
- Verification: ํ ์คํธ/์์ฉ์กฐ๊ฑด ํ์ธ, ์คํจ ์ ๋ณต๊ตฌ ๋ฃจํ
- Artifacts: ์งํ ๋ก๊ทธ, git ํ์คํ ๋ฆฌ, ํ๊ฒฝ ์คํฌ๋ฆฝํธ ๊ฐ์ โ์คํ ํ์ โ ๊ทธ๋ฐ๋ฐ ์ฌ๊ธฐ์ ํ ๋ฒ ๋ ๊ฑธ๋ฆฌ๋ ํฌ์ธํธ๊ฐ ์๋ค. โReasoning/Planningโ์ ์ด๋์ ๋๋๋์ด๋ค.
reasoning/planning๋ harness์ ํฌํจ๋๋ ๊ฑธ๊น, ์๋๋ฉด ๋ชจ๋ธ ์ชฝ์ผ๊น? ์ค๋ฌด์ ์ผ๋ก๋ ์ด๋ ๊ฒ ๋๋๋ฉด ๊ฐ์ฅ ๋ ํท๊ฐ๋ฆฐ๋ค:
- ์๊ฐ(์ถ๋ก /๊ณํ์ ์์ฑ) ์์ฒด๋ ๋ชจ๋ธ์ ๋ฅ๋ ฅ
- harness๋ ๊ทธ ์๊ฐ์ ๋ฐ๋ณต ์คํํ๊ณ ๊ด๋ฆฌํ๋ ํ๋ ์(๋ฃจํ/๊ท์จ)์ด๋ค. ์ฆ, ์๊ฐ์ โ๋ง๋๋ ๊ฒโ์ ๋ชจ๋ธ, ์๊ฐ์ โ๊ตด๋ฆฌ๊ณ ์ง์์ํค๋ ๊ฒโ์ harness. ์ด์ ๋ค์ ์ฐ๊ฒฐ ์ง๋ฌธ์ด ๋์จ๋ค. โ๊ทธ๋ผ harness๋ฅผ ๋ ๊ตฌ์ฒด์ ์ผ๋ก ์ค๋ช ํ ์ ๋ขฐ ๊ฐ๋ฅํ ๋ ํผ๋ฐ์ค๊ฐ ์๋?โ
โ๋ฌธ์์ harness๋ผ๋ ๋จ์ด๊ฐ ์๋๋ฐโฆโ โ ์ด๋์ โAI ์์ด์ ํธ harnessโ ๊ฐ๋ ์ ์ก๋?
AI ์์ด์ ํธ ๋ถ์ผ์์ harness๋ ์์ง โํ์ค ์ฉ์ดโ์ฒ๋ผ ๋ฑ ๊ณ ์ ๋ ๋จ์ด๋ผ๊ธฐ๋ณด๋จ,
- runtime
- orchestration layer
- scaffolding
- agent framework
๊ฐ์ ํํ๋ค๊ณผ ๊ฒน์น๋ ์๋ฏธ๋ก ์ฐ์ด๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค.
๊ทธ๋์ ์ฉ์ด๋ง ์ซ์ผ๋ฉด ํท๊ฐ๋ฆฌ๊ณ , โ์ด๋ค ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๋ ์ค๊ณ์ธ๊ฐ?โ๋ฅผ ๋ณด๋ฉด ๋น ๋ฅด๊ฒ ์ ๋ฆฌ๋๋ค.
์ฌ๊ธฐ์ Anthropic์ ๊ธ(Effective harnesses for long-running agents)์ด ๊ฐํ ์ด์ ๋:
harness๊ฐ ์ ํ์ํ์ง(์คํจ ๋ชจ๋) โ ์ด๋ป๊ฒ ์ค๊ณํด์ผ ํ๋์ง(๊ตฌ์ฑ/๊ท์จ)๊น์ง โlong-runningโ ๊ด์ ์์ ๋งค์ฐ ๊ตฌ์ฒด์ ์ผ๋ก ์ ์ด๋์๊ธฐ ๋๋ฌธ. ์ด ๊ธ์ด ๋์ง๋ ๋ค์ ์ฐ๊ฒฐ ์ง๋ฌธ์ ๋ช ํํ๋ค. โlong-runningโ์์ harness๊ฐ ํน๋ณํ ์ค์ํ ์ด์ ๊ฐ ๋ญ๊น?
Anthropic์ด ๋งํ๋ โlong-running agent harnessโ์ ํต์ฌ ๋ฌธ์
ํต์ฌ ๋ฌธ์ ๋ ํ ๋ฌธ์ฅ์ผ๋ก ์์ฝ๋๋ค:
- ์์ด์ ํธ๋ ์ปจํ ์คํธ ์๋์ฐ ๋๋ฌธ์ โ์ธ์ โ ๋จ์๋ก ๋๊ฒจ ์ผํ๊ณ ,
- ์ ์ธ์ ์ ์ด์ ๋งฅ๋ฝ์ โ์๋์ผ๋กโ ๋ค ๊ธฐ์ตํ์ง ๋ชปํด์,
- ๋ค์ ์ธ์ ์ด ์ถ์ธก์ผ๋ก ์ถ๋ฐํ๋ฉด ์งํ์ด ์ฝ๊ฒ ๋ฌด๋์ง๋ค. ์ฆ long-running์์ harness์ ๋ชฉํ๋ โํด์ ๋ถ์ด๊ธฐโ๋ฅผ ๋์ด ์ด๋ ๊ฒ ๋ฐ๋๋ค:
์ธ์ ์ด ๋๊ฒจ๋ ๋ค์ ์ธ์ ์ด ์ถ์ธกํ์ง ์๊ณ ํ์ธํ๋ฉฐ ์ด์ด์ ๋ฌ๋ฆฌ๊ฒ ๋ง๋ค๊ธฐ ์ฌ๊ธฐ์ ์์ฐ์ค๋ฝ๊ฒ ๋ค์ ์ง๋ฌธ์ผ๋ก ๋์ด๊ฐ๋ค. ๊ทธ๋ผ โ์ถ์ธก์ ์ค์ด๋ ค๋ฉดโ harness๊ฐ ๊ตฌ์ฒด์ ์ผ๋ก ๋ญ ์ ๊ณตํด์ผ ํ ๊น? Anthropic์ ๊ทธ ๋ต์ โartifact(ํ๊ฒฝ์ ๋จ๊ธฐ๋ ์ฐ์ถ๋ฌผ) + ์ด์ ๊ท์จโ๋ก ํ์ด๋ธ๋ค.
harness๋ฅผ ๊ตฌ์ฒดํํ๋ โartifactโ 4์ข ์ธํธ(Anthropic์)
1) feature list: โ์์ฑโ์ ํ์ผ๋ก ๊ณ ์
Initializer๊ฐ ์ฌ์ฉ์ ์๊ตฌ๋ฅผ ํ์ฅํด ์๋ฐฑ ๊ฐ ์์ค์ end-to-end ์๊ตฌ์ฌํญ ๋ชฉ๋ก์ ๋ง๋ ๋ค.
๊ทธ๋ฆฌ๊ณ ์ดํ ์์
์์ด์ ํธ๋ ์ด ํ์ผ์ ์ญ์ /์์ ํ์ง ๋ง๊ณ , ์ค์ง passes๋ง ๋ฐ๊พธ๊ฒ ์ ํํ๋ค.
{
"category": "functional",
"description": "New chat button creates a fresh conversation",
"steps": [
"Navigate to main interface",
"Click the 'New Chat' button",
"Verify a new conversation is created"
],
"passes": false
}์ด๊ฒ ํจ๊ณผ์ ์ธ ์ด์ ๋ ๊ฐ๋จํ๋ค: โ๋๋ค/์ ๋๋คโ๋ฅผ ๋ง๋ก ํฉ์ํ๋ ๊ฒ ์๋๋ผ, ์์ฉ์กฐ๊ฑด์ ๊ณ ์ ํด๋ฒ๋ฆฌ๊ธฐ ๋๋ฌธ์ด๋ค.
2) claude-progress.txt: ์ธ์ ๊ฐ ์ด์ด๋ฌ๋ฆฌ๊ธฐ ๋ก๊ทธ
์ธ์
์ด ๋๋ ๋๋ง๋ค โ๋ฌด์์ ํ๋์ง / ๋ฌด์์ ๊ฒฐ์ ํ๋์ง / ๋ค์์ ๋ญ ํ๋ฉด ๋๋์งโ๋ฅผ ์งง๊ฒ ๋จ๊ธด๋ค.
๋ค์ ์ธ์
์ ์ด ํ์ผ๋ถํฐ ์ฝ๊ณ ์ถ๋ฐํ๋ค.
3) init.sh: ๋งค ์ธ์ ์ ๋์ผํ ๋ฐฉ์์ผ๋ก ๊ธฐ๋์ํค๋ ์ค์์น
์๋ฒ ๋์ฐ๊ธฐ, ์ด๊ธฐ ์ค์ , smoke test ๊ฐ์ โ๋งค๋ฒ ํด์ผ ํ์ง๋ง ์์ฃผ ๊น๋จน๋ ๊ฒโ์ ์คํฌ๋ฆฝํธ๋ก ๊ณ ์ ํ๋ค.
4) git history: ์ํ ํ์ /๋ณต๊ตฌ์ ๊ณต์ฉ ์ธ์ด
long-running์์๋ โํ์ฌ ์ํ๊ฐ ๋ญ์งโ๋ฅผ ๋น ๋ฅด๊ฒ ํฉ์ํ๋ ๊ฒ ์ค์ํ๊ณ , git์ด ๊ทธ ์ญํ ์ ํ๋ค.
๋ค์ ์ธ์
์ git log๋ฅผ ๋ณด๊ณ โ์ด๋๊น์ง ํ๋์งโ๋ฅผ ๋ฐ๋ก ํ์
ํ๋ค.
์ด์ ๋ค์ ์ง๋ฌธ์ผ๋ก ์์ฐ์ค๋ฝ๊ฒ ์ด์ด์ง๋ค.
artifact๋ฅผ ์ค๋นํ์ผ๋ฉด ๋์ผ๊น? ์ค์ ๋ก๋ โ์ด๋ป๊ฒ ๊ตด๋ฆฌ๋๋(๊ท์จ)โ๊ฐ ๋ ์ค์ํ์ง ์์๊น? ๋ง๋ค. ๊ทธ๋์ Anthropic์ harness๋ฅผ โ์ด์ ๊ท์นโ์ผ๋ก๋ ์ ์ํ๋ค.
harness ์ด์ ๊ท์น 4๊ฐ(โ์ค๋ ๋ฌ๋ฆฌ๊ธฐโ์ ๋ง์ถ ๊ท์จ)
๊ท์น 1) โ์์ฑโ์ ์ฃผ์ฅํ์ง ๋ง๊ณ , feature list๋ก ์ฆ๋ช
โ๋ค ๋์ต๋๋คโ๊ฐ ์๋๋ผ passes๊ฐ true๊ฐ ๋ ํญ๋ชฉ์ ํฉ์ผ๋ก ์์ฑ์ ์ ์ํ๋ค.
๊ท์น 2) ํ ์ธ์ ์ ํ๋์ฉ: incremental progress
โํฌ๊ฒ ํ ๋ฐฉ์โ๋ณด๋ค โ์๊ฒ ์์ฃผ๋ฅผ ๋ฐ๋ณตโํ๋ ๋ฐฉ์์ด ์ธ์
๋จ์ ์ ๊ฐํ๋ค.
์ธ์
์ด ๋๊ฒจ๋ ๋ค์ ์ธ์
์ด ๋ฐ๋ก ์ด์ด๋ฐ์ ์ ์๊ฒ ๋ง๋ ๋ค.
๊ท์น 3) ์ธ์ ์ข ๋ฃ๋ clean state(merge-ready)
์ธ์
์ ๋๋ผ ๋๋ โ๋ค์ ์ธ์
์ด ์ฒญ์๋ถํฐ ํ์ง ์๋๋กโ ์ ๋ฆฌ๋ ์ํ์ฌ์ผ ํ๋ค.
(์ฝ๋ ์ ๋, ํฐ ๋ฒ๊ทธ ์์, ์ต์ํ์ ๋ฌธ์ํ ๋ฑ)
๊ท์น 4) passes๋ E2E ๊ฒ์ฆ ํ์๋ง ๋ฐ๊พผ๋ค
ํต์ฌ์ โํ
์คํธ๋ฅผ ํ๋๊ฐโ๊ฐ ์๋๋ผ ํ์ค์ ์ธ ๊ฒ์ฆ ๋ฃจํ๊ฐ harness์ ๊ณ ์ ๋ผ ์๋๊ฐ๋ค.
๋ธ๋ผ์ฐ์ ์๋ํ ๊ฐ์ ๋๊ตฌ๊ฐ ์ฌ๊ธฐ์ ๋ค์ด์ค๋ฉด, ์ฌ๋์ด ํ๋ฏ end-to-end ๊ฒ์ฆ์ ์ํํ๊ธฐ๊ฐ ์ฌ์์ง๋ค.
์ด์ ๋ง์ง๋ง ์ฐ๊ฒฐ ์ง๋ฌธ์ด ๋จ๋๋ค.
๊ท์น์ โ์๊ณ โ ์๋ ๊ฒ๊ณผ, ๋งค ์ธ์ ๋ง๋ค โ์ค์ ๋กโ ์ ์ฉํ๋ ๊ฑด ๋ค๋ฅด์ง ์์๊น? ๊ทธ๋์ harness๋ โ์ฒดํฌ๋ฆฌ์คํธ(ํ๋กํ ์ฝ)โ๊น์ง ์ ๊ณตํ๋ ์ชฝ์ผ๋ก ๊ตฌ์ฒดํ๋๋ค.
๋งค ์ธ์ ์์ ๋ฃจํด(= harness๊ฐ ์ ๊ณตํ๋ ๊ธฐ๋ณธ ํ๋กํ ์ฝ)
์ธ์
์ด ๋ฐ๋๋ฉด ์์ด์ ํธ๋ ๊ธฐ์ต์ด ์๋ค. ๊ทธ๋์ ์์์ ๋ โ์ํ ๋ณต๊ตฌโ๋ถํฐ๋ค.
1) pwd 2) read claude-progress.txt 3) read feature_list.json 4) git log --oneline -20 5) init.sh ๋ก ์๋ฒ ๊ธฐ๋ 6) ๊ธฐ๋ณธ E2E smoke test 7) ๋ค์์ผ๋ก ๊ณ ์น feature 1๊ฐ ์ ํ โ ๊ตฌํ/๊ฒ์ฆ 8) git commit + progress ํ์ผ ์
๋ฐ์ดํธ
์ด ๋ฃจํด์ ๋ชฉ์ ์ ํ ๊ฐ์ง๋ค:
์ธ์ ์ด ๋๊ฒจ๋ ๋ค์ ์ธ์ ์ด ์ถ์ธก ๋์ ํ์ธ์ผ๋ก ์ถ๋ฐํ๊ฒ ๋ง๋ค๊ธฐ
์ต์ข ์์ฝ(7์ค)
- harness๋ ๋ชจ๋ธ์ด ์๋๋ผ ๋ชจ๋ธ์ โ์ผํ๋ ์์คํ โ์ผ๋ก ๋ง๋๋ ๋ฐํ์/์ค์บํด๋ฉ์ด๋ค.
- (๊ทธ๋ฆผ ๊ธฐ์ค) Model์ ์ ์ธํ Orchestration/Memory/Tools ๋ฉ์ด๋ฆฌ๋ฅผ harness๋ก ๋ณด๋ฉด ๋๋ถ๋ถ ๋ง๋ค.
- long-running์์๋ harness์ ๋ชฉํ๊ฐ ์ธ์ ๊ฐ ๋จ์ ์ ๋ฉ์ฐ๊ธฐ๋ก ํ์ฅ๋๋ค.
feature_list.json๋ก ์์ฑ ๊ธฐ์ค์ ์ ๊ณ ์ ํด ์กฐ๊ธฐ ์๋ฃ ์ ์ธ์ ๋ง๋๋ค.- ๋งค ์ธ์ ์ ํ๋์ฉ ์์ฃผํ๊ณ , ๋ฐ์ฏค ๋ง๋ ์ฑ ๋๊ธฐ์ง ์๋๋ค.
- ์ธ์ ์ข ๋ฃ๋ clean state + git commit + progress ๊ธฐ๋ก์ด ๊ธฐ๋ณธ์ด๋ค.
- passes๋ โํ๋ค๊ณ ์ฃผ์ฅโ์ด ์๋๋ผ E2E ๊ฒ์ฆ ํ์๋ง ๋ฐ๊พผ๋ค.