docs: RRF score와 threshold 스케일 불일치 원인 추가

- RRF 점수(0.01~0.03)가 threshold(0.35)와 스케일 불일치 확인
- vector_score OR 조건으로 우회되지만 relevance_score 기준 정렬에 영향
- 실측 데이터 추가 (hybrid rrf=0.032 vs vector=0.775)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
happybell80 2026-03-21 15:48:33 +09:00
parent 3e78c7cf6e
commit 9bd9459912

View File

@ -71,11 +71,32 @@ DB 실측 (키워드 '투자', Company X 청크 대상):
검색이 무관한 문서를 반환하면 LLM이 `failure_reason`을 설정하여 실패 응답 생성. 이는 엉뚱한 문서로 답변하는 것보다 나은 정상 동작.
### 3. RRF 점수와 threshold 불일치 — hybrid 모드의 숨은 문제
hybrid 모드에서 `relevance_score`가 RRF 점수로 대체된다. RRF 점수는 구조적으로 낮다:
| 모드 | top-1 relevance_score | threshold | 통과 여부 |
|------|----------------------|-----------|-----------|
| vector | 0.775 (cosine) | 0.35 | ✅ |
| hybrid | **0.032** (RRF: 1/(60+1)) | 0.35 | ❌ (vector_score OR 조건으로 우회) |
실측 (질문: "아크로셀 개인투자조합 제2호 정기주총 서류 있어?"):
- vector: score=0.775, total=5
- hybrid: rrf=0.032, vector_score=0.775, total=5
현재 `hybrid_search()`의 필터가 `vector_score >= threshold OR keyword_score >= threshold OR relevance_score >= threshold`로 OR 조건이라 결과가 반환되긴 한다. 하지만:
- **`relevance_score`(=rrf)가 0.03 수준**이므로, 이 값을 신뢰하는 다른 컴포넌트가 있으면 잘못된 판단을 할 수 있다
- **grounding_service의 `_select_top_results()``relevance_score` 기준으로 정렬**하므로, hybrid 모드에서 RRF 점수 기준 정렬이 벡터 유사도 정렬과 다를 수 있다
- threshold 0.35는 cosine similarity 기준으로 설계된 값이고, RRF 점수 범위(0.01~0.03)와 스케일이 맞지 않는다
이것은 keyword recall=0과 별개의 문제다. keyword가 정상 작동해도 RRF 점수는 최대 `1/(60+1) + 1/(60+1)` ≈ 0.033이므로 threshold 0.35를 절대 넘지 못한다.
## 원인 요약
| 실패 | 직접 원인 | 계층 |
|------|----------|------|
| keyword recall = 0 | `simple` 토크나이저가 한국어 조사 분리 불가 | DB/인덱스 |
| RRF score ≪ threshold | RRF 점수(0.01~0.03)와 threshold(0.35)의 스케일 불일치 | 검색/점수 |
| 인덱싱 문서 있는데 검색 실패 | 벡터 임베딩이 해당 청크를 근접 이웃으로 잡지 못함 + keyword 보완 불가 | 검색 |
| 3건 grounding 미진입 | intent/domain 마커에 일반 질문 패턴 미포함 | 라우팅 |