AI Agent의 Context Engineering과 메모리 계층 설계

· 약 9분 읽기 · 조회 2 #AI 에이전트#Context Engineering#메모리#LLM#Claude Code

같은 모델을 써도 어떤 에이전트는 일을 끝내고 어떤 에이전트는 엉뚱한 파일을 고친다. 차이는 대개 모델이 아니라 "이번 호출에 무엇을 넣었는가"에서 난다. 이 글은 컨텍스트 창을 작업대로 보고 지침·절차·장기 기억·외부 지식을 계층으로 나눠 필요할 때만 불러오는 설계, 그리고 실제로 쓰는 Claude Code 환경에서 그 계층이 어떻게 생겼는지를 정리한 것이다.

책 몇 권만 펼친 책상에서 읽고 있는 사서와, 뒤편 서고에서 책 한 권을 골라 가져오는 조수, 옆에 열린 색인 카드 서랍

한눈에 보기

계층 담는 것 언제 창에 들어오나 수명
L0 컨텍스트 창 지금 작업에 필요한 것만 매 호출 호출 한 번
L1 세션 기록·요약 이번 대화의 결정, 남은 일 대화 내내, 길어지면 요약으로 세션
L2 지침 프로젝트 규칙, 명령, 금지 사항 세션 시작 때 항상 저장소와 함께
L3 절차(스킬) 작업별 단계와 참고 자료 그 작업을 할 때만 수정할 때까지
L4 장기 기억 사용자 선호, 지난 교훈, 진행 중인 일 색인은 항상, 본문은 필요할 때 지우거나 고칠 때까지
L5 외부 지식 코드, 문서, 로그, 검색 결과 도구로 찾아서 원본에 따라

지금 호출의 컨텍스트 창을 맨 위에 두고, 그 아래로 세션 요약, 프로젝트 지침, 스킬, 장기 기억, 외부 지식이 쌓여 아래로 갈수록 크고 오래가지만 필요할 때만 불러오는 메모리 계층

컨텍스트 창은 작업대다

컨텍스트 창은 모델이 한 번에 보는 전부다. 창이 커졌어도 아무거나 넣으면 안 되는 이유가 세 가지 있다.

  • 많이 넣을수록 놓친다. 긴 입력의 중간에 있는 정보를 모델이 잘 쓰지 못하는 현상이 연구로 보고돼 있다("Lost in the Middle", Liu 외, 2023). 필요한 규칙이 로그 수천 줄 사이에 묻히면 지켜지지 않는다.
  • 오래된 정보가 새 정보와 싸운다. 세 번 전 시도의 실패한 코드가 창에 남아 있으면 모델이 그 코드를 다시 고치려 든다.
  • 비용과 지연이 커진다. 호출마다 창 전체를 다시 읽으므로, 쓸모없는 1만 토큰은 매 호출 1만 토큰의 비용이다.

그래서 context engineering은 "더 넣기"가 아니라 "이번 단계에 필요한 것만 고르기"다. 작업대에는 지금 쓰는 도구만 올리고 나머지는 선반에 둔다.

네 가지 동작: 쓰기·고르기·줄이기·나누기

계층을 오가는 동작은 네 가지로 정리된다.

  • 쓰기(write): 창 밖에 적어 둔다. 계획 파일, 메모리 파일, 작업 로그. 창이 비워져도 남는다.
  • 고르기(select): 필요한 것만 불러온다. 스킬 본문, 관련 메모리 한 건, 검색한 코드 몇 줄.
  • 줄이기(compress): 길어진 기록을 요약한다. 대화 압축, 도구 출력 요약.
  • 나누기(isolate): 별도 창에서 일하게 한다. 하위 에이전트가 넓게 탐색하고 결론만 돌려준다.

설계할 때는 계층마다 "누가 쓰고, 누가 고르고, 언제 줄이는가"를 정한다. 이 셋이 정해지지 않은 계층은 결국 창에 통째로 들어간다.

L2 지침: 짧고, 이유가 있고, 읽지 말 것을 적는다

지침은 세션마다 항상 들어가므로 가장 비싼 계층이다. 한 줄마다 "이것이 없으면 모델이 틀리는가"를 묻는다.

이 블로그 저장소의 CLAUDE.md는 명령, 완료 기준, 구조를 짧게 적고, 따로 "토큰을 아끼려면 건너뛸 것"이라는 절을 둔다.

## Token-saving: skip these

