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