LCEL에 메모리 추가하기
LCEL에 메모리 추가하기
체인에 메모리를 추가해서 컨텍스트를 토대로 답변할 수 있도록 하는 기능이다. 매 포스트 마다 말하지만 랭체인 프레임워크가 아니라면 이런 것도 다 손수 만들어야한다.. 그리고 어떤 컨텍스트 까지 가져올건지(최근 몇개인지, 그걸 요약할건지 등..)도 다 정책으로 만들어서 구성해야한다. 랭체인이 이걸 대신 해줘서 넘 감사하다.
사용 방법
- 모델 초기화 및 프롬프트 입력
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라는 키값을 기준으로 삽입한다.
- 메모리 생성
memory = ConversationBufferMemory(return_messages=True, memory_key="chat_history")
- memory_key 는 나중에 체인의 prompt 안에 대입될 키이다.
- 이후 러너블 생성 메모리에 저장된 대화 기록을 추출하고, 다른 프로세스에 이를 전달해 답변을 생성할 수 있도록 만든다.
runnable = RunnablePassthrough.assign(
chat_history=RunnableLambda(memory.load_memory_variables) | itemgetter("chat_history")
)
runnable.invoke({"input": "hello"})
그리고 이 러너블을 체인에 연결한다.
chain = runnable | prompt | model
chain.invoke({"input": "안녕하세요"})