LangChain 메모리 시스템
메모리
챗 히스토리를 저장하기 위해 사용하는 기능. 앞서 다뤘던 챗 히스토리와 비슷한 기능이다. 둘의 차이점은 이후에 설명한다.
종류가 다양하다.
- 대화 버퍼 메모리 : 가장 기본적인 메모리 유형으로, 메시지를 사람의 입력과 ai의 답변으로 짝지어서 저장한다. 모든 대화 내용을 저장한다.
- 대화 버퍼 윈도우 메모리 : 너무 많은 대화 내용을 저장하면 토큰문제가 발생할 수 있으므로, 얼마만큼의 윈도우 분량까지만 대화를 기록할 지 정할 수 있다. 여기서의 윈도우는 최근 대화의 최대 메시지 수를 말한다.
- 대화 토큰 버퍼 메모리 : 윈도우가 아닌 토큰 단위로 대화 기록을 조절하는 방법이다.
- 대화 엔티티 메모리 : 토큰이나 윈도우는 절대적인 양을 토대로 제한하지만, 엔티티의 경우에는 대화에서 엔티티를 추출해 이를 기준으로 대화의 양을 지정하는 방법이다. 엔티티란 대화, 데이터에서 특정한 의미를 가지는 핵심 정보를 의미한다.
- 대화 지식 그래프 메모리 : 지식 그래프를 활용해서 정보를 저장하고 불러오기. 모델이 서로 다른 개체 간의 관계를 이해하는데 도움을 주고, 복잡한 연결망과 역사적 맥락을 기반으로 대응하는 능력을 향상시킨다.
- 대화 요약 메모리 : 이전 대화의 내용을 원문 텍스트 그대로 보관하지 않고 대화가 진행되는 동안 대화를 요약하고 요약본을 메모리에 저장한다.
대화 버퍼 메모리 사용
- 버퍼 메모리 초기화 ``` from langchain.memory import ConversationBufferMemory
memory = ConversationBufferMemory()
2. 메모리에 대화 내용 저장. save_context는 메모리에 대화 내용을 누적으로 저장한다.
memory.save_context( inputs={ “human”: “hello” }, outputs={ “ai” : “Hello, how can i help you today?” } )
3. 메모리에 저장된 대화 내용 불러오기
memory.load_memory_variables({})[“history”]
## 대화 버퍼 윈도우 메모리 사용
1. 버퍼 메모리 초기화
from langchain.memory import ConversationBufferWindowMemory
memory = ConversationBufferWindowMemory(k=2, return_messages=True)
- return_messages 옵션은 출력 결과를 보여준다.
- 사용은 대화 버퍼 메모리와 동일하게 한다.
## 대화 토큰 버퍼 메모리
1. 메모리 초기화
llm 자체에서 토큰을 계산하는 기능을 사용하기 때문에 llm을 먼저 설정해야한다.
from langchain.memory import ConversationTokenBufferMemory from langchain_openai import ChatOpenAI
llm = ChatOpenAI(model_name=”gpt-4o”) memory = ConversationTokenBufferMemory( llm=llm, max_token_limit=150, return_messages=true )
2. 대화 내용 저장.
- save_context 메서드를 사용해서 저장한다.
- 특이한 점은, 전체 대화의 토큰을 제한하는게 아니라, save_context 메서드를 한번 사용할때의 토큰을 제한하므로 각 대화 입력, 출력에 대해서 길이가 제한된다.
## 대화 엔티티 메모리
1. 엔티티 추출을 위한 템플릿 설정 임포트 - 기본 설정 프롬프트 활용
from langchain_openai import ChatOpenAI from langchain.chains import ConversationChain from langchain.memory import ConversationEntitiMemory from langchain.memory.propmt import ENTITY_MEMORY_CONVERSATION_TEMPLATE
2. conversation chain 생성
* 랭체인에서 대화 흐름을 관리하는 객체로, llm 과 대화 메모리를 결합하여 컨텍스트를 유지한다.
llm = ChatOpenAI(model_name=”gpt-4o”)
conversation = ConversationChain( llm = llm, prompt = ENTITY_MEMORY_CONVERSATION_TEMPLATE, memory = ConversationEntityMemory(llm=llm) )
3. 저장된 엔티티 확인 방법
conversation.memory.entity_store.entity
## 대화 지식 그래프 메모리
대화 지식 그래프 메모리는 핵심 정볼르 효율적으로 저장할 수 잇지만 세부 내용이 엔티티나 지식 그래프에 포함되지 않는 경우에 세세한 사항에 대해 물어보면 제대로 답변하지 못한다.
## 대화 요약 메모리
여러가지 방식이 있다.
- conversation summary memory : 바로바로 요약함
- conversation summery buffer memory : 최근 대화 기록과 요약을 결합한 방식. 일정 수준 까지는 대화의 원본을 유지하면서 사용자가 최신 대화를 이용할 수 있도록 하다가, 대화가 길어져 메모리가 초과되면 이전 대화를 요약해서 저장함
from langchain.memory import ConversationSummaryMemory from langchain_openai import ChatOpenAI
memory = ConversationSummaryBufferMemory( llm=ChatOpenAI(model_name=””), max_token_limit=200, return_messages=True )
memory.save_context( … )
## 벡터 스토어 검색 메모리
대화 내용을 벡터 스토어 데이터 베이스에 저장하고 조회해볼 수 있는 기능이다. 다른 메모리 클래스에서는 대화 기록을 시간 순서에 따라서 저장하는데 반해 벡터 데이터 스토어에서는 시간 순서를 고려하지 않고 대화 내용에서 필요한 내용을 검색해서 사용한다.
1. 임베딩 모델 정의, 데이터 베이스 초기화
import faiss from langchain_openai import OpenAIEmbeddings from langchain.docstore import InMemoryDocstore from langchain.vectorstores import FAISS
embedding_model = OpenAIEmbeddings() embedding_size = 1536 index = faiss.IndexFlatL2(embedding_size) vector_store = FAISS(embedding_model, index, InMemoryDocstore({}), {})
* faiss : 페이스북에서 만든 벡터 데이터베이스
2. 리트리버 추가
from langchain.memory import VectorStoreRetrieverMemory
retriever = vectorstore.as_retriever(search_kwargs={“k”:1}) memory = VecotStoreRetrieverMemory(retriever=retriever) ```
- 저장 및 불러오기
- save_context, load_memory_variables라는 동일한 메서드를 사용한다.
- 모든 메모리 사용 방식이 동일하다는 점이 정말 편리!