Skip to content

컨텍스트 엔지니어링 구현 패턴

Light, Select, Compress, Isolate - 4가지 핵심 패턴


학습 목표

  • LangChain 블로그에서 제안한 4가지 컨텍스트 엔지니어링 구현 패턴을 이해한다.
  • 각 패턴이 컨텍스트 윈도우 관리에서 어떤 역할을 하는지 파악한다.
  • 패턴 간의 관계와 실무 적용 방법을 학습한다.

1. 4가지 패턴 개요

LangChain 블로그에서는 AI 에이전트의 컨텍스트 윈도우를 효과적으로 관리하기 위한 4가지 대표적인 구현 패턴을 제안한다. 이 패턴들은 각각 독립적으로 사용할 수도 있고, 여러 패턴을 조합하여 더 정교한 컨텍스트 관리 전략을 구성할 수도 있다.

패턴영문 키워드핵심 한줄 요약
Write ContextLight컨텍스트를 외부에 기록한다
Select ContextSelect필요한 컨텍스트만 선별한다
Compress ContextCompress컨텍스트를 압축한다
Isolate ContextIsolate컨텍스트를 작업별로 격리한다

이 4가지 패턴은 "컨텍스트 윈도우에 무엇을 넣을 것인가?"라는 공통된 질문에 대해 서로 다른 각도에서 해법을 제시한다. Write는 정보를 저장하고, Select는 저장된 정보 중 필요한 것을 가져오며, Compress는 가져온 정보의 크기를 줄이고, Isolate는 복잡한 작업을 분리하여 각각에 맞는 컨텍스트를 구성한다.


2. Write Context (Light)

개념

Write Context 패턴은 에이전트가 사용할 컨텍스트를 컨텍스트 윈도우 외부에 저장하는 방식이다. AI 에이전트가 작업을 수행하면서 생성한 중간 결과, 발견한 정보, 메모 등을 외부 저장소에 기록해두고, 나중에 필요할 때 다시 활용할 수 있도록 한다.

핵심 아이디어

컨텍스트 윈도우는 유한하다. 모든 정보를 윈도우 안에 계속 담아둘 수 없으므로, 중요한 정보를 외부에 기록해두는 것이 필수적이다. 마치 사람이 메모장에 중요한 내용을 적어두는 것과 같은 원리다.

적용 사례

저장 방식설명예시
세션 내 메모리실행 중 스크래치패드에 임시 기록에이전트가 탐색 결과를 메모리 변수에 저장
파일 저장결과물을 파일 시스템에 기록분석 결과를 JSON/텍스트 파일로 저장
데이터베이스 기록구조화된 정보를 DB에 저장대화 히스토리, 사용자 프로필 정보 저장
벡터 스토어임베딩으로 변환하여 벡터 DB에 저장문서 청크를 임베딩하여 Pinecone/Chroma에 저장

동작 흐름

LangGraph 구현 예시

LangGraph에서 Write Context 패턴은 주로 State에 정보를 기록하거나, 외부 MemorySaver를 통해 체크포인트를 저장하는 방식으로 구현된다.

python
# LangGraph State에 중간 결과 기록
class AgentState(TypedDict):
    messages: list
    scratchpad: str  # 스크래치패드: 중간 결과를 기록하는 공간
    findings: list   # 발견한 정보를 누적 저장

def research_node(state: AgentState):
    # 연구 결과를 scratchpad에 기록
    result = perform_research(state["messages"])
    return {
        "scratchpad": state["scratchpad"] + "\n" + result,
        "findings": state["findings"] + [result]
    }

핵심 포인트: Write Context는 "정보를 잃지 않기 위한 보험"이다. 컨텍스트 윈도우에서 밀려날 수 있는 중요한 정보를 외부에 안전하게 보관해둔다.


3. Select Context

개념

Select Context 패턴은 외부에 저장된 다양한 컨텍스트 중에서 현재 작업에 필요한 정보만 선별하여 컨텍스트 윈도우 내부로 가져오는 방식이다. "모든 정보"를 넣는 것이 아니라 "적절한 정보"를 골라 넣는 것이 핵심이다.

핵심 아이디어

컨텍스트 윈도우에 관련 없는 정보가 많으면 오히려 성능이 떨어진다. 이를 **"바늘-건초더미 문제(Needle in a Haystack)"**라고 한다. 방대한 정보 속에서 필요한 정보를 찾아야 할 때, 불필요한 정보가 많을수록 LLM이 핵심 정보를 놓칠 확률이 높아진다. 따라서 현재 질문이나 작업에 직접 관련된 정보만 정밀하게 선택하는 것이 중요하다.

적용 사례

