이미지 및 키워드 기반 부동산 검색에서 지연 시간 및 페이지네이션 해결
Source: Dev.to
Ownership and Approach
시니어 소프트웨어 엔지니어로서 Deep Search의 성능과 정확성을 모두 개선하는 작업을 주도했습니다.
핵심 결정 중 하나는 시스템을 결정론적으로 유지하고, 랭킹이나 검색에 LLM을 사용하지 않는 것이었습니다. LLM은 유용하지만, 비결정론적이며 대규모 환경에서 제어하기 어렵습니다.
저는 사용자 의도 파악에만 LLM을 활용했습니다. LLM은 사용자 쿼리를 파싱하고 다음을 추출합니다:
- 침실 수나 위치와 같은 하드 필터
- 이미지 기반 검색이 필요한지를 나타내는 플래그
예시
- “2 bedroom apartment in Manhattan” → 순수히 결정론적 필터와 키워드 검색만 사용
- “2 bedroom house with backyard having large trees” → 시각적 이해가 필요하고 Deep Search를 트리거
이처럼 LLM 사용을 제한함으로써 시스템의 나머지 부분을 예측 가능하고 디버깅하기 쉬운 상태로 유지했습니다.
Challenges Found During Implementation
시스템을 재설계하면서 서로 다른 검색 시스템의 결과를 병합하는 방식에 큰 문제가 있음을 발견했습니다.
- BM25 검색은 자체적인 랭킹과 페이지네이션을 가집니다.
- Vector 검색도 자체적인 랭킹과 페이지네이션을 가집니다.
결과를 먼저 페이지네이션한 뒤 병합하면 페이지네이션이 완전히 깨집니다. BM25의 2페이지와 Vector 검색의 2페이지가 동일한 결과 집합을 나타내지 않으며, 어떤 페이지는 주로 벡터 매치만 포함하고, 어떤 페이지는 전혀 포함하지 않으며, 요청마다 랭킹이 변합니다. 이는 프로덕션 검색 시스템에서 용납될 수 없는 불안정하고 일관성 없는 결과를 초래합니다.
따라서 랭킹과 페이지네이션을 다루는 방식을 재고해야 했습니다.
Solution
Deep Search가 트리거될 때, 관심사의 명확한 분리를 적용한 하이브리드 검색 파이프라인을 구축했습니다:
- 하드 결정론적 필터
- RedisSearch를 이용한 BM25 전체 텍스트 검색
- pgvector를 이용한 부동산 이미지 벡터 검색
핵심 변화는 이제 이들 시스템이 각각 독립적으로 페이지네이션하지 않는다는 점입니다.
Merging results
각 검색 엔진의 랭킹 리스트를 결합하기 위해 Reciprocal Rank Fusion을 구현했습니다. 각 부동산에 대해 하나의 하이브리드 점수가 계산됩니다:
- BM25 순위는 역점수로 변환
- 벡터 유사도 점수는 정규화
Deep Search가 트리거되었는지 여부에 따라 가중치를 적용합니다:
# Hybrid scoring formula
hybridScore = alphaBM25 * bm25Score + betaVector * (vecScore / maxVec)
이 통합된 하이브리드 점수가 계산된 뒤에야 페이지네이션을 적용합니다. 이를 통해 페이지 간에 안정적인 정렬 순서를 보장합니다.
Result
새로운 접근 방식은 성능과 랭킹 문제를 모두 해결했습니다:
- 지연 시간이 약 5분에서 10초 이하로 감소
- 페이지네이션이 안정적이고 결정론적으로 동작
- 사용자가 시각적 특징을 요청할 때 시각적 매치가 자연스럽게 노출
- 키워드 의도는 여전히 랭킹에 영향을 미침
- 페이지 간 결과가 일관됨