랭체인(LangChain)의 Memory 모듈은 애플리케이션이 사용자와의 상호작용에서 상태를 기억하고 이전 대화의 맥락을 유지할 수 있도록 도와주는 기능입니다.
Memory 모듈은 언어 모델과의 대화를 보다 자연스럽고 일관되게 만들기 위해 설계되었습니다.
이 글에서는 Memory 모듈의 기능, 사용 사례, 구성 요소에 대해 자세히 설명하겠습니다.
Memory 모듈은 애플리케이션이 사용자와의 대화에서 중요한 정보를 저장하고, 이를 바탕으로 다음 대화를 보다 자연스럽게 이어갈 수 있도록 지원합니다.
이 모듈은 사용자의 질문, 응답, 그리고 대화의 흐름을 기억하여, 이전 상호작용을 바탕으로 보다 개인화된 경험을 제공합니다.
LangChain은 다양한 유형의 Memory 구현을 제공합니다.
가장 기본적인 형태로, 모든 대화 내용을 그대로 저장합니다.
from langchain.memory import ConversationBufferMemory
memory = ConversationBufferMemory()
memory.chat_memory.add_user_message("안녕하세요!")
memory.chat_memory.add_ai_message("안녕하세요! 어떻게 도와드릴까요?")
print(memory.load_memory_variables({}))
가장 최근 K개의 메시지만 기억합니다.
from langchain.memory import ConversationBufferWindowMemory
memory = ConversationBufferWindowMemory(k=2)
memory.chat_memory.add_user_message("첫 번째 메시지")
memory.chat_memory.add_ai_message("첫 번째 응답")
memory.chat_memory.add_user_message("두 번째 메시지")
memory.chat_memory.add_ai_message("두 번째 응답")
print(memory.load_memory_variables({})) # 최근 2개 대화만 포함됨
대화가 길어질 때 요약본을 유지하여 토큰 사용을 최적화합니다.
from langchain.memory import ConversationSummaryMemory
from langchain.llms import OpenAI
llm = OpenAI(temperature=0)
memory = ConversationSummaryMemory(llm=llm)
memory.chat_memory.add_user_message("프로젝트에 대해 논의해보자.")
memory.chat_memory.add_ai_message("네, 어떤 프로젝트인가요?")
memory.chat_memory.add_user_message("웹 애플리케이션 개발 프로젝트입니다.")
print(memory.load_memory_variables({})) # 요약된 내용 포함
대화에서 중요한 엔티티를 추출하고 추적합니다.
from langchain.memory import ConversationEntityMemory
from langchain.llms import OpenAI
llm = OpenAI(temperature=0)
memory = ConversationEntityMemory(llm=llm)
memory.chat_memory.add_user_message("내 이름은 김철수이고 파이썬으로 프로젝트를 진행중이야.")
memory.chat_memory.add_ai_message("안녕하세요 김철수님, 파이썬 프로젝트에 대해 더 알려주세요.")
print(memory.load_memory_variables({})) # 김철수, 파이썬과 같은 엔티티 정보 포함
대규모 대화 기록을 벡터 저장소에 저장하고 관련성 있는 내용을 검색합니다.
from langchain.memory import VectorStoreRetrieverMemory
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import FAISS
embeddings = OpenAIEmbeddings()
vectorstore = FAISS.from_texts(["대화 내용 1", "대화 내용 2"], embeddings)
retriever = vectorstore.as_retriever()
memory = VectorStoreRetrieverMemory(retriever=retriever)
print(memory.load_memory_variables({"query": "관련 대화"})) # 관련 대화 검색 결과 포함
Memory 모듈을 활용한 간단한 챗봇 구현 코드입니다.
from langchain.chains import ConversationChain
from langchain.memory import ConversationBufferMemory
from langchain.llms import OpenAI
# 메모리 초기화
memory = ConversationBufferMemory()
# 대화 체인 생성
conversation = ConversationChain(
llm=OpenAI(temperature=0.7),
memory=memory,
verbose=True
)
# 첫 번째 대화
response = conversation.predict(input="안녕하세요! 저는 인공지능에 관심이 많은 학생입니다.")
print(response)
# 두 번째 대화 (이전 대화 맥락 유지)
response = conversation.predict(input="제가 배워야 할 프로그래밍 언어는 무엇이 좋을까요?")
print(response)
# 세 번째 대화 (사용자의 관심사를 기억)
response = conversation.predict(input="그 언어로 어떤 프로젝트를 시작해볼 수 있을까요?")
print(response)
특정 요구사항에 맞게 Memory 모듈을 커스터마이징하는 방법입니다.
from langchain.memory.chat_memory import BaseChatMemory
from typing import Dict, Any, List
class CustomMemory(BaseChatMemory):
"""사용자 정의 메모리 클래스"""
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.user_preferences = {}
def load_memory_variables(self, inputs: Dict[str, Any]) -> Dict[str, Any]:
"""메모리에서 변수를 로드하는 메소드"""
return {
"history": self.buffer,
"preferences": self.user_preferences
}
def save_context(self, inputs: Dict[str, Any], outputs: Dict[str, str]) -> None:
"""새로운 컨텍스트를 저장하는 메소드"""
super().save_context(inputs, outputs)
# 사용자 선호도 추출 로직 (실제 구현은 더 복잡할 수 있음)
if "preference" in inputs:
self.user_preferences[inputs["preference_key"]] = inputs["preference_value"]
def clear(self) -> None:
"""메모리를 초기화하는 메소드"""
super().clear()
self.user_preferences = {}
랭체인의 메모리 모듈은 사용자와의 상호작용을 보다 자연스럽고 개인화된 경험으로 만들어주는 중요한 기능입니다.
이 모듈을 통해 개발자는 대화의 맥락을 유지하고, 이전 상호작용을 바탕으로 보다 일관된 응답을 제공할 수 있습니다.
메모리 기능은 단순한 챗봇부터 복잡한 대화형 시스템까지 다양한 애플리케이션에서 활용될 수 있으며, 랭체인의 다양한 메모리 구현체를 사용하거나 커스텀 메모리 개발함으로써 특정 사용 사례에 최적화된 솔루션을 구축할 수 있습니다.
적절한 메모리 전략을 선택하고 구현하는 것은 사용자 경험을 크게 향상시키는 핵심 요소이며, 이를 통해 더욱 지능적이고 맥락을 이해하는 AI 애플리케이션을 개발할 수 있습니다.