Skip to content

메모리 타입과 갱신 패턴

Semantic, Episodic, Procedural 메모리와 갱신 전략


학습 목표

  • 장기 메모리의 3가지 타입(Semantic, Episodic, Procedural)의 개념과 차이를 이해한다.
  • 각 메모리 타입의 AI 에이전트 구현 패턴을 파악한다.
  • Semantic Memory의 프로필 방식과 컬렉션 방식의 장단점을 비교할 수 있다.
  • Hot Path와 Background 두 가지 메모리 갱신 패턴의 동작 방식과 트레이드오프를 이해한다.
  • 상황에 따라 적합한 메모리 갱신 전략을 선택할 수 있다.

1. 장기 메모리의 3가지 타입 (KoALA 연구 기반)

인간의 메모리 구조화 연구(KoALA)에서 착안하여, 장기 메모리를 3가지 타입으로 분류한다. 각 타입은 저장하는 정보의 성격과 활용 방식이 다르며, AI 에이전트에서도 이 분류에 따라 구현 패턴이 달라진다.


Semantic Memory (의미 기억)

사실과 개념을 저장하는 메모리다. 인간으로 비유하면 학교에서 배운 지식에 해당한다. AI 에이전트에서는 사용자에 대한 사실 정보를 저장하는 데 활용된다. 예를 들어 "이 유저는 한국인이므로 한국어로 답변해야 한다"와 같은 정보가 이에 해당한다.

구현 패턴 2가지:

1. 프로필 방식: 하나의 JSON key-value 객체를 계속 갱신하는 방식이다.

json
{
  "name": "Tom",
  "age": 22,
  "friends": ["Bob"],
  "language": "Korean"
}
  • 장점: 항상 최신 상태를 유지한다. 중복 데이터가 쌓이지 않는다.
  • 단점: 정확한 추출과 갱신 로직이 필요하다. 기존 값을 잘못 덮어쓸 위험이 있다.

2. 컬렉션 방식: 리스트에 새 정보가 오면 계속 append하는 방식이다.

python
memories = [
    "사용자는 한국인이다",
    "사용자는 피자를 좋아한다",
    "사용자는 개발자이다",
    "사용자는 서울에 거주한다"
]
  • 장점: 구현이 간단하다. 정보 손실 위험이 낮다.
  • 단점: 검색 정확도가 중요하다. 데이터가 계속 쌓이므로 관리가 필요하다.

Episodic Memory (일화 기억)

경험을 저장하는 메모리다. 인간으로 비유하면 연인과 여행한 기억처럼, 특정 상황에서의 경험 전체를 기억하는 것이다. AI 에이전트에서는 과거 인터랙션이나 작업 수행 방법을 기억하는 데 활용된다.

대표 구현: Few-shot Example 제공

과거에 성공적으로 문제를 해결한 예시를 프롬프트에 포함하여, LLM이 유사한 문제를 만났을 때 참고할 수 있도록 한다.

python
system_prompt = """
당신은 고객 지원 에이전트입니다.

## 과거 성공 사례 (Episodic Memory)

[사례 1] 환불 요청 처리
- 고객: "주문한 상품이 파손되어 도착했습니다."
- 에이전트 대응: 사진 요청 → 확인 → 즉시 환불 + 재발송
- 결과: 고객 만족

[사례 2] 배송 지연 문의
- 고객: "배송이 일주일째 안 옵니다."
- 에이전트 대응: 물류 추적 → 고객에게 상세 상황 전달 → 보상 쿠폰 발행
- 결과: 고객 만족
"""

Procedural Memory (절차 기억)

규칙과 절차를 저장하는 메모리다. 인간으로 비유하면 자전거 타는 법처럼, 반복을 통해 체득한 절차적 지식이다. AI 에이전트에서는 시스템 프롬프트를 메모리에 저장하고 동적으로 갱신하는 방식으로 구현한다.

핵심 아이디어는 사용자 인터랙션을 기반으로 시스템 프롬프트를 점진적으로 개선하는 것이다. 에이전트가 사용될수록 더 나은 지침을 갖게 된다.

예를 들어, 에이전트가 특정 유형의 질문에 반복적으로 잘못 대응한다면, 그 패턴을 감지하여 시스템 프롬프트에 "이런 질문에는 이렇게 대응하라"는 지침을 추가하는 것이다.


