LangChain의 대화 요약 버퍼 메모리: 효율적인 토큰 관리와 대화 요약 활용법

GoGoComputer·2024년 11월 12일
0

LangChain Basics

목록 보기
34/40
post-thumbnail

안녕하세요!

오늘은 LangChain에서 제공하는 또 다른 유용한 메모리 유형인 대화 요약 버퍼 메모리에 대해 자세히 알아보겠습니다. 이 메모리는 대화 내용을 요약하여 메모리에 할당된 토큰 제한에 맞게 관리할 수 있습니다. 이를 통해 대화의 맥락을 유지하면서도 토큰 수를 효율적으로 관리할 수 있습니다.

대화 요약 버퍼 메모리란?

대화 요약 버퍼 메모리는 이전 대화 내용을 요약하여 메모리에 저장하는 메모리 유형입니다. 대화가 길어져 메모리에 저장된 토큰 수가 지정한 최대 토큰 제한을 초과하면, 자동으로 이전 대화 내용을 요약합니다. 이를 통해 메모리의 크기를 제한하고, 모델이 이전 대화의 핵심 내용을 계속 인지할 수 있게 합니다.

왜 필요한가요?

대형 언어 모델을 사용할 때, 입력 토큰의 수가 모델의 최대 컨텍스트 길이를 초과하면 문제가 발생합니다. 또한 API 호출 시 비용이 증가할 수 있습니다. 따라서 이전 대화 내용을 요약하여 토큰 수를 관리하면 비용 절감과 성능 향상에 도움이 됩니다.

실습 예제

이제 실제로 코드 예제를 통해 어떻게 동작하는지 알아보겠습니다.

사전 준비

  1. 필요한 패키지 설치

    pip install langchain openai python-dotenv
  2. OpenAI API 키 설정

    프로젝트 루트 디렉토리에 .env 파일을 생성하고 다음과 같이 작성합니다.

    OPENAI_API_KEY=your_openai_api_key_here

    your_openai_api_key_here 부분을 실제 OpenAI API 키로 교체하세요.

코드 작성

import os
from dotenv import load_dotenv
from langchain.chat_models import ChatOpenAI
from langchain.memory import ConversationSummaryBufferMemory

# 1. 환경 변수 로드
load_dotenv()
OPENAI_API_KEY = os.getenv('OPENAI_API_KEY')

# 2. 언어 모델 초기화
llm = ChatOpenAI(temperature=0.0, openai_api_key=OPENAI_API_KEY)

# 3. 대화 요약 버퍼 메모리 생성 (최대 토큰 제한 설정)
memory = ConversationSummaryBufferMemory(llm=llm, max_token_limit=100)

# 4. 긴 대화 내용 생성 (토큰 제한을 초과하도록)
trip_plans = '''이번 주말에는 옐로스톤 국립공원으로 여행을 갈 계획이에요!
너무 기대돼요! 먼저 웅장한 입구를 통해 드라이브하며 멋진 경치를 감상할 거예요.
첫 번째로는 유명한 올드 페이스풀 간헐천에 들러 놀라운 분출을 볼 거예요.
그 다음에는 상부 간헐천 분지의 보드워크를 따라 걸으며 멋진 지열 현상을 구경할 거예요.
그리고 자연 온천인 보일링 리버에서 휴식을 취하며 하루를 마무리할 거예요.
자연의 아름다움을 만끽하며 쉬는 시간이 정말 기대돼요!
그래서 이게 제 주말 계획이에요. 당신은 어떤 계획이 있나요?'''

# 5. 대화 내용 저장
memory.save_context({"input": "안녕하세요"}, {"output": "안녕하세요!"})
memory.save_context({"input": "이번 주말에 어떤 계획이 있나요?"}, {"output": trip_plans})

# 6. 현재 메모리 상태 로드 및 출력 (요약된 대화 내용 확인)
print(memory.load_memory_variables({}))

