개요

LangMem은 AI 에이전트가 시간이 지남에 따라 상호작용에서 학습하고 적응할 수 있도록 하는 Python 라이브러리입니다. 대화에서 중요한 정보를 추출하고, 프롬프트 개선을 통해 에이전트 동작을 최적화하며, 장기 메모리를 유지하는 기능을 제공합니다.

LangMem은 LangGraph의 장기 메모리 저장소와 네이티브로 통합되어 모든 LangGraph Platform 배포에서 사용할 수 있습니다.

핵심 기능

  • 저장소 독립적 API: 모든 저장 시스템과 호환되는 핵심 메모리 API
  • 능동적 메모리 관리: 에이전트가 대화 중에 정보를 기록하고 검색하는 메모리 관리 도구
  • 백그라운드 처리: 에이전트의 능동적 개입 없이 지식을 자동으로 추출하고 통합
  • LangGraph 통합: LangGraph의 장기 메모리 저장소와 네이티브 통합

아키텍처

LangMem은 세 가지 레벨로 작동합니다:

  1. 기능적 프리미티브 (Functional Primitives): 모든 저장 시스템과 호환되는 핵심 메모리 API
  2. 핫 패스 도구 (Hot Path Tools): 에이전트가 대화 중에 적극적으로 사용하는 메모리 관리 유틸리티
  3. 백그라운드 처리 (Background Processing): 지식의 자동 추출 및 통합

세 가지 메모리 타입

1. 의미 메모리 (Semantic Memory) - 사실 & 지식

의미 메모리는 에이전트 응답의 근거가 되는 중요한 사실과 관계를 저장합니다. 사용자 선호도와 모델 자체에 내재되지 않은 도메인별 지식을 캡처합니다.

전통적인 검색 시스템과의 차이점: 지식이 오프라인 수집이 아닌 실제 상호작용에서 발생합니다.

예시: “Alice는 ML 팀을 관리하고 Bob을 멘토링한다”와 같은 정보를 기억합니다.

2. 절차 메모리 (Procedural Memory) - 행동 진화

절차 메모리는 작업 수행을 위한 학습된 기술, 규칙, 패턴을 캡처합니다. 시스템은 성능 피드백을 기반으로 발견된 효과적인 행동을 통합하도록 에이전트 프롬프트를 업데이트합니다.

SDK는 세 가지 알고리즘 접근 방식을 제공합니다:

  • Metaprompt: 반성과 “사고 시간”을 사용하여 상호작용을 분석
  • Gradient: 비평과 제안 생성을 별도 단계로 분리
  • Prompt_memory: 간소화된 단일 단계 대안

3. 일화 메모리 (Episodic Memory) - 경험

일화 메모리는 특정 과거 상호작용을 요약된 퓨샷 예제로 보존하여, 특정 해결된 문제를 일반 지식과 구별합니다.

설치

pip install -U langmem

환경 변수 설정:

export ANTHROPIC_API_KEY="sk-..."  # 또는 다른 지원되는 LLM 프로바이더
export OPENAI_API_KEY="sk-..."     # OpenAI 임베딩 사용 시

빠른 시작

기본 사용 예제

from langgraph.prebuilt import create_react_agent
from langgraph.store.memory import InMemoryStore
from langmem import create_manage_memory_tool, create_search_memory_tool
 
# 인메모리 저장소 설정 (개발용)
store = InMemoryStore(
    index={"dims": 1536, "embed": "openai:text-embedding-3-small"}
)
 
# 메모리 도구를 가진 에이전트 생성
agent = create_react_agent(
    "anthropic:claude-3-5-sonnet-latest",
    tools=[
        create_manage_memory_tool(namespace=("memories",)),
        create_search_memory_tool(namespace=("memories",)),
    ],
    store=store,
)
 
# 메모리 저장
agent.invoke({
    "messages": [{"role": "user", "content": "나는 다크 모드를 선호해."}]
})
 
# 메모리 검색
response = agent.invoke({
    "messages": [{"role": "user", "content": "내 선호도가 뭐였지?"}]
})

핵심 도구

LangMem은 두 가지 상호보완적인 도구를 통해 작동합니다:

  • create_manage_memory_tool: 에이전트가 관련 대화 세부사항을 저장할 수 있게 함
  • create_search_memory_tool: 관련성 있는 유사한 메모리를 검색할 수 있게 함

에이전트는 명시적인 명령 없이 어떤 정보를 저장할 가치가 있는지 자율적으로 결정합니다. 시스템은 의미론적 검색을 사용하여 관련된 과거 상호작용을 찾습니다.

저장소 옵션

개발 환경

from langgraph.store.memory import InMemoryStore
 
store = InMemoryStore(
    index={"dims": 1536, "embed": "openai:text-embedding-3-small"}
)

주의: InMemoryStore는 재시작 시 데이터가 손실됩니다.

프로덕션 환경

from langgraph.store.postgres import AsyncPostgresStore
 
# PostgreSQL 기반 영구 저장소 (임베딩 설정 포함)
store = AsyncPostgresStore.from_conn_string(
    conn_string="postgresql://user:password@localhost:5432/langgraph",
    index={
        "dims": 1536,                              # 임베딩 차원
        "embed": "openai:text-embedding-3-small",  # 임베딩 모델
        "fields": ["$"]                            # 임베딩할 필드 (기본값: 전체 문서)
    }
)
 
