이번 포스팅에서는 LangChain 으로 LLM 모델 기반 애플리케이션을 구축할 때 캐시(Cache)를 사용하여 응답 속도를 향상시키고 계산 부하를 줄이는 방법을 소개하겠습니다. 

 

1. 캐시(Cache)란 무엇인가?

2. LangChain 으로 LLM 기반 애플리케이션 구축 시 사용하는 캐시 유형

3. LangChain 에서 Cache 적용해보기

 

 

LangChain - Cache

 

 

1. 캐시(Cache)란 무엇인가? 

 

"캐시(Cache)"는 컴퓨팅에서 데이터를 저장하여 이후 데이터 요청을 더 빠르게 처리할 수 있도록 하는 하드웨어 또는 소프트웨어 구성 요소를 말합니다. 캐시에 저장되는 데이터는 이전 계산의 결과거나 다른 곳에 저장된 데이터의 복사본일 수 있습니다. 캐시는 주로 데이터 접근 속도를 높이고, 주 메모리나 더 먼 저장 위치에서 데이터를 가져오는 시간을 줄이는 데 사용됩니다. 

LangChain과 같은 언어 모델 애플리케이션 구축 프레임워크의 맥락에서, 캐싱은 성능과 효율성을 향상시키는 데 중요한 역할을 합니다. LangChain과 같은 애플리케이션에서 캐시가 수행하는 기능은 다음과 같습니다. 

(1) 응답 속도 향상: GPT-3 또는 GPT-4와 같은 언어 모델이 쿼리를 처리할 때, 복잡한 계산을 수행해야 할 수 있으며, 이는 상당한 시간이 소요될 수 있습니다. 비슷한 쿼리가 자주 발생하는 경우, 결과를 캐싱하면 이러한 반복 쿼리에 대한 응답 시간을 크게 단축할 수 있습니다. 

(2) 계산 부하 감소: 이전에 계산된 결과를 저장함으로써, 언어 모델이 동일한 계산을 여러 번 수행할 필요를 줄일 수 있습니다. 이는 비용이 들어가는 언어 모델에 대한 호출 API 호출을 줄이는 데 특히 유용할 수 있습니다. 

(3) 사용자 경험 개선: 높은 사용자 상호 작용을 가진 애플리케이션, 예를 들어 챗봇이나 대화형 도구에서 자주 요청되는 정보나 응답을 캐싱하면 사용자는 즉각적인 피드백을 받을 수 있어 전반적인 경험이 향상됩니다. 

(4) 맞춤화 및 컨텍스트 유지: 경우에 따라 캐싱은 세션 동안 컨텍스트나 사용자 특정 데이터를 유지하는 데 사용될 수 있어 언어 모델과의 보다 개인화되고 컨텍스트에 맞는 상호 작용을 가능하게 합니다. 


전반적으로, LangChain과 같은 애플리케이션에서 캐싱의 역할은 데이터 및 계산 결과를 지능적으로 저장하고 재사용함으로써 효율성, 속도 및 사용자 경험을 향상시키는 것입니다. 

 

 

2. LangChain 으로 LLM 기반 애플리케이션 구축 시 사용하는 캐시 유형


LangChain은 언어 모델 애플리케이션을 구축하기 위한 프레임워크인데, 이러한 맥락에서 일반적으로 사용되는 캐시 유형은 다음과 같습니다. 

- 메모리 캐시 (Memory Cache): 언어 모델 계산 또는 API 응답 결과를 임시로 저장하는 데 사용됩니다. 이러한 작업이 자원을 많이 사용할 수 있으므로, 메모리에 결과를 캐싱하면 반복 쿼리나 작업에 대한 성능을 크게 향상시킬 수 있습니다. 

- 디스크 캐시 (Disk Cache): 더 크거나 시간에 민감하지 않은 데이터에 대해 디스크 캐싱이 사용될 수 있습니다. 이는 대용량 데이터셋이나 언어 모델 출력을 저장하는 데 특히 유용하며, 메모리 캐시의 속도가 필요하지 않지만 자주 접근되어 캐싱의 이점을 볼 수 있는 경우에 해당합니다. 

- 애플리케이션 캐시 (Application Cache): LangChain은 애플리케이션 프레임워크이므로 애플리케이션 특정 캐싱 메커니즘을 사용합니다. 여기에는 사용자 세션, 진행 중인 대화의 컨텍스트 또는 특정 사용자 환경 설정 및 데이터를 캐싱하는 것이 포함됩니다. 

- 데이터베이스 캐시 (Database Cache): LangChain이 데이터 저장 및 검색을 위해 데이터베이스와 상호 작용하는 경우, 일반적인 쿼리나 데이터 검색 작업을 가속화하기 위해 데이터베이스 캐싱이 사용될 수 있습니다. 

