본문 바로가기
C.W.K.
Stream
Lesson 02 of 05 · published

FTS5와 BM25로 찾기

~13 min · fts5, bm25, keyword-search, inverted-index

Level 0꺼진 심지
0 XP0/33 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete
"신경망부터 찾기 전에 기억해. 40년 된 키워드 순위 함수가 이름과 오류 코드, 정확한 구절에서는 여전히 더 잘 찾아. GPU도 필요 없고."

문서 목록을 뒤집으면 검색이 빨라져

일반적인 목록은 문서마다 어떤 단어가 들어 있는지 적어. 이 구조에서 단어 하나를 찾으려면 모든 문서를 훑어야 해. 역색인은 방향을 뒤집어 각 단어가 어느 문서의 어느 위치에 나타나는지 기록해. 이제 'affogato'가 있는 곳을 찾는 일은 전체 코퍼스를 읽는 작업이 아니라 해당 단어 항목을 한 번 조회하는 일이 돼. SQLite FTS5가 외부 서비스 없이 이 구조를 제공해.

BM25는 세 가지 직관으로 순위를 매겨

  • 단어가 여러 번 나오면 관련성이 커지되 증가폭은 줄어. 같은 단어를 백 번 반복한다고 100배 중요한 문서가 되지는 않아.
  • 역문서빈도(IDF)는 드문 단어를 더 무겁게 봐. 흔한 조사보다 'affogato' 같은 낱말이 문서를 훨씬 또렷하게 가리켜.
  • 긴 문서가 우연히 많은 단어를 담은 효과를 보정해. 짧고 핵심적인 글이 장황한 문서에 밀리지 않게 하지.

모두 역색인 위에서 계산하는 산수라 임베딩과 학습, GPU가 필요 없어. 1990년대부터 쓰여 온 방법이지만 아직도 강한 이유가 여기에 있어.

정확한 단어를 찾을 때는 흐릿함이 약점이야

벡터 검색은 비슷한 뜻을 찾는 데 뛰어나지만 이름과 함수명, 오류 코드, 드문 전문 용어처럼 철자가 중요한 쿼리는 주변 의미로 흐릴 수 있어. BM25는 입력한 단어 자체를 놓치지 않아. 그래서 키워드 검색은 벡터가 등장하기 전에 쓰던 낡은 경로가 아니라, 하이브리드 엔진의 정밀한 절반이야.

키워드 검색을 결정론적 바닥으로 먼저 튼튼하게 만들어. 로컬 역색인과 BM25는 모델 서버가 꺼져도 계속 작동해. 벡터는 이 기반을 대체하는 것이 아니라 의미 검색을 보태는 향상이야.

실행은 로컬 SQL 한 번이야

FTS5 가상 테이블을 만들고 MATCH로 단어를 찾은 뒤 내장 bm25() 값으로 정렬하면 돼. SQLite에서는 낮은 점수가 더 좋은 결과라 오름차순으로 정렬해. 네트워크도 모델도 없이 하나의 로컬 데이터베이스 파일에서 끝나는 빠르고 재현 가능한 기반이야.

Code

BM25로 순위 매긴 FTS5 키워드 검색 — 모델 없이 로컬에서 실행·sql
-- A full-text index over chunk text, queried and ranked, entirely in SQLite.
CREATE VIRTUAL TABLE chunks_fts USING fts5(
  text,
  chunk_id UNINDEXED,      -- carried along, not searched
  corpus_id UNINDEXED
);

-- Find chunks matching the query, ranked by BM25 (lower score = better match).
-- No model, no network — this runs against a local database file.
SELECT chunk_id, bm25(chunks_fts) AS score, text
FROM chunks_fts
WHERE chunks_fts MATCH 'long-term AND investor'
ORDER BY score          -- FTS5's bm25() is negative; ascending = most relevant first
LIMIT 8;

External links

Exercise

키워드 검색이 시맨틱 검색을 이길 거라 기대할 쿼리 하나, 반대를 기대할 쿼리 하나를 골라. 첫째엔 정확한 이름·코드·드문 용어를, 둘째엔 막연한 개념적 요청을 떠올려. BM25가 왜 첫째를 이기고 둘째에서는 흐려지는지 각각 한 문장으로 설명해. 이게 하이브리드 엔진의 어느 절반에 언제 기댈지 알려주는 직관이야.
Hint
키워드 검색은 쿼리가 답의 정확한 단어일 때 이겨(이름, 오류 코드, 인용 구절). 시맨틱 검색은 답이 같은 생각에 완전히 다른 단어를 쓸 때 이겨. 좋은 하이브리드 엔진은 진짜 쿼리가 섞여서 둘 다 필요해.

Progress

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

댓글 0

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

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