1. BM25 키워드 검색 (Lexical Search)
- BM25 키워드 검색은 Lexical Search(어휘 검색) 방식 중 하나로, 문서의 단어 빈도와 희귀도를 기반으로 검색 결과를 랭킹하는 알고리즘.
- Lexical Search는 문서 내 단어(lexicon)의 정확한 매칭을 기반으로 검색을 수행하는 방식.
- BM25 키워드 검색의 특징
- 정확한 단어 매칭을 기반으로 검색
- 단순 TF-IDF보다 검색 성능이 향상됨
- 짧은 문서와 긴 문서를 균형 있게 평가 (문서 길이 보정)
- Elasticsearch, Solr 등 주요 검색 엔진에서 기본 알고리즘으로 사용됨
- 데이터 양이 많을수록 검색 성능이 향상됨
- 한계점
- 동의어나 의미적으로 유사한 단어를 인식하지 못함. (예: "AI"와 "인공지능"을 다르게 인식) 자연어 의미를 이해하지 못하고, 단순히 키워드 매칭 기반으로 작동.
- Lexical Search (어휘 검색) vs. Semantic Search (의미 검색)
- Lexical Search (어휘 검색): 키워드 매칭을 기반으로 문서를 검색 (BM25, TF-IDF 등).
- Semantic Search (의미 검색): 단어의 의미를 고려하여 유사한 내용을 검색 (벡터 검색, 임베딩, LLM 기반 검색).
- BM25와 Semantic Search 비교비교 항목 BM25 (Lexical Search) Semantic Search (벡터 검색)
검색 방식 키워드 매칭 의미 기반 매칭 대표 기술 BM25, TF-IDF BERT, OpenAI Embeddings, FAISS 장점 빠르고 가벼움, 정확한 단어 검색 동의어와 문맥 이해 가능 단점 의미적 연관성 부족 계산량 많고 임베딩 학습 필요 사용 사례 뉴스, 법률 검색, 전통적인 검색 엔진 챗봇, 추천 시스템, RAG - BM25를 사용하는 경우
- 빠르고 정확한 키워드 검색이 필요한 경우
- 전통적인 검색 엔진(Elasticsearch, Solr)에서 검색 성능을 높이고 싶을 때
- TF-IDF보다 더 정교한 검색을 원할 때
- 빠른 인덱싱과 검색이 중요한 환경 (예: 뉴스, 블로그, 논문 검색)
- Semantic Search(벡터 검색)를 사용하는 경우
- "AI"와 "인공지능" 같은 동의어를 검색 결과에 포함해야 하는 경우
- 사용자가 의미적으로 비슷한 질문을 해도 정확한 답변을 찾아야 하는 경우
- LLM (GPT) 기반의 검색 시스템에서 RAG를 구축할 때
- 텍스트가 아니라 이미지, 음성 같은 비정형 데이터를 검색할 때
2. MultiQueryRetriever (검색어 확장)
- 검색어 확장(Query Expansion) 기법을 활용하여 LLM 기반의 검색 성능을 개선하는 기법(LangChain에서 제공하는 기능)
- MultiQueryRetriever가 필요한 이유
- 기본적인 검색(Retriever) 시스템에서는 사용자가 입력한 검색어(Query)에만 의존하여 검색을 수행해서 아래와 같은 한계가 있음.
- 검색어가 다르면 결과가 달라짐(예: "인공지능"과 "AI"는 같은 의미지만, 단순 BM25 검색에서는 별도로 처리됨.)
- 질문에 포함되지 않은 관련 문서를 찾기 어려움(예: "머신러닝 모델 튜닝 방법" → "하이퍼파라미터 최적화" 문서를 찾지 못할 수도 있음.)
- 사용자가 입력한 단어와 다른 표현이 문서에 있을 경우 검색 실패(예: "챗봇 개발"로 검색했을 때 "대화형 AI" 문서는 검색되지 않을 가능성.)
- MultiQueryRetriever가 해결하는 방법
- LLM을 활용하여 하나의 쿼리에서 여러 개의 변형된 쿼리를 생성.
- 서로 다른 표현 방식으로 검색을 수행하여 더 많은 관련 문서를 검색.
- 검색어 확장(Query Expansion) 기능을 통해 검색 누락을 줄임.
- MultiQueryRetriever가 BM25를 보완하는 방법
- LLM을 활용하여 검색어를 자동 확장(Query Expansion)→ 유사한 의미의 쿼리를 여러 개 생성하여 검색 수행.
- 확장된 여러 쿼리를 각각 BM25 검색에 적용→ 단순 키워드 매칭이 아닌 다양한 검색어를 활용하여 문서 검색.
- 더 많은 관련 문서를 찾아서 제공→ BM25 단독 사용보다 검색 성능이 크게 향상됨.
3. Singleton 패턴
- 싱글톤 패턴은 특정 클래스의 인스턴스가 단 하나만 생성되도록 보장하는 디자인 패턴인데 프로그램 전체에서 객체 하나만 유지하고 여러 곳에서 공유할 수 있도록 해줌.
- 우리코드에서 VectorRetriever 클래스는 싱글턴 패턴을 적용하여 한 번만 인스턴스화 됨.
- 특징
- 객체 하나만 생성하여 공유 → 메모리 사용량 최소화
- 중복된 리소스 생성 방지 → CPU, I/O 연산 절약
- 전역적으로 동일한 객체 사용 → 데이터 일관성 유지
참고 문서
'Today I Learned' 카테고리의 다른 글
LangChain RAG 시스템 구조 개념 정리 (0) | 2025.04.02 |
---|---|
MVP 벡터 DB 로드 코드 (2) | 2025.03.22 |
LAG를 왜 공부해야할까? (0) | 2025.03.10 |
내가 보려고 정리한 협업 깃 명령어 (2) | 2025.03.05 |
openai로 내용 보강법 (0) | 2025.02.21 |