상용 LLM 서비스의 실제 멀티에이전트 조직화

우리는 흔히 강의나 이론서에서 Supervisor, Hierarchical, Network, Subgraph 같은 깔끔한 에이전트 패턴을 배웁니다. 이론적으로는 완벽해 보이지만, “실제 대규모 트래픽을 감당하는 프로덕션 환경에서도 이 패턴이 그대로 쓰일까?”라는 의문이 남습니다.

오늘은 실제 운영되고 있는 유명 LLM 기반 코딩 어시스턴트 서비스(이하 ‘서비스 X’)의 공개된 아키텍처 문서를 바탕으로, 실무진들이 컨텍스트 폭발 문제역할 전문화를 어떻게 해결했는지 그 핵심 트레이드오프와 설계 결정을 파헤쳐 봅니다.

0. 왜 이론과 실무는 다를까?

이론적인 Supervisor 패턴은 깔끔하지만, 실무에서 그대로 적용하면 메인 에이전트의 컨텍스트 윈도우(Context Window)가 순식간에 폭발하는 치명적인 한계가 있습니다. 수많은 파일의 코드를 읽고 분석하는 코딩 어시스턴트의 특성상, 중간 과정의 모든 메시지를 메인이 들고 있으면 비용도 기하급수적으로 늘고 모델의 추론 능력도 흐려지기 때문입니다.

서비스 X는 이 문제를 해결하기 위해 ‘격리와 요약’이라는 고도의 설계 전략을 선택했습니다.

1. 핵심 구조: Orchestrator와 Subagent

서비스 X의 전체적인 아키텍처는 메인 에이전트가 오케스트레이터(Orchestrator) 역할을 하고, 특정 작업에 특화된 서브 에이전트(Subagent)들을 도구(Tool) 형태로 호출하는 구조입니다.

  • 메인 에이전트의 컨텍스트가 폭발하지 않게 하려면?
  • 같은 도메인 작업을 어떻게 전문화할까?
  • 왜 어떤 작업은 main 에이전트가 하고, 어떤 건 sub-agent 에 위임할까?

1-1. 핵심 구조 (한 그림)

        ┌─────────────────────────┐
        │   메인 에이전트          │   ← 사용자와 직접 대화
        │   (Orchestrator)        │     긴 컨텍스트 유지
        └──┬─────┬─────┬─────┬───┘
           │     │     │     │
           ▼     ▼     ▼     ▼      Task 도구로 subagent 호출
       ┌────┐┌────┐┌────┐┌────┐
       │Sub │ Sub │ Sub │ Sub │     각자 독립 컨텍스트
       │ A  ││ B  ││ C  ││ D  │     역할별 전문화
       └─┬──┘└─┬──┘└─┬──┘└─┬──┘     완료 시 요약만 반환
         │    │    │    │
         └────┴────┴────┘
              ↓
        결과 요약 (몇 줄)
              ↓
        메인 에이전트 (요약 받음, 풀 트랜스크립트 X)

1-2. 핵심 결정 5 가지

설계 결정이유
Task 라는 단일 도구로 subagent 호출메인 입장에선 도구 1개 호출. 상세 협업 흐름은 도구 안에 캡슐화
Subagent 는 독립 컨텍스트메인의 메시지 히스토리를 안 봄. 컨텍스트 오염 방지
Subagent 는 요약만 반환메인의 컨텍스트 윈도우 절약 (subagent 가 100 메시지 써도 메인엔 5 줄 요약만 들어옴)
Subagent 별 역할 (전문화)“탐색”, “계획”, “보안 리뷰” 처럼 명시적 분업
읽기 전용 vs 쓰기 권한 분리위험 도구 (파일 수정·git 커밋) 는 메인만, 읽기 (코드 검색·문서 fetch) 는 subagent

서브 에이전트들이 내부적으로 소모한 메시지는 총 130+개가 넘지만, 메인 에이전트의 컨텍스트에는 도구 호출 4개와 요약본 4개만 남습니다. 이 방식을 통해 컨텍스트를 90% 이상 절약하면서도 복잡한 미션을 완수합니다.

1-3. 실제 동작 시나리오 (재구성)

사용자: "tests/ 디렉토리의 실패하는 테스트 모두 찾아서 fix 해줘"

메인 에이전트의 결정:
  "테스트 결과 수집 + 실패 원인 분석 + 코드 수정 — 단계별로"

1. Task("Explore", "tests/ 의 모든 *.test.ts 찾기")
   ↓
   [Subagent A] 50 개 파일 탐색·읽기·분석 → 100 메시지
   ↓ 메인엔 "5 개 실패 테스트 발견 (auth, payment, ...)" 만 반환

2. Task("Plan", "위 5 개 실패 케이스의 fix 계획")
   ↓
   [Subagent B] 코드 분석·관계 추적 → 30 메시지
   ↓ 메인엔 "fix 계획: A→B→C 순서 / 각 단계 5 분 소요" 만 반환

3. 메인이 직접 파일 수정 (쓰기 도구는 메인 권한)

4. Task("Verify", "수정된 테스트 다시 실행")
   ↓
   [Subagent C] 테스트 실행·로그 분석
   ↓ 메인엔 "5/5 통과" 반환

