LangChain을 이용한 RAG - (3) 벡터 DB 편

    목차
반응형

2024.07.06 - [데이터 분석/LLM] - LangChain을 이용한 RAG - (2) 문서 임베딩 편

벡터 DB

말 그대로 "벡터" 데이터를 효율적으로 저장하고 빠르게 검색하는데 최적화된 데이터베이스이다. 벡터 DB를 사용하는 이유는 1편에서 간단하게 설명했었다.

 

나는 거지이기 때문에 무료인 FAISS, Chroma DB를 사용하였다.

 

 

벡터스토어 생성

벡터스토어는 벡터DB와 동일한 개념으로 사용되는 용어다. LangChain에서는 벡터스토어라고 표현을 했기 때문에 나도 그에 맞춰 작성을 하였다.

from langchain_community.vectorstores import FAISS, Chroma

vectorstore_faiss = FAISS.from_documents(
    documents=split_docs, embedding=hf
)


from chromadb.errors import InvalidDimensionException

try:
    vectorstore_chroma = Chroma.from_documents(documents=split_docs, embedding=hf)
except InvalidDimensionException:
    Chroma().delete_collection()
    vectorstore_chroma = Chroma.from_documents(documents=split_docs, embedding=hf)

`FAISS`와 `Chroma` 벡터스토어는 위와 같은 방법으로 생성할 수 있다.

 

로컬 저장 및 불러오기

한 번 임베딩한 문서를 매번 수행하는데 시간이 오래 걸리므로 저장하고 필요시 불러올 필요가 있다.

# 저장
vectorstore_faiss.save_local('./db/faiss')

# 불러오기
vectorstore_faiss = FAISS.load_local('./db/faiss', hf, allow_dangerous_deserialization=True)

`FAISS`는 `save_local`과 `load_local` 메서드로 간단히 저장하고 불러올 수 있다.

 

# 저장
try:
    vectorstore_chroma = Chroma.from_documents(documents=split_docs, embedding=hf, persist_directory='./db/chroma')
except InvalidDimensionException:
    Chroma().delete_collection()
    vectorstore_chroma = Chroma.from_documents(documents=split_docs, embedding=hf, persist_directory='./db/chroma')
    
# 불러오기
vectorstore_chroma = Chroma(persist_directory="./db/chroma", embedding_function=hf)

한편 `Chroma`는 임베딩을 수행할 때 `persist_directory` 파라미터를 통해 저장할 위치를 지정해야 한다.

 

어차피 저장할 거 임베딩 수행하면서 동시에 저장되는 `Chroma`가 좋다고 생각할 수도 있고, 혹은 실험용으로 잠깐 임베딩 했는데 여건상 저장을 해야할 상황이 생긴다면 `FAISS`가 좋다고 생각할 수도 있다.

 

개인적으로 둘의 성능 차이는 크게 느끼지 못했다. 다만 광범위한 데이터셋을 처리할 때는 Chroma가 안 좋다는 평이 있다. (출처)

 

 

 

728x90
반응형