AgentCore Memory
관리형 기억 — STM/LTM, 추출 전략 4종, MemoryClient·Strands 연동
AgentCore Memory
STM · LTM · 추출 전략 4종 · Strands 연동
세션이 끝나도, 에이전트는 기억한다
STM·LTM과 추출 전략 4종으로 설계하는 관리형 기억
왜 관리형 기억인가
LLM의 망각 · 직접 운영 vs 관리형 · Strands와의 관계
AgentCore Memory
에이전트의 대화 기억을 저장·추출·검색하는 관리형 서비스
AgentCore Memory
대화를 이벤트로 저장하고, 전략이 기억을 추출하고, 다음 세션에서 검색해 되살립니다
- STM — 세션 이벤트 원본 저장
- LTM — 추출 전략이 만든 레코드
- 네임스페이스 — 전략·액터·세션 격리
- 연동 — Strands SessionManager 한 줄
벡터 저장소도 추출 파이프라인도 직접 만들지 않습니다 — Memory 리소스 하나로 저장·추출·검색이 관리형으로 돌아갑니다.
세션과 함께 끝나는 기억
"지난주에 추천받은 식당 어디였지?" — 세션 안의 기억만으로는 답할 수 없는 질문
| 구분 | 세션 (Session) | Memory |
|---|---|---|
| 지속 시간 | 단일 대화 (분~시간) | 세션을 넘어 보존 (일~월) |
| 저장 위치 | 컨텍스트 윈도우 | 외부 저장소 |
| 용량 | 모델 컨텍스트 윈도우 이내 | 컨텍스트 제약 없음 |
| 검색 | 없음 (전체 포함) | 시맨틱 검색 + 필터 |
| 비용 | 매 턴 전체 재전송 | 검색한 것만 주입 |
Memory는 대화를 세션 밖에 저장했다가, 다음 세션에서 관련된 기억만 검색해 주입합니다 — 재방문 사용자를 아는 에이전트의 출발점입니다.
Strands Memory 계층과의 관계
같은 목표(장기 기억), 다른 운영 주체 — 직접 운영과 관리형의 갈림길
Strands MemoryManager
직접 운영 — SDK 계층
- Strands 상태 관리의 Memory 계층 (Recall·Injection·Extraction)
- 스토어(Bedrock Knowledge Base 등)를 개발자가 준비·연결
- 저장소 프로비저닝·만료·격리를 직접 설계
- 스토어 선택과 추출 로직을 세밀하게 제어 가능
SDK가 기억 사이클을 돌리지만, 그 밑의 저장소 운영은 개발자 몫입니다.
AgentCore Memory
관리형 — AWS 서비스
- 저장소·추출 파이프라인·시맨틱 검색을 AWS가 운영
- 추출 전략 4종을 선언만 하면 레코드 생성 자동
- 이벤트 만료·액터 격리·암호화 내장
- AgentCoreMemorySessionManager로 Strands에 그대로 장착
Strands 상태 관리 덱에서 본 SessionManager 백엔드의 "AgentCore Memory" 옵션이 바로 이 서비스입니다.
에이전트 코드는 Strands 그대로 — 기억의 저장과 추출만 관리형으로 갈아 끼우는 것이 이 모듈의 주제입니다.
STM / LTM 구조
단기 — 세션 이벤트 · 장기 — 추출 전략의 레코드
Memory 하나, 기억 두 층
하나의 Memory 리소스 안에서 함께 동작하는 단기 기억(STM)과 장기 기억(LTM)
STM + LTM
단기 기억은 대화 원본을, 장기 기억은 전략이 정제한 결과를 담습니다
- STM — 대화 이벤트 원본 그대로
- LTM — 전략이 추출한 레코드
- 이벤트 만료 — 7~365일
- 전략 — Memory당 최대 6개
STM은 이벤트를 저장하면 자동으로 쌓이고, LTM은 전략을 등록해야 만들어집니다 — 무엇을 남길지는 전략이 결정합니다.
이벤트에서 레코드까지 — 기억 파이프라인
대화 원본은 STM에 쌓이고, 전략이 정제해 LTM 레코드로
-
1
대화 턴
사용자와 에이전트가 메시지를 주고받습니다. 도구 결과도 기억 대상이 될 수 있습니다.
-
2
Event 저장 — STM
대화 턴이 이벤트로 기록됩니다. actor_id와 session_id로 분류되어 세션 이력이 됩니다.
-
3
전략 실행
등록된 추출 전략이 이벤트를 백그라운드에서 처리합니다. 전략마다 각자 자기 방식으로 정제합니다.
-
4
Record 생성 — LTM
요약·사실·선호·에피소드가 레코드로 저장됩니다. 전략별 네임스페이스에 분리되어 쌓입니다.
-
5
검색·주입
다음 세션에서 시맨틱 검색으로 관련 레코드만 꺼내 컨텍스트에 주입합니다.
개발자는 이벤트만 저장하면 됩니다 — 추출·인덱싱·검색 인프라는 서비스가 백그라운드에서 처리합니다.
STM vs LTM
원본을 그대로 담는 단기 기억과, 정제된 결과만 남기는 장기 기억
STM — 단기 기억
Short-Term Memory
- 저장 단위 — Event (대화 턴 원본)
- 생성 — 이벤트를 저장하는 즉시
- 조회 — actor_id + session_id로 세션 이력 로드
- 만료 — 이벤트 만료 설정 (7~365일)
세션 이어가기와 멀티턴 맥락 복원이 목적 — 대화가 원본 그대로 남습니다.
LTM — 장기 기억
Long-Term Memory
- 저장 단위 — Record (전략의 추출 결과물)
- 생성 — 등록한 추출 전략이 이벤트를 처리해 생성
- 조회 — 네임스페이스 + 시맨틱 검색 + 메타데이터 필터
- 용도 — 세션을 넘는 지식·선호·이력의 축적
전략 4종(요약·시맨틱·선호도·에피소드)이 각자 다른 형태의 레코드를 만듭니다.
"Session/Semantic 2계층"이 아닙니다 — Semantic은 LTM 추출 전략 4종 중 하나일 뿐, 장기 기억 전체의 이름이 아닙니다.
STM 더 깊이 — 조회 · 메타데이터 · 브랜치
원본 이력은 쌓기만 하는 게 아니라 — 찾고, 걸러내고, 갈래를 내는 대상
- ListSessions · ListEvents · GetEvent
- 지난 세션을 찾아 이력을 다시 로드 — 편의 메서드 get_last_k_turns로 최근 k턴만
- 이벤트 메타데이터
- 키-값을 붙여 ListEvents 필터로 조회 — 민감정보 저장 금지(CMK 암호화 제외 대상)
- branch
- name + rootEventId로 특정 이벤트에서 갈래 생성 — 메시지 수정·대안 대화 경로, 원 대화는 보존
- 이벤트 유형 2종
- Conversational(USER·ASSISTANT·TOOL·OTHER)과 blob(체크포인트 등 바이너리) — LTM 추출은 Conversational만
쓰기 상한은 CreateEvent 200 TPS(계정) · 액터·세션당 5 TPS, 이벤트 10MB·메시지 100KB — 대화 턴 단위 저장이면 넉넉합니다.
네임스페이스 — 기억의 주소 체계
레코드가 저장되는 경로가 곧 검색 범위와 격리 경계
- /strategies/{memoryStrategyId}
- 전략별 분리 — 요약은 요약끼리, 선호도는 선호도끼리 검색
- /actors/{actorId}
- 액터(사용자)별 격리 — 사용자 A의 기억에 사용자 B가 접근 불가
- /sessions/{sessionId}
- 세션별 그룹 — 특정 세션의 이력만 좁혀서 조회 가능
기본 템플릿은 /strategies/{memoryStrategyId}/actors/{actorId}/sessions/{sessionId}/ — 검색할 때 네임스페이스를 어디까지 지정하느냐가 곧 검색 범위입니다.
추출 전략 4종
Summarization · Semantic · User Preferences · Episodes
추출 전략
전략 = 이벤트를 레코드로 바꾸는 변환기 — 같은 대화라도 등록한 전략에 따라 달라지는 기억
전략이 기억의 형태를 결정한다
한 이벤트를 여러 전략이 각자 처리해, 전략별 네임스페이스에 서로 다른 레코드를 만듭니다
- Summarization — 대화 요약
- Semantic — 사실·지식 청크
- User Preferences — 선호/비선호
- Episodes — 에피소드 맥락
등록 방식은 Built-in(즉시 사용) · Built-in with override(모델·프롬프트 커스텀) · Self-managed(커스텀 트리거·자체 처리) 3가지입니다.
전략 4종 비교
무엇을 남기고, 어떻게 찾고, 어디에 쓰는가 — 전략 선택의 세 질문
Summarization
- 대화를 요약 텍스트로 압축 저장
- 검색 — 네임스페이스 기반 조회
- 긴 대화의 토큰을 크게 절약
언제 — 장기 이력 압축 — 100턴 넘는 상담·프로젝트 대화
Semantic
- 의미 단위의 사실·지식 청크로 저장
- 검색 — 시맨틱 유사도
- 대화 속 사실이 지식으로 축적
언제 — 지식 축적 — 도메인 사실·결정 사항 회상
User Preferences
- 선호/비선호만 구조화하여 추출
- 검색 — 키-값 조회
- "이탈리안 좋아함, 매운 것 싫어함"
언제 — 개인화 — 추천·맞춤 응답이 핵심인 서비스
Episodes
- 대화 에피소드(시작→종료) 단위로 보존
- 검색 — 시간 기반
- 전체 맥락을 그대로 복원
언제 — 맥락 복원 — 이전 상담을 이어가는 시나리오
넷 중 하나를 고르는 분류가 아니라 조합입니다 — 같은 이벤트를 여러 전략이 각자 처리해 별도 네임스페이스에 쌓습니다.
같은 대화, 다른 기억
같은 대화도 전략마다 다른 레코드로 — 요약·사실·선호·에피소드, 전략별 변환 결과 비교
"예산: 5만원/인", "편의: 주차 필요"]
조건 — 주차 필수 · 5만원/인 이하
전략 조합 패턴
워크로드별로 검증된 2개 조합에서 출발
추천 봇
Summarization + User Preferences
상담 봇
Semantic + Episodes
코딩 에이전트
Semantic + Summarization
시작은 2개면 충분합니다 — Memory당 전략은 최대 6개(하드 리밋), 필요해질 때 추가하면 됩니다.
코드 패턴
create_memory · Strands 연동 · retrieve_memories · Metadata
코드로 보는 사용 여정
컨트롤 플레인으로 생성, SessionManager로 연결, MemoryClient로 검색
생성 → 연동 → 검색
리소스 관리와 데이터 접근이 클라이언트부터 다릅니다
- boto3 bedrock-agentcore-control — 리소스 생성
- AgentCoreMemorySessionManager — Strands 연동
- MemoryClient — 이벤트 저장·직접 검색
- memory_id — 생성 응답으로 받는 식별자
memory_id는 ARN이 아니라 ID입니다 — 생성 응답의 id 값을 이후 모든 호출에 그대로 사용합니다.
Memory 생성 — 전략 등록
전략과 이벤트 만료만 선언 — 나머지 인프라는 서비스가 준비
핵심 포인트
- bedrock-agentcore-control
- 컨트롤 플레인 — 리소스 생성·수정은 boto3로
- eventExpiryDuration
- STM 이벤트 만료 7~365일
- memoryStrategies
- 전략 등록 — summary·semantic·userPreference·episodic 키, name 필수
- response['memory']['id']
- 이후 모든 호출에 쓰는 memory_id — ARN이 아니라 ID
코드
import boto3
# 컨트롤 플레인 — Memory 리소스 생성은 boto3
control = boto3.client('bedrock-agentcore-control')
# Memory 생성 — 전략 2종 등록 (요약 + 선호도)
response = control.create_memory(
name="restaurant_bot_memory",
eventExpiryDuration=90,
memoryStrategies=[
{"summaryMemoryStrategy": {"name": "SessionSummary"}},
{"userPreferenceMemoryStrategy": {"name": "Preferences"}},
],
)
# 이후 모든 호출의 식별자 — ARN이 아니라 ID
memory_id = response["memory"]["id"]
Strands 연동 — SessionManager 한 줄
에이전트 코드에 Memory 로직 없음 — 장착하면 저장과 검색이 자동
핵심 포인트
- AgentCoreMemoryConfig
- memory_id + actor_id(사용자 격리) + session_id(이력 단위)
- AgentCoreMemorySessionManager
- Strands Agent에 Memory를 투명하게 연결하는 어댑터
- 세션 시작
- 해당 액터의 관련 기억을 검색해 컨텍스트에 자동 주입
- 대화 중
- 각 턴을 Event로 저장 — 등록된 전략이 백그라운드 처리
코드
from strands import Agent
from bedrock_agentcore.memory.integrations.strands.config import AgentCoreMemoryConfig
from bedrock_agentcore.memory.integrations.strands.session_manager import AgentCoreMemorySessionManager
# 연결 정보 — memory_id는 생성 응답의 ID
config = AgentCoreMemoryConfig(
memory_id=memory_id,
actor_id="user-42",
session_id="session-0722",
)
# 장착 — 이후 이벤트 저장·기억 검색은 자동
agent = Agent(
model="us.anthropic.claude-sonnet-4-6",
session_manager=AgentCoreMemorySessionManager(
agentcore_memory_config=config, region_name="us-east-1"),
)
result = agent("이번에도 이탈리안으로 추천해줘")
LTM Metadata — 명시적 경계 긋기
시맨틱 유사도만으로는 못 가르는, 섞이면 안 되는 기억
LTM Metadata
레코드에 구조화된 메타데이터 태깅
- 시맨틱 검색 + 메타데이터 필터 결합 검색
- Indexed metadata는 생성 시 정의 — 생성 후 편집 불가
- 전략에 연결해 레코드마다 자동 부착
Strictly Consistent Metadata
메타데이터 값을 LLM 추론이 아닌 명시적 값으로 보장
- 같은 메타데이터 값끼리만 그루핑·통합
- 값이 다르면 시맨틱 유사도와 무관하게 절대 병합 안 함
- 테넌트·조직 단위의 기억 격리에 적합
유사도는 "비슷한 것"을 찾고, 메타데이터는 "섞이면 안 되는 것"의 경계를 긋습니다 — 멀티테넌트 기억 설계의 안전장치입니다.
기억 검색 — MemoryClient
Agent 없이도 데이터 플레인 API로 직접 다루는 기억
핵심 포인트
- retrieve_memories
- 자연어 쿼리로 시맨틱 검색 — 레코드의 content는 dict, 본문은 content["text"]
- create_event
- SessionManager 없이 대화 턴을 STM에 직접 저장
- namespace
- 전략·액터 경로로 좁히기 — 선호도는 선호도 네임스페이스에서
- score
- 유사도 점수 — 컨텍스트에 주입할 레코드를 선별하는 기준
코드
from bedrock_agentcore.memory import MemoryClient
# 데이터 플레인 클라이언트 — 저장·검색 API 직접 호출
client = MemoryClient(region_name="us-east-1")
# 시맨틱 검색 — 선호도 전략의 액터 네임스페이스에서
# strategy_id — 등록한 전략의 ID (콘솔 또는 GetMemory로 확인)
memories = client.retrieve_memories(
memory_id=memory_id,
namespace=f"/strategies/{strategy_id}/actors/user-42/",
query="이탈리안 식당 선호",
)
# 점수와 함께 확인 — content는 dict, 본문은 content["text"]
for mem in memories:
print(f"[{mem['score']:.2f}] {mem['content']['text'][:80]}")
실습
Memory 생성 · 전략 등록 · Strands 연동 · 세션 간 회상
Memory 실습
Memory를 생성해 Strands 에이전트에 연결하고, 세션을 넘는 기억을 확인합니다
학습 목표
- Memory 생성 — 추출 전략 2종(요약 + 선호도) 등록
- MemoryClient로 이벤트 저장과 시맨틱 검색 확인
- AgentCoreMemorySessionManager로 Strands 에이전트 연동
- 새 세션에서 이전 선호가 회상되는지 검증
STM/LTM 구조 · 전략 조합 · 네임스페이스 격리 · Strands 연동