🐯
경민민 IT 핸드북
  • Orientation
    • 전달사항
    • 복습방법
    • 수료한 선배의 한마디
    • 간단 자기소개
    • 스터디
  • 백엔드
    • Java
      • 1장 프로그래밍 기초
      • 2장 자바 메모리구조
        • 1. Stack
        • 2. Heap
      • 6장 객체
      • 8장 상속
      • 9장 다형성
      • 10장 추상클래스와 인터페이스
      • 13장 Generic
      • 14장 Thread
      • 15장 Network
      • 16장 Lamda
        • 1. 내부 클래스 (Inner Class)
          • DTO , VO, Builder Pattern
        • 2. 람다 표현식 (Lambda Expression)
        • 3. 스트림 API (Stream API)
          • Optional
      • 17장 Enum
  • 프론트
    • Node.js
    • Java Script
      • ES6+
        • Node.js로 자바스크립트 실행
        • let , const , var
        • Destructuring문법
          • Rest(...) 문법
        • Arrow Function
        • 모듈
        • ETC
    • Type Script
      • 개요
      • TS설치 및 환경설정
      • 타입스크립트 기본
        • 기본 자료형들과 타입추론
        • Object, Array , Tuple
        • Any, Unknown, Union Type
        • Function Type
          • Type Assertion && Narrowing
          • Never type
        • Type Aliases와 Interface
        • 리터럴 타입
        • 함수 추가 문법
        • Class문법
        • 객체 타입 추가 문법
        • 실습문제 1차
        • 실습문제 2차
        • 실습문제 3차
    • React
      • 개요
      • SPA 와 MPA
        • SEO(작성예정)
      • 리액트 프로젝트 생성(18.3.1.ver)
        • HTML + react 샘플
        • CRA 와 Vite 비교
      • 리액트 개념들
        • Component
          • 클래스 컴포넌트(작성예정)
          • 함수형 컴포넌트(작성예정)
        • JSX
        • React Virtual Dom
          • Reconciliation
        • hook
          • useState
        • 리액트 데이터 전달
          • FLUX
      • 백엔드 서버 연동
        • 비동기요청
        • 웹소켓
        • Promise(작성예정)
      • 실습문제 1
      • 실습문제 2
      • 실습문제3
      • 실습문제4
  • 프레임워크
    • Spring
      • Spring 개발환경 구축
        • 프로젝트 환경설정
        • 프로젝트 생성
          • MVC Project 생성이슈
        • Maven 설정
        • web.xml 설정
        • Spring Bean Configuration.xml 설정
      • Spring Legacy Project
        • Spring 요청 및 응답 흐름
        • Spring 주요 Annotation
          • 의존성 주입방식의 차이점
          • @ModelAttribute와 유효성검사
          • 비동기처리
          • 스프링 예외처리
        • Logging
        • Pagination
        • Spring File 업로드 및 다운로드
        • Spring WebSocket
        • Spring AOP
      • Spring 라이브러리들(작성예정)
        • Lombok
        • Maven
        • MyBatis
      • Spring 구성 모듈(작성예정)
      • 스프링 과제
    • Spring Boot
      • Spring Boot 개발환경 구축
      • 스프링 부트 프로젝트 생성방법들
        • 프로젝트에서 사용하는 의존성들
      • 스프링 프로젝트 구조
        • SpringBootApplication
      • application.properties
      • Cross Origin
        • CORS
      • WebSocket
        • Stomp(작성중)
      • 로그인(작성중)
      • Spring Security(작성중)
      • 실습문제 Select
      • 실습문제 Update
      • 실습문제 Delete
  • 형상관리(Git)
    • GitHub설정
    • SourceTree를 활용한 깃허브 연동
      • 소스트리 설치
      • Clone
      • Branch
        • Branch Protection rules
          • Branch Protection Rules 상세규칙
        • Rebase 와 Squash (작성예정)
      • Team Project 설정
        • 팀장 프로젝트 셋팅
          • Collaborator
          • .gitignore 설정
        • 팀원 프로젝트 셋팅
        • 공통 프로젝트 진행
  • 프로젝트
    • 진행순서
      • 요구사항 분석 단계
        • 유용한 사이트
      • 프로그램 설계 단계
        • 유용한 사이트
      • 프로그램 구현단계
        • SourceTree를 활용한 Team Project설정
      • 테스트 단계
  • 배포
    • AWS-EC2 배포 연습
    • DevOps
      • IT시스템의 변화와 DevOps
      • DevOps 라이프사이클
    • 젠킨스
      • 도커
        • 도커 설치 방법
        • 도커 기본 명령어들
      • 젠킨스 설치
      • 젠킨스 프로젝트 생성
      • 젠킨스 소스코드 통합 - Github
      • 젠킨스 빌드 설정 - Maven
      • 배포 서버 구축하기
      • 파이프라인 구축
      • AWS 서버 생성
        • AWS 인스턴스 생성
        • AWS - Zenkins 연동
        • AWS - 배포서버 연동
        • AWS - Jenkins CI/CD파이프라인 구축
  • 유용한 사이트 모음
  • SQL
    • SQLD
      • 데이터 모델링의 이해 - 스키마
      • 데이터 모델링의 이해 - ERD
      • 데이터 모델링의 이해 - 정규화
      • 데이터 모델링의 이해 - NULL
      • SQL 기본 및 활용 - WINDOW FUNCTION
    • Oracle
      • 1장 개요
      • 2장 SQL
  • LLM 서비스
    • 1장 LLM에 대한 이해
    • 2장 프롬프트 엔지니어링
      • 프롬프트와 프롬프트 엔지니어링
      • GPT PlayGround
      • 프롬프트 작문 유형
      • 기본 프롬프트 엔지니어링 태크닉
      • 고급 프롬프트 엔지니어링 태크닉
        • ReAct Prompting
        • Active-Prompt
        • Reflexion
        • Graph Prompt
      • OpenAI API설정
      • OpenAI를 활용한 프롬프트 엔지니어링 실습
        • 실습 프롬프트
    • 3장 Lang Chain 프레임워크
      • LangSmith 프레임워크
        • LangSmith를 활용한 LangChain 모니터링 설정
      • LangChain 실습 1 - Prompt
        • 실습 코드
      • LangChain 실습 2 - LLM 캐시와 메모리
    • 4장 RAG
      • Document Loader - 문서 로더
      • Text Splitter - 텍스트 분할
      • Embedding - 임베딩
      • Vector Store - 벡터 저장소
      • Retriever - 검색기
      • ReRanker - 재평가자
      • RAG