선별 방법설명예시
RAG 검색질문과 관련된 문서 청크를 벡터 유사도로 검색사용자 질문 → 벡터 DB 검색 → 상위 5개 청크 반환
관련 메모리 조회현재 맥락과 관련된 과거 대화/메모를 조회현재 주제와 관련된 이전 대화 내역만 선택
도구 선택수십 개의 도구 중 현재 작업에 필요한 도구만 선택코드 작성 요청 시 코드 관련 도구만 활성화
Few-shot 예시 선택현재 입력과 유사한 예시만 골라서 프롬프트에 포함유사 문제 해결 예시 3개만 선별하여 포함

동작 흐름

LangGraph 구현 예시

LangGraph에서 Select Context 패턴은 RAG 리트리버 노드나, 동적 도구 선택 로직으로 구현된다.

python
# RAG 기반 컨텍스트 선별
def retrieve_context(state: AgentState):
    query = state["messages"][-1].content
    # 벡터 DB에서 관련 문서 검색
    relevant_docs = vector_store.similarity_search(query, k=5)
    # 관련 도구만 선택
    relevant_tools = select_tools(query, all_tools)
    return {
        "context": format_docs(relevant_docs),
        "available_tools": relevant_tools
    }

핵심 포인트: Select Context는 "적절한 정보 선택"의 기술이다. 100개의 문서를 모두 넣는 것보다, 가장 관련성 높은 5개만 넣는 것이 LLM 성능을 더 높인다.


4. Compress Context

개념

Compress Context 패턴은 컨텍스트 정보를 요약하거나 일부를 잘라내어 크기를 줄이는 방식이다. 컨텍스트 윈도우의 물리적 크기 제한 내에서 최대한 많은 정보를 효율적으로 담기 위한 전략이다.

핵심 아이디어

대화가 길어지거나 참조 문서가 많아지면, 컨텍스트 윈도우가 가득 차게 된다. 이때 오래된 정보나 덜 중요한 정보를 요약하거나 제거함으로써 공간을 확보한다. 핵심은 정보의 손실을 최소화하면서 크기를 줄이는 것이다.

적용 사례

압축 방법설명예시
대화 내역 요약긴 대화를 핵심만 남기고 요약50턴의 대화 → 3문장 요약으로 압축
오래된 메시지 트림최근 N개 메시지만 유지, 나머지 제거최근 10개 메시지만 유지
문서 축약긴 문서에서 핵심 부분만 추출10페이지 문서 → 핵심 단락 3개만 추출
토큰 수 제한전체 컨텍스트가 일정 토큰 수를 넘지 않도록 관리최대 8,000 토큰으로 제한

동작 흐름

압축 전후 비교

[압축 전] - 토큰 수: ~12,000
────────────────────────────────
사용자: 안녕하세요, 마이크로프론트엔드에 대해 알려주세요.
AI: 마이크로프론트엔드는 프론트엔드 애플리케이션을...
사용자: Module Federation이 뭔가요?
AI: Module Federation은 Webpack 5에서 도입된...
... (48턴의 상세한 대화) ...
사용자: 그러면 배포 전략은 어떻게 해야 하나요?

[압축 후] - 토큰 수: ~2,000
────────────────────────────────
[대화 요약] 사용자는 마이크로프론트엔드의 개념, Module Federation,
컴포지션 패턴, 상태 관리를 학습했으며, 현재 배포 전략에 대해 질문 중.
────────────────────────────────
사용자: 그러면 배포 전략은 어떻게 해야 하나요?

LangGraph 구현 예시

LangGraph에서 Compress Context 패턴은 메시지 히스토리를 주기적으로 요약하는 노드로 구현된다.

python
def compress_messages(state: AgentState):
    messages = state["messages"]
    if len(messages) > 20:
        # 오래된 메시지들을 LLM으로 요약
        old_messages = messages[:-10]
        summary = llm.invoke(
            f"다음 대화를 핵심만 요약하세요:\n{format_messages(old_messages)}"
        )
        # 요약 + 최근 10개 메시지로 교체
        return {
            "messages": [SystemMessage(content=f"[이전 대화 요약] {summary}")]
                        + messages[-10:]
        }
    return state

핵심 포인트: Compress Context는 "제한된 공간의 최적 활용"이다. 정보를 잃지 않으면서도 컨텍스트 윈도우의 공간을 효율적으로 사용한다.


5. Isolate Context

개념

Isolate Context 패턴은 복합적인 요청을 개별 작업으로 분해하고, 각 작업에 맞는 컨텍스트를 별도로 구성하여 격리하는 방식이다. 하나의 거대한 컨텍스트를 유지하는 대신, 작업별로 분리된 작은 컨텍스트를 사용한다.

핵심 아이디어

