본문 바로가기
C.W.K.
Stream
Lesson 01 of 06 · published

키워드 검색이 무너지는 자리

~22 min · embeddings, search, intuition

Level 0Scout
0 XP0/41 lessons0/10 achievements
0/120 XP to next level120 XP to go0% complete

글자가 다르면 못 찾는 검색

고전 검색 엔진과 SQL LIKE 쿼리는 문자열을 맞춰볼 뿐 뜻은 읽지 않아. "연간 결제 환불 정책"을 찾는 사람에게 "annual subscription cancellation" 문서를 보여주지 못하는 이유야. 의도는 같은데 겹치는 단어가 하나도 없거든.

형태소 분석과 표제어 추출, 동의어 사전은 달리는 → 달리다, 저렴한 ↔ 싼처럼 가까운 표현은 이어줘. 하지만 뜻 사이의 거리가 더 벌어지면 금세 한계가 드러나:

  • "메모리 누수 어떻게 고쳐?"로는 "가비지 컬렉션 디버깅"을 못 찾아
  • 영문에서 "은행이 우리 대출 거절"을 찾다가 강둑(river bank) 기사까지 함께 잡아
  • "PyTorch M3에서 느림"으로는 "MLX로 Apple Silicon 학습 가속"을 못 봐

뜻을 좌표로 바꿔봐

필요한 건 단어가 아니라 의미를 좌표로 나타내는 방식이야. 같은 뜻을 담은 글이라면 사용한 단어가 달라도 가까운 좌표에 놓여야 해. 그 좌표가 바로 임베딩이야. 이 퀘스트에서는 글을 임베딩으로 바꾸고, 저장하고, 찾아내고, 실제 서비스에서 믿고 쓸 수 있게 만드는 전 과정을 다뤄.

내 데이터에 정말 필요한지 먼저 증명해

벡터 검색부터 들이밀지 말고 실제 자료에서 이런 빈틈이 얼마나 큰지 재봐. 사용자 쿼리 30개와 지식 베이스 문서 30개를 뽑은 뒤, 뜻은 분명히 맞는데 겹치는 토큰이 0인 쌍을 세는 거야. 이런 쌍이 많다면 벡터 검색을 도입할 이유가 충분해. 거의 없다면 BM25와 동의어 사전이 훨씬 싸고도 충분할 수 있어.

Code

한 줄로 갭 보여주기·python
from collections import Counter

query = 'refund policy for yearly plans'
doc   = 'how to cancel an annual subscription'

def token_overlap(a: str, b: str) -> int:
    a_tokens = Counter(a.lower().split())
    b_tokens = Counter(b.lower().split())
    return sum((a_tokens & b_tokens).values())

print(token_overlap(query, doc))   # 0 — 키워드 검색은 이걸 통째로 놓침
내 자료에서 빈틈 확인하기·python
import csv
from pathlib import Path

pairs = csv.DictReader(Path('audit_pairs.csv').open())
zero_overlap = 0
for row in pairs:
    if token_overlap(row['query'], row['doc']) == 0 and row['relevant'] == 'yes':
        zero_overlap += 1
print(f'{zero_overlap} 개의 relevant pair 가 키워드 검색으로는 매칭 불가')

External links

Exercise

지원함이나 채팅 기록에서 실제 질문 20개를 뽑아. 질문마다 가장 가까운 정답 KB 글을 짝지은 뒤 겹치는 토큰 수를 세봐. 0인 쌍이 몇 개인지 확인해. 그 숫자가 벡터 검색을 도입할 최소한의 근거야.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.