AI Agents for Beginners - 13. Memory for AI Agents
Memory types for AI Agents (Working, Short-term, Long-term, Persona, Episodic, Entity, Structured RAG), implementation with Mem0, Cognee, and Azure AI Search, and the self-improving agent pattern with code examples.
June 9, 2026
AI Agents for Beginners - 13. Memory for AI Agents
이 글은 Microsoft의 AI Agents for Beginners 강좌 Lesson 13을 기반으로 정리한 내용입니다.
AI Agent의 두 가지 고유한 장점으로 주로 언급되는 것은 도구를 호출해 태스크를 완수하는 능력과 시간이 지나면서 개선되는 능력입니다.
메모리는 더 나은 사용자 경험을 만들 수 있는 자기 개선 에이전트를 만드는 토대입니다.
메모리는 더 나은 사용자 경험을 만들 수 있는 자기 개선 에이전트를 만드는 토대입니다.
Understanding AI Agent Memory
핵심적으로 AI Agent 메모리는 정보를 보유하고 회상할 수 있게 하는 메커니즘입니다.
이 정보는 대화의 세부사항, 사용자 선호, 과거 행동, 또는 학습된 패턴일 수 있습니다.
이 정보는 대화의 세부사항, 사용자 선호, 과거 행동, 또는 학습된 패턴일 수 있습니다.
메모리가 없으면 AI 애플리케이션은 흔히 상태 없음(stateless)이 되어, 매번 상호작용이 처음부터 시작됩니다. 이는 에이전트가 이전 컨텍스트나 선호를 "잊어버리는" 반복적이고 답답한 사용자 경험으로 이어집니다.
Why is Memory Important?
에이전트의 지능은 과거 정보를 회상하고 활용하는 능력과 깊이 연결됩니다. 메모리는 에이전트를 다음과 같이 만들어줍니다:
| 특성 | 설명 |
|---|---|
| Reflective | 과거 행동과 결과에서 학습 |
| Interactive | 지속적인 대화에서 컨텍스트 유지 |
| Proactive and Reactive | 이력 데이터를 기반으로 필요를 예측하거나 적절히 응답 |
| Autonomous | 저장된 지식을 활용해 더 독립적으로 동작 |
메모리 구현의 목표는 에이전트를 더 신뢰할 수 있고 유능하게 만드는 것입니다.
Types of Memory
| 타입 | 수명 | 설명 | 여행 예시 |
|---|---|---|---|
| Working Memory | 단일 태스크 | 다음 단계에 필요한 즉각적 정보. 요구사항·결정·행동 캡처 | "파리 여행을 예약하고 싶어" — 현재 요청을 즉각적 컨텍스트에 보유 |
| Short-term Memory | 단일 세션 | 현재 대화 컨텍스트. 이전 턴 참조 가능 | "파리 항공편은?" → "거기 숙박은?" — "거기"가 파리임을 기억 |
| Long-term Memory | 세션 간 지속 | 사용자 선호·이력·일반 지식. 개인화의 핵심 | "Ben은 스키 좋아하고, 마운틴 뷰 커피 선호, 상급 슬로프 부상으로 금지" |
| Persona Memory | 지속 | 에이전트의 일관된 역할·성격 유지 | "전문 스키 플래너" 역할 강화 — 전문가 톤·지식으로 응답 조율 |
| Episodic Memory | 지속 | 태스크 단계별 성공·실패 시퀀스. 경험 기반 학습 | 특정 항공편 예약 실패(좌석 없음) 기록 → 대안 항공편 자동 시도 |
| Entity Memory | 지속 | 대화에서 사람·장소·사물 추출·구조화 | "파리", "에펠탑", "Le Chat Noir" 추출 → 미래에 재예약 제안 |
| Structured RAG | 지속 | 다양한 소스에서 구조화된 정보 추출. 정밀 쿼리 지원 | 이메일에서 항공편 세부사항 파싱 → "화요일 파리 항공편 언제 예약?" 가능 |
%%{init: {'look': 'default', 'flowchart': {'subGraphTitleMargin': {'top': 12, 'bottom': 6}}, 'themeVariables': {'clusterBkg': '#e8efff28', 'clusterBorder': '#aabbcc'}}}%% flowchart LR Root["Memory Types"] Root --> WM["Working\nMemory"] Root --> ST["Short-term\nMemory"] Root --> LT["Long-term\nMemory"] Root --> PM["Persona\nMemory"] Root --> EM["Episodic\nMemory"] Root --> ENT["Entity\nMemory"] Root --> SR["Structured\nRAG"]
Implementing and Storing Memory
AI Agent 메모리 구현에는 메모리 관리의 체계적인 프로세스가 포함됩니다 — 생성, 저장, 검색, 통합, 업데이트, 심지어 "망각"(삭제)까지 포함됩니다.
Specialized Memory Tools
Mem0
에이전트 메모리를 저장하고 관리하는 방법 중 하나는 Mem0 같은 특수 도구를 사용하는 것입니다. Mem0는 영구 메모리 레이어로 작동해 에이전트가 관련 상호작용을 회상하고, 사용자 선호와 사실 컨텍스트를 저장하고, 시간이 지나면서 성공과 실패에서 학습할 수 있게 합니다.
Mem0는 두 단계 메모리 파이프라인: 추출과 업데이트로 작동합니다. 먼저 에이전트 스레드에 추가된 메시지가 Mem0 서비스로 전송되고, LLM이 대화 이력을 요약해 새 메모리를 추출합니다. 이후 LLM 기반 업데이트 단계에서 이 메모리를 추가·수정·삭제할지 결정하고, 벡터·그래프·키-값 데이터베이스를 포함한 하이브리드 데이터 스토어에 저장합니다.
Cognee
또 다른 강력한 접근법은 Cognee입니다 — 구조화·비구조화 데이터를 임베딩 기반 쿼리 가능한 지식 그래프(Knowledge Graph)로 변환하는 오픈소스 시맨틱 메모리입니다.
Cognee는 벡터 유사성 검색과 그래프 관계를 결합한 **이중 저장소 아키텍처(dual-store)**를 제공해, 에이전트가 어떤 정보가 유사한지뿐만 아니라 개념들이 서로 어떻게 관련되는지 이해할 수 있게 합니다.
| 특징 | 설명 |
|---|---|
| Hybrid Retrieval | 벡터 유사성·그래프 구조·LLM 추론을 혼합 — 청크 조회부터 그래프 인식 QA까지 |
| Living Memory | 하나의 연결된 그래프로 쿼리 가능한 상태를 유지하면서 진화·성장 |
| Dual-store | 단기 세션 컨텍스트와 장기 영구 메모리 모두 지원 |
Storing Memory with RAG
특수 메모리 도구 외에도, Azure AI Search를 메모리 저장·검색 백엔드로 활용할 수 있습니다 — 특히 Structured RAG에 적합합니다.
Azure AI Search는 대화 이력, 이메일, 이미지 등 대규모 데이터셋에서 밀도 있고 구조화된 정보를 추출·검색하는 Structured RAG를 지원합니다. 전통적인 텍스트 청킹·임베딩 접근법 대비 "초인적 정밀도와 회상"을 제공합니다.
Working Memory with Sessions
setup.pypython
세션을 통한 working memory — 동일 세션(session)을
agent.run() 호출에 전달하면 에이전트는 대화 전체 이력을 볼 수 있습니다:working_memory.pypython
새 세션을 생성하면 에이전트는 이전 대화를 기억하지 못합니다:
new_session.pypython
%%{init: {'look': 'default'}}%% flowchart LR U1["사용자: '해변 좋아해, 예산 $3000'"] -->|"session"| A["TravelMemoryAgent"] U2["사용자: '내 예산이 얼마라고 했지?'"] -->|"same session"| A A -->|"이전 턴 참조"| R["$3000 정확히 회상"] U3["사용자: '내 예산이 얼마야?'"] -->|"new_session"| B["TravelMemoryAgent\n(새 세션)"] B -->|"이전 대화 없음"| NR["모름 — 새 세션"]
Long-Term Memory Pattern
세션 간 사용자 선호를 기억하려면 대화 스레드 밖에 있는 영구 저장소가 필요합니다. 에이전트는 도구(tools)를 통해 이 저장소에 접근합니다:
memory_tools.pypython
%%{init: {'look': 'default'}}%% flowchart LR subgraph Agent["MAF Agent (LLM)"] direction TB LLM["LLM"] end subgraph Tools["@tool functions"] direction TB SP["save_preference()"] GP["get_preferences()"] SH["search_hotels()"] end subgraph Store["Preference Store (dict)"] direction TB PS["user_id → [prefs]"] end LLM -->|"call"| Tools SP & GP --> PS PS -->|"persists across\nsessions"| PS SH -->|"hotel DB"| LLM
Scenario 1 — First-time user books an anniversary trip
Sarah가 처음 방문합니다. 에이전트가 도구를 통해 선호를 저장하고 호텔을 추천합니다:
scenario1_session1.pypython
scenario1_session1_followup.pypython
Scenario 2 — Sarah returns weeks later
Sarah가 새로운 스레드(새 세션)로 돌아옵니다. Working memory는 비어있지만, 장기 선호 저장소에 정보가 남아있습니다:
scenario2_session2.pypython
scenario2_followup.pypython
%%{init: {'look': 'default'}}%% flowchart TD subgraph S1["Session 1 — First Visit"] U1["Sarah: '로맨틱·스파·접근 가능\n예산 $700-800/박'"] U2["Sarah: '채식·견과류 알레르기'"] U1 & U2 -->|"save_preference()"| STORE["preference_store\n['romantic', 'spa', 'accessible',\n 'vegetarian', 'nut allergy']"] end subgraph S2["Session 2 — Returns Weeks Later"] U3["Sarah: '호텔 추천해줘'\n(새 세션, working memory 없음)"] U3 -->|"get_preferences()"| STORE STORE -->|"저장된 선호 반환"| A2["TravelBookingAssistant\n개인화된 추천"] end
Storing Memory with Cognee Knowledge Graphs
Cognee는 비구조화 텍스트를 쿼리 가능한 지식 그래프로 변환해 에이전트에 관계 인식 장기 메모리를 제공합니다.
Part 1 — Building the Knowledge Base
세 가지 유형의 데이터를 수집해 포괄적인 지식 베이스를 구축합니다:
cognee_setup.pypython
cognee_data.pypython
cognee_ingest.pypython
%%{init: {'look': 'default'}}%% flowchart TD D1["Developer Profile\n(developer_intro)"] D2["Past Conversations\n(human_agent_conversations)"] D3["Python Principles\n(python_zen_principles)"] D1 & D2 -->|"cognee.add(node_set=['developer_data'])"| ADD["cognee.add()"] D3 -->|"cognee.add(node_set=['principles_data'])"| ADD ADD -->|"cognee.cognify()"| KG["Knowledge Graph\n+ Vector Embeddings"] KG -->|"cognee.memify()"| Rules["Enriched Memory\n패턴·규칙·관계"] KG -->|"visualize_graph()"| HTML["cognee_graph.html\n인터랙티브 시각화"]
Part 2 — MAF Agent with Cognee Tools
MAF 에이전트가
@tool 함수를 통해 Cognee 지식 그래프를 쿼리합니다:cognee_tools.pypython
cognee_agent.pypython
%%{init: {'look': 'default'}}%% flowchart LR subgraph MAF["MAF Agent (AgentSession)"] direction TB LLM2["CodingAssistant\n(LLM)"] Sess["create_session()\nWorking Memory"] LLM2 <--> Sess end subgraph CogneeTools["@tool functions"] direction TB SK["search_knowledge()\nGRAPH_COMPLETION"] SP2["search_principles()\nprinciples_data만"] end subgraph KG2["Cognee Knowledge Graph"] direction TB VEC["Vector Embeddings"] GR["Graph Relations"] end LLM2 -->|"call"| CogneeTools CogneeTools -->|"cognee.search()"| KG2 KG2 -->|"관련 지식 반환"| LLM2
Making AI Agents Self-Improve
자기 개선 에이전트를 위한 일반적인 패턴은 "knowledge agent"를 도입하는 것입니다. 이 별도 에이전트는 사용자와 주 에이전트 간의 대화를 관찰하며 다음 역할을 합니다:
- Identify valuable information: 대화의 어느 부분이 일반 지식이나 특정 사용자 선호로 저장할 가치가 있는지 판단
- Extract and summarize: 대화에서 필수 학습이나 선호를 추출·요약
- Store in a knowledge base: 추출된 정보를 벡터 데이터베이스 등에 저장
- Augment future queries: 사용자가 새 쿼리를 시작할 때 관련 저장 정보를 검색해 사용자 프롬프트에 추가 (RAG와 유사)
%%{init: {'look': 'default'}}%% flowchart TD User["사용자"] -->|"새 쿼리"| KA["Knowledge Agent\n(옵저버)"] KA -->|"관련 지식 검색\n(RAG)"| VDB["Vector DB\n지식 베이스"] VDB -->|"저장된 컨텍스트 추가"| PA["Primary Agent\n주 에이전트"] PA -->|"응답"| User PA -->|"대화 관찰"| KA KA -->|"가치 있는 정보\n추출·요약·저장"| VDB
Optimizations for Memory
| 최적화 | 설명 |
|---|---|
| Latency Management | 처음에는 저렴하고 빠른 모델로 정보 저장·검색 가치를 신속히 확인하고, 필요할 때만 복잡한 추출·검색 프로세스 호출 |
| Knowledge Base Maintenance | 성장하는 지식 베이스에서 덜 자주 사용되는 정보를 "cold storage"로 이동해 비용 관리 |
Summary
%%{init: {'look': 'default'}}%% flowchart LR Root["Memory for\nAI Agents"] Root --> Types["Memory Types"] Root --> Tools["Memory Tools"] Root --> Pattern["Self-Improving\nPattern"] Types --> T1["Working\ncreate_session()"] Types --> T2["Short-term\n세션 내 컨텍스트"] Types --> T3["Long-term\n@tool 영구 저장소"] Types --> T4["Persona·Episodic\nEntity·Structured RAG"] Tools --> TL1["Mem0\n추출+업데이트 파이프라인"] Tools --> TL2["Cognee\n지식 그래프+벡터"] Tools --> TL3["Azure AI Search\nStructured RAG 백엔드"] Pattern --> P1["Knowledge Agent\n대화 관찰·추출"] Pattern --> P2["RAG Augmentation\n미래 쿼리에 컨텍스트 추가"]
| Memory Type | MAF 메커니즘 | 수명 |
|---|---|---|
| Working | agent.create_session() | 단일 대화 |
| Short-term | 스레드 내 누적 컨텍스트 | 단일 태스크/세션 |
| Long-term | @tool 함수로 접근하는 외부 저장소 | 세션 간 지속 |
agent.create_session()으로 working memory 제공 — 에이전트가 세션 내 전체 대화 이력을 확인- 새 세션은 컨텍스트를 잃습니다 — 장기 메모리 없이는 에이전트가 과거 대화를 회상할 수 없음
@tool함수가 간극을 메웁니다 — 에이전트가 영구 저장소에서 정보를 저장·검색- Mem0: 두 단계 파이프라인(추출→업데이트)으로 stateless 에이전트를 stateful로 전환
- Cognee: 지식 그래프 + 벡터 임베딩으로 관계 인식 장기 메모리 —
GRAPH_COMPLETION검색으로 개념 간 관계까지 이해 - 저장된 선호·이력이 많을수록 에이전트 추천이 정교해지는 자기 개선(self-improving) 루프 형성