2. 3가지 타입 비교

타입저장 대상인간 비유AI 에이전트 예시구현 패턴
Semantic사실/개념교과서 지식사용자 프로필 정보프로필/컬렉션
Episodic경험여행 기억과거 대화 내역Few-shot Example
Procedural규칙/절차자전거 타기시스템 프롬프트동적 프롬프트 갱신

3. 메모리 갱신 패턴: Hot Path

Hot Path는 유저 메시지가 들어올 때마다 즉시 메모리를 갱신하는 방식이다. 갱신이 완료된 후에야 답변을 생성하므로, 항상 최신 메모리 상태를 기반으로 응답한다.

  • 장점: 항상 최신 메모리 상태를 반영한다.
  • 단점: 메모리 갱신에 의한 응답 지연(latency)이 발생한다.

구현 방식: 매 대화마다 auto_store 노드가 실행되어 transcript를 저장하고, upsert_memory 호출 시 content/context 구조화 저장이 이루어진다.

python
def auto_store(state, config, *, store):
    """매 대화마다 즉시 메모리를 갱신하는 노드"""
    user_id = config["configurable"]["user_id"]
    last_message = state["messages"][-1].content

    # 메모리에 즉시 저장 (content/context 구조화)
    store.put(
        ("memories", user_id),
        str(uuid4()),
        {
            "content": last_message,
            "context": extract_context(state["messages"])
        }
    )
    return state

4. 메모리 갱신 패턴: Background

Background는 유저 메시지에 즉시 답변한 후, 일정 시간(예: 30초)이 지나면 백그라운드에서 메모리를 갱신하는 방식이다. 응답 속도를 우선시하는 경우에 적합하다.

  • 장점: 응답 지연이 없다.
  • 단점: 갱신이 완료되기 전까지는 과거 메모리를 기반으로 답변한다.

구현 방식: Python asyncio task로 delay_seconds만큼 대기한다. 새 대화가 들어오면 기존 task를 cancel하고, 대화가 없으면 save_memory를 실행한다.

python
import asyncio

class BackgroundMemoryManager:
    def __init__(self, store, delay_seconds=30):
        self.store = store
        self.delay_seconds = delay_seconds
        self._pending_task = None

    async def schedule_save(self, user_id, messages):
        """기존 예약이 있으면 취소하고 새로 예약"""
        if self._pending_task:
            self._pending_task.cancel()

        self._pending_task = asyncio.create_task(
            self._delayed_save(user_id, messages)
        )

    async def _delayed_save(self, user_id, messages):
        """delay_seconds만큼 대기 후 메모리 저장"""
        await asyncio.sleep(self.delay_seconds)
        self.store.put(
            ("memories", user_id),
            str(uuid4()),
            {"content": messages[-1].content}
        )

5. 두 방식 비교

구분Hot PathBackground
갱신 시점매 대화마다 즉시일정 시간 후 일괄
메모리 최신성항상 최신갱신 전까지 과거
응답 지연있음없음
적합한 경우실시간성이 중요한 시스템응답 속도가 중요한 시스템

6. 핵심 정리

장기 메모리는 Semantic, Episodic, Procedural 세 가지 타입으로 분류되며, 각 타입에 맞는 구현 패턴이 존재한다. 메모리 갱신은 Hot Path와 Background 두 가지 전략 중 상황에 맞게 선택한다.

  • Semantic Memory: 사실과 개념을 저장한다. 프로필 방식(JSON 갱신)과 컬렉션 방식(리스트 append) 두 가지 패턴이 있다.
  • Episodic Memory: 과거 경험을 저장한다. Few-shot Example로 과거 성공 사례를 프롬프트에 포함하는 것이 대표적이다.
  • Procedural Memory: 규칙과 절차를 저장한다. 사용자 인터랙션을 기반으로 시스템 프롬프트를 점진적으로 개선하는 방식으로 구현한다.
  • Hot Path: 매 대화마다 즉시 메모리를 갱신한다. 실시간성이 중요할 때 적합하지만 응답 지연이 발생한다.
  • Background: 일정 시간 후 백그라운드에서 메모리를 갱신한다. 응답 속도가 중요할 때 적합하지만 갱신 전까지 과거 메모리를 사용한다.