이 예제는 머신러닝 임베딩을 캐싱하고 이를 로컬 파일 시스템에 저장하여 성능을 최적화하는 방법을 보여줍니다. 특히, 동일한 문서나 데이터에 대해 반복적으로 임베딩을 생성해야 할 때, 캐시를 활용하면 성능이 크게 향상됩니다.
캐시는 자주 사용되거나 접근할 가능성이 높은 데이터를 임시로 저장해두는 고속의 메모리입니다. 프로세서나 메모리와 비교하여 상대적으로 빠른 접근이 가능하며, 필요할 때 해당 데이터를 빠르게 불러올 수 있습니다.
임베딩 과정에서 같은 데이터가 여러 번 처리될 가능성이 있습니다. 예를 들어, NLP 모델에서 문장이나 단어가 자주 사용된다면, 동일한 단어에 대해 반복적으로 임베딩을 계산해야 할 수 있습니다. 이때, 캐시는 이전에 계산된 임베딩 결과를 저장해두어, 동일한 데이터에 대해 다시 임베딩을 계산할 필요 없이 캐시에 저장된 값을 바로 가져올 수 있게 합니다.
캐시가 있으면 임베딩 과정에서 이미 계산된 결과를 재사용할 수 있기 때문에, 불필요한 재계산을 줄일 수 있습니다. 그 결과, 전체 연산 속도가 빨라집니다.
OpenAI 임베딩: OpenAI에서 제공하는 임베딩 모델을 사용하여 문서의 텍스트를 고차원 벡터로 변환합니다.
LocalFileStore: 로컬 파일 시스템을 캐시 저장소로 사용합니다. 여기서 임베딩 결과가 파일 형태로 저장됩니다. 이를 통해 동일한 임베딩 계산을 반복하지 않고도 저장된 결과를 재사용할 수 있습니다.
CacheBackedEmbeddings: 임베딩을 생성할 때 캐시를 지원하는 래퍼 클래스입니다. 이 클래스는 임베딩 결과를 캐시에서 먼저 찾고, 캐시에 없을 경우에만 임베딩 계산을 수행한 후 결과를 캐시에 저장합니다.
임베딩 설정 및 로컬 파일 저장소 설정:
from langchain.storage import LocalFileStore
from langchain_openai import OpenAIEmbeddings
from langchain.embeddings import CacheBackedEmbeddings
# OpenAI 임베딩을 사용하여 기본 임베딩 설정
embedding = OpenAIEmbeddings()
# 로컬 파일 저장소 설정
store = LocalFileStore("./cache/")
# 캐시를 지원하는 임베딩 생성
cached_embedder = CacheBackedEmbeddings.from_bytes_store(
underlying_embeddings=embedding,
document_embedding_cache=store,
namespace=embedding.model, # 네임스페이스로 모델 이름 사용
)
캐시된 키를 확인:
# store에서 키들을 순차적으로 가져옵니다.
list(store.yield_keys())
문서 로드 및 임베딩 생성:
from langchain.document_loaders import TextLoader
from langchain_text_splitters import CharacterTextSplitter
from langchain.vectorstores import FAISS
# 문서 로드
raw_documents = TextLoader("./data/appendix-keywords.txt").load()
# 문자 단위로 텍스트 분할 설정
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
# 문서 분할
documents = text_splitter.split_documents(raw_documents)
# 코드 실행 시간을 측정합니다.
%time db = FAISS.from_documents(documents, cached_embedder)
캐시 활용에 따른 성능 비교:
# 캐싱된 임베딩을 사용하여 FAISS 데이터베이스 생성
%time db2 = FAISS.from_documents(documents, cached_embedder)
초기 임베딩 생성: 처음 문서를 임베딩할 때는 모든 문서에 대해 임베딩을 계산하고, 그 결과를 캐시에 저장합니다.
반복적인 임베딩 생성: 두 번째로 동일한 문서를 임베딩할 때는 캐시에서 이미 계산된 결과를 불러오기 때문에, 임베딩 계산에 걸리는 시간이 거의 없습니다. 이로 인해 전체 처리 속도가 대폭 빨라집니다.
성능 최적화: 캐시를 사용하면 동일한 데이터에 대해 불필요한 계산을 피할 수 있으므로, 특히 대규모 데이터 세트나 자주 사용되는 데이터를 처리할 때 성능이 크게 향상됩니다.
따라서, 캐시를 활용하는 임베딩 시스템은 반복적인 작업에서 특히 효과적이며, 전체 시스템의 처리 속도를 비약적으로 개선할 수 있습니다.
캐시를 사용하면 동일한 데이터에 대한 중복 계산을 피할 수 있어 연산 시간이 크게 줄어듭니다. 이는 전체 시스템의 성능을 향상시키고, 특히 대규모 데이터나 실시간 처리가 중요한 경우에 매우 유용합니다.