메인 에이전트의 컨텍스트엔 도구 호출 4 개 + 요약 4 개만.
실제 작업은 100+ 메시지 분량이지만 컨텍스트 절약 90%+.

접기

1-4. 실제 등록된 Subagent 카탈로그 (예시)

서비스 X 가 메인 에이전트에서 호출 가능한 subagent 들의 실제 카탈로그 (재구성). 메인은 Task(subagent_type=..., prompt=...) 한 도구로 이 중 하나를 골라 호출.

subagent_type역할허용 도구호출 시점
general-purpose범용 멀티스텝 (광범위 검색·종합)전체 도구키워드 / 파일 위치를 자신 없을 때, 여러 단계 reasoning 필요할 때
Explore빠른 read-only 검색 — 파일·심볼 grepRead / Grep / Glob / WebFetch / Bash (read-only)“X 정의 어디?”, “Y 참조하는 파일?” 같은 위치 추적
Plan소프트웨어 아키텍트 — 구현 전 설계모든 read 도구 + 분석 (Edit/Write 금지)기능 추가 / 리팩토링 전 단계별 계획 + 트레이드오프 분석
claude-code-guideClaude Code 자체 사용법 Q&A 도우미Bash / Read / WebFetch / WebSearch“이 CLI 의 hooks·MCP·slash command 어떻게?” 식 도구 자체 질문
statusline-setup사용자 status line 설정 마법사Read / Edit (settings.json 만)상태바 커스터마이징 요청 시에만

핵심 관찰:

  • general-purpose = 디폴트 fallback — 메인이 어떤 도메인인지 못 정할 때
  • Explore 는 “검색만” — 크지만 빠른 문맥 윈도우 (수많은 파일 빠르게 훑되 cat-n 관점이라 깊이는 얕음)
  • Plan 은 “쓰기 금지” — 메인이 직접 쓰기 권한 (위험 도구 분리 원칙 5)
  • 도메인 특화 subagent (statusline-setup) — 작은 일이지만 자주 반복 / 명확 분리되는 task 만 별도 등록

1-5. Subagent 정의 형식 (재구성)

각 subagent 는 메인이 보는 카탈로그 항목 + 자기 자신만의 system prompt + 허용 도구 화이트리스트로 구성됨:

# 예시 — Explore subagent 정의
name: Explore
description: |
  Fast read-only search agent for locating code. Use it to find files
  by pattern, grep for symbols, or answer "where is X defined / which
  files reference Y." Do NOT use it for code review or open-ended analysis.tools: [Read, Grep, Glob, WebFetch, WebSearch, Bash]
system_prompt: |
  너는 코드 탐색 전문가. 키워드·심볼 빠르게 찾고 위치 + 짧은 발췌만 반환.
  설계 비평 / 리팩토링 제안 X — 그건 Plan / general-purpose 의 일.

메인 에이전트는 사용자 요청을 보고 “이건 Explore? Plan? general-purpose?” 를 LLM 추론으로 결정. 잘못 고르면 결과가 빈약 → 메인이 다시 다른 subagent 호출 (재시도).

1-6. 메인이 subagent 를 고르는 휴리스틱 (재구성)

사용자 요청
     ↓
"단순 조회/탐색이고 결과 위치만 알면 됨?"  →  YES → Explore
                  ↓ NO
"구현 전 큰 그림 / 단계별 계획이 필요?"      →  YES → Plan
                  ↓ NO
"여러 단계 reasoning + 다양한 도구 필요?"    →  YES → general-purpose
                  ↓ NO
"이 도구·CLI 자체에 대한 질문?"              →  YES → claude-code-guide
                  ↓ NO
                직접 처리 (메인이 도구 호출)

코드 전체 보기 (11줄)

휴리스틱은 prompt 에 인코딩 — 강제 분기 X. LLM 이 카탈로그 description 을 읽고 자체 판단.


2. Day 5 강의 4 패턴과 비교

항목Day 5 Supervisor서비스 X 패턴
위계Supervisor (분배자) → WorkersMain (대화자) → Subagents (배치 작업자)
메시지 흐름모든 메시지가 supervisor 거침Subagent 의 messages 는 격리
컨텍스트 절약Supervisor 가 전체 봄 → 길어짐메인은 요약만 → 일정함
Subagent 호출Command(goto=) 또는 handoff toolTask 도구 호출 (도구 1개)
사용자 인지어느 에이전트가 답했는지 명시메인이 종합해서 답 (subagent 존재 안 보임)
적합 대상명확한 도메인 분리 (검색/DB/보고서)도구 많은 코딩·연구 어시스턴트

핵심 차이: 컨텍스트 절약 vs 흐름 추적성 트레이드오프.

이론적인 에이전트 아키텍처는 흐름의 ‘추적성(Traceability)’과 ‘명확한 도메인 분리’에 집중합니다. 반면 실제 대규모 서비스(프로덕션) 환경에서는 ‘컨텍스트 윈도우 절약’과 ‘안정성(권한 분리)’을 위해 추적성을 일부 포기하더라도 메시지를 격리하고 캡슐화하는 전략을 취합니다.

Similar Posts

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다