코드 상세 설명

  • 환경 변수 로드 및 언어 모델 초기화

    • load_dotenv() 함수를 사용하여 .env 파일에 저장된 환경 변수를 로드합니다.
    • ChatOpenAI 클래스를 사용하여 언어 모델을 초기화합니다. 여기서 temperature=0.0은 모델의 출력이 더 결정적이도록 설정합니다.
  • 대화 요약 버퍼 메모리 생성

    • ConversationSummaryBufferMemory 클래스는 llmmax_token_limit을 인자로 받습니다.
    • max_token_limit=100으로 설정하여 메모리에 저장될 최대 토큰 수를 제한합니다.
  • 긴 대화 내용 생성

    • trip_plans 변수에 긴 문자열을 저장합니다. 이 문자열은 토큰 수가 많아 설정한 토큰 제한을 초과하게 됩니다.
  • 대화 내용 저장

    • memory.save_context() 메서드를 사용하여 대화의 입력과 출력을 메모리에 저장합니다.
    • 첫 번째 대화: 사용자의 입력 "안녕하세요"와 모델의 응답 "안녕하세요!"를 저장합니다.
    • 두 번째 대화: 사용자의 입력 "이번 주말에 어떤 계획이 있나요?"와 긴 응답 trip_plans를 저장합니다.
  • 메모리 상태 로드 및 출력

    • memory.load_memory_variables({})를 호출하여 현재 메모리 상태를 로드합니다.
    • 출력 결과는 요약된 대화 내용이 됩니다. 긴 대화 내용이 요약되어 토큰 제한을 준수합니다.

실행 결과 예시

코드를 실행하면 다음과 같은 출력이 나타날 수 있습니다.

{'history': '사용자가 인사를 했고, AI가 인사로 응답했습니다. 사용자가 주말 계획을 물었고, AI는 옐로스톤 국립공원 여행 계획을 자세히 설명했습니다.'}

여기서 긴 대화 내용이 요약되어 핵심 정보만 담고 있는 것을 볼 수 있습니다.

중요한 점

  • 요약은 대화 내내 진행됩니다. 대화 내용이 누적될 때마다 이전 내용이 요약되어 메모리에 저장됩니다.
  • 대형 언어 모델을 사용합니다. 요약 작업은 언어 모델을 통해 이루어지므로, 모델 호출에 따른 비용이 발생할 수 있습니다.
  • 메모리 관리가 용이합니다. 토큰 제한을 설정함으로써 메모리의 크기를 제어할 수 있습니다.

전체 코드

마지막으로, 모든 내용을 포함한 전체 코드를 다시 제공합니다.

import os
from dotenv import load_dotenv
from langchain.chat_models import ChatOpenAI
from langchain.memory import ConversationSummaryBufferMemory

# 1. 환경 변수 로드
load_dotenv()
OPENAI_API_KEY = os.getenv('OPENAI_API_KEY')

# 2. 언어 모델 초기화
llm = ChatOpenAI(temperature=0.0, openai_api_key=OPENAI_API_KEY)

# 3. 대화 요약 버퍼 메모리 생성 (최대 토큰 제한 설정)
memory = ConversationSummaryBufferMemory(llm=llm, max_token_limit=100)

# 4. 긴 대화 내용 생성
trip_plans = '''이번 주말에는 옐로스톤 국립공원으로 여행을 갈 계획이에요!
너무 기대돼요! 먼저 웅장한 입구를 통해 드라이브하며 멋진 경치를 감상할 거예요.
첫 번째로는 유명한 올드 페이스풀 간헐천에 들러 놀라운 분출을 볼 거예요.
그 다음에는 상부 간헐천 분지의 보드워크를 따라 걸으며 멋진 지열 현상을 구경할 거예요.
그리고 자연 온천인 보일링 리버에서 휴식을 취하며 하루를 마무리할 거예요.
자연의 아름다움을 만끽하며 쉬는 시간이 정말 기대돼요!
그래서 이게 제 주말 계획이에요. 당신은 어떤 계획이 있나요?'''

# 5. 대화 내용 저장
memory.save_context({"input": "안녕하세요"}, {"output": "안녕하세요!"})
memory.save_context({"input": "이번 주말에 어떤 계획이 있나요?"}, {"output": trip_plans})

# 6. 현재 메모리 상태 로드 및 출력
print(memory.load_memory_variables({}))

마무리

이렇게 LangChain의 대화 요약 버퍼 메모리를 사용하여 대화 내용을 효율적으로 관리하고 토큰 수를 제어할 수 있습니다. 이를 통해 모델의 성능을 최적화하고 비용을 절감할 수 있습니다.

실습을 통해 직접 적용해 보시기 바랍니다. 궁금한 점이나 추가적인 도움이 필요하시면 언제든지 문의해주세요.

감사합니다!

profile
IT를 좋아합니다.

0개의 댓글