Skip to main content

벡터 검색만으로는 부족합니다

Sonamu로 상품 검색 API를 만들었습니다:
문제 발생: 사용자가 “MacBook Pro 14”로 검색하면?
  • ✅ “MacBook” → 찾음 (의미 유사)
  • ✅ “맥북 프로” → 찾음 (한글도 OK)
  • ❌ “MBP14” → 못 찾음 (정확한 모델명)
  • ❌ “SKU-12345” → 못 찾음 (상품 코드)
벡터 검색의 한계:
  • 정확한 제품명, 모델명에 약함
  • 상품 코드, SKU 같은 고유 식별자 못 찾음
  • 기술 용어, 약어에 취약

하이브리드 검색이란?

벡터 검색(의미) + 전문 검색/FTS(키워드)를 결합합니다. 장점:
  • 벡터: 의미 이해, 동의어, 오타
  • FTS: 정확한 키워드, 부분 매칭
  • 결합: 최고의 정확도

Sonamu에서 구현하기

1. PostgreSQL FTS 설정

먼저 전문 검색(FTS)을 준비합니다.

tsvector 컬럼 추가

포인트:
  • 'simple': 한국어 + 영어 처리
  • setweight: 제목(A)에 더 높은 가중치
  • GIN 인덱스: 빠른 검색

자동 업데이트 트리거

이제 상품 추가/수정 시 자동으로 search_vector가 업데이트됩니다.

2. Sonamu Model에서 하이브리드 검색

SQL 설명:
  1. vector_results: 벡터 유사도 계산
  2. fts_results: FTS 점수 계산
  3. LEFT JOIN: 둘 중 하나라도 매칭되면 포함
  4. 가중 평균: (벡터 * 0.7) + (FTS * 0.3)

가중치 전략

언제 어떤 가중치를?

균형형 (기본)
  • 용도: 일반적인 검색
  • : 블로그, 문서, 지식 베이스
의미 중심
  • 용도: 의미 이해가 중요한 경우
  • : Q&A, 고객 지원, 추천
키워드 중심
  • 용도: 정확한 매칭이 중요한 경우
  • : 상품 코드, 모델명, 기술 용어

Sonamu에서 동적 조정

실전 시나리오

시나리오: 이커머스 상품 검색

Sonamu로 쇼핑몰을 만들고 있습니다. 1단계: 테이블 준비
2단계: 상품 추가 API
3단계: 하이브리드 검색 API
사용 예시:

벤치마크

검색 정확도 비교

실제 1000개 상품 DB에서 테스트: 결론: 하이브리드가 15-20% 더 정확합니다.

주의사항

Sonamu에서 하이브리드 검색 시 주의사항:
  1. 두 인덱스 필수: 벡터 + FTS
  2. tsvector 업데이트: 트리거로 자동화
  3. 가중치 합 = 1: 정규화
  4. NULL 처리: COALESCE 사용
  5. LEFT JOIN: 한쪽만 매칭도 OK
  6. 한국어는 ‘simple’: FTS 언어 설정
  7. 성능 모니터링: EXPLAIN ANALYZE

언제 하이브리드를 쓰나요?

하이브리드 추천

이커머스 상품 검색
  • 의미 + 모델명, SKU
기술 문서 검색
  • 개념 + 함수명, 코드
고객 지원
  • 문제 설명 + 정확한 용어

벡터만으로 충분

추천 시스템
  • 키워드 불필요
이미지 검색
  • 텍스트 키워드 없음
유사 문서 찾기
  • 의미만 중요

다음 단계

벡터 검색

기본 벡터 검색 구현

청킹

긴 문서 분할하기