LangChain 메모리 옵션으로 AI 대화의 문맥을 유지하는 방법

GoGoComputer·2024년 11월 12일
0

LangChain Basics

목록 보기
31/40
post-thumbnail

LangChain의 메모리 옵션 소개

메모리란 무엇인가요?

LangChain에서 "메모리"란 대화 기록, 즉 메시지 상호 작용의 추적을 의미합니다. 이는 우리가 ChatGPT를 사용할 때와 유사합니다. 이전 대화 내용을 기억하고, 그 문맥을 기반으로 대화를 이어나가는 것이죠. 예를 들어, ChatGPT와 대화를 나눌 때 이전에 이야기한 내용이 기억되어 자연스러운 대화가 가능했습니다.

왜 메모리가 중요한가요?

메모리를 사용하면 AI 모델이 대화의 문맥을 이해하고 유지할 수 있습니다. 이를 통해 더욱 일관성 있고 인간적인 대화를 생성할 수 있습니다. 예를 들어, 사용자가 질문을 하면 AI는 이전에 나눈 대화를 바탕으로 더 정확하고 관련성 있는 답변을 제공할 수 있습니다.


LangChain의 다양한 메모리 옵션

LangChain은 대화 메모리를 저장하고 관리하는 여러 가지 옵션을 제공합니다:

  1. 전체 대화 기록 저장 (ConversationBufferMemory): 모든 메시지를 저장하여 대화의 전체 문맥을 유지합니다.

  2. 제한된 대화 기록 저장 (ConversationBufferWindowMemory): 최근의 몇 개의 메시지만 저장하여 메모리 사용량을 조절합니다.

  3. 요약 기반 메모리 (ConversationSummaryMemory): 이전 대화 내용을 요약하여 저장함으로써 중요한 정보만 유지하고, 메모리 사용량을 줄입니다.

  4. 토큰 기반 메모리 (ConversationTokenBufferMemory): 토큰 수를 기반으로 대화 기록을 관리하여 OpenAI의 토큰 제한을 고려합니다.

각 메모리 옵션의 특징

  • ConversationBufferMemory: 가장 단순한 형태로, 모든 대화 내용을 누적하여 저장합니다. 대화의 길이가 길어질수록 메모리 사용량이 증가합니다.

  • ConversationBufferWindowMemory: 지정한 메시지 개수만큼만 저장합니다. 예를 들어, 최근 5개의 메시지만 유지합니다.

  • ConversationSummaryMemory: 대화 내용을 요약하여 저장하므로, 중요한 정보는 유지하면서도 메모리 사용량을 줄일 수 있습니다.

  • ConversationTokenBufferMemory: 토큰의 개수를 기준으로 대화 기록을 관리하므로, 토큰 제한을 효과적으로 관리할 수 있습니다.


ChatMessageHistory를 사용한 메모리 구현

이제 LangChain의 기본 메모리 빌딩 블록인 ChatMessageHistory를 사용하여 실제로 메모리를 구현해 보겠습니다.

1. ChatMessageHistory 객체 생성

먼저, LangChain의 memory 모듈에서 ChatMessageHistory를 가져옵니다.

from langchain.memory import ChatMessageHistory

history = ChatMessageHistory()
  • ChatMessageHistory()는 새로운 대화 기록 객체를 생성합니다.

2. 메시지 추가

ChatMessageHistory 객체에 사용자와 AI의 메시지를 수동으로 추가할 수 있습니다.

history.add_user_message("안녕하세요, 만나서 반갑습니다.")
history.add_ai_message("저도 만나서 반가워요!")
  • add_user_message()를 사용하여 사용자 메시지를 추가합니다.
  • add_ai_message()를 사용하여 AI의 응답을 추가합니다.

이렇게 하면 이미 대화를 나눈 것처럼 대화 기록을 쌓을 수 있습니다. 이는 프롬프트를 구성하는 또 다른 방법으로 생각할 수 있으며, 나중에 AI 모델에 전달하여 대화를 이어나갈 수 있습니다.

3. 대화 기록 확인

대화 기록을 확인하려면 다음과 같이 합니다.

print(history.messages)
  • history.messages는 현재까지 저장된 모든 메시지의 리스트를 반환합니다.

메모리 객체와 대화 체인 연결

이제 메모리 객체를 실제 AI 모델과 연결하여 자동으로 메시지가 추가되도록 설정해 보겠습니다.

1. 필요한 모듈 가져오기

import os
from dotenv import load_dotenv
from langchain import ConversationChain
from langchain.chat_models import ChatOpenAI
  • dotenv를 사용하여 .env 파일에서 환경 변수를 로드합니다.
  • ConversationChain은 대화를 관리하는 체인입니다.
  • ChatOpenAI는 OpenAI의 채팅 모델을 사용하기 위한 래퍼입니다.