- `static/reports/` (46MB generated report files), `src/lib/reports.json` (generated), `local.db`, `.svelte-kit/`, `.vercel/`, `node_modules/`.
- `REVIEW.md` is a past review snapshot (2026-10-27); read only when asked about known issues.
  • 읽지 말 것 목록은 모델이 생성 파일 46MB를 열어 창을 채우는 일을 막는다.
  • 규칙에는 이유를 붙인다. "관리자 액션마다 권한 검사를 반복한다, 라우트 그룹 가드가 없으므로"처럼 이유가 있으면 처음 보는 경우에도 맞게 판단한다.
  • 코드에서 알 수 있는 것은 쓰지 않는다. 파일 목록, 함수 설명은 도구로 찾으면 된다. 지침에 옮기면 코드가 바뀔 때 거짓이 된다.

L3 절차: 스킬은 단계적으로 펼친다

작업별 절차는 항상 넣지 않는다. 필요할 때만 펼치도록 세 겹으로 나눈다.

  1. 목록: 스킬 이름과 설명 한 줄만 항상 창에 있다. 모델은 이 줄을 보고 쓸지 정한다.
  2. 본문: 스킬을 부르면 SKILL.md 본문이 들어온다. 단계, 끝 기준, 절대 규칙.
  3. 참고 자료: 본문이 "이 단계에서 이 파일을 읽는다"고 할 때만 읽는다.

이 글을 쓴 글쓰기 스킬이 그 예다. 본문에는 단계만 있고, 문체 규칙은 references/writing.md, 기준 글은 references/example-*.md 두 편에 따로 둔다. 원고를 쓰는 단계에서 "주제가 가까운 예시 글 하나"만 읽으라고 적어 두어서, 두 편을 다 넣지 않는다. 다이어그램 규칙도 그림을 그리는 단계에서야 불러온다.

설명 한 줄이 곧 검색어다. "언제 쓰는가"를 사용자가 실제로 하는 말로 적어야 맞는 순간에 불린다.

L4 장기 기억: 한 파일에 한 사실, 색인은 한 줄

장기 기억은 세션을 넘어 남는 사실이다. 모델이 직접 쓰고 고치므로 형식이 엄격해야 한다. 아래는 이 환경의 실제 메모리 파일 하나를 줄인 것이다(세션 ID 같은 관리용 필드는 뺐다).

---
name: blog-posts-in-korean
description: "Posts published to the my-blog site must be written entirely in Korean, slug included"
metadata:
  type: feedback
---
Blog posts on my-blog (용데브) go up in Korean: title, body, excerpt and the slug ...

**Why:** The user said "블로그 글 올릴때는 한글로 올려야 돼" when asked to publish the 2026-10-28 dev log.
**How to apply:** When drafting or publishing a post, write Korean and do not pass an English slug. ... See [[my-blog-deploy-and-cache]].

규칙 한 줄, 그 규칙이 생긴 이유(사용자가 한 말 원문), 적용할 때, 관련 기억으로 가는 링크가 한 파일에 있다.

  • 한 파일에 한 사실. 여러 사실을 한 파일에 쌓으면 일부만 틀려져도 파일 전체를 믿지 못한다.
  • 색인(MEMORY.md)은 한 줄 요약만. 색인은 항상 창에 들어가고, 본문은 관련 있을 때만 읽는다. 지금 이 환경의 색인은 여섯 줄이다.
  • 종류를 나눈다. 사용자에 대한 사실(user), 일하는 방식에 대한 교정(feedback), 진행 중인 일(project), 외부 자료 위치(reference).
  • 저장하지 않을 것을 정한다. 코드와 git 기록으로 알 수 있는 것, 이번 대화에서만 쓰는 것은 저장하지 않는다. 쌓이기만 하는 메모리는 L0을 다시 어지럽힌다.
  • 기억은 그때의 사실이다. 메모리에 적힌 파일이나 옵션 이름은 쓰기 전에 지금도 있는지 확인한다. 고친 사실은 새 파일을 만들지 말고 원래 파일을 고친다.

L1 압축과 하위 에이전트

대화 압축

