피드로 돌아가기
Dev.toBackend
원문 읽기
8º. Hybrid search with RRF: combining pgvector, tsvector, and a knowledge graph in one query
Postgres의 pgvector, tsvector, 그래프 데이터베이스를 Reciprocal Rank Fusion으로 통합해 100ms 이내 하이브리드 검색 구현
AI 요약
Context
단일 검색 방식으로는 모든 사용 사례를 충족할 수 없었다. 의미 기반 검색은 "beach trip" 쿼리에서 "Qué calor en Valencia, el agua estaba perfecta"를 찾지만, 정확한 인명 검색에는 부정확한 결과를 반환했고, 풀텍스트 검색은 키워드에만 의존해 관계 정보를 놓쳤다.
Technical Solution
- 4개 신호 병렬 생성: pgvector 코사인 유사도 (의미 검색), tsvector + GIN 인덱스 + ts_rank (정확 키워드 검색), entity_links 그래프 순회 (관계 검색), record_heat 테이블 (시간 관련성)
- 벡터 검색: 쿼리를 qwen3-embedding:0.6b (1024차원)로 인베딩하고 0.3 이상 코사인 유사도 점수로 상위 50개 후보 추출
- 풀텍스트 검색: 7개 도메인 테이블 (notes, events, contacts, emails, files, diary, bookmarks, kanban_cards)에서 plainto_tsquery('simple') 사용해 언어별 스테밍 부작용 제거, 가중치(제목 'A', 내용 'B', 태그 'C')로 필드별 점수 차등화
- 그래프 검색: graph_entities.normalized_name 매칭 후 entity_links로 연결된 모든 레코드 추출, overlap ratio로 그래프 점수 계산
- 정규화 및 융합: 5단계에서 rank-based normalization으로 각 신호를 [0, 1]로 변환 (상위 순위는 1.0, 하위는 0에 가까움), 6단계에서 signal entropy로 퇴화 신호 감지해 억제, 7단계에서 가중 합계 + 다중 신호 보너스 적용
- Free 사용자는 풀텍스트만 제공, Pro 사용자는 4개 신호 모두 활용
Impact
최종 검색 응답 시간 100ms 이내 달성.
Key Takeaway
하이브리드 검색의 핵심은 개별 신호가 아니라 서로 다른 스케일·실패 모드·강점을 가진 신호들을 결합하는 방식이다. Reciprocal Rank Fusion으로 스케일 문제 해결, 신호 퇴화 감지로 노이즈 신호 억제, 다중 신호 보너스로 신뢰도 높은 결과를 식별할 수 있다.
실천 포인트
다중 데이터 소스(벡터 DB, 풀텍스트 인덱스, 그래프)를 검색하는 시스템에서 각 신호를 raw score 대신 rank position으로 정규화한 후 가중 합산하면, 자동 튜닝 없이도 일관된 결과 순서를 유지할 수 있다. 또한 엔드포인트에 provenance 필드(각 결과의 신호별 점수)를 추가하면 검색 품질 디버깅 시간을 대폭 단축할 수 있다.