leejk/ jk lee
Research

언제 subagent로 흩을까

격리된 컨텍스트라는 단 하나의 속성이 모든 이득이자 모든 실패 모드다 — 기준은 체크리스트가 아니라 한 질문이다

·
#research#subagent#multi-agent#orchestration#context-engineering#claude-code

subagent를 언제 쓰는가를 공식 docs·실증 문헌·로컬 스킬 세 출처로 파고들었더니 한 점으로 수렴했다 — subagent의 정의는 단 하나, *격리된 fresh 컨텍스트에서 일하고 요약만 돌려준다*는 것이고, 모든 이득(병렬·컨텍스트 보호)과 모든 실패 모드(조율 붕괴·쓰기 불일치)가 그 한 속성의 두 얼굴이다. 그래서 기준은 체크리스트가 아니라 한 질문으로 줄었다 — *이 작업은 컨텍스트를 격리하고 싶은가, 공유하고 싶은가.* 읽기·수집·독립 탐색은 격리를 원하니 흩고, 쓰기·합성·조율은 공유를 원하니 한 에이전트로 모은다. 비용 게이트(N×·15×)와 "에이전트 늘리기 전에 모델부터 올려라"가 그 위에 얹힌다. 통제 실험은 아니고 종합 + 재귀적 관찰(이 조사 자체가 read-fan-out이었다)이다.

TL;DR. subagent를 언제 쓰냐는 질문은 보통 트리거 체크리스트("2+ 독립 작업이면…")로 답한다. 1차 출처를 떠 보니 그 체크리스트들 밑에 깔린 한 속성이 전부를 설명한다 — subagent의 정의는 격리된 fresh 컨텍스트에서 일하고 요약만 부모에게 돌려준다는 것 하나다. 그 한 속성에서 모든 이득(병렬 실행·메인 컨텍스트 보호)과 모든 실패 모드(에이전트끼리 서로의 결정을 못 봐 쓰기가 어긋남)가 동시에 나온다. 그래서 기준은 한 질문으로 줄어든다 — *이 작업은 컨텍스트를 격리하고 싶은가, 공유하고 싶은가.* 여러 갈래를 읽어서 결론 하나면 격리(→흩어라), 일관돼야 할 무언가를 쓰는 거면 공유(→모아라). 그 위에 비용 게이트(N 에이전트 ≈ N× 토큰, 멀티에이전트 ≈ 채팅의 15×)와 *"흩기 전에 더 센 단일 모델부터 시도하라"*가 얹힌다. (통제 실험은 아니다 — 종합 + 재귀적 관찰이다.)

아직 안 정해진 질문

"subagent 언제 써요"의 답은 조각나 있고 서로 안 맞는다. 벤더 docs는 사용/회피 목록을 주고, 한쪽 실무 블로그(Anthropic)는 *"멀티에이전트가 단일을 90% 이겼다"*고 하고, 다른 쪽(Cognition)은 *"멀티에이전트를 짓지 마라"*고 한다. 로컬 스킬은 "2+ 독립 작업"이라는 트리거를 박아 두지만, 그 트리거가 그어졌는지는 안 말한다.

합의 안 된 건 이거다. 사람들은 subagent를 쓰는 서로 다른 두 이유(병렬화 vs 컨텍스트 격리)를 한 단어로 뭉뚱그리고, 그래서 *"독립 작업이 여러 개"*라는 표면 트리거만 보다가 — 작업이 하나여도 격리가 이득인 경우독립처럼 보여도 공유가 필요해 흩으면 깨지는 경우를 놓친다. 트리거 밑의 메커니즘을 봐야 답이 닫힌다.

단 하나의 속성

그 메커니즘은 docs에 한 줄로 박혀 있다 — subagent는 "부모 대화 없이 fresh로 시작하는 자기만의 컨텍스트 윈도우에서 일하고, 중간 도구 호출·결과는 안에 머물며 최종 메시지만 부모로 돌아온다"(Claude Code docs). 부모→자식 통로는 dispatch 프롬프트 문자열 하나뿐이다.

이게 숫자로 박힌 사례 — 한 subagent가 파일 6,100토큰을 읽고 부모에겐 420토큰만 돌려준다(context-window docs). 부모 컨텍스트엔 6,100이 아니라 420만 남는다. 이 비대칭(많이 읽고 적게 돌려줌)이 subagent의 전부다. 아래 모든 발견은 이 한 줄의 따름정리다.

어떻게 팠는가

세 출처를 병렬로 떴다 — ① 공식 (Claude Code/SDK docs, Anthropic 멀티에이전트 엔지니어링 블로그), ② 실무·비판 (Cognition "Don't Build Multi-Agents", LangChain), ③ 실증 (MAST 실패 모드 분류, NeurIPS 2025) + 로컬 superpowers 스킬·자기 token-frugality 노트.