Powered by GitBook
On this page
  • 1. LLM / ChatModel
  • LLM?
  • ChatModel ?
  • LLM설정방법들
  • 1) GPT-40 설정 - 유료
  • 2) LLAMA3 설정 - 오픈소스
  • 3) Hugging Face 설정 - LOCAL 오픈소스
  • 4) Google GEMINI 설정 - 5$ 무료
  • 2. Caching
  • 1) InMemoryCache
  • 2) SQLiteCache
  • 3) RedisCache
  • 3. Memory
  • 1) ConversationBufferMemory
  • 2) ConversationBufferWindowMemory
  • 3) ConversationTokenBufferMemory
  • 4) ConversationSummaryMemory / ConversationSummaryBufferMemory
  • 5) ConversationEntityMemory
  • 6) ConversationKGMemory
  • 7) VectorStoreRetrieverMemory
  1. LLM 서비스
  2. 3장 Lang Chain 프레임워크

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에는 사용자와의 대화이력을 관리하는 다양한 메모리가 있습니다. 각 메모리들의 특징과 활용방법에 대해 알아보도록 하겠습니다.

  • 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

  • 대화 기록을 벡터로 변환하여 저장하고 검색할 수 있는 메모리

  • 단순한 최근 대화가 아니라 의미적으로 유사한 이전 대화도 검색할 수 있따.

  • 기존의 단순한 히스토리 저장방식 보다 문맥의 이해도가 높다

  • 사용자의 이전 질문과 비슷한 질문을 메모리에서 검색하여 답변을 개선한다.

Previous실습 코드Next4장 RAG

Last updated 2 months ago

참고문서 :

https://python.langchain.com/api_reference/langchain/memory.html