본문 바로가기
Data & Research

[LLM & RAG] Langchain 기초 - Memory

by TrillionNT 2025. 4. 3.

우리가 Chat GPT와 채팅을 할 때 이전에 대화한 내용을 기억해야 대답을 할 수 있는 상황도 있겠죠? 그런 작업을 위해서는 대화 기록을 저장해야합니다. 그것을 위한 모듈이 Memory입니다. 

 

Memory 종류 특성 장점 단점
ConversationBufferMemory 모든 대화 기록을 저장 단순하고 사용하기 쉬움 길어지면 토큰 한도 초과 가능
ConversationBufferWindowMemory 최근 n개 대화만 저장 토큰 사용량 절약 오래된 정보는 잊어버림
ConversationTokenBufferMemory 최근 n개의 토큰(token) 기반으로 대화 저장 토큰 초과 방지 일부 중요한 대화가 잘릴 수 있음
ConversationSummaryMemory 이전 대화를 요약하여 저장 긴 대화에서도 컨텍스트 유지 요약 과정에서 정보 손실 가능
ConversationEntityMemory 개체(Entity) 중심으로 기억 특정 정보(예: 인물, 장소)를 기억하는 데 유용 일반 대화보다는 정보 추출형 대화에 적합
ConversationKGMemory 지식 그래프(Knowledge Graph) 기반으로 기억 개념과 관계를 유지하며 기억 설정이 복잡하고 일반 대화에는 부적합
VectorStoreRetrieverMemory 벡터 데이터베이스에 대화를 저장 후 검색 긴 대화에서도 원하는 정보를 효율적으로 검색 벡터 DB 설정 필요

 

 

1. ConversationBufferMemory (모든 대화 저장)

from langchain.memory import ConversationBufferMemory

# 메모리 생성
memory = ConversationBufferMemory()

# 메모리에 저장
memory.save_context({"input": "Hello!"}, {"output": "Hi! How can I help you?"})
memory.save_context({"input": "What’s your name?"}, {"output": "I'm an AI assistant."})

# 전체 대화 기록 확인
print(memory.load_memory_variables({}))

 

 

2. ConversationBufferWindowMemory (최근 n개 대화 저장)

from langchain.memory import ConversationBufferWindowMemory

# 최근 2개의 대화만 저장
memory = ConversationBufferWindowMemory(k=2)

# 여러 개의 대화 저장
memory.save_context({"input": "Hello!"}, {"output": "Hi! How can I help you?"})
memory.save_context({"input": "What’s your name?"}, {"output": "I'm an AI assistant."})
memory.save_context({"input": "What can you do?"}, {"output": "I can answer your questions."})

# 저장된 최근 대화 확인
print(memory.load_memory_variables({}))

 

 

3. ConversationTokenBufferMemory (최근 n개 토큰 기반 저장)

from langchain.memory import ConversationTokenBufferMemory
from langchain_openai import ChatOpenAI

# OpenAI 모델 설정 (토큰 카운트에 사용됨)
llm = ChatOpenAI(model="gpt-4")

# 최근 50개 토큰만 저장
memory = ConversationTokenBufferMemory(llm=llm, max_token_limit=50)

# 대화 저장
memory.save_context({"input": "Tell me about AI."}, {"output": "AI stands for Artificial Intelligence..."})
memory.save_context({"input": "What is deep learning?"}, {"output": "Deep learning is a subset of AI that uses neural networks..."})

# 저장된 대화 확인
print(memory.load_memory_variables({}))

 

 

4. ConversationSummaryMemory (대화 요약 저장)

from langchain.memory import ConversationSummaryMemory
from langchain_openai import ChatOpenAI

# 요약 기반 메모리 생성
llm = ChatOpenAI(model="gpt-4")
memory = ConversationSummaryMemory(llm=llm)

# 대화 저장
memory.save_context({"input": "Hello!"}, {"output": "Hi! How can I help you?"})
memory.save_context({"input": "Tell me about machine learning."}, {"output": "Machine learning is a field of AI that enables computers to learn..."})

# 저장된 요약 확인
print(memory.load_memory_variables({}))

 

 

5. ConversationEntityMemory (개체 중심 기억)

사람, 장소 등 특정 개체(Entity) 정보를 저장하는 방식입니다.

from langchain.memory import ConversationEntityMemory
from langchain_openai import ChatOpenAI

# 개체 기반 메모리
llm = ChatOpenAI(model="gpt-4")
memory = ConversationEntityMemory(llm=llm)

# 대화 저장
memory.save_context({"input": "My name is John."}, {"output": "Nice to meet you, John!"})
memory.save_context({"input": "I live in New York."}, {"output": "New York is a great city!"})

# 저장된 개체 확인
print(memory.load_memory_variables({}))

 

 

6. ConversationKGMemory (지식 그래프 기반 기억)

Elon Musk → founded → Tesla 같은 관계 기반 정보 저장
개념 간 연결이 필요한 경우 유용

from langchain.memory import ConversationKGMemory

memory = ConversationKGMemory()

memory.save_context({"input": "Elon Musk founded Tesla."}, {"output": "Got it!"})
memory.save_context({"input": "He also founded SpaceX."}, {"output": "Understood."})

print(memory.load_memory_variables({}))

 

 

7. VectorStoreRetrieverMemory (벡터 DB 기반 기억)

from langchain.memory import VectorStoreRetrieverMemory
from langchain_openai import OpenAIEmbeddings
from langchain.vectorstores import FAISS

# FAISS 벡터 스토어 생성
vectorstore = FAISS.from_texts(["Hello! How can I help you?"], OpenAIEmbeddings())

# 벡터 메모리 생성
memory = VectorStoreRetrieverMemory(retriever=vectorstore.as_retriever())

# 대화 저장 및 검색
memory.save_context({"input": "Tell me a joke."}, {"output": "Why did the chicken cross the road?"})
print(memory.load_memory_variables({}))