LangChain 실습 2 - LLM 캐시와 메모리
최신버전에서 deprecated된 클래스가 많기 때문에 고쳐줘야함.
1. LLM / ChatModel
LLM?
GPT와 같은 AI모델을 활용하여 Prompt에 대한 응답을 생성하는 컴포넌트
GPT, Hugging Face, Cohere등 다양한 ai모델들을 일관된 인터페이스로 사용할 있게 설계하였다
ChatModel ?
사용자와의 대화형 메세지를 기반으로 응답을 생성하는 챗봇 등에서 사용하는 컴포넌트.
기본적으로 LLM컴포넌트와 비슷하나 , 대화형 메세지 응답에 최적화된 컴포넌트이다.
— 생략 —
LLM설정방법들
1) GPT-40 설정 - 유료
2) LLAMA3 설정 - 오픈소스
3) Hugging Face 설정 - LOCAL 오픈소스
4) Google GEMINI 설정 - 5$ 무료
— 생략 —
2. Caching
동일한 질문이 자주 들어오는 경우 Cache를 활용하면 api호출 비용을 줄이고 응답속도를 향상 시킬 수 있다.
1) InMemoryCache
RAM을 활용하여 빠르게 데이터를 저장하고 검색할 수 있는 기능을 제공하는 컴포넌트
응답결과를 RAM에 저장하기 때문에 프로그램이 종료되면 캐시 데이터도 사라짐(영속성X)
from langchain.globals import set_llm_cache
from langchain.cache import InMemoryCache
# 인메모리 캐시
set_llm_cache(InMemoryCache())
2) SQLiteCache
SQLite DB를 활용하여 데이터를 저장 및 검색할 수 있는 기능을 제공하는 컴포넌트
InMemory방식보다 속도는 느리지만 데이터를 영구적으로 저장할 수 있다
SQLite Viewer
from langchain_community.cache import SQLiteCache
from langchain_core.globals import set_llm_cache
import os
# 캐시 디렉토리를 생성합니다.
if not os.path.exists("cache"):
os.makedirs("cache")
# SQLiteCache를 사용합니다.
set_llm_cache(SQLiteCache(database_path="cache/llm_cache.db"))
3) RedisCache
Redis서버를 활용하여 데이터를 저장 및 검색할 수 있는 기능을 제공하는 컴포넌트
SqlLite와 같이 데이터를 영구적으로 저장할 수 있으며, 데이터를 RAM에 저장하기 때문에 조회속도도 빠르다.
단, InMemoryCache에 비해 설정이 복잡하고 , 서버관리와 비용이 별도로 추가됨.
3. Memory
LangChain에는 사용자와의 대화이력을 관리하는 다양한 메모리가 있습니다. 각 메모리들의 특징과 활용방법에 대해 알아보도록 하겠습니다.
참고문서 : https://python.langchain.com/api_reference/langchain/memory.html
langchain0.3.1 버전부터 deprecated됨. langGraph persistence에 memory를 관리할것을 권장함.
1) ConversationBufferMemory
LangChain에서 대화 이력을 저장하기 위해 사용하는 메모리 클래스.
챗봇이 사용자와 나눈 대화내용을 기억시켜 응답에 필요한 적절한 문맥을 유지하도록 도와준다.
대화 내용을 버퍼형태로 저장하며, 버퍼의 크기에 제한이 없기 때문에 이전 대화내용을 모두 저장 시킬 수 있다. 단, 대화내용이 너무 많은 경우 성능이 저하될 수 있다.
from langchain.memory import ConversationBufferMemory
memory = ConversationBufferMemory()
# 대화내용 저장 함
# 메모리에는 사용자의 질문과 AI의 응답을 한 쌍으로 묶어서 저장 한다.
memory.save_context(
inputs={
"human": "서울에서 제일 맛있는 돈까스 맛집을 추천해줘"
},
outputs={
"ai": "안녕하세요! 서울에는 맛있는 돈까스 집이 많아요! 분위기 좋은 곳을 원하시나요, 아니면 가성비 좋은 곳을 찾으시나요?"
},
)
# 저장된 데이터 불러오기
converstaion_context = memory.load_memory_variables({})
# print(converstaion_context)
# 대화내용 추가
memory.save_context(
inputs={
"human": "돈까스가 무슨 분위기야. 가성비 맛집으로 추천해줘"
},
outputs={
"ai": "그렇다면 김밥천국을 추천합니다!"
},
)
from langchain.chains import ConversationChain
# ConversationChain을 생성
conversation = ConversationChain(
# ConversationBufferMemory를 사용하여 대화내용 유지
llm=llm,
memory=memory,
)
# 이전 대화내용을 이어서 하기
response = conversation.predict(input="김밥천국 말고 다른곳은 없어?")
print(response)
2) ConversationBufferWindowMemory
최근 N개의 대화이력만 저장하는 메모리로 사용자와 길게 대화하더라도 최근 맥락만 유지할 수 있기 때문에 메모리에 너무 많은 데이터가 쌓이는 것을 방지할 수 있다.
오래된 대화내용을 자동으로 삭제하여 메모리를 최적화 한다.
from langchain.memory import ConversationBufferWindowMemory
memory = ConversationBufferWindowMemory(k=1, return_messages=True) # 최근 1개의 대화내용 저장
3) ConversationTokenBufferMemory
메세지를 개수가 아닌 토큰 개수를 기준으로 일정량만을 저장하는 메모리. openAi와 같은 api기반에서 최대 토큰 제한을 유지시킬 때 유용하게 사용한다.
from langchain.memory import ConversationTokenBufferMemory
memory = ConversationTokenBufferMemory(
llm=llm, max_token_limit=100, return_messages=True # 최대 토큰 길이를 100개로 제한
)
4) ConversationSummaryMemory / ConversationSummaryBufferMemory
전체 대화를 요약한 내용만 유지하는 방식의 메모리
핵심적인 맥락을 유지하면서 메모리를 최적화 할 수 있다.
요약시에는 LLM을 다시 이용해야 하므로 API 비용이 추가로 발생한다.
# 4-1. ConversationSummaryMemory.
from langchain.memory import ConversationSummaryMemory
memory = ConversationSummaryMemory(
llm=ChatOpenAI(api_key=api_key, temperature=0), return_messages=True)
# 4-2. ConversationSummaryBufferMemory
from langchain.memory import ConversationSummaryBufferMemory
memory = ConversationSummaryBufferMemory(
llm=ChatOpenAI(api_key=api_key, temperature=0), max_token_limit=100, return_messages=True)
5) ConversationEntityMemory
대화속에서 사용자가 언급한 개념(Entity)을 추출하여 저장하여 관리하는 메모리
사용자가 자주 묻는 주제를 기억하여 맞춤형 답변을 제공할 수 있다.
6) ConversationKGMemory
대화내용을 KG(Knowledge Graph)로 변환하여 저장하는 메모리
개별적인 문장이 아닌 개념과 관계를 중심으로 정보를 저장(Graph-prompt)
대화에서 점점 축적되는 정보를 바탕으로 더 똑똑한 응답기 가능해진다.
사용자의 이전 질문과 관련된 개념을 이해하여 연관 질문을 추천한다.
7) VectorStoreRetrieverMemory
대화 기록을 벡터로 변환하여 저장하고 검색할 수 있는 메모리
단순한 최근 대화가 아니라 의미적으로 유사한 이전 대화도 검색할 수 있따.
기존의 단순한 히스토리 저장방식 보다 문맥의 이해도가 높다
사용자의 이전 질문과 비슷한 질문을 메모리에서 검색하여 답변을 개선한다.
Last updated