2. API 키 설정

.env 파일에서 OPENAI_API_KEY를 로드합니다.

load_dotenv()
OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")
  • .env 파일에 다음과 같이 API 키를 저장해야 합니다:
OPENAI_API_KEY=your_openai_api_key_here

3. LLM(대형 언어 모델) 설정

llm = ChatOpenAI(openai_api_key=OPENAI_API_KEY, temperature=0.7)
  • temperature는 응답의 다양성을 조절하는 하이퍼파라미터입니다.

4. 대화 체인 생성 및 메모리 연결

conversation = ConversationChain(
    llm=llm,
    memory=history,
    verbose=True
)
  • ConversationChain에 LLM과 메모리를 연결합니다.
  • verbose=True로 설정하면 대화 과정이 상세하게 출력됩니다.

5. 대화 진행

user_input = input("사용자: ")
response = conversation.predict(input=user_input)
print(f"AI: {response}")
  • 사용자로부터 입력을 받고, conversation.predict()를 통해 AI의 응답을 생성합니다.

전체 실습 코드 1

아래는 위에서 설명한 내용을 모두 포함한 전체 코드입니다.

import os
from dotenv import load_dotenv
from langchain import ConversationChain
from langchain.memory import ConversationBufferMemory
from langchain.chat_models import ChatOpenAI

# .env 파일에서 API 키 로드
load_dotenv()
OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")

# OpenAI LLM 설정
llm = ChatOpenAI(openai_api_key=OPENAI_API_KEY, temperature=0.7)

# 대화 메모리 객체 생성 (ConversationBufferMemory 사용)
memory = ConversationBufferMemory()

# 대화 체인에 LLM 및 메모리 연결
conversation = ConversationChain(
    llm=llm,
    memory=memory,
    verbose=True
)

# 새로운 사용자 입력 받기
user_input = input("사용자: ")

# 대화 진행
response = conversation.predict(input=user_input)
print(f"AI: {response}")

전체 실습 코드 2 (계속 대화)

import os
from dotenv import load_dotenv
from langchain import ConversationChain
from langchain.memory import ConversationBufferMemory
from langchain.chat_models import ChatOpenAI

# .env 파일에서 API 키 로드
load_dotenv()
OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")

# OpenAI LLM 설정
llm = ChatOpenAI(openai_api_key=OPENAI_API_KEY, temperature=0.7)

# 대화 메모리 객체 생성 (ConversationBufferMemory 사용)
memory = ConversationBufferMemory()

# 대화 체인에 LLM 및 메모리 연결
conversation = ConversationChain(
    llm=llm,
    memory=memory,
    verbose=True
)

# 사용자가 계속 대화할 수 있도록 반복문 사용
print("AI와의 대화를 시작합니다. '종료'라고 입력하면 대화가 종료됩니다.")
while True:
    user_input = input("사용자: ")
    if user_input.lower() in ["종료", "quit", "exit"]:
        print("대화를 종료합니다.")
        break
    
    # 대화 진행
    response = conversation.predict(input=user_input)
    print(f"AI: {response}")

실행 방법

  1. 필요한 패키지 설치

    pip install langchain openai python-dotenv
  2. .env 파일 설정

    프로젝트 디렉토리에 .env 파일을 생성하고, 다음과 같이 OpenAI API 키를 저장합니다.

    OPENAI_API_KEY=your_openai_api_key_here

    실제 API 키로 your_openai_api_key_here를 대체해야 합니다.

  3. 코드 실행

    터미널에서 다음과 같이 실행합니다.

    python main.py

    그러면 사용자 입력을 기다립니다.

예시 실행 결과

사용자: 오늘 날씨가 어떤가요?
AI: 현재 위치에 따라 날씨 정보가 다르지만, 일반적으로 인터넷에서 최신 날씨 정보를 확인해 보세요.

마무리

이렇게 LangChain의 메모리 기능을 활용하여 AI와의 대화에서 문맥을 유지하고, 더욱 자연스럽고 일관성 있는 대화를 구현할 수 있습니다. 메모리를 사용함으로써 AI는 이전 대화 내용을 기억하고, 그에 따라 적절한 응답을 제공합니다.

LangChain은 이 외에도 다양한 메모리 옵션과 기능을 제공하므로, 프로젝트의 필요에 맞게 적절히 활용해 보세요. 메모리를 잘 활용하면 AI와의 대화가 한층 더 인간적이고 자연스러워질 것입니다.

profile
IT를 좋아합니다.

0개의 댓글