index

LLM 에이전트의 기본기: Planning, Memory, Tool

· 18min

LLM 에이전트의 기본기: Planning, Memory, Tool

2023년에 정립된 프레임워크가 왜 아직도 유효한가


들어가며: LLM은 뇌일 뿐이다

ChatGPT가 나왔을 때 우리는 “AI가 모든 걸 할 수 있다”고 생각했다. 하지만 실제로 LLM에게 복잡한 작업을 시키면 금방 한계에 부딪힌다.

사용자: "우리 회사 코드베이스에서 보안 취약점을 찾아서 고쳐줘"
LLM: "네, 코드를 보여주시면 분석해드리겠습니다..."

문제는 명확하다:

  • 계획을 못 세운다: 한 번에 다 풀려고 하다가 실패
  • 기억을 못 한다: 컨텍스트 윈도우가 끝이다
  • 행동을 못 한다: 텍스트만 생성할 뿐, 실제로 뭘 “하지” 못함

LLM은 일 뿐이다. 뇌만 있는 존재가 세상에서 일을 할 수 있을까?


프레임워크: Planning / Memory / Tool Use

Lilian Weng(OpenAI 연구원)의 LLM Powered Autonomous Agents 글은 이 문제에 대한 체계적인 프레임워크를 제시한다.

┌─────────────────────────────────────────────┐
│              Agent System                   │
│  ┌───────────────────────────────────────┐  │
│  │            LLM (Brain)                │  │
│  └───────────────────────────────────────┘  │
│        ↓            ↓            ↓          │
│  ┌─────────┐  ┌─────────┐  ┌─────────┐     │
│  │Planning │  │ Memory  │  │Tool Use │     │
│  └─────────┘  └─────────┘  └─────────┘     │
└─────────────────────────────────────────────┘

1. Planning: 큰 문제를 작은 단계로

인간도 복잡한 문제를 한 번에 풀지 않는다. 단계로 쪼갠다.

기법핵심 아이디어한 줄 설명
Chain-of-Thought (CoT)“단계별로 생각해보자”중간 추론 과정을 명시적으로 출력하며 답에 도달
Tree-of-Thoughts여러 경로를 트리로 탐색하나의 경로가 아닌 여러 가능성을 병렬로 탐색
ReAct생각 ↔ 행동 반복”생각 → 도구 호출 → 결과 관찰 → 다시 생각” 루프
Reflexion실패에서 배우기이전 시도의 실패 원인을 분석하고 전략 수정

2. Memory: 단기 기억을 넘어서

LLM의 컨텍스트 윈도우는 “단기 기억”에 불과하다. 진짜 일을 하려면 “장기 기억”이 필요하다.

인간 메모리에이전트 대응설명
단기 기억컨텍스트 윈도우현재 대화에서 볼 수 있는 범위
장기 기억외부 벡터 DB대화 밖의 지식을 저장하고 검색

RAG (Retrieval-Augmented Generation): 질문이 들어오면 관련 문서를 검색해서 컨텍스트에 주입하는 방식. “모르면 찾아보기”의 구현.

3. Tool Use: 세상과 상호작용

텍스트 생성만으로는 세상에 영향을 줄 수 없다. 도구가 필요하다.

LLM 혼자: "파일을 읽어야 합니다" (텍스트만 출력)
LLM + Tool: read_file("/src/main.ts") → 실제 파일 내용 반환

프레임워크의 진화: 2023 → 2025

2023년 에이전트 글 이후, Lilian Weng은 각 컴포넌트를 더 깊이 파고들었다. 이 프레임워크가 “정적인 이론”이 아니라 계속 발전하는 연구임을 보여준다.

2023.06 [Agent]          → 프레임워크 제시 (뭐가 필요한가)

2024.07 [Hallucination]  → Memory/Tool의 한계 (어떻게 망가지는가)

2025.05 [Why We Think]   → Planning의 심화 (어떻게 제대로 하는가)

Memory/Tool의 한계 — Hallucination (2024)

Extrinsic Hallucinations in LLMs에서 외부 지식 접근의 근본적 문제를 다룬다.

“모델은 새로운 지식 학습 시 hallucinate하는 경향이 증가한다”

RAG를 붙인다고 끝이 아니다:

  • 검색 결과를 검증해야 함
  • 모델이 자기 지식의 한계를 인식해야 함

Planning의 심화 — Why We Think (2025)

Why We Think에서는 “생각한다는 것”의 본질을 파고든다.

테스트 타임 컴퓨트: 같은 모델이라도 추론 시점에 더 많이 “생각”하면 성능이 향상된다.

