소개
대화 버퍼 윈도우 메모리(Conversation Buffer Window Memory)를 사용하는 방법에 대해 자세히 알아보겠습니다. 이 메모리 유형은 기본적인 대화 버퍼 메모리와 유사하지만, 대화 기록의 창 크기를 제한하여 모델이 접근할 수 있는 이전 상호 작용의 수를 제어할 수 있습니다. 이때 k
는 모델이 기억할 이전 상호 작용의 수를 나타냅니다.
대화 버퍼 윈도우 메모리 이해하기
일반적인 대화에서는 모델이 모든 이전 메시지를 기억합니다. 하지만 때로는 모델이 이전 대화의 일부만 기억하도록 제한하고 싶을 수 있습니다. 예를 들어, 너무 많은 정보로 인해 모델이 혼란스러워지는 것을 방지하고 싶을 때 말이죠. 이럴 때 대화 버퍼 윈도우 메모리를 사용하면 됩니다. 이 메모리는 최근 k
개의 상호 작용(사용자 메시지와 모델의 응답)을 저장하여 모델이 그 부분만 참고하도록 합니다.
환경 설정하기
새로운 노트북을 열고 시작해봅시다.
필요한 라이브러리 임포트하기
먼저, LangChain 라이브러리에서 필요한 클래스를 임포트합니다:
from langchain.chat_models import ChatOpenAI
from langchain.chains import ConversationChain
from langchain.memory import ConversationBufferWindowMemory
OpenAI API 키 로드하기
보안을 위해 .env
파일에서 OPENAI_API_KEY
를 로드하겠습니다. 작업 디렉토리에 .env
파일을 만들고 다음과 같이 입력하세요:
OPENAI_API_KEY=여러분의_실제_OpenAI_API_키
그런 다음, dotenv
라이브러리를 사용하여 환경 변수를 로드합니다:
import os
from dotenv import load_dotenv
load_dotenv()
대화 체인과 메모리 생성하기
이제 메모리의 창 크기 k
를 설정하고 대화 체인을 만들어봅시다.
언어 모델 초기화하기
모델의 출력을 일관되게 하기 위해 temperature
를 0.0으로 설정합니다.
llm = ChatOpenAI(temperature=0.0)
메모리 설정하기
ConversationBufferWindowMemory
를 사용하여 k=1
로 설정합니다. 이는 모델이 가장 최근의 상호 작용 한 개만 기억하도록 합니다.
memory = ConversationBufferWindowMemory(k=1)
대화 체인 생성하기
언어 모델과 메모리를 연결하는 ConversationChain
을 생성합니다.
conversation = ConversationChain(
llm=llm,
memory=memory,
verbose=True
)
모델과 대화 시작하기
이제 모델과 실제로 대화를 시작해보겠습니다.
첫 번째 상호 작용
response = conversation.predict(input="안녕하세요, 만나서 반가워요!")
print(response)
모델이 인사말을 반환할 것입니다.
두 번째 상호 작용
response = conversation.predict(input="수학에 대해 이야기해 줄래요?")
print(response)
모델이 수학에 대한 정보를 제공할 것입니다.
세 번째 상호 작용
response = conversation.predict(input="화성에 대해 알려주세요.")
print(response)
모델이 화성에 대한 정보를 제공할 것입니다.
메모리 확인하기
이제 메모리에 무엇이 저장되어 있는지 확인해봅시다.
전체 메모리 버퍼 출력하기
print("\n전체 메모리 버퍼:")
print(memory.buffer)
이 코드는 대화 내역의 모든 메시지를 출력합니다.
메모리 변수 로드하기
모델이 현재 접근할 수 있는 대화 내역(창 크기 k
로 제한됨)을 보려면 다음과 같이 합니다:
memory_variables = memory.load_memory_variables({})
print("\n메모리 변수 (k로 제한됨):")
print(memory_variables)
여기서는 가장 최근의 k
개의 상호 작용만 표시됩니다.
창 크기 k
의 작동 방식 이해하기
k=1
로 설정하면 모델은 가장 최근의 상호 작용만 고려합니다(사용자 메시지 1개와 모델 응답 1개). k=2
로 설정하면 최근 두 개의 상호 작용을 고려합니다.
# 창 크기를 2로 변경
memory.k = 2
memory_variables = memory.load_memory_variables({})
print("\nk를 2로 변경한 후 메모리 변수:")
print(memory_variables)
전체 작동 코드
다음은 모든 내용을 포함한 전체 코드입니다. .env
파일에 실제 OpenAI API 키를 입력하는 것을 잊지 마세요.
# 필요한 라이브러리 임포트
import os
from dotenv import load_dotenv
from langchain.chat_models import ChatOpenAI
from langchain.chains import ConversationChain
from langchain.memory import ConversationBufferWindowMemory
# .env 파일에서 OpenAI API 키 로드
load_dotenv()
OPENAI_API_KEY = os.getenv('OPENAI_API_KEY')
# 언어 모델 초기화
llm = ChatOpenAI(temperature=0.0, openai_api_key=OPENAI_API_KEY)
# 창 크기 k를 사용하여 메모리 설정
memory = ConversationBufferWindowMemory(k=1)
# 대화 체인 생성
conversation = ConversationChain(
llm=llm,
memory=memory,
verbose=True
)
# 대화 시작
response = conversation.predict(input="안녕하세요, 만나서 반가워요!")
print(response)
# 대화 계속
response = conversation.predict(input="수학에 대해 이야기해 줄래요?")
print(response)
response = conversation.predict(input="화성에 대해 알려주세요.")
print(response)
# 전체 메모리 버퍼 출력
print("\n전체 메모리 버퍼:")
print(memory.buffer)
# 메모리 변수 로드 및 출력 (k로 제한됨)
memory_variables = memory.load_memory_variables({})
print("\n메모리 변수 (k로 제한됨):")
print(memory_variables)
# 창 크기 변경 및 확인
memory.k = 2
memory_variables = memory.load_memory_variables({})
print("\nk를 2로 변경한 후 메모리 변수:")
print(memory_variables)
코드 설명
환경 변수 로드
dotenv
라이브러리를 사용하여 .env
파일에서 환경 변수를 로드합니다. 이는 API 키를 안전하게 관리하는 방법입니다.
언어 모델 초기화
ChatOpenAI
인스턴스를 생성하고 openai_api_key
를 전달합니다. temperature=0.0
으로 설정하여 모델의 응답이 일관되도록 합니다.
메모리 설정
ConversationBufferWindowMemory
에서 k=1
로 설정하여 대화 내역을 가장 최근의 상호 작용 한 개로 제한합니다.
대화 체인 생성
ConversationChain
을 사용하여 언어 모델과 메모리를 연결합니다. verbose=True
로 설정하면 상호 작용의 상세 로그를 볼 수 있습니다.
모델과 상호 작용
conversation.predict(input=...)
를 사용하여 모델에게 메시지를 보내고 응답을 받습니다.
메모리 확인
memory.buffer
는 전체 대화 내역을 포함합니다.memory.load_memory_variables({})
는 k
로 제한된 대화 내역을 반환합니다.창 크기 조정
memory.k
값을 동적으로 변경하여 더 많은 이전 상호 작용을 컨텍스트에 포함시킬 수 있습니다.
결론
대화 버퍼 윈도우 메모리를 사용하면 AI 모델이 접근할 수 있는 대화 내역의 양을 제어할 수 있습니다. 이는 긴 대화에서 컨텍스트를 관리하고 모델이 오래된 정보에 영향을 받는 것을 방지하는 데 특히 유용합니다.
다양한 k
값을 사용하여 실험해보고 사용 가능한 컨텍스트에 따라 모델의 응답이 어떻게 달라지는지 관찰해보세요.