Skip to content

Latest commit

 

History

History
251 lines (209 loc) · 9.33 KB

File metadata and controls

251 lines (209 loc) · 9.33 KB

Memory의 사용

AgentCore의 Memory

How AgentCore Memory Works와 같이 AgentCore에는 short/long term memory를 가지고 있습니다. short term memory는 sliding windows형태로 근래 k개의 메시지를 저장하였다가 prompt로 활용합니다. long term memory는 아래와 같이 vector store 형태로 운용됩니다. 또한 long term memory는 Semantic, Summary, User Preference, Custom과 같은 형태의 strategy를 가지고 있고 namespace를 이용해 구분합니다.

image

Memory와 관련된 용어는 아래와 같습니다.

  • actorId: Memory의 event와 관련된 사용자 또는 agent/user 형태로 된 계정으로서 "/agent-support-123/customer-456"의 형태를 가집니다.
  • sessionId: 대화 세션과 같은 이벤트들의 그룹

MemoryClient의 list_memories을 활용하여 메모리 항목을 확인합니다.

global memory_id
from bedrock_agentcore.memory import MemoryClient
memory_client = MemoryClient(region_name="us-west-2")

memories = memory_client.list_memories()
logger.info(f"memories: {memories}")
for memory in memories:
    logger.info(f"Memory Arn: {memory.get('arn')}")
    memory_id = memory.get('id')
    logger.info(f"Memory ID: {memory_id}")
    logger.info("--------------------------------------------------------------------")

이때의 조회결과는 아래와 같습니다. 여기서 memory의 id가 대화 내용을 저장하거나 읽어올 때에 활용됩니다.