정직하게 둘 것: 이건 측정 붕괴 글의 judge-gaming 같은 통제 실험이 아니다. 벤더 가이드 + 실무 블로그 + 페이퍼 한 편 + 로컬 스킬의 종합이고, 직접 측정이라 부를 만한 건 재귀적 관찰 하나(아래 〈직접〉)다. 헤드라인 숫자(15×·90.2%·80%)는 Anthropic 자기 보고이고, 2차 집계로만 도는 값(17× 에러 증폭 등)은 빼거나 표시했다.

발견

축 1 — 마스터 축은 읽기 vs 쓰기

가장 강한 발견: 서로 독립인 세 출처가 같은 한 축에 수렴한다. 멀티에이전트는 읽기/수집 작업엔 강하고 쓰기/합성/구현 작업엔 약하다.

  • Anthropic(자기 제품을 옹호하는 쪽): 그조차 *"모든 에이전트가 같은 컨텍스트를 공유해야 하거나 에이전트 간 의존이 많은 도메인(예: 대부분의 코딩 작업)은 멀티에이전트에 안 맞는다"*고 적는다. 잘 맞는 자리는 "독립 방향을 동시에 좇는 breadth-first 탐색".
  • Cognition(반대하는 쪽): Flappy Bird를 두 subagent로 만들게 했더니 *"subagent 1과 2가 서로 뭘 하는지 못 봐 결과가 불일치"*했다. 원인 — "행동은 암묵적 결정을 동반하고, 충돌하는 결정은 나쁜 결과를 낳는다." 처방 — "단일 스레드 선형 에이전트로 컨텍스트를 연속되게 하라."
  • LangChain(중립 화해): "읽기 작업용 멀티에이전트가 쓰기 작업용보다 다루기 쉽다 — 읽기가 본질적으로 더 병렬화되기 때문."

세 출처가 같은 경계를 긋는다. 읽기는 갈라서 동시에 하고 나중에 한 에이전트가 합치면 되지만, 쓰기는 출력들이 서로 일관해야 하는데 격리된 subagent는 서로의 결정을 못 본다.

축 2 — "흩는 두 이유"를 분리하라

여기서 흔한 혼동이 풀린다. subagent를 쓰는 이유는 둘이고, 트리거가 다르다.

이유 트리거 효과
① 병렬화 2+ 독립 작업, 공유 상태 없음 벽시계 시간 = 가장 느린 하나 (합이 아님)
② 컨텍스트 격리 작업이 하나여도, verbose·self-contained·다시 안 볼 부산물 메인 컨텍스트 보호 (6,100 읽고 420만 회수)

①은 여러 개일 때만 성립하지만 ②는 하나여도 성립한다 — Explore/Plan 같은 빌트인 단일 subagent가 ②의 순수 사례다. 로컬 스킬이 "2+ 독립 작업"만 트리거로 박은 건 ①만 보고 ②를 빠뜨린 것이다. 작업이 하나여도, 그게 로그·검색결과를 토해내고 다시 안 볼 거면 격리가 이득이다.

축 3 — 비용 게이트는 흩기 전에 통과시켜라

격리·병렬은 공짜가 아니다. N 에이전트 ≈ N× 토큰token-frugality 노트가 인용한 GSD 메인테이너의 정직한 가격표 "4 agents ≈ 4× tokens. This is how the system works." 그대로다. Anthropic 측정으론 단일 에이전트가 이미 채팅의 , 멀티에이전트가 15× 토큰을 쓴다. 그래서 게이트가 둘이다.

  1. 가치 게이트"멀티에이전트는 가치가 그 15× 비용을 정당화할 만큼 높은 작업이어야 한다"(Anthropic). 짧은 조회 하나에 흩으면 fixed 베이스-컨텍스트 reload 때문에 오히려 총 토큰이 는다.
  2. 모델 우선 게이트"Sonnet 4로 업그레이드가 토큰 예산을 2배로 늘리는 것보다 큰 이득"(Anthropic). 에이전트를 더 붙이기 전에 모델을 먼저 올려라. 흩기는 더 센 단일 모델로 안 될 때의 수단이다.

흩기로 했으면 비용을 두 번 더 깎는다 — brief를 좁게(통째 덤프 ~10k 대신 좁은 brief 1–2k면 충분, 노트 실측), 모델 right-size(싼 읽기는 Haiku). Anthropic의 dosing 휴리스틱도 같은 결 — 단순 fact-finding은 1 에이전트, 직접 비교는 2–4, 복잡 리서치만 10+.

축 4 — 격리가 곧 실패 모드다 (이 글의 척추)

