임베딩
텍스트를 숫자 벡터로 바꾸는 것. Dense 검색의 기반.
개념
“사업기간”과 “용역기간”은 글자가 다르지만 뜻이 가깝다. 임베딩 모델은 이 둘을 벡터 공간에서 가까운 위치에 놓는다. 그래서 글자가 안 겹쳐도 검색된다.
모델 선택의 트레이드오프
| 큰 모델 (API) | 작은 모델 (로컬) | |
|---|---|---|
| 품질 | 높음 | 보통 |
| 비용 | 호출당 과금 | 무료 |
| 고유명사·표 | 상대적으로 강함 | 약함 |
우리는 **로컬 intfloat/multilingual-e5-small**을 골랐다 (ADR-006).
API 비용 한도가 있고, 재인덱싱을 자유롭게 해야 했기 때문.
그 대가로 고유명사·표 검색이 약하다는 걸 처음부터 알고 있었고, BM25 하이브리드를 보완책으로 백로그에 뒀다.
프리픽스 규약
e5 계열은 텍스트 앞에 용도를 표시해야 제 성능이 난다.
질문: "query: 사업기간이 어떻게 되나요?"
청크: "passage: □ 사업기간 : 계약일로부터 3개월"
이걸 빠뜨리면 성능이 조용히 떨어진다. 에러가 안 나서 알아채기 어렵다.
토큰 제한
512토큰. 이걸 넘으면 잘린다 → 청크와 chunk_id 크기가 여기 맞춰져 있다.
관련
Dense 검색 · 청크와 chunk_id · BM25