2023 Agent 글2025 Thinking 글
행동 경로(action trajectory) 계획인지 경로(reasoning trajectory) 계획
”무엇을 할지” 분해”어떻게 생각할지” 분해

중요한 경고:

“단순히 ‘더 길게 생각하기’는 해결책이 아니다. 어떻게 올바르게 생각하는가가 진정한 과제다.”


Anthropic의 실전 패턴: Workflow vs Agent

Weng의 글이 “무엇이 필요한가”를 정의했다면, Anthropic의 Building Effective Agents는 “어떻게 조합하는가”를 다룬다.

핵심 구분: Workflow vs Agent

Anthropic은 두 가지를 명확히 구분한다:

구분WorkflowAgent
정의LLM과 도구가 미리 정해진 코드 경로로 조율됨LLM이 동적으로 프로세스와 도구 사용을 지시
제어개발자가 흐름을 설계LLM이 흐름을 결정
적합한 경우예측 가능한 단계의 작업예측 불가능한 개방형 문제

중요한 철학:

“성공은 가장 정교한 시스템을 구축하는 것이 아니라, 필요에 맞는 올바른 시스템을 만드는 것이다.”

5가지 Workflow 패턴

Anthropic이 제안하는 패턴들을 Weng 프레임워크와 매핑하면:

┌────────────────────┬─────────────────┬────────────────────────────┐
│ 패턴               │ 주요 컴포넌트    │ 사용 시나리오              │
├────────────────────┼─────────────────┼────────────────────────────┤
│ Prompt Chaining    │ Planning        │ 순차적 단계 (작성→번역)     │
│ Routing            │ Planning        │ 입력 분류 (고객문의 분류)   │
│ Parallelization    │ Planning+Tool   │ 독립 작업 동시 실행        │
│ Orchestrator-Worker│ Planning+Tool   │ 복잡한 작업 동적 분해       │
│ Evaluator-Optimizer│ Memory+Planning │ 피드백 루프 반복 개선       │
└────────────────────┴─────────────────┴────────────────────────────┘

ACI: Agent-Computer Interface

Anthropic의 또 다른 핵심 인사이트:

“도구 설계에 HCI(Human-Computer Interface)만큼의 노력을 투자하라”

ACI 설계 원칙:

  1. 모델이 “생각할” 충분한 토큰 제공
  2. 인터넷에서 자연스럽게 나타나는 포맷 사용
  3. 포맷 오버헤드 제거 (라인 수 계산, 문자열 이스케이핑 등)
  4. 실수를 어렵게 하도록 인자 설계 (Poka-yoke 원칙)

이건 Tool Use의 품질에 관한 이야기다. 도구가 있다고 끝이 아니라, 도구가 LLM 친화적이어야 한다.

단순성의 원칙

Anthropic이 반복해서 강조하는 것:

“복잡성을 추가할 때는 오직 명확히 결과를 개선할 때만”

시작점: 단일 LLM + 기본 프롬프트
    ↓ (부족하면)
1단계: 프롬프트 체이닝
    ↓ (부족하면)
2단계: 라우팅/병렬화
    ↓ (부족하면)
3단계: 오케스트레이터-워커
    ↓ (정말 필요하면)
최종: 자율 에이전트

이론에서 구현으로: 지식의 흐름

여기까지의 내용을 정리하면:

Lilian Weng (2023)
"무엇이 필요한가" — 이론적 프레임워크
Planning / Memory / Tool Use

Anthropic (2024)
"어떻게 조합하는가" — 실전 패턴
Workflow vs Agent, 5가지 패턴, ACI

LangChain deepagents (2025)
"실제 코드로" — 구현체
Middleware, Tools, Sub-agents

이 흐름을 이해하면 새로운 에이전트 기술이 나와도 어디에 해당하는지 바로 파악할 수 있다.


구현: deepagents가 프레임워크를 코드로 옮긴 방법

deepagents는 LangChain 팀이 만든 오픈소스 에이전트 하네스다. Claude Code의 성공 패턴을 분석해서 만들었다.

이 프레임워크가 코드로 어떻게 구현되는지 보자.

에이전트 생성: 미들웨어 스택

// deepagentsjs/src/agent.ts
export function createDeepAgent(params) {
  const middleware = [
    // Planning: 작업 계획 및 추적
    todoListMiddleware(),

    // Tool Use: 파일시스템 접근
    createFilesystemMiddleware({ backend: filesystemBackend }),

    // Planning + Tool: 서브에이전트 위임
    createSubAgentMiddleware({
      defaultModel: model,
      subagents,
      generalPurposeAgent: true,
    }),

    // Memory: 컨텍스트 관리
    summarizationMiddleware({
      model,
      trigger: { tokens: 170_000 },  // 토큰 한계 접근 시
      keep: { messages: 6 },          // 최근 6개 메시지 유지
    }),

    // 성능 최적화
    anthropicPromptCachingMiddleware(),
  ];

  return createAgent({ model, tools, middleware });
}

