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 는 절대 필요 없어."

역색인

전문 검색이 빠른 건 자료구조 뒤집기 하나 덕분이야. 순진한 배치는 각 문서를 담긴 단어로 매핑해; 단어를 찾으려면 모든 문서를 훑어야 해. 역색인은 그걸 뒤집어: 각 단어를 그걸 담은 문서(와 위치) 목록으로 매핑해. 이제 "afogato" 가 나타나는 모든 곳을 찾는 게 코퍼스 전체 스캔이 아니라 단일 조회야. SQLite 의 FTS5 확장이 바로 이 구조를, DB 바로 안에서, 외부 서비스 없이 짓고 쿼리해.

BM25: 모델 없는 순위

매치를 찾는 건 일의 절반이고, 순위 매기는 게 나머지 절반이고, 그게 BM25 가 하는 거야. 매칭되는 각 문서를 세 직관으로 점수 매겨:

  • 단어 빈도, 포화와 함께. 네 단어를 더 언급하는 문서가 더 관련 있어 — 근데 수확 체감으로. 열 번째 등장은 아홉 번째에 거의 안 더해서, 페이지가 단어 반복만으론 못 이겨.
  • 역문서빈도. 드문 단어가 흔한 것보다 더 많은 신호를 지녀. "afogato" 매칭이 "the" 매칭보다 훨씬 많이 알려줘서, 드문 매치는 가중이 올라가.
  • 길이 정규화. 긴 문서는 자연히 더 많은 단어를 담아; BM25 는 길이를 할인해서 장황한 페이지가 짧고 핵심 있는 걸 못 이기게 해.

셋 다 인덱스 위 순수 산수야. 임베딩 없음, 학습 없음, GPU 없음 — 그리고 1990년대부터 조용히 훌륭했어.

키워드 검색이 여전히 중요한 이유

벡터 검색이 검색의 유행하는 절반이지만, 흐려. '비슷한 뜻인 걸 찾아' 엔 뛰어나고 '이 정확한 단어를 찾아' 엔 서툴러. 이름, 에러 코드, 드문 전문 용어, 특정 함수명, 정확한 표현 — 이게 바로 임베딩이 또렷한 쿼리를 흐린 이웃으로 번지게 하는 지점이야. BM25 는 그걸 딱 맞혀. 진짜 엔진에서 키워드 검색은 참아주는 레거시 경로가 아냐. 날카롭게 유지하는 정밀 도구야.

키워드 검색이 네 결정론적 바닥이야. 역색인 위 BM25 는 모델도 네트워크도 필요 없어서, 항상 작동하는 검색 경로야 — 임베딩 서버가 꺼졌을 때 여전히 서 있는 그거. 먼저 짓고, 잘 만들고, 벡터를 그 위에 얹은 향상으로 다뤄, 대체가 아니라. 키워드 절반이 약한 하이브리드 엔진은 조용히 부서지기 쉬워.

실제론 어떻게 생겼나

FTS5 는 순위를 order by 할 수 있는 일급 함수로 노출해. 텍스트 위에 가상 테이블을 만들고, MATCH 표현으로 쿼리하고, 내장 bm25() 점수로 정렬해. 전체가 로컬 파일에 대한 SQL 쿼리야 — 빠르고, 결정론적이고, 완전히 오프라인. 이게 더 화려한 검색이 앉는 지루하고 믿을 만한 기반암이야.

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

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

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