AI Agents for Beginners - 12. Context Engineering

How Context Engineering differs from Prompt Engineering, the five types of context in AI Agents, practical management strategies, and how to recognize and fix Context Poisoning, Distraction, Confusion, and Clash failures.
June 9, 2026

AI Agents for Beginners - 12. Context Engineering

이 글은 Microsoft의 AI Agents for Beginners 강좌 Lesson 12를 기반으로 정리한 내용입니다.

What is Context Engineering?

AI Agent에서 컨텍스트(Context)는 에이전트가 다음 행동을 계획할 때 필요한 모든 정보입니다.
Context Engineering은 에이전트가 각 단계를 완료하는 데 필요한 올바른 정보를 갖추도록 하는 실천입니다.
컨텍스트 윈도우는 크기가 제한되어 있기 때문에, 에이전트 개발자는 컨텍스트 윈도우의 정보를 추가·제거·압축하는 시스템과 프로세스를 구축해야 합니다.

Prompt Engineering vs Context Engineering

구분Prompt EngineeringContext Engineering
초점단일한 정적 지시문동적인 정보 집합 관리
목표AI Agent를 규칙으로 효과적으로 안내시간이 지남에 따라 에이전트가 필요한 것을 갖추도록 보장
특성일회성 최적화반복 가능하고 신뢰할 수 있는 프로세스
Context Engineering의 핵심은 이 과정을 반복 가능(repeatable)하고 신뢰할 수 있게(reliable) 만드는 것입니다.

Types of Context

AI Agent가 관리해야 하는 컨텍스트는 단일 출처가 아닌 다양한 소스에서 옵니다:
타입설명
Instructions에이전트의 "규칙" — 프롬프트, 시스템 메시지, few-shot 예제, 사용 가능한 도구 설명
Knowledge데이터베이스에서 검색한 사실, 정보, 에이전트가 축적한 장기 기억. RAG 시스템 포함
Tools외부 함수, API, MCP 서버 정의 및 사용 후 피드백(결과)
Conversation History사용자와의 지속적인 대화. 시간이 지날수록 길어지며 컨텍스트 윈도우 공간을 차지
User Preferences시간이 지남에 따라 학습된 사용자 선호 정보. 핵심 결정 시 불러와 사용
%%{init: {'look': 'default'}}%% flowchart TD Agent["AI Agent\n컨텍스트 윈도우"] Agent --> I["Instructions\n프롬프트·시스템 메시지·few-shot·도구 설명"] Agent --> K["Knowledge\nRAG·DB·장기 기억"] Agent --> T["Tools\nAPI·MCP 서버·함수 결과"] Agent --> CH["Conversation History\n멀티턴 대화 이력"] Agent --> UP["User Preferences\n선호·습관·피드백"]

Strategies for Effective Context Engineering

좋은 컨텍스트 엔지니어링은 좋은 계획에서 시작됩니다:
  1. Define Clear Results — AI Agent가 맡게 될 태스크의 결과를 명확히 정의. "에이전트가 완료했을 때 세상은 어떤 모습인가?"라는 질문에 답해야 합니다.
  2. Map the Context — 결과를 정의한 후 "에이전트가 이 태스크를 완료하려면 어떤 정보가 필요한가?"를 파악하여 정보 위치를 매핑.
  3. Create Context Pipelines — 정보가 어디 있는지 알았다면 "에이전트가 이 정보를 어떻게 얻을 것인가?"를 결정. RAG, MCP 서버, 다른 도구 활용.
%%{init: {'look': 'default'}}%% flowchart LR R["Define Clear Results\n결과 명확히 정의"] --> M["Map the Context\n필요 정보 위치 매핑"] M --> P["Create Context Pipelines\nRAG·MCP·Tool로 정보 전달"] P --> Agent["AI Agent\n적절한 컨텍스트 보유"]

Planning Strategies

Managing Context