Planning 구현: Todo List Middleware

// 에이전트가 사용할 수 있는 도구
write_todos(todos)  // 작업 계획 작성
read_todos()        // 현재 작업 목록 확인

ReAct 패턴의 구현이다:

  1. 목표를 받으면 → write_todos로 계획 작성
  2. 각 단계 실행 → 완료되면 체크
  3. 막히면 → 계획 수정

Memory 구현: Summarization Middleware

summarizationMiddleware({
  model,
  trigger: { tokens: 170_000 },  // 170K 토큰 접근 시 발동
  keep: { messages: 6 },          // 최근 6개는 원본 유지
})

컨텍스트가 너무 커지면:

  1. 오래된 대화를 요약
  2. 요약본 + 최근 메시지만 유지
  3. → 장기 작업도 가능해짐

Tool Use 구현: Filesystem Middleware

// deepagentsjs/src/middleware/fs.ts
const tools = [
  createLsTool(backend),       // 디렉토리 목록
  createReadFileTool(backend), // 파일 읽기
  createWriteFileTool(backend),// 파일 쓰기
  createEditFileTool(backend), // 파일 수정
  createGlobTool(backend),     // 패턴 검색
  createGrepTool(backend),     // 내용 검색
];

Pluggable Backend 패턴:

  • StateBackend: 메모리에 저장 (테스트용)
  • FilesystemBackend: 실제 파일시스템
  • StoreBackend: LangGraph Store (영속성)
  • CompositeBackend: 여러 백엔드 조합

서브에이전트: Orchestrator-Worker 패턴의 구현

// 복잡한 작업을 서브에이전트에게 위임
task({
  description: "React 컴포넌트에서 보안 취약점 분석",
  subagent_type: "security-reviewer"
})

왜 서브에이전트인가?

  • 컨텍스트 격리: 각 서브에이전트는 자기 작업에만 집중
  • 병렬 실행: 독립적인 작업은 동시에 실행
  • 토큰 효율: 메인 에이전트는 결과 요약만 받음

이건 Anthropic이 말한 Orchestrator-Worker 패턴의 직접적인 구현이다.


실제 동작: “보안 취약점 찾기” 시나리오

도입부의 예제로 돌아가보자. 에이전트가 실제로 어떻게 동작하는가?

사용자: "우리 회사 코드베이스에서 보안 취약점을 찾아서 고쳐줘"

Step 1: Planning — 작업 분해

// todoListMiddleware 동작
write_todos([
  "1. 코드베이스 구조 파악 (ls, glob)",
  "2. 보안 관련 파일 식별 (auth, api, input 처리)",
  "3. 각 영역별 취약점 분석",
  "4. 발견된 취약점 수정",
  "5. 수정 사항 검증"
])

에이전트는 한 번에 다 하려 하지 않는다. 먼저 계획을 세운다.

Step 2: Tool Use — 코드베이스 탐색

// createFilesystemMiddleware 동작
ls("/src")                          // 디렉토리 구조 확인
glob("**/*.ts")                     // 모든 TypeScript 파일 찾기
grep("password|token|secret", "/src") // 민감한 키워드 검색
read_file("/src/auth/login.ts")     // 의심 파일 내용 확인

LLM이 “파일을 봐야겠다”고 생각하면 → 실제로 파일을 읽는다.

Step 3: Memory — 컨텍스트 관리

// summarizationMiddleware 동작
// 토큰이 170K에 접근하면...
"auth 폴더 분석 완료: SQL injection 취약점 2건 발견 (login.ts:45, user.ts:112)"
// 상세 분석 내용은 요약되고, 핵심만 유지

수십 개 파일을 분석해도 컨텍스트가 폭발하지 않는다.

Step 4: 서브에이전트 — 병렬 분석

// createSubAgentMiddleware 동작
// 독립적인 분석을 병렬로 위임
task({ description: "auth 폴더 SQL injection 분석", subagent_type: "security-reviewer" })
task({ description: "api 폴더 XSS 취약점 분석", subagent_type: "security-reviewer" })
task({ description: "input validation 검토", subagent_type: "security-reviewer" })

각 서브에이전트는 자기 영역만 깊이 분석하고 결과를 반환한다.

Step 5: 수정 및 완료

