Post

텍스트 검색의 종류를 정리해보자

키워드 검색과 벡터 검색이 서로 다른 실패 사례를 갖는다는 걸 토이 데이터로 확인하고, 하이브리드가 왜 필요한지 정리했다

텍스트 검색의 종류를 정리해보자

텍스트 검색의 종류를 정리해보자

검색 시스템을 만들려고 자료를 찾다 보니 “검색”이라는 말 안에 방식이 여러 개 섞여 있었다. 뭘 먼저 골라야 할지 헷갈려서 종류부터 정리했다.

1. 서론 (Introduction)

  • 문제/상황 (Problem): 검색 시스템을 만들면서 “검색”을 어떻게 구현할지 찾아보니 키워드 검색·벡터 검색·하이브리드 검색이라는 말이 뒤섞여 나왔다. 뭐가 뭔지 구분이 안 된 채로 코드부터 짜면 나중에 왜 이 방식을 골랐는지 설명이 안 될 것 같았다.
  • 목적 (Purpose): 텍스트 검색 방식을 키워드·벡터·하이브리드 세 갈래로 나누고, 각각이 어떤 질의에서 강하고 약한지 토이 데이터로 확인한다.
  • 대상 (Target Audience): 검색 기능을 처음 붙이면서 방식 선택 기준이 필요한 개발자.

2. 방법 및 과정 (Methods & Process)

  • 배경 조사 및 데이터 (Data Collection): 세 방식의 원리와 실패 사례를 정리했다.

    방식원리강점약점
    키워드 검색(역색인·BM25)질의 단어가 문서에 있는지 텍스트 매칭정확한 단어·고유명사 일치에 강함, 빠름동의어·바꿔쓴 표현은 못 찾음
    벡터/임베딩 검색질의·문서를 벡터로 바꿔 의미 거리 비교동의어·의미 유사 표현도 찾음정확한 고유명사·짧은 식별자 구분에 약함
    하이브리드두 방식의 순위를 점수로 결합서로의 약점을 상호 보완결합 로직·가중치 튜닝이 별도로 필요

    BM25는 역색인에 단어별로 어떤 문서에 몇 번 등장했는지 저장해두고 질의 단어와의 일치도로 점수를 매기는 방식이라, 문서에 없는 단어는 애초에 매칭 대상이 아니다. 벡터 검색은 질의와 문서를 같은 임베딩 공간의 좌표로 바꾼 뒤 코사인 유사도 같은 거리로 순위를 매기기 때문에, 원문에 같은 단어가 없어도 의미가 가까우면 상위에 올라온다.

  • 접근 방법 (Approach Methods):
    • [방법 1]: 키워드 검색 단독 테스트. 토이 문서 5개(여행 2건·음식 1건·기술 2건)에 질의 두 개를 넣었다. “제주도”처럼 문서 원문에 그대로 있는 단어는 정확히 잡았지만, “국내 여행지 어디가 좋을까”처럼 원문과 겹치는 단어가 거의 없는 질의는 결과가 0건이었다.
    • [방법 2]: 벡터 검색 단독 테스트. 같은 두 질의를 목(mock) 코사인 유사도 검색에 넣었다. 동의어 질의에서는 여행 문서 2건을 모두 찾아내 키워드 검색의 실패를 메웠다. 다만 “제주도” 질의에서도 관련 없는 “부산 관광” 문서가 유사도 0.97로 정답 문서(1.00)와 거의 차이 없이 상위에 딸려 올라왔다 — 둘 다 “여행” 의미 공간에 가깝다 보니 벡터 검색이 “제주도”와 “부산”이라는 서로 다른 고유명사를 세밀하게 구분하지 못한 것이다.
  • 분석 및 해결 프로세스 (Analysis Flow):
    • 도구/기술: 파이썬 문자열 부분일치 함수(키워드), 목 코사인 유사도 함수(벡터) — 둘 다 외부 라이브러리 없이 토이 구현.
    • 주요 단계: 토이 문서 5개 준비 $\rightarrow$ 문서마다 의미 좌표(벡터) 수동 부여 $\rightarrow$ 질의 2개(정확 일치용·동의어용) 준비 $\rightarrow$ 같은 질의를 키워드·벡터 두 함수에 각각 통과 $\rightarrow$ 결과 비교.
    • 결과 도출 및 검증: “제주도” 질의에서 키워드 검색은 d1 1건만 반환했다. “국내 여행지 어디가 좋을까” 질의에서는 키워드 검색이 0건, 벡터 검색은 d1(1.00)·d2(0.98)를 반환해 의미가 통하는 여행 문서 2건을 모두 찾았다.

3. 결과 (Results)

  • 분석 결과 요약: 키워드 검색은 동의어 질의에서 결과 0건으로 완전히 실패했고, 벡터 검색은 그 자리를 채웠지만 대신 “제주도”와 “부산”처럼 구분돼야 할 고유명사를 유사도 0.97 대 1.00 차이로만 흐릿하게 구분했다. 두 방식의 실패 지점이 서로 다른 자리에서 나타났다.

4. 인사이트 및 액션 (Insights & Action)

  • 인사이트 (Insight): 키워드 검색과 벡터 검색은 우열 관계가 아니라 실패하는 질의 유형이 다른 상호보완 관계다. 하나만 골라 쓰면 그 방식이 약한 질의 유형에서 계속 구멍이 난다.
  • 실행 방안 (Action Plan): 검색 시스템을 새로 만든다면 처음부터 하이브리드를 목표로 설계 범위를 잡는다. 키워드 색인(역색인·BM25)과 벡터 색인을 각각 준비해두고, 결합은 나중에 붙이더라도 두 순위 리스트를 뽑는 구조 자체는 먼저 갖춘다.
  • 한 줄 결론 (Key Takeaway): 키워드 검색은 정확한 일치에, 벡터 검색은 의미 유사도에 강하고 서로의 약점이 겹치지 않으니 결국 둘을 합치는 하이브리드로 간다. 샘플 코드
  • 다음 스텝 (Next Step): 이번 토이 데모는 문서 5건, 좌표도 사람이 직접 부여한 값이라 “제주도”와 “부산”의 유사도 차이가 0.97 대 1.00으로 그나마 눈에 보였다. 문서가 수만 건으로 늘어나면 벡터끼리의 거리 차이가 훨씬 촘촘해질 텐데, 그 규모에서도 고유명사 구분력이 이 정도로 유지되는지는 이번 토이 데모만으로는 확인이 안 된다.

This post is licensed under CC BY 4.0 by the author.