세션이 길어지면 앞부분을 요약해 창을 비운다. 요약이 무엇을 남기느냐가 그 뒤의 품질을 정한다.

  • 남길 것: 내린 결정과 그 이유, 남은 일, 실패한 시도와 실패 원인, 사용자가 한 말 원문.
  • 버릴 것: 도구의 원시 출력, 이미 반영된 중간 코드, 탐색하다 버린 경로.
  • 결정을 요약에서 다시 뒤집지 않도록, 결정은 파일(계획, 메모리)에도 쓴다. 요약은 줄어들어도 파일은 남는다.

하위 에이전트로 나누기

넓은 탐색(여러 디렉터리 훑기, 문서 수십 쪽 읽기)은 하위 에이전트에게 맡기고 결론만 받는다. 주 창에는 파일 덤프 대신 결론 몇 줄이 들어온다.

대가도 있다. 하위 에이전트는 지시문에 쓴 것만 알고, 주 에이전트는 요약만 본다. 그래서 지시문에는 목표, 이미 배제한 것, 볼 파일, 돌려받을 형식을 적는다. 몇 번의 도구 호출로 끝나는 일은 직접 하는 편이 정확하다.

L5 외부 지식: 도구 출력은 창 밖에서 걸러 들인다

코드, 로그, 검색 결과는 크기가 정해져 있지 않다. 원본을 창에 쏟지 않는다.

  • 큰 출력은 파일로 저장하고 필요한 줄만 검색해 읽는다.
  • 로그는 통째로 읽지 않고 오류 줄과 앞뒤 몇 줄만 꺼낸다.
  • 분석이 목적이면 코드로 세고 걸러 결과만 창에 들인다. 이 환경에는 명령 출력을 별도 저장소에 색인하고 질문에 맞는 부분만 돌려주는 플러그인이 붙어 있다.
  • 웹 문서는 원문 대신 질문에 필요한 단락만 가져온다.

계층을 왜 나누는가

계층 누가 쓰나 없거나 섞이면 생기는 일
L0 창 관리 에이전트 규칙이 로그 사이에 묻혀 지켜지지 않음
L1 요약 에이전트 긴 세션 끝에 앞의 결정을 잊고 뒤집음
L2 지침 사람 매 세션 같은 설명을 반복, 생성 파일을 읽느라 창 소모
L3 스킬 사람, 에이전트 모든 절차가 항상 들어가 창이 비대해짐
L4 장기 기억 에이전트 같은 교정을 세션마다 다시 해야 함
L5 외부 지식 도구 원시 출력이 창을 채워 판단할 자리가 없음

자주 하는 실수

  • 지침에 모든 것을 적는다. 항상 들어가는 계층이 커지면 정작 이번 작업에 필요한 정보가 밀려난다.
  • 메모리에 무엇이든 저장한다. 코드로 알 수 있는 사실까지 쌓이면 색인이 길어지고, 코드가 바뀌면 거짓 기억이 된다.
  • 오래된 기억을 확인 없이 쓴다. 이름이 바뀐 함수를 기억대로 부르면 그럴듯한 오류가 난다.
  • 도구 출력을 통째로 넣는다. 한 번의 빌드 로그가 창의 절반을 쓰고 그 뒤 판단이 흐려진다.
  • 하위 에이전트에게 맥락 없이 일을 넘긴다. 이미 배제한 가설을 다시 확인해 오고, 주 에이전트는 그 요약을 그대로 믿는다.

설계 점검표

  • 계층마다 담는 것, 불러오는 시점, 쓰는 주체가 정해져 있다
  • 지침 파일에 읽지 말아야 할 큰 파일·생성 폴더 목록이 있다
  • 지침의 규칙마다 이유가 한 줄 붙어 있다
  • 스킬 설명 한 줄에 언제 쓰는지가 사용자 말투로 적혀 있다
  • 스킬 참고 자료는 본문이 지시한 단계에서만 읽는다
  • 장기 기억은 한 파일 한 사실이고 색인은 한 줄씩이다
  • 저장하지 않을 정보의 기준이 있다
  • 기억 속 파일·옵션 이름은 쓰기 전에 존재를 확인한다
  • 결정과 남은 일은 요약뿐 아니라 파일에도 남는다
  • 큰 도구 출력은 창 밖에서 걸러 필요한 부분만 들인다

Context engineering은 큰 창을 채우는 기술이 아니라, 지침·절차·기억·외부 지식을 계층으로 나눠 두고 이번 단계에 필요한 것만 작업대에 올리는 설계다.

댓글 0개

아직 댓글이 없습니다. 첫 댓글을 남겨보세요.

댓글 쓰기

← 목록으로 돌아가기