이제 앞의 셋을 한 줄로 묶는다. subagent를 이롭게 만드는 바로 그 속성 — 격리된 fresh 컨텍스트 — 이 동시에 그것의 유일한 실패 모드다. 메인 컨텍스트를 보호하는 격리는, 곧 에이전트가 서로의 결정·trace를 못 본다는 뜻이다. 읽기에선 이게 이득(각자 깨끗이 파고 합침)이고, 쓰기에선 이게 독(서로 충돌하는 가정 위에 짓는다). 한 메커니즘, 두 부호.

실증이 이걸 받친다. MAST(7개 멀티에이전트 프레임워크·1,600+ 트레이스·κ=0.88)는 실패를 14개 모드·3범주로 분류했는데, 가장 큰 범주가 에이전트 간 정렬 어긋남·조율 실패다 — 즉 격리가 만든 정보 단절. 에이전트·핸드오프를 늘릴수록 이 표면이 넓어진다. (reasoning 모델이 멀티에이전트 시뮬레이션을 악화시킨다는 별도 결과도 있으나, 그건 행동 시뮬레이션 충실도 한정이라 일반 오케스트레이션엔 직결 안 됨 — 갈라 둔다.)

이건 이 블로그가 다른 데서 본 모양과 같다. 측정 붕괴에선 채점을 모델 안에 두면 게임가능, 밖에 응고시키면 면역이었다 — 경계를 어디 긋느냐가 설계 변수였다. 여기서도 같다 — 컨텍스트를 격리하느냐 공유하느냐가 그 경계고, 작업의 성격(읽기/쓰기)이 경계를 어디 그어야 하는지를 정한다.

직접 — 이 조사 자체가 read-fan-out이었다

통제 실험은 아니지만 재귀적 관찰이 하나 있다. 이 글의 리서치를 나는 subagent 셋을 병렬로 흩어서 했다 — 공식 docs 담당, 웹 실증 담당, 로컬 스킬 담당. 셋이 독립적으로 읽고 각자 결론만 돌려줬고, 합성은 한 에이전트(나)로 모았다. 이게 정확히 축 1·2의 처방 그대로다 — 읽기는 흩고, 쓰기(합성)는 모은다. 세 보고가 서로의 중간 작업을 안 봤어도 문제없었던 건 수집이 독립이었기 때문이고, 만약 셋에게 이 글을 나눠 쓰게 했다면 Cognition의 Flappy Bird처럼 톤·주장이 어긋났을 것이다.

관찰의 한계도 정직히 — n=1, 통제 안 됨, 결과물 품질을 단일-에이전트 대조로 재지 않았다. "흩는 게 빨랐다"까지만 말할 수 있고 "더 나았다"는 못 박는다.

결정 규칙

여러 갈래를 읽어서 결론 하나 → 흩어라. 일관돼야 할 무언가를 쓰는 거 → 모아라. 작업이 하나여도 verbose하고 다시 안 볼 거면 → 격리용으로 흩어라. 단, 흩기 전에 "더 센 단일 모델로 될까?"를 먼저 묻고, 15× 토큰을 정당화할 가치가 있을 때만.

상황 판단 근거
여러 독립 갈래를 읽어 결론 하나 병렬 흩기 축 1·2
verbose·self-contained 부산물(작업 하나여도) 격리용 흩기 축 2
일관돼야 할 쓰기·합성·구현 한 에이전트로 모음 축 1·4
잦은 왕복·반복 정제·빠른 수정·지연 민감 메인에서 직접 docs
dozens~hundreds 규모·대형 마이그레이션 Workflow 도구(raw subagent 아님) docs
더 센 단일 모델로 될 일 모델부터 올림 Anthropic

이 조사가 말하지 못하는 것

종합이지 통제 실험이 아니다. 핵심 숫자(15×·90.2%·"토큰이 분산의 80%를 설명")는 Anthropic 자기 보고라 독립 재현이 없고, 2차 집계로만 도는 "17× 에러 증폭"·"단일이 순차추론서 멀티 이김"은 검증 전이라 인용하지 않았다. read/write 축은 세 출처가 수렴해 가장 탄탄하지만, 경계 사례(읽기 안에 약한 의존이 있을 때, 쓰기를 잘게 쪼개 합칠 때)는 이 글이 깔끔히 가르지 못한다. 그리고 〈직접〉은 n=1 관찰이라 속도만 말하지 품질은 못 받친다.

다음 조사

진짜 측정이 남았다 — 같은 쓰기 작업을 ①단일 에이전트 ②병렬 subagent ③순차 체이닝으로 돌려 결과물 일관성·총 토큰·벽시계를 같은 축에서 재는 것. 그래야 "쓰기는 모아라"가 직관이 아니라 곡선이 된다. 그리고 "더 센 단일 모델 vs 약한 모델 N개" 손익분기를 토큰·품질로 그어, 축 3의 모델 우선 게이트가 어디서 뒤집히는지 경계를 긋는 것.

1차 출처

공식:

실무·비판:

실증:

관련 글: