LCEL에 메모리 추가하기

LCEL에 메모리 추가하기

체인에 메모리를 추가해서 컨텍스트를 토대로 답변할 수 있도록 하는 기능이다. 매 포스트 마다 말하지만 랭체인 프레임워크가 아니라면 이런 것도 다 손수 만들어야한다.. 그리고 어떤 컨텍스트 까지 가져올건지(최근 몇개인지, 그걸 요약할건지 등..)도 다 정책으로 만들어서 구성해야한다. 랭체인이 이걸 대신 해줘서 넘 감사하다.

사용 방법

  1. 모델 초기화 및 프롬프트 입력
from operator import itemgetter
from langchain.memory import ConversationBufferMemory
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.runnables import RunnableLambda, RunnablePassthrough
from langchain_openai import ChatOpenAI

model = ChatOpenAI()

prompt = ChatPromptTemplate.from_messages([
    ("system", "당신은 유용한 챗봇입니다."),
    MessagePlaceholder(variable_name="chat_history"),
    ("human", "{input}")
])
  • message place holder 에서 이전 대화 기록을 chat_history라는 키값을 기준으로 삽입한다.
  1. 메모리 생성
    memory = ConversationBufferMemory(return_messages=True, memory_key="chat_history")
    
    • memory_key 는 나중에 체인의 prompt 안에 대입될 키이다.
  2. 이후 러너블 생성 메모리에 저장된 대화 기록을 추출하고, 다른 프로세스에 이를 전달해 답변을 생성할 수 있도록 만든다.
runnable = RunnablePassthrough.assign(
    chat_history=RunnableLambda(memory.load_memory_variables) | itemgetter("chat_history")
)

runnable.invoke({"input": "hello"})

그리고 이 러너블을 체인에 연결한다.

chain = runnable | prompt | model

chain.invoke({"input": "안녕하세요"})