Dense 검색

뜻이 가까운 것을 찾는 검색. 우리 프로덕션의 현행 방식.

어떻게 동작하나

  1. 모든 청크를 미리 벡터(숫자 배열)로 바꿔 저장한다 → 임베딩
  2. 질문이 들어오면 질문도 같은 방식으로 벡터로 바꾼다
  3. 벡터 사이 거리가 가까운 청크를 꺼낸다

“사업기간이 언제야?”라고 물으면 기간, 일정, 개월 같은 말이 있는 청크가 걸린다. 질문에 그 단어가 없어도 뜻이 비슷하면 찾는다. 이게 BM25와 결정적으로 다른 점.

강점과 약점

강점표현이 달라도 찾는다 (사업기간용역기간계약일로부터 3개월)
약점고유명사·코드에 약하다. ISO 4373 같은 건 뜻으로 잡기 어렵다
약점표 청크에서 신호가 희석된다 — 셀 수십 개가 벡터 하나로 뭉개짐

우리 프로젝트에서

  • 모델: 로컬 intfloat/multilingual-e5-small (ADR-006)
  • query: / passage: 프리픽스를 붙여야 제 성능이 난다 (이 모델의 규약)
  • 512토큰 제한 → 청크와 chunk_id 크기가 여기 맞춰져 있다
  • 실측: 문서를 좁힌 조건에서 MRR 0.577. 청크 단위로는 개선 여지가 크다

관련

BM25 · 하이브리드 검색 · 임베딩 · MRR