- 웹 캐시 (Web Cache): LangChain 애플리케이션이 웹 소스에서 데이터를 가져올 때, 웹 캐싱 메커니즘을 사용하여 웹 콘텐츠를 저장하고 빠르게 검색할 수 있습니다. 

- CDN 캐시 (CDN Cache): 애플리케이션이 웹을 통해 넓은 지역의 사용자 기반에 콘텐츠를 제공하는 경우, 사용자 위치에 가까운 곳에서 정적 리소스를 캐시하기 위해 CDN(콘텐츠 전송 네트워크,Content Delivery Network) 캐시를 사용할 수 있습니다. 


LangChain 애플리케이션에서 캐시 유형의 선택은 애플리케이션의 특정 요구 사항, 예를 들어 데이터의 성격, 접근 빈도, 필요한 접근 속도, 자원 제한 등에 따라 달라집니다

 

 

 

3. LangChain 에서 Cache 적용해보기

 

터미널에서 pip install로 openai, langchain을 설치합니다. 

 

! pip install openai langchain

 

 

 

인메모리 캐시(InMemory Cache)와 SQLite 데이터베이스 캐시 (SQLite Database Cache)를 순서대로 소개하겠습니다. 

 

3-1. InMemory Cache

 

먼저 메모리 캐시 (Memory Cache)를 이용하는 방법을 소개합니다.  

LLM 모델은 OpenAI의 "gpt-3.5-turbo"를 이용하겠으며, 환경변수로 OPENAI_API_KEY를 등록해줍니다. 

 

# (1) InMemoryCache
from langchain.globals import set_llm_cache
from langchain.llms import OpenAI

import os

os.environ["OPENAI_API_KEY"]="sk-xxxx..." # set with yours

 

 

캐시의 효과를 더 강조하기 위해서 조금 느린 LLM 모델을 사용하겠습니다. 

 

# To make the caching really obvious, let's use a slower model.
model = OpenAI(model="gpt-3.5-turbo-instruct", n=3)

 

 

%%time 으로 실행 시간을 측정해보겠습니다. 처음 사용할 때는 캐시가 적용되지 않기 때문에 시간이 상대적으로 오래 걸립니다. 

 

%%time
from langchain.cache import InMemoryCache

set_llm_cache(InMemoryCache())

# The first time, it is not yet in cache, so it should take longer
model.invoke("Tell me a joke about birds.")

# CPU times: total: 688 ms
# Wall time: 1.35 s
# '\n\nWhy did the chicken go to the seance?\n\nTo talk to the other side of the road!'

 

 

똑같은 사용자 쿼리를 LLM 모델에 보내면 캐시에 저장되어 있는 응답을 사용하여 즉시 응답해주기 때문에 소요시간이 대폭 줄어들었음을 알 수 있습니다. 

 

%%time
# The second time it is, so it goes faster
model.invoke("Tell me a joke about birds.")

# CPU times: total: 15 ns
# Wall time: 12 ns
# '\n\nWhy did the chicken go to the seance?\n\nTo talk to the other side of the road!'

 

 

 

3-2. SQLite Database Cache

 

다음으로 SQLLite Database Cache를 사용하기 위해 database path를 설정해줍니다. 

 

## (2) SQLite Cache
# We can do the same thing with a SQLite Cache
from langchain.globals import set_llm_cache
from langchain.cache import SQLiteCache

set_llm_cache(SQLiteCache(database_path=".langchain.db"))

# To make the caching really obvious, let's use a slower model.
model = OpenAI(model="gpt-3.5-turbo-instruct", n=3)

 

 

첫번째 사용자 쿼리 실행 시간을 측정해보겠습니다. 

 

%%time
# The first time, it is not yet in cache, so it should take longer.
model.invoke("Tell me a joke about birds")

# CPU times: total: 46.9 ms
# Wall time: 764 ms
# '\n\nWhy did the chicken go to the seance?\n\nTo talk to his ghost hen-cestors!'

 

 

위와 똑같은 사용자 쿼리를 LLM 모델에 보내보면, 이번에는 SQLite Cache에 저장되어 있던 답변이 신속하게 반환됩니다. 

 

%%time
# The second time it is, so it goes faster
model.invoke("Tell me a joke about birds")

# CPU times: total: 15.6 ms
# Wall time: 7.56 ms
# '\n\nWhy did the chicken go to the seance?\n\nTo talk to his ghost hen-cestors!'

 

 

[ Reference ]

- LangChain Cache: https://python.langchain.com/docs/modules/model_io/llms/llm_caching

 

 

이번 포스팅이 많은 도움이 되었기를 바랍니다. 

행복한 데이터 과학자 되세요!  :-)

 

728x90
반응형
Posted by Rfriend
,