정보가 컨텍스트 윈도우로 흐르기 시작하면 적극적으로 관리해야 합니다:
전략설명활용 시점
Agent Scratchpad현재 세션의 관련 정보를 컨텍스트 윈도우 밖 파일/객체에 저장단일 세션 내 중간 결과 보존
Memories여러 세션에 걸쳐 관련 정보를 저장·검색사용자 선호·요약 장기 보존
Compressing Context요약·트리밍으로 오래된 메시지 제거컨텍스트 윈도우 한계 도달 직전
Multi-Agent Systems각 에이전트가 독립적 컨텍스트 윈도우 보유복잡한 병렬 작업 분산 처리
Sandbox Environments코드 실행·대용량 처리를 별도 환경에서 수행, 결과만 읽음대규모 문서 처리·코드 실행
Runtime State Objects복잡한 태스크의 서브태스크 결과를 단계별로 저장하는 컨테이너다단계 복잡 워크플로우
%%{init: {'look': 'default'}}%% flowchart TD CW["컨텍스트 윈도우\n(제한된 크기)"] CW -->|"단일 세션 임시 저장"| SP["Agent Scratchpad\n파일·런타임 객체"] CW -->|"세션 간 장기 보존"| MEM["Memories\n요약·선호·피드백"] CW -->|"윈도우 한계 시"| COMP["Compressing Context\n요약·트리밍"] CW -->|"복잡한 병렬 작업"| MAS["Multi-Agent Systems\n독립 컨텍스트 분산"] CW -->|"코드·대용량 처리"| SBX["Sandbox Environments\n결과만 반환"] CW -->|"다단계 워크플로우"| RSO["Runtime State Objects\n서브태스크 결과 컨테이너"]

Example of Context Engineering

"Book me a trip to Paris." 라는 요청으로 두 방식의 차이를 비교해봅니다:
방식동작응답 예시
Prompt Engineering only현재 질문만 처리"Okay, when would you like to go to Paris?"
Context Engineering캘린더 확인, 장기 기억에서 선호 조회, 예약 도구 파악 후 응답"Hey! I see you're free the first week of October. Shall I look for direct flights to Paris on [Preferred Airline] within your usual budget of [Budget]?"
Context Engineering을 적용한 에이전트는 응답 전에 자동으로:
  • 캘린더에서 가능한 날짜를 실시간으로 조회
  • 장기 기억에서 선호 항공사·예산·직항 선호 여부를 회상
  • 항공편·호텔 예약에 필요한 도구를 파악

Common Context Failures

Context Poisoning

정의: LLM이 생성한 환각(hallucination)이나 오류가 컨텍스트에 들어가 반복적으로 참조되면서, 에이전트가 불가능한 목표를 추구하거나 무의미한 전략을 개발하는 현상.
여행 예시: 에이전트가 소규모 지역 공항에서 국제 도시로의 직항편을 환각합니다. 이 존재하지 않는 항공편이 컨텍스트에 저장되고, 나중에 예약을 요청하면 에이전트는 이 불가능한 노선의 티켓을 찾으려 반복적으로 시도합니다.
해결책: 항공편 세부 정보를 컨텍스트에 추가하기 전에 실시간 API로 항공편 존재와 노선을 검증하는 단계를 구현. 검증 실패 시 잘못된 정보를 "격리(quarantine)"하고 이후에 사용하지 않음.
%%{init: {'look': 'default'}}%% flowchart TD LLM["LLM 응답\n(항공편 정보 포함)"] --> V{"실시간 API 검증"} V -->|"검증 성공"| CTX["컨텍스트에 추가\n정상 진행"] V -->|"검증 실패\n환각 감지"| Q["격리(Quarantine)\n컨텍스트 차단"] Q --> Fresh["새 컨텍스트 스레드\n오염 방지"]

Context Distraction

정의: 컨텍스트가 너무 커져서 모델이 훈련 시 학습한 것보다 누적된 이력에 지나치게 집중하면서 반복적이거나 무의미한 행동을 하는 현상. 컨텍스트 윈도우가 가득 차기 전에도 실수가 발생할 수 있음.
여행 예시: 오랫동안 여러 여행지를 이야기하면서 2년 전 배낭여행 경험을 자세히 설명했습니다. 나중에 "다음 달 저렴한 항공편을 찾아줘" 라고 요청하면, 에이전트가 배낭여행 장비나 과거 일정에 빠져들어 현재 요청을 처리하지 못합니다.
해결책: 일정 턴 수 또는 컨텍스트가 너무 커지면, 에이전트가 가장 최근의 관련 부분을 요약해 압축된 요약본으로 다음 LLM 호출에 사용.
%%{init: {'look': 'default'}}%% flowchart LR Long["긴 대화 이력\n(비관련 내용 포함)"] -->|"임계값 초과"| Sum["컨텍스트 요약\n현재 목표·관련 세부정보만"] Sum --> Next["다음 LLM 호출\n압축된 요약 사용"] Next --> Focused["집중된 응답\n현재 요청에 적합"]