# 최초 사용 전 스키마 설정 필요 (1회만 실행)
await store.setup()

프로덕션 환경에서는 AsyncPostgresStore 또는 다른 데이터베이스 기반 대안을 사용하여 영속성을 확보합니다.

중요: AsyncPostgresStore도 의미론적 검색을 위해 임베딩 설정이 필요합니다. index 설정이 없으면 벡터 검색이 지원되지 않습니다.

저장소 비교

특징InMemoryStoreAsyncPostgresStore
데이터 영속성❌ 재시작 시 손실✅ 영구 저장
임베딩 설정필요필요
setup() 호출불필요필수 (최초 1회)
연결 풀링해당 없음지원
용도개발/테스트프로덕션
성능빠름 (메모리)DB 의존

구현 시 고려사항

배포 전에 다음 사항을 평가해야 합니다:

  1. 행동 적응: 어떤 행동이 적응이 필요하고 어떤 행동이 정적으로 유지되어야 하는가?
  2. 지식 카테고리: 어떤 지식 범주가 영속성을 요구하는가?
  3. 검색 트리거: 어떤 조건에서 메모리 검색이 트리거되어야 하는가?
  4. 프라이버시: 네임스페이스 조직을 통한 프라이버시 영향 (일반적으로 사용자 ID 포함)

사용 사례

개인화된 대화

사용자의 선호도, 과거 상호작용, 개인 정보를 기억하여 더 자연스럽고 개인화된 대화를 제공합니다.

# 사용자가 "나는 Python을 선호해"라고 말하면
# 에이전트는 자동으로 이 정보를 저장
# 나중에 코드 예제를 제공할 때 Python을 사용

컨텍스트 유지

여러 세션에 걸쳐 컨텍스트를 유지하여 사용자가 이전 대화를 반복할 필요가 없습니다.

# 세션 1: "나는 전자상거래 앱을 개발 중이야"
# 세션 2: "결제 기능을 추가하고 싶어"
# 에이전트는 전자상거래 컨텍스트를 기억하고 관련 제안을 제공

행동 학습 및 개선

에이전트가 성공적인 상호작용 패턴을 학습하고 프롬프트를 자동으로 개선합니다.

# 특정 유형의 질문에 대한 효과적인 응답 패턴을 학습
# 시간이 지남에 따라 더 나은 결과를 제공하도록 행동을 조정

LangGraph와의 통합

LangMem은 LangGraph의 장기 메모리 저장소와 완벽하게 통합됩니다:

개발 환경 예제

from langgraph.graph import StateGraph, MessagesState
from langgraph.store.memory import InMemoryStore
from langmem import create_manage_memory_tool, create_search_memory_tool
 
# 저장소 설정
store = InMemoryStore(
    index={"dims": 1536, "embed": "openai:text-embedding-3-small"}
)
 
# StateGraph에서 사용
builder = StateGraph(MessagesState)
 
# 메모리 도구를 노드에 추가
# ...
 
# 체크포인터와 함께 컴파일
graph = builder.compile(checkpointer=checkpointer, store=store)

프로덕션 환경 예제

from langgraph.prebuilt import create_react_agent
from langgraph.store.postgres import AsyncPostgresStore
from langgraph.checkpoint.postgres import AsyncPostgresSaver
from langmem import create_manage_memory_tool, create_search_memory_tool
 
# Store 설정 (장기 메모리)
store = AsyncPostgresStore.from_conn_string(
    conn_string="postgresql://user:password@localhost:5432/langgraph",
    index={
        "dims": 1536,
        "embed": "openai:text-embedding-3-small",
        "fields": ["$"]
    }
)
 
# Checkpointer 설정 (대화 히스토리)
checkpointer = AsyncPostgresSaver.from_conn_string(
    conn_string="postgresql://user:password@localhost:5432/langgraph"
)
 
# 최초 1회 스키마 설정
await store.setup()
await checkpointer.setup()
 
# 메모리 기능을 가진 에이전트 생성
agent = create_react_agent(
    "anthropic:claude-3-5-sonnet-latest",
    tools=[
        create_manage_memory_tool(namespace=("user_memories", "{user_id}")),
        create_search_memory_tool(namespace=("user_memories", "{user_id}")),
    ],
    checkpointer=checkpointer,  # 대화 히스토리 (단기 메모리)
    store=store,                 # 장기 메모리
)
 
# 사용자별 메모리로 실행
response = await agent.ainvoke(
    {"messages": [{"role": "user", "content": "나는 Python을 선호해"}]},
    config={
        "configurable": {
            "thread_id": "conversation_123",
            "user_id": "user_456"  # 네임스페이스 플레이스홀더에 주입됨
        }
    }
)

주요 포인트:

  • checkpointer: 대화 히스토리 저장 (단기 메모리, thread 단위)
  • store: 사용자 정보/선호도 저장 (장기 메모리, user 단위)
  • 네임스페이스에 {user_id} 같은 플레이스홀더 사용 가능
  • 두 시스템을 함께 사용하여 완전한 메모리 관리 구현

참고 자료

라이선스

MIT License