Investment-Assistant

LangChain으로 BM25와 FAISS를 활용한 검색 알고리즘 비교 실습 [10]

HeyTeddy 2024. 11. 26. 15:14
반응형

단어 기반 검색 알고리즘(BM25)과 OpenAI API Embedding(FAISS)를 활용하여 동일한 데이터에 대해 검색 성능과 특징을 비교해 보았습니다.

실습에 사용한 알고리즘

  • BM25: 단어 기반 검색 알고리즘으로, 텍스트 데이터의 단어 빈도와 검색어와의 겹치는 정도를 바탕으로 유사도를 측정합니다.
  • FAISS: OpenAI API의 임베딩을 활용하여 문서를 벡터화하고, 의미적으로 유사한 문서를 검색합니다.

BM25와 FAISS 검색기를 설정하고 동일한 문서 리스트를 각각의 알고리즘에 입력하였습니다.

  • BM25Retriever: 단어 빈도를 기반으로 검색
  • FAISS: OpenAI API 임베딩을 활용하여 문서를 벡터화
from langchain_community.retrievers import BM25Retriever
from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import FAISS
import config

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

# BM25 설정
bm25_retriever = BM25Retriever.from_texts(
    docs, metadatas=[{"source": 1}] * len(docs)
)
bm25_retriever.k = 1

# FAISS 설정
embedding = OpenAIEmbeddings(api_key=config.OPENAI_API_KEY)
faiss_vectorstore = FAISS.from_texts(
    docs, embedding, metadatas=[{"source": 1}] * len(docs)
)
faiss_retriever = faiss_vectorstore.as_retriever(search_kwargs={"k": 1})

# 검색 테스트
query = "2022년 우리나라 GDP대비 R&D 규모는?"

bm25_docs = bm25_retriever.invoke(query)
faiss_docs = faiss_retriever.invoke(query)

print(bm25_docs)  # BM25 결과
print('-----------')
print(faiss_docs)  # FAISS 결과

 

BM25 결과: "우리나라 2024년 GDP 전망은 3.0%이다."

FAISS 결과: "우리나라는 2022년 국내총생산 중 연구개발 예산은 약 5%이다."

BM25와 FAISS의 특징

  • BM25:
    • 장점: 단어 기반의 유사도를 빠르게 계산.
    • 특징: 검색어와 문서의 단어가 많이 겹칠수록 높은 점수를 부여.
    • 결과: 문서의 표면적인 단어와 일치한 내용을 반환.
  • FAISS:
    • 장점: 단어의 의미적 유사성을 반영하여 검색.
    • 특징: 임베딩을 활용하여 단어 간 의미를 고려한 결과 제공.
    • 결과: 의미적으로 가장 유사한 문서를 반환.

결론

  • BM25는 단어 기반으로 빠른 속도를 제공하며, 간단한 검색 시 유용합니다.
  • FAISS는 단어 간 의미적 유사성을 반영하므로, 의미 기반 검색에 적합합니다.
반응형