Dense 검색
뜻이 가까운 것을 찾는 검색. 우리 프로덕션의 현행 방식.
어떻게 동작하나
- 모든 청크를 미리 벡터(숫자 배열)로 바꿔 저장한다 → 임베딩
- 질문이 들어오면 질문도 같은 방식으로 벡터로 바꾼다
- 벡터 사이 거리가 가까운 청크를 꺼낸다
“사업기간이 언제야?”라고 물으면 기간, 일정, 개월 같은 말이 있는 청크가 걸린다.
질문에 그 단어가 없어도 뜻이 비슷하면 찾는다. 이게 BM25와 결정적으로 다른 점.
강점과 약점
| 강점 | 표현이 달라도 찾는다 (사업기간 ↔ 용역기간 ↔ 계약일로부터 3개월) |
| 약점 | 고유명사·코드에 약하다. ISO 4373 같은 건 뜻으로 잡기 어렵다 |
| 약점 | 표 청크에서 신호가 희석된다 — 셀 수십 개가 벡터 하나로 뭉개짐 |
우리 프로젝트에서
- 모델: 로컬
intfloat/multilingual-e5-small(ADR-006) query:/passage:프리픽스를 붙여야 제 성능이 난다 (이 모델의 규약)- 512토큰 제한 → 청크와 chunk_id 크기가 여기 맞춰져 있다
- 실측: 문서를 좁힌 조건에서 MRR 0.577. 청크 단위로는 개선 여지가 크다