투자 어시스턴트 개발

Sentence Transformers를 활용한 문장 임베딩 및 FAISS 검색 시스템 구축 [16]

HeyTeddy 2024. 12. 17. 05:59
반응형

SBERT(Sentence-BERT)는 문장 수준의 임베딩을 생성하여 자연어 처리(NLP)에서 문장 간 유사도를 효율적으로 계산할 수 있도록 도와주는 강력한 도구입니다. 이번 블로그에서는 SBERT 모델 중 distiluse-base-multilingual-cased-v1을 활용하여 문장을 벡터화하고, FAISS(Vector Search Library)를 사용하여 효율적으로 유사 문장을 검색하는 시스템을 구축하는 방법을 알아보겠습니다.

SBERT와 FAISS를 활용한 주요 작업 흐름

  1. 문서 리스트 준비: 검색 대상이 되는 문서를 리스트 형태로 준비합니다.
  2. SBERT로 문장 임베딩 생성: 사전 학습된 다국어 SBERT 모델을 사용해 각 문장을 벡터화합니다.
  3. FAISS로 벡터 저장소 구성: 생성된 벡터를 FAISS 벡터 저장소에 저장하여 유사도 기반 검색이 가능하도록 설정합니다.
  4. 질의(Query) 처리: 검색 쿼리를 입력하면, 가장 유사한 문장을 검색합니다.
# SentenceTransformerEmbeddings: SBERT 모델을 활용한 문장 임베딩 생성
from langchain_community.embeddings.sentence_transformer import SentenceTransformerEmbeddings
# FAISS: 효율적인 유사성 검색을 위한 벡터 데이터베이스 라이브러리
from langchain_community.vectorstores import FAISS

# 1. 문서 리스트 준비
doc_list = [
    "우리나라는 2022년에 코로나가 유행했다.",
    "우리나라 2024년 GDP 전망은 3.0%이다.",
    "우리나라는 2022년 국내총생산 중 연구개발 예산은 약 5%이다."
]

# 2. SBERT 모델 초기화
# 사용 모델: distiluse-base-multilingual-cased-v1 (다국어 지원 모델)
embedding = SentenceTransformerEmbeddings(model_name="distiluse-base-multilingual-cased-v1")

# 3. FAISS 벡터 저장소 구성
# - doc_list의 각 문장을 벡터화하여 FAISS 데이터베이스에 저장
# - 각 문서에 메타데이터를 부여하여 추적 가능하도록 설정
faiss_vectorstore = FAISS.from_texts(
    doc_list, embedding, metadatas=[{"source": 1}] * len(doc_list)
)

# 4. FAISS 검색기(FaissRetriever) 설정
# - k=1: 가장 유사한 문장 1개만 검색
faisss_retriever = faiss_vectorstore.as_retriever(search_kwargs={"k": 1})

# 5. 검색 쿼리 입력
query = "2022년 우리나라 GDP대비 R&D 규모는?"

# 6. 유사 문서 검색 수행
docs = faisss_retriever.invoke(query)

# 7. 검색 결과 출력
print(docs)
# 결과: "우리나라는 2022년 국내총생산 중 연구개발 예산은 약 5%이다." 문장이 가장 유사한 결과로 반환
반응형