time weighted vector store retriever 에 대해서 자세히 알아보고 입력한 문서들에서 검색하는 사람이 원하는 정확한 정보를 가져올 수 있는 기능을 직접 코드를 작성해 보겠습니다. 초보자도 아래 포스팅을 따라서 타이핑만 하시면 쉽게 완성하실 수 있으니까 꼭 끝까지 읽어봐 주세요!
Table of Contents
time weighted vector store retriever 란 무엇일까요?
time weighted vector store retiever 는 원하는 날짜에 맞춰서 검색된 결과 중에서 중요도가 높은 순서를 정렬하여 문서에서 필요한 내용을 가져오는 방법입니다.
가장 최근에 생성된 데이터를 가져오도록 설정한 후에 retrieve 시키는 경우에 자주 이용됩니다.
FAISS 란 무엇인가?
faiss 란 페이스북 AI 연구소에서 만든 기술로서 벡터로 클러스터링을 형성하여 빠르게 인덱스를 형성해줍니다. 또한, 인덱스에서 빠르게 검색하고자 하는 단어를 찾아서 검색해주는 기능도 지원합니다. 페이스북 AI 연구소에서 클러스터링 기술을 효율적으로 설계하여 벡터들을 입력하였을 때 빠르게 인덱싱 해주는 능력이 인상적이었습니다.
faiss 단점 및 보완책
faiss 가 빠른 인덱싱과 빠른 검색이 장점이기는 하지만 직접 데이터세트를 입력받아서 벡터를 만들어주고 그 벡터들을 인덱싱해주는 기능은 포함되어 있지 않습니다. 따라서, 개발자는 문장이나 단어를 먼저 one hot encoding 이라 embedding 을 해주는 모듈에 입력해서 출력되는 벡터리스트들을 faiss에 입력해주어야 합니다. 이러한 번거로움을 해소해주는 가장 편리한 방법은 elasticsearch 를 설치해서 사용하는 것입니다.
elasticsearch는 단어를 벡터로 변환하고 다시 벡터에 인덱스를 부여하여 검색할 수 있는 데이터베이스로 만들어주며 kibana 라는 Web UI 프로그램을 설치하면 elasticsearch 검색엔진을 사용하여 빠르고 정확하게 검색을 할 수 있습니다. 아래 포스팅에 elasticsearch 설치 방법과 kibana 설치 방법 및 사용 방법을 자세하게 정리하였으니 꼭 한번 확인해 보시기 바랍니다.
elasticsearch 설치 방법 및 사용 방법 알아보기
FAISS 사용 방법
faiss-gpu 를 사용하려면 jupyternote 에서 아래와 같은 커맨드를 실행해서 다운로드 받아서 설치할 수 있습니다. 직접 소스 코드를 다운로드 받으시려면 아래의 버튼을 눌러서 직접 받으실 수 있습니다.
!pip install -q faiss-gpu
retriever 와 관련된 대부분의 패키지는 langchain 패키지에 담겨있습니다. 이번에는 TimeWeightedVectorStoreRetriever 를 langchain.retrievers 패키지 에서 임포트시켜서 가져옵니다. FAISS 모듈을 langchain_community.vectorstores 패키지에서 임포트해서 사용할 수 있습니다.
time weighted vector store retriever 만드는 방법
pdf 문서들을 불러올 때 사용하는 Document 모듈도 임포트 해둡니다.
from datetime import datetime, timedelta
import faiss
from langchain.docstore import InMemoryDocstore
from langchain.schema import Document
from langchain.retrievers import TimeWeightedVectorStoreRetriever
from langchain_community.vectorstores import FAISS
임베딩 이란 자연어로 생성된 텍스트 데이터를 벡터로 변환해주는 방법을 의미합니다. 단어 1개를 벡터로 표현을 할 때 정교하게 표현하기 위하여 N 차원의 벡터로 구성하여 표현할 수 있습니다. 아래 예제에서는 벡터로 표현 할때 768차원으로 표현하기 위해서 embedding_size 를 768 로 설정합니다.
faiss.IndexFlatL2(embidding_size) 구문은 어떤 의미가 있는가 하면 faiss 라는 모듈은 2차원 인덱스를 생성할 것인데 입력 데이터로 들어오는 벡터의 사이즈가 768 차원이라는 뜻입니다. 즉, faiss 에 768 차원으로 표현된 벡터를 하나 입력할 테니까 그에 부합하는 인덱스를 생성해서 반환해 달라는 의미가 됩니다.
벡터스토어를 생성하기 위해서 한글로 임베딩된 오브젝트와 방금 생성한 인덱스 값과 document 형태의 벡터를 저장하기 위해서 메모리를 할당받은 InMemoryDocstore({}) 를 입력하면 FAISS( ) 라는 모듈이 vectorstore 라는 객체를 생성해줍니다.
# Initialize the vectorstore as empty
embedding_size = 768
index = faiss.IndexFlatL2(embedding_size)
vectorstore = FAISS(ko_embedding, index, InMemoryDocstore({}), {})
실제로 Time Weighted Vector Store Retriever( ) 객체를 만드는 방법입니다. 위에서 생성한 vectorstore 와 decay_rate 을 0.99로 설정하여 retriever 를 생성해 줍니다.
retriever = TimeWeightedVectorStoreRetriever(
vectorstore=vectorstore, decay_rate=0.99, k=1
)
Time Weighted Vector Store Retriever 기능 검증하는 방법
오늘을 기준으로 하루 사이에 추가된 문서 중에서 가장 최신의 문서 내용을 가져오도록 하는 기능을 테스트 해 보겠습니다.
retreiver 에 문서를 추가하기 위해서 retreiver.add_documents( ) 를 호출합니다. 이때 입력하는 텍스트 데이터는 “영어는 훌륭합니다.” 입니다. 문서가 생성된 날짜는 어제 (yesterday) 로 지정합니다.
방금 입력한 “영어는 훌륭합니다” 라는 문장과 구분하기 위해서 document 를 하나 더 추가합니다. “한국어는 훌륭합니다.” 를 add_documents( ) 로 추가합니다.
yesterday = datetime.now() - timedelta(days=1)
retriever.add_documents(
[Document(page_content="영어는 훌륭합니다.", metadata={"last_accessed_at": yesterday})]
)
retriever.add_documents([Document(page_content="한국어는 훌륭합니다")])
decay_rate 을 0에 가까운 값으로 설정하면 가장 최근에 추가된 문서를 검색하게 됩니다.
# "Hello World" is returned first because it is most salient, and the decay rate is close to 0., meaning it's still recent enough
retriever.get_relevant_documents("영어가 좋아요")
위에서 검색을 할 때 한국어를 찾아 달라고 하지 않고 “영어가 좋아요” 를 검색을 시켰는데 검색 결과에는 “한국어는 훌륭합니다.” 라는 document가 검색 결과로서 제공됩니다.
나가며
time weighted vector store retriever 와 faiss 는 생성형 AI를 연구하거나 개발 업무를 하면서 생계를 이어가는 사람들에게는 가장 기본적인 연장이라고 할 수 있습니다. 생성형 AI 라이브러리들이 gemini-pro 를 비롯하여 ChatGPT-o 를 포함하여 llama3 도 등장하면서 각 모델의 장점과 단점을 빠르게 파악하여 고객들에게 제안을 해야 하는 시대가 열렸습니다.
환각 현상에 대한 우려가 커지고 있어서 RAG 기술에 대한 관심이 쏟아지고 있으며 MS Azure 에서도 유료 솔루션으로서 RAG 패키지를 제공하고 있습니다. 소규모 개인 사업자와 개인 개발자들께서 마이크로소프트 Azure 솔루션 비용을 감당하기에는 버거울 것입니다.
multi query retriever 를 비롯하여 무료로 llama3 을 이용해서 여러 개의 문서에서 키워드와 정확히 일치하거나 유사한 단어를 담고 있는 문장과 문단을 딱 골라서 검색 결과로서 보여줍니다. 이런 섬세한 문서 검색 기능은 네이버 검색이나 구글 검색이나 윈도우즈 내장 검색에서도 제공해 주지 못합니다. 오로지 벡터 검색 엔진만이 제공할 수 있는 기능입니다.
다음 포스팅에서는 self query retriever 를 이용해서 문서를 빠르고 정확하게 검색하고자 하는 문단을 찾는 Ensemble Retriever 기술을 적용한 챗봇을 직접 만들어 보도록 하겠습니다.