edit_file("/src/auth/login.ts",
  "db.query(`SELECT * FROM users WHERE id = ${userId}`)",  // 취약한 코드
  "db.query('SELECT * FROM users WHERE id = ?', [userId])" // 수정된 코드
)
// todo 완료 체크

전체 흐름

┌─────────────────────────────────────────────────────────────┐
│  "보안 취약점 찾아서 고쳐줘"                                 │
└─────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────┐
│  Planning: 작업을 5단계로 분해                              │
│  → todoListMiddleware                                       │
└─────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────┐
│  Tool: 파일 탐색 및 분석                                    │
│  → ls, glob, grep, read_file                                │
└─────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────┐
│  Memory: 분석 결과 요약, 컨텍스트 유지                      │
│  → summarizationMiddleware                                  │
└─────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────┐
│  서브에이전트: 영역별 병렬 심층 분석 (Orchestrator-Worker)  │
│  → task() 병렬 호출                                         │
└─────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────┐
│  Tool: 취약점 수정                                          │
│  → edit_file                                                │
└─────────────────────────────────────────────────────────────┘

                    ✅ 작업 완료

이게 Planning + Memory + Tool이 함께 동작하는 모습이다.


시사점: 에이전트를 설계할 때 생각할 것

1. 진단 도구로 활용하라

에이전트가 이상하게 동작할 때:

"이건 Planning 문제인가? Memory 문제인가? Tool 문제인가?"
증상가능한 원인해결책
계획 없이 무작정 시작Planning 부재Todo list, 단계 분해
예전에 한 얘기 반복Memory 한계Summarization, RAG
”할 수 없습니다” 반복Tool 부족필요한 도구 추가
중간에 방향 잃음Self-reflection 부재ReAct, Reflexion 패턴
도구 호출 실패ACI 문제도구 인터페이스 개선

2. 단순하게 시작하라

Anthropic의 조언:

“에이전트 시스템을 구축할 때, 간단함을 유지하고 필요할 때만 복잡성을 추가하라.”

처음부터 복잡한 멀티에이전트 시스템을 만들지 마라:

  1. 단일 LLM + 좋은 프롬프트로 시작
  2. 안 되면 → 프롬프트 체이닝
  3. 그래도 안 되면 → 도구 추가
  4. 서브에이전트는 정말 필요할 때만

3. Workflow vs Agent 구분하라

모든 문제에 자율 에이전트가 필요한 건 아니다:

상황추천
단계가 예측 가능Workflow (Prompt Chaining)
분기가 명확Workflow (Routing)
독립 작업 여러 개Workflow (Parallelization)
단계가 예측 불가Agent
오류 복구 필요Agent

4. 컴포넌트별로 개선하라

프레임워크의 힘은 모듈화에 있다:

Planning이 약하다 → CoT 프롬프트 개선, Todo 도구 추가
Memory가 부족하다 → RAG 붙이기, 요약 전략 조정
Tool이 부족하다 → MCP 서버 연결, 커스텀 도구 추가
Tool이 안 먹힌다 → ACI 개선 (인터페이스 단순화)

각 컴포넌트를 독립적으로 테스트하고 개선할 수 있다.


마치며

LLM 에이전트는 마법이 아니다. **뇌(LLM) + 계획(Planning) + 기억(Memory) + 행동(Tool)**의 조합이다.

이 프레임워크를 알면:

  • 새로운 에이전트 기술이 나와도 “이건 어떤 컴포넌트의 혁신인가?”로 평가할 수 있다
  • 에이전트가 실패할 때 “어디서 문제인가?”를 진단할 수 있다
  • 자신만의 에이전트를 설계할 때 체계적으로 접근할 수 있다
  • Workflow로 충분한지, Agent가 필요한지 판단할 수 있다

결국 좋은 에이전트는 좋은 시스템 설계다. 그리고 좋은 시스템은 필요한 만큼만 복잡하다.


참고 자료

핵심 레퍼런스

출처핵심 기여
Lilian Weng (OpenAI)LLM Powered Autonomous Agents (2023)프레임워크 정의
Lilian Weng (OpenAI)Extrinsic Hallucinations (2024)Memory/Tool 한계
Lilian Weng (OpenAI)Why We Think (2025)Planning 심화
AnthropicBuilding Effective Agents (2024)실전 패턴
LangChainDeep Agents (2025)구현 분석

구현체

추가 읽을거리


  • [[lilian-weng-llm-agent-시스템-개요]] - 원문 정리 노트
  • [[ai-agent-tool-skill-개념정리]] - Agent/Tool/Skill 벤더별 비교
  • [[deepagents-스터디]] - deepagents 실습 로드맵
  • [[moc-ai-agent]] - AI Agent 허브