Context Confusion

정의: 불필요한 컨텍스트, 특히 너무 많은 도구가 있을 때 모델이 잘못된 응답을 생성하거나 관련 없는 도구를 호출하는 현상. 소형 모델에서 특히 취약.
여행 예시: 에이전트가 book_flight, book_hotel, rent_car, find_tours, currency_converter, weather_forecast, restaurant_reservations 등 수십 가지 도구에 접근 가능합니다. "파리에서 이동하는 가장 좋은 방법은?" 을 물으면 도구 설명이 겹치거나 구분이 어려워 에이전트가 파리 내에서 book_flight를 호출하거나 rent_car를 시도합니다.
해결책: RAG over tool descriptions — 쿼리에 따라 가장 관련성 높은 도구만 동적으로 선택해 LLM에 제공. 도구 선택 수를 30개 미만으로 제한하는 것이 권장됨.
%%{init: {'look': 'default'}}%% flowchart TD Query["사용자 쿼리\n'파리에서 이동 방법?'"] --> RAG["RAG over Tool Descriptions\n벡터 DB에서 관련 도구 선택"] RAG --> Focused["집중된 도구 세트\nrent_car, public_transport_info"] Focused --> LLM["LLM\n적절한 도구 호출"] LLM --> Response["정확한 응답"]

Context Clash

정의: 컨텍스트 내에 상충하는 정보가 존재해 일관성 없는 추론이나 잘못된 최종 응답을 유발하는 현상. 정보가 단계적으로 도착하고 초기의 잘못된 가정이 컨텍스트에 남을 때 자주 발생.
여행 예시: 처음에 에이전트에게 "이코노미 클래스로 비행하고 싶어" 라고 합니다. 이후 "이 여행은 비즈니스 클래스로 가자" 로 마음을 바꿉니다. 두 지시문이 모두 컨텍스트에 있으면 에이전트가 어떤 선호를 우선시할지 혼란스러워집니다.
해결책: Context Pruning — 새 지시문이 이전 것과 모순될 때 오래된 지시문을 제거하거나 명시적으로 재정의. 또는 Scratchpad를 사용해 상충하는 선호를 결정 전에 조율.
%%{init: {'look': 'default'}}%% flowchart TD Old["이전 지시문\n'이코노미 클래스'"] --> Conflict{"상충 감지\n새 지시문 도착"} New["새 지시문\n'비즈니스 클래스'"] --> Conflict Conflict -->|"Context Pruning"| Prune["이전 지시문 제거\n새 지시문만 유지"] Conflict -->|"Scratchpad"| Scratch["스크래치패드에서 조율\n최종 일관된 지시 결정"] Prune & Scratch --> Clean["일관된 컨텍스트\n에이전트 정상 동작"]

Chat History Reduction with Agent Scratchpad

모든 LLM은 단일 요청에서 처리할 수 있는 최대 토큰 수인 유한한 컨텍스트 윈도우를 가집니다. 멀티턴 대화가 진행되면:
  • 각 사용자 메시지와 어시스턴트 응답으로 토큰 수가 선형으로 증가
  • 전체 이력을 매번 재전송하므로 프롬프트 토큰이 비용의 대부분 차지
  • 결국 대화가 컨텍스트 윈도우를 초과하면 모델이 잘라내거나 오류 발생
전략동작 방식트레이드오프
Truncation가장 오래된 메시지 삭제초기 컨텍스트 손실
Summarization오래된 메시지를 요약으로 압축일부 세부사항 손실, 핵심 유지
Scratchpad / External Memory핵심 사실을 대화 외부에 저장도구 호출 필요, 어떤 축소에도 생존

Creating a Context-Aware Agent

context_aware_agent.py
python

Simulating a Long Conversation

