대화 버퍼 윈도우 메모리를 활용한 효율적인 대화 관리 방법

GoGoComputer·2024년 11월 12일
0

LangChain Basics

목록 보기
33/40
post-thumbnail

소개

대화 버퍼 윈도우 메모리(Conversation Buffer Window Memory)를 사용하는 방법에 대해 자세히 알아보겠습니다. 이 메모리 유형은 기본적인 대화 버퍼 메모리와 유사하지만, 대화 기록의 창 크기를 제한하여 모델이 접근할 수 있는 이전 상호 작용의 수를 제어할 수 있습니다. 이때 k는 모델이 기억할 이전 상호 작용의 수를 나타냅니다.

대화 버퍼 윈도우 메모리 이해하기

일반적인 대화에서는 모델이 모든 이전 메시지를 기억합니다. 하지만 때로는 모델이 이전 대화의 일부만 기억하도록 제한하고 싶을 수 있습니다. 예를 들어, 너무 많은 정보로 인해 모델이 혼란스러워지는 것을 방지하고 싶을 때 말이죠. 이럴 때 대화 버퍼 윈도우 메모리를 사용하면 됩니다. 이 메모리는 최근 k개의 상호 작용(사용자 메시지와 모델의 응답)을 저장하여 모델이 그 부분만 참고하도록 합니다.

환경 설정하기

새로운 노트북을 열고 시작해봅시다.

  1. 필요한 라이브러리 임포트하기

    먼저, LangChain 라이브러리에서 필요한 클래스를 임포트합니다:

    from langchain.chat_models import ChatOpenAI
    from langchain.chains import ConversationChain
    from langchain.memory import ConversationBufferWindowMemory
  2. OpenAI API 키 로드하기

    보안을 위해 .env 파일에서 OPENAI_API_KEY를 로드하겠습니다. 작업 디렉토리에 .env 파일을 만들고 다음과 같이 입력하세요:

    OPENAI_API_KEY=여러분의_실제_OpenAI_API_키

    그런 다음, dotenv 라이브러리를 사용하여 환경 변수를 로드합니다:

    import os
    from dotenv import load_dotenv
    
    load_dotenv()

대화 체인과 메모리 생성하기

이제 메모리의 창 크기 k를 설정하고 대화 체인을 만들어봅시다.

  1. 언어 모델 초기화하기

    모델의 출력을 일관되게 하기 위해 temperature를 0.0으로 설정합니다.

    llm = ChatOpenAI(temperature=0.0)
  2. 메모리 설정하기

    ConversationBufferWindowMemory를 사용하여 k=1로 설정합니다. 이는 모델이 가장 최근의 상호 작용 한 개만 기억하도록 합니다.

    memory = ConversationBufferWindowMemory(k=1)
  3. 대화 체인 생성하기

    언어 모델과 메모리를 연결하는 ConversationChain을 생성합니다.

    conversation = ConversationChain(
        llm=llm,
        memory=memory,
        verbose=True
    )

모델과 대화 시작하기

이제 모델과 실제로 대화를 시작해보겠습니다.

  1. 첫 번째 상호 작용

    response = conversation.predict(input="안녕하세요, 만나서 반가워요!")
    print(response)

    모델이 인사말을 반환할 것입니다.

  2. 두 번째 상호 작용

    response = conversation.predict(input="수학에 대해 이야기해 줄래요?")
    print(response)

    모델이 수학에 대한 정보를 제공할 것입니다.

  3. 세 번째 상호 작용

    response = conversation.predict(input="화성에 대해 알려주세요.")
    print(response)

    모델이 화성에 대한 정보를 제공할 것입니다.

메모리 확인하기

이제 메모리에 무엇이 저장되어 있는지 확인해봅시다.

  1. 전체 메모리 버퍼 출력하기

    print("\n전체 메모리 버퍼:")
    print(memory.buffer)

    이 코드는 대화 내역의 모든 메시지를 출력합니다.

  2. 메모리 변수 로드하기

    모델이 현재 접근할 수 있는 대화 내역(창 크기 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 값을 사용하여 실험해보고 사용 가능한 컨텍스트에 따라 모델의 응답이 어떻게 달라지는지 관찰해보세요.

profile
IT를 좋아합니다.

0개의 댓글