한 줄 요약: 컨텍스트 격리(Context Isolation)란, AI 에이전트나 서브에이전트가 서로 다른 작업의 정보·상태·컨텍스트가 교차 오염되지 않도록 독립된 실행 환경에서 분리 운영하는 보안·설계 패턴이다.


1. 컨텍스트 격리란 무엇인가?

병원의 수술실을 생각해 보세요. 각 수술실은 완전히 독립된 공간입니다. 환자 A의 수술 정보가 환자 B의 수술실로 유입되면 안 됩니다. AI 에이전트 시스템에서도 같은 원칙이 적용됩니다.

컨텍스트 격리 없이 여러 에이전트가 같은 컨텍스트를 공유하면:

  • A 사용자의 개인정보가 B 사용자의 응답에 포함될 수 있음
  • 에이전트 1의 오류 상태가 에이전트 2의 판단을 오염시킬 수 있음
  • 테스트 데이터가 프로덕션 컨텍스트에 섞일 수 있음

2. 핵심 개념 이해하기

격리 수준

수준 설명 예시
프로세스 격리 별도 OS 프로세스 서브에이전트를 독립 프로세스로
컨텍스트 격리 독립 메시지 히스토리 각 서브에이전트별 빈 컨텍스트로 시작
메모리 격리 독립 메모리 공간 에이전트별 별도 벡터 DB 네임스페이스
파일시스템 격리 독립 작업 디렉토리 Git Worktree, Docker 볼륨

컨텍스트 격리 패턴

[격리 없음 - 위험]
에이전트 A ─┐
             ├─ 공유 컨텍스트 (오염 위험)
에이전트 B ─┘

[격리 있음 - 안전]
에이전트 A → [독립 컨텍스트 A]
에이전트 B → [독립 컨텍스트 B]
오케스트레이터 → 결과만 수집

Claude Code의 Worktree 격리

Claude Code에서 --isolation: worktree 옵션은 에이전트가 독립된 Git Worktree에서 작업하도록 격리합니다:

메인 저장소
└── .git/
└── worktrees/
    ├── agent-task-abc/  ← 에이전트 A의 격리된 공간
    └── agent-task-xyz/  ← 에이전트 B의 격리된 공간

3. 실무 적용 예시

컨텍스트 격리를 구현하는 멀티에이전트 시스템입니다.

import anthropic
import threading
from dataclasses import dataclass, field
from typing import List

@dataclass
class IsolatedContext:
    """격리된 에이전트 컨텍스트 — 각 에이전트가 독립 보유"""
    agent_id: str
    messages: List[dict] = field(default_factory=list)
    memory: dict = field(default_factory=dict)

    def add_message(self, role: str, content: str):
        self.messages.append({"role": role, "content": content})

    def get_messages(self) -> List[dict]:
        return self.messages.copy()  # 복사본 반환 (원본 보호)


class IsolatedAgent:
    def __init__(self, agent_id: str, role: str):
        self.agent_id = agent_id
        self.role = role
        # 각 에이전트가 독립된 컨텍스트 보유
        self.context = IsolatedContext(agent_id=agent_id)
        self.client = anthropic.Anthropic()
        self._lock = threading.Lock()

    def process(self, task: str) -> str:
        """격리된 컨텍스트에서 작업을 처리합니다."""
        with self._lock:
            # 이전 컨텍스트 완전 초기화 (격리)
            if task.startswith("[NEW_SESSION]"):
                self.context = IsolatedContext(agent_id=self.agent_id)

            self.context.add_message("user", task)

            response = self.client.messages.create(
                model="claude-3-haiku-20240307",
                max_tokens=1024,
                system=f"당신은 {self.role}입니다. 격리된 컨텍스트에서 독립적으로 작업하세요.",
                messages=self.context.get_messages()
            )

            result = response.content[0].text
            self.context.add_message("assistant", result)
            return result


class IsolatedOrchestrator:
    def __init__(self):
        self.agents = {
            "researcher": IsolatedAgent("agent_1", "리서처"),
            "analyst": IsolatedAgent("agent_2", "데이터 분석가"),
            "writer": IsolatedAgent("agent_3", "작가")
        }

    def run_isolated(self, tasks: dict[str, str]) -> dict[str, str]:
        """각 에이전트를 격리된 컨텍스트에서 독립 실행합니다."""
        results = {}
        threads = []

        def run_agent(name: str, task: str):
            result = self.agents[name].process(task)
            results[name] = result

        for agent_name, task in tasks.items():
            t = threading.Thread(target=run_agent, args=(agent_name, task))
            threads.append(t)
            t.start()

        for t in threads:
            t.join()

        return results

# 사용
orchestrator = IsolatedOrchestrator()
results = orchestrator.run_isolated({
    "researcher": "에이전틱 AI 최신 트렌드 조사",
    "analyst": "AI 시장 규모 데이터 분석",
    "writer": "초보자를 위한 AI 소개 글 작성"
})

for agent, result in results.items():
    print(f"\n[{agent}]\n{result[:200]}...")

4. 컨텍스트 격리 vs 유사 개념 비교

구분 컨텍스트 격리 공유 메모리 샌드박싱
정보 분리 ✅ 완전 분리 ❌ 공유
성능 독립 API 호출 효율적 오버헤드 있음
보안 ✅ 높음 ❌ 낮음 ✅ 높음
협업 결과만 공유 ✅ 실시간 제한적
구현 복잡도 중간 낮음 높음

5. 마치며

컨텍스트 격리는 멀티에이전트 시스템의 보안과 예측 가능성을 담보하는 핵심 원칙입니다. 특히 여러 사용자가 사용하는 서비스나 민감한 데이터를 처리하는 시스템에서는 컨텍스트 격리가 필수입니다. 작업 트리(Worktree)와 함께 사용하면 파일 수준의 격리도 함께 구현할 수 있습니다.

참고 자료

함께 읽으면 좋은 용어

이 개념과 함께 알아두면 이해가 깊어지는 관련 용어들입니다.

댓글 남기기