[
   {
      "arn":"arn:aws:bedrock-agentcore:us-west-2:262976740991:memory/LangGraph-VMvQCK89aW",
      "id":"LangGraph-VMvQCK89aW",
      "status":"ACTIVE",
      "createdAt":datetime.datetime(2025,7,20,23,23,51,557000,"tzinfo=tzlocal())",
      "updatedAt":datetime.datetime(2025,7,20,23,23,51,557000,"tzinfo=tzlocal())",
      "memoryId":"LangGraph-VMvQCK89aW"
   }
]

메모리가 없다면 아래와 같이 생성합니다.

if len(memories) == 0:
    result = client.create_memory(
        name=user_id,
        description="LangGraph Memory",
        event_expiry_days=7, # 7 - 365 days
        # memory_execution_role_arn=memory_execution_role_arn
    )
    logger.info(f"result: {result}")

메모리 생성시의 결과입니다.

{
   "arn":"arn:aws:bedrock-agentcore:us-west-2:262976740991:memory/agentcore_strands-HuPfmNFtZM",
   "id":"LangGraph-HuPfmNFtZM",
   "name":"LangGraph",
   "description":"LangGraph Memory",
   "eventExpiryDuration":7,
   "status":"ACTIVE",
   "createdAt":datetime.datetime(2025,7,21,12,56,28,854000,"tzinfo=tzlocal())",
   "updatedAt":datetime.datetime(2025,7,21,12,56,28,854000,"tzinfo=tzlocal())",
   "strategies":[
      
   ],
   "memoryId":"agentcore_strands-HuPfmNFtZM",
   "memoryStrategies":[
      
   ]
}

대화 내용은 아래와 같이 저장할 수 있습니다.

memory_result = memory_client.create_event(
    memory_id=memory.get("id"),
    actor_id=user_id, 
    session_id=user_id, 
    messages=[
        (query, "USER"),
        (result, "ASSISTANT")
    ]
)
logger.info(f"result of save conversation to memory: {memory_result}")

저장시 아래와 같을 결과로 리턴합니다.

{
   "memoryId":"LangGraph-VMvQCK89aW",
   "actorId":"LangGraph",
   "sessionId":"LangGraph",
   "eventId":"0000001753022422000#5f585a3e",
   "eventTimestamp":datetime.datetime(2025,7,20,23,40,22,"tzinfo=tzlocal())",
   "branch":{
      "name":"main"
   }
}

저장된 대화 내용을 아래와 같이 조회할 수 있습니다.

conversations = memory_client.list_events(
    memory_id=memory.get("id"),
    actor_id=user_id,
    session_id=user_id,
    max_results=5,
)
logger.info(f"conversations: {conversations}")

이때의 조회 결과는 아래와 같습니다. 이를 LangGraph에서 활용하기 위해서는 적절한 memory 포맷으로 변경이 필요합니다.

[
   {
      "memoryId":"LangGraph-VMvQCK89aW",
      "actorId":"LangGraph",
      "sessionId":"LangGraph",
      "eventId":"0000001753022526000#c8b6ecfa",
      "eventTimestamp":datetime.datetime(2025,7,20,23,42,6,"tzinfo=tzlocal())",
      "payload":[
         {
            "conversational":{
               "content":{
                  "text":"너의 이름은?"
               },
               "role":"USER"
            }
         },
         {
            "conversational":{
               "content":{
                  "text":"안녕하세요!  이름은 서연입니다 😊 \n저는 여러분의 질문에 친근하고 상세하게 답변해드리는 AI 도우미예요. \n무엇을 도와드릴까요?"
               },
               "role":"ASSISTANT"
            }
         }
      ],
      "branch":{
         "name":"main"
      }
   },
   {
      "memoryId":"LangGraph-VMvQCK89aW",
      "actorId":"LangGraph",
      "sessionId":"LangGraph",
      "eventId":"0000001753022422000#5f585a3e",
      "eventTimestamp":datetime.datetime(2025,7,20,23,40,22,"tzinfo=tzlocal())",
      "payload":[
         {
            "conversational":{
               "content":{
                  "text":"안녕"
               },
               "role":"USER"
            }
         },
         {
            "conversational":{
               "content":{
                  "text":"안녕하세요! 저는 서연이에요. 현재 시각은 2025 7 20 23 40분이네요. 무엇을 도와드릴까요? 날씨 정보, 주식 정보, 도서 검색  다양한 정보를 알려드릴  있어요. 또한 파일 시스템 관리나 AWS 서비스 작업도 도와드릴  있답니다. 어떤 것이 궁금하신가요?"
               },
               "role":"ASSISTANT"
            }
         }
      ],
      "branch":{
         "name":"main"
      }
   }
]

AWS CLI로 동작 확인하기

aws bedrock-agentcore retrieve-memory-records \
    --memory-id "mcp-w4Wd0tBc5g" \
    --namespace "/users/langgraph" \
    --search-criteria '{"topK":100, "searchQuery":"사용자"}'

이때의 결과는 아래와 같습니다.

{
    "memoryRecordSummaries": [
        {
            "memoryRecordId": "mem-272cfb74-0b7e-4ddf-8260-59cdddf28902",
            "content": {
                "text": "{\"context\":\"사용자가 자신의 직장이 AWS라고 명시적으로 언급했습니다.\",\"preference\":\"AWS에서 근무하는 것을 선호\",\"categories\":[\"경력\",\"직장\",\"기술\",\"IT\"]}"
            },
            "memoryStrategyId": "langgraph-IUSVyT8IwG",
            "namespaces": [
                "/users/langgraph"
            ],
            "createdAt": "2025-08-09T11:04:25+09:00",
            "score": 0.36116046
        },
        {
            "memoryRecordId": "mem-df23a942-8cea-45ef-a6a8-f8ee9ef53358",
            "content": {
                "text": "{\"context\":\"사용자가 역삼동에서 근무한다고 언급했습니다.\",\"preference\":\"역삼동 지역에서 근무하는 것을 선호\",\"categories\":[\"위치\",\"근무지\"]}"
            },
            "memoryStrategyId": "langgraph-IUSVyT8IwG",
            "namespaces": [
                "/users/langgraph"
            ],
            "createdAt": "2025-08-09T10:30:35+09:00",
            "score": 0.35573184
        }
    ]
}

메모리 ID의 처리

Memory의 모든 동작은 Memory ID가 반드시 필요한데, list_memories로 조회하면 description등은 보여주지 않고 id만 제공하여 어떤 대화가 mapping되어 있는지 알 수 없습니다. 따라서, Memory ID 생성 시점에 config 형태로 저장해서, 대화와 mapping이 필요합니다. 대화는 sessionId와 actorId를 필수로 가지고 있어야 하므로, config에서 이 정보를 Memory ID와 mapping 할 수 있어야 합니다.

Reference

Amazon Bedrock AgentCore Memory

tool - agent_core_memory.py

boto3 - create_memory

boto3 - get_memory_record

boto3 - retrieve_memory_records

Bedrock AgentCore Memory SDK

LangGraph with AgentCore Memory Tool (Short term memory)

AWS CLI: retrieve-memory-records

Boto3: retrieve_memory_records