LangChain example 03

Kitkat·2025년 1월 14일

Caching

  • LLM 응답을 저장하고 재사용하는 기능
  • 동일한 질문에 대한 반복적인 API 호출을 줄여 비용 감소
  • 캐시된 결과를 즉시 반환하여 응답 속도 향상
  • 불필요한 연산 및 API 호출를 줄여 서버 부하 감소

캐시 유형

  • InMemory Cache
    메모리에 데이터 저장
    가장 빠른 접근 속도
    애플리케이션 재시작 시 데이터 소멸

  • SQLite Cache
    파일 기반 데이터베이스에 저장
    영구적인 데이터 보존
    시스템 재시작 후에도 데이터 유지

from langchain.globals import set_llm_cache
from langchain.cache import InMemoryCache, SQLiteCache

set_llm_cache(InMemoryCache())
set_llm_cache(SQLiteCache("cache.db"))

Memory

챗봇 메모리의 필요성

  • LLM은 상태를 저장하지 않는 무상태(stateless) 시스템
  • 각 요청은 독립적으로 처리되어 이전 대화 맥락을 기억하지 못함
  • 자연스러운 대화를 위해서는 이전 대화 내용을 저장하는 메모리 시스템 필요

메모리 타입별 특징

  • ConversationBufferMemory
    모든 대화 내용을 순차적으로 저장
    장점: 완전한 대화 기록 유지
    단점: 토큰 제한에 빠르게 도달, 비용 증가
  • ConversationBufferWindowMemory
    파라미터로 지정된 최근 대화만 저장
    장점: 메모리 사용량 제한, 비용 효율적
    단점: 오래된 컨텍스트 손실
  • ConversationSummaryMemory
    대화 내용을 실시간으로 요약
    장점: 긴 대화도 효율적으로 저장
    단점: 요약 과정에서 세부 정보 손실 가능
  • ConversationSummaryBufferMemory
    최근 대화는 그대로 저장, 이전 대화는 요약
    장점: 최근 맥락 유지와 장기 기억 균형
    단점: 요약 생성에 추가 비용 발생
  • ConversationKGMemory
    구조화된 형태로 정보를 저장하여 엔티티 간 관계 파악 가능
    장점: 관계성 기반 정보 저장, 특정 정보 쉽게 검색
    단점: 구현 복잡도 높음, 모든 대화에 적합하지 않음

메모리 구현 방식/패턴

  • Chat Based Memory: 기존의 단순한 메모리 구현 방식
# 메모리 구현체 사용
memory = ConversationBufferMemory(
    memory_key="chat_history",
    return_messages=True
)

# LLMChain에서 메모리 사용
chain = LLMChain(
    llm=llm,
    prompt=prompt,
    memory=memory
)
  • LCEL Based Memory: LangChain Expression Language를 사용한 새로운 구현 방식
from langchain.prompts import ChatPromptTemplate, MessagesPlaceholder

# 메모리 구현체 사용
memory = ConversationBufferMemory(
    return_messages=True,
    memory_key="chat_history"
)

# LCEL 방식으로 메모리 통합
prompt = ChatPromptTemplate.from_messages([
    ("system", "You are a helpful AI"),
    MessagesPlaceholder(variable_name="chat_history"),
    ("human", "{input}")
])

chain = RunnablePassthrough.assign(
    chat_history=memory.load_memory_variables | itemgetter("chat_history")
) | prompt | llm

return_messages=True

  • 메모리에서 검색된 대화 내용을 ChatMessage 형식으로 반환
  • ChatOpenAI와 같은 채팅 모델이 이해할 수 있는 형식으로 변환
  • system, human, ai 등 역할 구분 가능

0개의 댓글