복잡한 요청을 하나의 에이전트가 모든 맥락을 가지고 처리하면, 컨텍스트 윈도우가 금방 가득 차고 관련 없는 정보가 뒤섞여 성능이 저하된다. 대신 각 하위 작업을 담당하는 별도의 에이전트(또는 서브 에이전트)에게 해당 작업에 필요한 컨텍스트만 전달하면, 각 에이전트는 자신의 역할에 집중할 수 있다.

적용 사례

격리 방법설명예시
멀티 에이전트각 에이전트가 자신의 역할에 맞는 컨텍스트만 보유리서치 에이전트, 코딩 에이전트, 리뷰 에이전트 분리
서브 태스크 분해복합 요청을 독립 태스크로 분해"앱 만들어줘" → 설계/구현/테스트/배포 태스크
병렬 처리독립적인 작업을 병렬로 실행3개 파일을 동시에 분석, 각각 별도 컨텍스트
도구 격리특정 도구 호출 시 해당 도구만의 격리된 컨텍스트 제공코드 실행 시 코드 관련 컨텍스트만 전달

동작 흐름

LangGraph 구현 예시

LangGraph에서 Isolate Context 패턴은 서브그래프(Subgraph)를 활용하여 구현된다. 각 서브그래프는 자체 State를 갖고 독립적으로 실행된다.

python
# 메인 그래프 (오케스트레이터)
main_graph = StateGraph(OrchestratorState)

# 서브그래프: 설계 에이전트 (설계 관련 컨텍스트만 보유)
design_graph = StateGraph(DesignState)
design_graph.add_node("analyze_requirements", analyze_requirements)
design_graph.add_node("create_architecture", create_architecture)

# 서브그래프: 구현 에이전트 (구현 관련 컨텍스트만 보유)
impl_graph = StateGraph(ImplementState)
impl_graph.add_node("write_code", write_code)
impl_graph.add_node("review_code", review_code)

# 메인 그래프에 서브그래프를 노드로 추가
main_graph.add_node("design", design_graph.compile())
main_graph.add_node("implement", impl_graph.compile())

핵심 포인트: Isolate Context는 "분할 정복"의 원리다. 하나의 거대한 문제를 작은 문제로 나누고, 각 문제에 집중할 수 있는 환경을 만든다.


6. 패턴 비교 정리

비교 표

패턴핵심 동작적용 사례LangGraph 구현 예시
Write Context정보를 외부에 기록스크래치패드, DB 저장, 파일 기록State에 중간 결과 저장, MemorySaver 체크포인트
Select Context필요한 정보만 선별RAG 검색, 도구 선택, Few-shot 선별리트리버 노드, 동적 도구 바인딩
Compress Context정보를 요약/축소대화 요약, 메시지 트림, 문서 축약메시지 요약 노드, 토큰 카운트 기반 트림
Isolate Context작업별로 격리멀티 에이전트, 서브 태스크 분해서브그래프, 독립 State 관리

패턴의 협업: 실제 AI 에이전트에서의 통합

실제 AI 에이전트 시스템에서는 이 4가지 패턴이 독립적으로 사용되기보다, 서로 유기적으로 결합되어 동작한다. 다음 다이어그램은 하나의 AI 에이전트가 사용자 요청을 처리하는 과정에서 4가지 패턴이 어떻게 함께 동작하는지를 보여준다.

이 흐름에서 주목할 점은 Write 단계에서 저장된 정보가 다음 요청의 Select 단계에서 다시 활용된다는 것이다. 이 순환 구조를 통해 에이전트는 점점 더 풍부한 컨텍스트를 축적하고 활용할 수 있게 된다.


7. 핵심 정리

컨텍스트 엔지니어링의 4가지 패턴은 각각 "기록(Write)", "선별(Select)", "압축(Compress)", "격리(Isolate)"라는 명확한 역할을 갖는다.

  • Write Context: 컨텍스트 윈도우 외부에 정보를 기록하여, 유한한 윈도우의 한계를 극복한다.
  • Select Context: 저장된 정보 중 현재 작업에 필요한 것만 선별하여, 관련성 높은 컨텍스트를 구성한다.
  • Compress Context: 정보를 요약하거나 트림하여, 제한된 윈도우 내에서 최대한 많은 정보를 담는다.
  • Isolate Context: 복합 작업을 분해하고 각 작업에 맞는 컨텍스트를 격리하여, 집중도를 높인다.

이 4가지 패턴은 독립적으로도 유용하지만, 조합하여 사용할 때 진정한 힘을 발휘한다. 실전에서는 Select로 관련 정보를 가져오고, Compress로 압축하며, Isolate로 작업을 분리하고, Write로 결과를 저장하는 순환 구조가 AI 에이전트의 성능을 극대화한다.