단순 키워드 매칭을 넘어 개인화 벡터 검색과 RRF 도입으로 거래액을 끌어올린 실전 엔지니어링 이야기
이 아티클은 4050 여성 패션 플랫폼 '퀸잇'이 서비스 초기의 단순 데이터베이스 검색에서 대형 장애와 다양한 시행착오를 거치며 고도화된 하이브리드 검색 엔진으로 성장해 나가는 여정을 그립니다. 엘라스틱서치를 활용한 시맨틱 검색, 개인화 벡터 검색의 도입 과정과 비즈니스 성과를 투명하게 공개합니다. 이종의 검색 결과를 효과적으로 융합하기 위한 RRF 적용 방법과 아키텍처적 트레이드오프를 심도 있게 다룹니다.
단순 텍스트 매칭 검색의 한계를 느끼고 개인화 추천이나 자연어 의미 분석 기술을 검색 시스템에 도입하고자 하는 백엔드 엔지니어들에게 적극 추천합니다.
초기 퀸잇에는 검색 시스템이 없거나 MySQL LIKE '%keyword%' 조건문에 의존하여 검색 속도가 느리고 동의어 및 형태소 분석이 불가능한 한계가 있었습니다. 이후 도입된 키워드 검색(BM25) 또한 단순 텍스트 일치 점수에만 의존하여 사용자의 개인적 선호도를 반영하지 못하고 자연어로 구성된 검색어의 의미를 파악하지 못하는 한계가 있었습니다.
Elasticsearch 기반 역인덱스 매칭과 function_score 기반 리랭킹을 거쳐 유저 행동 기반의 개인화 벡터 검색과 ML 서버(FAISS) 기반의 시맨틱 검색을 구축했습니다. 각 검색 결과는 RRF(Reciprocal Rank Fusion) 알고리즘을 통해 단일 순위로 병합되었으며, 장애 전파를 막기 위해 Resilience4j 기반의 서킷 브레이커와 다단계 Fallback 구조를 설계했습니다.
시맨틱 검색 도입을 통해 검색 실패율이 4.3%에서 0.47%로 약 89% 감소하였으며, 개인화 및 RRF 검색 실험을 통해 전체 거래액과 검색 기여 거래액 지표를 크게 증대시켰습니다. 또한 대규모 트래픽 장애 환경에서도 외부 시스템 지연을 격리하고 캐싱된 BM25 결과를 제공하여 서비스 가용성을 대폭 확보했습니다.
Trade-off
검색의 빠른 지표 검증을 위해 검색 서버와 ML 서버에 비즈니스 로직이 분산되어 복잡도가 늘어났으며, FAISS 사용 시 사전 필터링(Pre-filtering)이 불가능하여 결과의 품질과 속도가 제한적이었습니다. 또한 단순 교집합 선노출 방식은 오히려 개인화 추천 점수를 희석시켜 클릭률(CTR)을 떨어뜨리는 부작용이 관찰되었습니다.
서로 다른 성격의 다중 검색 엔진이 반환한 결과들을 절댓값 점수가 아닌 상대적인 순위(Rank) 기반으로 계산하여 자연스럽게 하나로 병합하는 순위 융합 알고리즘입니다.
사용자의 과거 클릭 및 구매 이력 등 행동 정보를 기반으로 한 유저 임베딩 벡터와 상품 벡터를 고차원 공간에 함께 사상하여 가장 인접한 맞춤형 상품을 찾아내는 기법입니다.
마이크로서비스나 외부 연동 시스템 장애 시, 특정 서비스의 무반응이나 에러가 앱 전체로 전파되지 않도록 호출 흐름을 즉시 차단하고 대체 동작을 정의하는 탄력성 확보 패턴입니다.