LangChain에서 Memory는 LLM 기반 애플리케이션의 “대화 컨텍스트” 유지에 핵심적인 역할을 합니다.
기본적으로 ConversationBufferMemory(단순히 대화 이력을 모두 저장)를 가장 많이 쓰고, 더 스마트한 컨텍스트 관리가 많아질수록 Summary Memory, Entity Memory, 그 외 다양한 Memory 객체를 사용할 수 있습니다.
| 종류 | 특징/설명 | 대표적 사용 예시 |
|---|---|---|
| ConversationBufferMemory | 대화 이력(입력/출력)을 순차적으로 계속 기록. 컨텍스트 최대량에 도달할 때까지 버퍼처럼 저장 | 일반 챗봇, 최근 몇 turn까지만 문맥 반영 |
| ConversationSummaryMemory | 전체 대화 내용을 요약해서 간결한 컨텍스트로 LLM에 제공 (gpt-3.5 등으로 자동 요약) | 긴 대화에도 ‘핵심 맥락’만 유지할 때 코스트 절감 |
| ConversationEntityMemory | 대화 중 등장한 사람/장소/사물 등 엔터티(주체)를 추출·정리해서 LLM 컨텍스트에 명확 전달 | “OOO는 누구야?”, “방금 언급한 제품 다시 설명해줘” |
| ConversationBufferWindowMemory | 최근 N개의 질문/응답만을 기억 (윈도우 방식의 짤막한 버퍼) | 최근 turn만 필요한 챗봇 (메모리 절약) |
| CombinedMemory | 여러 메모리 객체를 합쳐서 개별 특성을 동시에 사용 | 엔터티+요약, 혹은 버퍼+엔터티 등 복합 운영 |
원리: 전형적인 대화 기록(입‧출력 쌍)을 모두 저장
장점: 단순, 직관적
단점: 대화가 길어질수록 프롬프트/토큰이 너무 커질 수 있음
원리: 전체 대화를 요약(기사처럼 핵심만 추리기)해서 사실상 하나의 “짧은 요약문”으로만 LLM에 넘김
장점: 대화 길이 무관하게 문맥 유지, 비용/속도 효율
단점: 상세 내용 잃을 수 있음
예시 코드:
from langchain.memory import ConversationSummaryMemory
from langchain.llms import OpenAI
memory = ConversationSummaryMemory(
llm=OpenAI(), # 요약에 사용될 LLM (요약 비용 쿼리 발생)
)
장점: “OOO가 누구야?”, “방금 말한 A 회사가 뭐지?” 등 맥락적 질문에 맞춤 답변
단점: 엔터티 추출 정확도에 따라 컨텍스트 품질이 다름
예시 코드:
from langchain.memory import ConversationEntityMemory
memory = ConversationEntityMemory(
llm=OpenAI(), # 엔터티 추출 자동화에 사용될 LLM
)
원리: 최근 N개의 대화만 저장(메모리 윈도우 이동), 오래된 대화는 잊음
장점: 토큰 제한 걱정↓, 최근 맥락만 필요할 때
예시 코드:
from langchain.memory import ConversationBufferWindowMemory
memory = ConversationBufferWindowMemory(k=5) # 최근 5-turn만 기억
원리: Memory 종류를 여러 개 조합해서 파이프라인 적용
예시 코드:
from langchain.memory import CombinedMemory, ConversationBufferMemory, ConversationEntityMemory
memory = CombinedMemory(
memories=[
ConversationBufferMemory(),
ConversationEntityMemory(llm=OpenAI())
]
)
SummaryMemory : 긴 다국어 대화를 요약+연속 번역할 때 적합
EntityMemory : 여러 인물/제품/전문용어가 반복 등장하는 번역 대화(특히 질의응답, 기술문서 번역 등)에 유용
BufferWindowMemory : “직전 맥락” 파악만 중요하거나 토큰 아끼고 싶을 때
무조건 하나만 고집X, 상황/서비스 목적 따라 자유 조합 가능!
대부분의 메모리 객체는 LLM 또는 체인(Chain, Agent)에서 memory=... 옵션으로 바로 적용됨
“예제에서 사용한 memory”는 바로 아래 코드 부분에서 사용된 ConversationBufferMemory입니다.
from langchain.memory import ConversationBufferMemory
memory = ConversationBufferMemory()
...
translation_chain = create_translation_chain(vector_db, memory=memory)
특징
유저와의 대화이력(입력/출력 쌍 전체)을 순차적으로 모두 저장합니다.
체인(Chain) 또는 LLM에 넣어주면 자동으로 대화 ‘히스토리’가 prompt에 반영됩니다.
그래서 "방금 전에 쓴 말"이나 "이전 번역"처럼 최근 대화 내용을 참고해야 할 때 유용합니다.
장점
구현이 쉽고, 특별한 설정 없이도 사용할 수 있습니다.
대화가 짧거나, 단순히 연속 대화 맥락만 유지하면 되는 번역 기능에 적합합니다.
단점
SummaryMemory/EntityMemory 등이 더 효율적일 수 있습니다.“위 코드에서 사용한 memory는 ConversationBufferMemory로, 대화 이력을 그대로 저장‧이어주는 가장 기본적인 메모리입니다!”