하네스 엔지니어링이란 AI가 일하는 환경 전체를 설계하는 것
하네스는 모델을 감싸 일을 시키는 구조 전체입니다. 무엇을 알려주고(맥락), 누가 만들고 채점하며(역할·기준), 어떤 도구를 제공할지 설계한 환경입니다. 모델은 그 안에서 작동하는 엔진 하나일 뿐입니다.
말의 (근육, 속도)는 AI 모델에 해당합니다.
말에게 씌우는 마구, 달리는 길, 신호 체계는 하네스에 해당합니다.
아무리 좋은 말이라도 올바른 마구 없이는 원하는 방향으로 달리지 못합니다. AI도 마찬가지입니다.
아무리 똑똑한 신입사원도 업무 매뉴얼 없이 첫날부터 혼자 일하면 실수투성이입니다.
업무 범위, 보고 체계, 사용 도구, 금지 사항을 정리해 둔
온보딩 시스템 전체가 바로 하네스입니다.
AI에게 "이렇게 일해"라고 알려주는 회사 시스템이 곧 하네스입니다.
LLM은 코어, 하네스는 코어를 감싸는 업무 환경
핵심: LLM은 엔진이고, 하네스는 엔진을 업무에 투입하는 운전석·계기판·도로·안전장치입니다.
Claude, GPT, Gemini 같은 모델은 하네스 안에서 돌아가는 엔진입니다.
Role
기획자, 생성자, 평가자
Rubric
합격 기준과 검증 장치(테스트·린터·평가 에이전트)
Context
지식 제공, 세션 간 인수인계(메모리), 저장소 정리
Tools
MCP, 스킬, 플러그인, 파일 접근
Workflow
계획 → 실행 → 검증 → 수정의 피드백 루프
Guardrail
권한, 보안, 승인, 금지 사항, 아키텍처 제약
하네스 엔지니어링을 하나의 공식으로 묶으면 이렇습니다. 모델은 출발점일 뿐, 여섯 요소를 하나씩 더할수록 같은 모델의 결과가 좋아집니다.
이 페이지는 ① 역할 분리 · ② 평가 기준 · ③ 컨텍스트 관리(인수인계)를 깊게 다루고, ④ 도구 · ⑤ 작업 절차 · ⑥ 가드레일은 다음 장으로 다루어집니다.
"장기 실행 앱 개발을 위한 하네스 설계"에서 Anthropic은 하네스 없이 AI에게 긴 작업을 맡겼을 때 반복적으로 나타나는 두 가지 근본 문제를 짚었습니다.
자기 결과물을 스스로 채점하면 항상 후하게 나옵니다
자신이 생성한 작업물을 평가하라고 하면, 에이전트는 자신감 있게 칭찬하는 경향을 보입니다. 인간 관찰자에게는 품질이 명백히 평범한 수준인데도 말입니다.
학생이 자기 시험지를 직접 채점하면 점수가 후하게 나오는 것과 같습니다.
긴 작업 도중에 품질을 낮춰 조기 종료합니다
모델은 긴 작업에서 컨텍스트 윈도우가 차오르면 일관성을 잃습니다. 일부 모델은 "컨텍스트 불안"을 보이며, 한계에 가까워졌다고 인지하면 작업을 조기에 마무리해 버립니다.
10페이지짜리 보고서를 요청했는데 7페이지에서 갑자기 "이상 마치겠습니다"라고 종료하는 셈입니다.
원문 기준으로 이 현상은 Sonnet 4.5에서 두드러졌고, Opus 4.5부터는 거의 사라졌습니다. 그래서 Anthropic도 이후 하네스에서는 컨텍스트 리셋을 뺐습니다.
"만드는 사람"과 "검토하는 사람"은 반드시 분리해야 합니다. 만드는 AI(Generator·생성자)와 평가하는 AI(Evaluator·채점자)를 따로 두고, 합격 기준(Rubric)을 채점자가 외부에서 쥔 채 냉정하게 채점하게 만듭니다.
작업 기억(컨텍스트 윈도우)에는 필요한 것만 넣습니다. 최신 모델은 한 세션을 길게 이어 가고, 스킬과 도구는 설명만 먼저 보여 준 뒤 필요할 때 전체를 불러옵니다(점진적 공개). 모델이 조기 종료를 보이면 그때 컨텍스트를 비우고, 교대 근무자에게 인수인계서를 전달하듯 이전 상태를 구조화된 MD 파일로 인계해 새 세션을 시작합니다(컨텍스트 리셋).
네덜란드 미술관 웹사이트 디자인
"이 디자인 괜찮아?"라는 주관적 질문을 점수로 바꾼 결과
Anthropic은 Generator-Evaluator 구조로 랜딩 페이지를 반복 개선했습니다. 9회차까지 전형적인 다크 테마였던 페이지가, 10회차에서 CSS perspective로 구현된 3D 공간 네비게이션으로 완전히 바뀌었습니다. 체크무늬 바닥, 벽에 걸린 작품, 문을 통한 페이지 이동까지 포함된 공간적 경험입니다.
출처: Anthropic Engineering Blog
"첫 번째 반복에서도, 아무런 기준 없이 만든 결과물보다 눈에 띄게 나은 품질이 나왔습니다. 채점 기준의 문구 자체가 결과물의 성격을 직접 형성합니다."
어떻게 가능했는가: 두 원칙의 적용
역할 분리
만드는 AI와 채점하는 AI를 완전히 분리한다
- Generator는 만들고, Evaluator는 Playwright MCP로 실제 페이지를 클릭하며 확인한 뒤 채점
- 채점 기준은 4가지 (디자인 품질, 독창성, 완성도, 기능성). 모델이 약한 디자인 품질과 독창성에 가중치를 더 두었습니다
- 5~15회 반복하며 개선
컨텍스트 관리
다음 회차에는 채점 결과만 골라 인계한다
- Evaluator가 항목별 점수와 상세 비평을 작성
- 그 비평이 다음 회차 Generator의 입력으로 들어감
- 아래 실습 프롬프트에서는 이 인계를 page.html과 score.md 파일로 설계했습니다
아래 역할표와 프롬프트는 원문 구조를 실습용으로 옮긴 것입니다. 채점 기준은 처음 해 보는 사람도 판단하기 쉬운 항목(시각적 계층, 색상 일관성, 여백, CTA 명확성)으로 바꿨습니다.
채점 기준에 맞춰 페이지를 만들고, 부족한 항목만 다시 고친다
- 입력디자인 브리프 + 직전 회차의 score.md
- 출력page.html (단일 HTML 파일)
- 임무9.5점 미만 항목만 골라 다시 작성
- 안 함자기 결과물 채점, 점수 변경
실제 페이지를 열어보고 4가지 기준으로 냉정하게 점수를 매긴다
- 입력page.html (Generator가 방금 만든 결과)
- 출력score.md (점수표 + 개선 사항)
- 임무시각적 계층, 색상 일관성, 여백, CTA 명확성을 각 10점으로 평가
- 안 함코드 직접 수정, 다음 회차 만들기
프롬프트 예시
간략 버전으로 간단하게 실습을 하고, 상세 버전으로 설계하세요
# 이 프롬프트가 하려는 일 랜딩 페이지 한 장을 자동으로 디자이너 수준까지 끌어올린다. 같은 AI에게 만들기와 채점을 모두 맡기면 자기 결과에 후해지는 문제가 있다. 그래서 두 역할을 나눈다. 만드는 Generator, 채점하는 Evaluator. # 등장 인물 Generator (제작자) · 입력: 디자인 브리프 + (있으면) 직전 회차 채점표 · 출력: 단일 HTML 파일 한 페이지 · 임무: 4가지 채점 항목을 모두 9.5점 이상으로 끌어올리기 · 안 함: 자기 결과 채점, 점수 임의 변경 Evaluator (채점자) · 입력: 방금 Generator가 만든 HTML · 출력: 항목별 점수 + 개선 사항 · 임무: 냉정하게 채점하되 점수보다 개선 사항을 먼저 적기 · 안 함: 코드 직접 수정, 다음 회차 만들기 # 합격 기준 (각 10점 만점) 1. 시각적 계층: 제목·본문·소제목이 한눈에 구분되는가 2. 색상 일관성: 주조색 1개·보조색 1개만 일관되게 쓰는가 3. 여백 활용: 요소 간 간격이 충분한가 4. CTA 명확성: "다음 행동" 버튼이 눈에 띄는가 # 입력 디자인 브리프: (한두 문장) # 진행 순서 한 회차 = Generator 출력 → Evaluator 출력. 2회차부터 Generator는 직전 채점표에서 9.5점 미만 항목만 손본다. 나머지는 절대 건드리지 않는다. # 종료 조건 4개 항목 모두 9.5점 이상이면 종료. 아니면 다음 회차로. 최대 5회까지.
# 이 프롬프트가 하려는 일 랜딩 페이지 한 장을 자동으로 디자이너 수준까지 끌어올린다. 간략 버전과 달리, Claude Code의 Task 도구로 Generator와 Evaluator를 별도의 서브에이전트로 띄운다. 두 에이전트는 매 회차 새 컨텍스트에서 시작하고, 같은 메시지 창에서 대화하지 않고 파일로만 주고받는다. # 작업 디렉토리 ./design-loop/ ├─ page.html (Generator의 출력) └─ score.md (Evaluator의 출력) # 합격 기준 (각 10점 만점, 총 40점) 1. 시각적 계층: 제목·소제목·본문의 크기·굵기가 명확히 구분되는가 2. 색상 일관성: 주조색 1개, 보조색 1개만 사용하는가 3. 여백 활용: 요소 간 간격이 충분히 확보되어 있는가 4. CTA 명확성: 행동 유도 버튼이 눈에 띄는 위치에 있는가 # 입력 디자인 브리프: (한두 문장으로 무엇을 위한 페이지인지) # 메인 에이전트 절차 (최대 10회) 회차마다 다음 3단계를 순서대로 수행한다. 1. Task 도구로 generator-agent를 호출한다. 입력: 디자인 브리프 + (있으면) ./design-loop/score.md 산출물: ./design-loop/page.html 2. Task 도구로 evaluator-agent를 호출한다. 입력: ./design-loop/page.html 산출물: ./design-loop/score.md 3. score.md를 읽는다. 모든 항목이 9.5점 이상이면 STATUS: COMPLETED를 선언하고 종료. 아니면 다음 회차로 넘어간다. # generator-agent 시스템 프롬프트 너는 랜딩 페이지를 만드는 Generator다. - 디자인 브리프를 읽는다. 직전 score.md가 있으면 함께 읽는다. - 4가지 합격 기준을 목표로 단일 HTML 파일을 ./design-loop/page.html에 저장한다. - 직전 score.md가 있으면 9.5점 미만 항목만 수정한다. 나머지는 절대 건드리지 않는다. - 수정한 영역에는 다음 주석을 단다. /* 수정 (N회차): [항목명] - [변경 내용] */ # evaluator-agent 시스템 프롬프트 너는 랜딩 페이지를 채점하는 Evaluator다. - ./design-loop/page.html을 실제 브라우저로 열어서 본다. - 4가지 항목을 각 10점 만점으로 채점하고, 결과를 ./design-loop/score.md에 다음 형식으로 기록한다. | 회차 | 시각적 계층 | 색상 일관성 | 여백 활용 | CTA 명확성 | 총점 | | N | X점 | X점 | X점 | X점 | XX점 | 표 다음에 9.5점 미만 항목별로 "무엇이 부족한가, 무엇을 바꿔야 하는가"를 구체적으로 적는다. - 9점 이상은 거의 완벽할 때만 준다. 점수보다 개선 사항을 먼저 적는다. - 코드를 직접 수정하지 않는다.
브라우저 기반 DAW (디지털 오디오 워크스테이션)
"이 앱이 실제로 작동하는가"라는 질문을 PASS/FAIL로 바꾼 결과
단순화된 3-Agent 하네스 (Planner, Generator & Evaluator)로 브라우저에서 돌아가는 DAW를 만들었습니다. 어레인지먼트 뷰, 믹서, 트랜스포트가 모두 포함되어 있고, AI가 프롬프트로 간단한 곡을 자동 작곡하는 기능까지 들어 있습니다.
출처: Anthropic Engineering Blog
풀스택 앱은 디자인보다 한 단계 더 복잡합니다. Anthropic은 사례 1의 2-Agent 구조에 Planner(기획자)를 추가해 3-Agent로 확장했습니다. 첫 버전(Opus 4.5)은 일을 스프린트로 나누고, 스프린트마다 "무엇이 완료인지"를 먼저 합의했습니다. DAW는 Opus 4.6에서 이 구조를 단순화한 버전으로 만들었습니다. 스프린트를 없애고, Planner와 Evaluator만 남겼습니다.
역할 분리
Planner를 더해 만들기·검증·기획을 모두 분리한다
- Planner가 1~4문장 브리프를 완전한 기획서로 확장
- Generator가 기획서대로 코드 작성, Evaluator가 실제 사용자처럼 앱을 테스트
- Evaluator는 합격/불합격을 판정만 한다 (구현은 안 함)
- Planner를 빼자 Generator가 범위를 좁게 잡아 기능이 적은 앱을 만들었기 때문에 남겼습니다
컨텍스트 관리
리셋 없이 한 세션으로 이어 간다
- 컨텍스트 리셋을 쓰지 않고 빌드 전체를 한 세션으로 진행, 늘어나는 컨텍스트는 자동 압축(compaction)이 처리
- Generator는 스프린트 분할 없이 2시간 넘게 일관되게 작업
- 스프린트 계약은 첫 버전에서만 썼습니다. 스프린트마다 Generator가 만들 것과 검증 방법을 제안하고 Evaluator가 검토해 합의했으며, 이 합의는 파일로 주고받았습니다
사례 1의 2-Agent 구조에 Planner를 더해, 기획·제작·검증을 모두 다른 에이전트로 띄웁니다. 아래 역할표와 프롬프트는 원문 구조를 실습용으로 옮긴 것이고, plan.md와 feedback.md는 실습을 위해 정한 파일 이름입니다.
시작 전에 "무엇이 성공인지" 합격 기준을 먼저 합의한다
- 입력1~4문장의 짧은 브리프
- 출력plan.md (기획서 + 합격 기준)
- 임무"좋아 보인다" 대신 PASS/FAIL로 판정 가능한 기준 설계
- 안 함코드 작성, 합격 판정
기획서대로 앱을 짜고, 직전 피드백에서 FAIL인 항목만 고친다
- 입력plan.md + 직전 회차의 feedback.md
- 출력동작하는 앱 코드
- 임무합격 기준 항목을 PASS로 바꾸는 데 집중
- 안 함합격 기준 변경, 자기 코드 판정
실제 사용자처럼 앱을 써보고 PASS/FAIL을 판정한다
- 입력Generator가 방금 만든 동작하는 앱
- 출력feedback.md (기준별 PASS/FAIL + 근거)
- 임무합격 기준대로 사용자처럼 동작 검증
- 안 함코드 수정, 합격 기준 변경
| 단계 | 소요 시간 | 비용 |
|---|---|---|
| 기획 (Planner) | 4.7분 | $0.46 |
| 1차 Build (Generator) | 2시간 7분 | $71.08 |
| 1차 QA (Evaluator) | 8.8분 | $3.24 |
| 2차 Build (Generator) | 1시간 2분 | $36.89 |
| 2차 QA (Evaluator) | 6.8분 | $3.09 |
| 3차 Build (Generator) | 10.9분 | $5.88 |
| 3차 QA (Evaluator) | 9.6분 | $4.06 |
| 합계 | 약 3시간 50분 | $124.70 |
Build 횟수가 거듭될수록 소요 시간과 비용이 급격히 줄어들었습니다. 3차 Build는 1차와 비교하면 시간은 1/12, 비용도 1/12 수준으로 끝났습니다. Evaluator가 남은 문제만 정확히 짚어주었기 때문입니다.
모델이 좋아져도 Evaluator는 라운드마다 빠진 기능을 찾아냈습니다. 타임라인의 클립을 끌어 옮길 수 없다는 점, 녹음 버튼이 실제로 마이크를 쓰지 않는다는 점 같은 문제입니다. 모델 혼자 안정적으로 하기 어려운 부분일수록 검증을 분리하는 효과가 큽니다.
프롬프트 예시
간략 버전으로 간단하게 실습을 하고, 상세 버전으로 설계하세요
# 이 프롬프트가 하려는 일 브라우저에서 동작하는 풀스택 앱을 자동으로 만든다. "좋아 보인다"라는 주관에서 벗어나 PASS/FAIL로 판정 가능한 합격 기준을 먼저 합의하고, 그다음에 만들기와 검증을 반복한다. # 등장 인물 Planner (기획자) · 입력: 1~4문장의 짧은 앱 브리프 · 출력: 측정 가능한 합격 기준 5개 이상이 적힌 기획서 · 임무: "좋아 보인다" 대신 PASS/FAIL로 판정 가능한 기준 설계 · 안 함: 코드 작성, 합격 판정 Generator (제작자) · 입력: 기획서 + (있으면) 직전 회차 피드백 · 출력: 동작하는 단일 HTML 앱 · 임무: 합격 기준 항목을 PASS로 바꾸기 · 안 함: 합격 기준 변경, 자기 코드 판정 Evaluator (채점자) · 입력: 방금 Generator가 만든 앱 · 출력: 기준별 PASS/FAIL + 근거 · 임무: 실제 사용자처럼 앱을 써보고 기준대로 판정 · 안 함: 코드 수정, 합격 기준 변경 # 입력 앱 브리프: (한두 문장) # 진행 순서 (최대 3회차) 1회차에만 Planner를 호출한다. · Planner: 측정 가능한 합격 기준 5개 이상을 작성. 주관적 표현 금지. · Generator: 합격 기준을 만족하는 단일 HTML 앱을 출력. · Evaluator: 기준별 결과를 | 기준 | 판정 | 근거 | 표로 출력. 점수보다 근거를 먼저 적는다. 2회차부터: · Generator: 직전 회차에서 FAIL인 기준만 손본다. 나머지는 그대로 둔다. · Evaluator: 다시 판정한다. # 종료 조건 모든 기준 PASS면 종료. 아니면 다음 회차로. 최대 3회까지.
# 이 프롬프트가 하려는 일 브라우저에서 동작하는 풀스택 앱을 PASS/FAIL 기반으로 자동 구축한다. "이게 정말 작동하는가"를 측정 가능한 합격 기준으로 바꾼 뒤, Claude Code의 Task 도구로 Planner / Generator / Evaluator를 별도 서브에이전트로 띄운다. 세 에이전트는 매 단계 새 컨텍스트에서 시작하고, 같은 메시지 창에서 대화하지 않고 파일로만 주고받는다. # 작업 디렉토리 ./app-build/ ├─ plan.md (Planner의 기획서 + 합격 기준) ├─ code/ (Generator의 앱 코드) └─ feedback.md (Evaluator의 PASS/FAIL + 근거) # 입력 앱 브리프: (한두 문장) # Phase 1. 기획·합의 (최대 3회) 구현을 시작하기 전에 합격 기준을 먼저 굳힌다. 1. Task 도구로 planner-agent를 호출한다. 입력: 앱 브리프 산출물: ./app-build/plan.md 2. Task 도구로 evaluator-agent를 호출해 plan.md를 검토한다. 합격 기준이 측정 가능하면 plan.md 하단에 STATUS: APPROVED 추가. 아니면 1번으로 돌아가서 기준을 다시 작성한다. # Phase 2. 구현·검증 (최대 N회차) 기준이 굳어지면 그제서야 코드를 만들기 시작한다. 회차마다 다음 3단계를 순서대로 수행한다. 1. Task 도구로 generator-agent를 호출한다. 입력: plan.md + (있으면) feedback.md 산출물: ./app-build/code/ 2. Task 도구로 evaluator-agent를 호출한다. 입력: plan.md + ./app-build/code/ 산출물: ./app-build/feedback.md 3. feedback.md를 읽는다. 모든 기준이 PASS면 STATUS: COMPLETED를 추가하고 종료. 아니면 다음 회차로. # planner-agent 시스템 프롬프트 너는 앱 기획자다. 1~4문장 브리프를 받아 plan.md를 작성한다. - 합격 기준은 번호가 매겨진 측정 가능한 조건 5개 이상. - 주관적 표현 금지. ("좋아 보인다" X, "버튼 클릭 시 X 발생" O) - 기술 제약과 우선순위도 함께 명시한다. # generator-agent 시스템 프롬프트 너는 코드 작성자다. plan.md만을 진실의 원천으로 보고 ./app-build/code/에 앱을 작성한다. - (있으면) 직전 feedback.md에서 FAIL인 기준 번호만 수정한다. 나머지는 절대 건드리지 않는다. - 수정한 영역에는 변경 내용을 코드 상단 주석으로 명시한다. # evaluator-agent 시스템 프롬프트 너는 검증자다. plan.md의 합격 기준만을 근거로 ./app-build/code/를 판정한다. - 실제 코드를 실행하거나 브라우저로 열어서 확인한다. - 결과를 feedback.md에 다음 형식으로 기록한다. | 기준 번호 | 판정 (PASS/FAIL) | 근거 | - 근거는 재현 가능하게 구체적으로 적는다. - 코드를 직접 수정하지 않는다.
이 페이지의 모든 인용문, 이미지, 동영상, 데이터 테이블은 위 Anthropic 원문에서 발췌한 것입니다. 실습용 역할표와 프롬프트는 원문 구조를 옮겨 이 가이드가 작성했습니다.
본 자료는 교육 및 강의 목적으로 정리되었으며, 원문의 저작권은 Anthropic에 있습니다.
하네스 설계, 직접 해보세요
Anthropic이 증명한 핵심은 이것입니다. 같은 모델이라도 하네스가 다르면 결과가 완전히 달라집니다.
CLAUDE.md, 스킬, 훅, MCP로 여러분만의 하네스를 만들어 보세요.