컨텍스트가 어떻게 누적되는지 멀티턴 대화로 확인합니다. 에이전트는 여러 턴에 걸쳐 핵심 세부사항(선호·예산·여행 날짜)을 유지해야 합니다:
long_conversation.py
python
%%{init: {'look': 'default'}}%% flowchart TD T1["Turn 1\n일본·스시·사원·사진"] --> T2["Turn 2\n예산 $3000·솔로·10일·4월"] T2 --> T3["Turn 3\n컨텍스트 보존 테스트"] T3 --> T4["Turn 4\n숙박: 전통 일본 료칸"] T4 --> T5["Turn 5\n날짜 변경: 10월 단풍"] T5 --> T6["Turn 6\n전체 요약 요청"] T1 & T2 & T4 & T5 -->|"누적 컨텍스트"| CTX["컨텍스트 윈도우\n(점점 증가)"] CTX -->|"짧은 대화: 정상"| T6

Context Summarization Pattern

대화가 길어지면 요약 도구(Summarization Tool)를 사용해 누적된 컨텍스트를 압축합니다.
이 패턴은 더 정교한 이력 축소의 기반:
  1. 에이전트가 대화에서 핵심 사실을 파악
  2. 요약 도구를 호출해 영구 저장
  3. 요약이 핵심을 포착하므로 오래된 메시지를 안전하게 제거 가능
summarization_tool.py
python
summarization_demo.py
python
%%{init: {'look': 'default'}}%% flowchart TD Conv["멀티턴 대화\n선호·예산·날짜·관심사 누적"] --> Agent["SummarizingTravelAgent"] Agent -->|"핵심 사실 파악"| Tool["summarize_preferences()\n압축 요약 저장"] Tool --> Sum["[SUMMARY] User preferences recorded: ..."] Sum -->|"오래된 메시지 제거 가능"| Trim["컨텍스트 윈도우 축소"] Trim --> Next["다음 LLM 호출\n요약 기반 응답"] Next -->|"지속적 연속성"| User["사용자\n이전 맥락 유지된 응답"]
Agent Scratchpad 예시 — 외부 파일에 세션 간 지속되는 메모:
vacation_agent_scratchpad.md
markdown
Scratchpad는 컨텍스트 윈도우 밖에 존재하므로 어떤 형태의 컨텍스트 축소에도 살아남아 세션 간 연속성을 제공합니다.

Summary

%%{init: {'look': 'default'}}%% flowchart LR Root["Context\nEngineering"] Root --> PE["vs Prompt Eng.\n정적 vs 동적"] Root --> Types["Types of Context\n5가지 소스"] Root --> Plan["Planning\nStrategies"] Root --> Mgmt["Managing\nContext\n6가지 전략"] Root --> Fail["Common\nFailures"] Types --> I["Instructions"] Types --> K["Knowledge"] Types --> T["Tools"] Types --> CH["Conversation\nHistory"] Types --> UP["User Preferences"] Plan --> P1["Define Clear Results"] Plan --> P2["Map the Context"] Plan --> P3["Create Pipelines"] Mgmt --> M1["Scratchpad"] Mgmt --> M2["Memories"] Mgmt --> M3["Compression"] Mgmt --> M4["Multi-Agent"] Mgmt --> M5["Sandbox"] Mgmt --> M6["Runtime State"] Fail --> F1["Poisoning\n환각 전파"] Fail --> F2["Distraction\n이력 과집중"] Fail --> F3["Confusion\n도구 과부하"] Fail --> F4["Clash\n정보 충돌"]
  • Context Engineering은 Prompt Engineering을 넘어 에이전트가 시간에 따라 필요한 동적 정보를 갖추도록 반복 가능하고 신뢰할 수 있는 프로세스를 구축하는 것
  • 컨텍스트는 Instructions·Knowledge·Tools·Conversation History·User Preferences의 다섯 가지 유형으로 구성
  • Planning Strategies(결과 정의 → 컨텍스트 매핑 → 파이프라인 생성)와 6가지 실용 전략(Scratchpad·Memories·Compression·Multi-Agent·Sandbox·Runtime State)으로 효과적으로 관리
  • Context Poisoning·Distraction·Confusion·Clash 네 가지 Context Failures를 인식하고 검증·요약·RAG·프루닝으로 해결
  • Chat Summarization + Agent Scratchpad 패턴으로 긴 대화에서도 컨텍스트 연속성을 유지하면서 토큰 비용을 절감
Jooojub
System S/W engineer
Explore Tags
Series
    Recent Post
    © 2026. jooojub. All right reserved.