SPLADE 모델을 비교하고, 합격 모델 하나를 Rust로 이식하기 위한 실험 저장소입니다.
진행 순서와 합격 기준은 설계 문서에 기록합니다.
- 같은 문서와 질의로 모델을 비교합니다.
- 원시 측정값에서 표와 그래프를 자동 생성합니다.
- 모델 파일은 커밋하지 않고 버전과 SHA-256을 고정합니다.
- 합격 모델만 Rust로 이식합니다.
pentesting은 Rust POC가 통과한 뒤 수정합니다.
| 항목 | 결과 |
|---|---|
| 합격 모델 | OpenSearch neural sparse v2 mini |
| Python↔Rust 순위 | top-10 60/60 일치 |
| Rust 질의+검색 p95 | 0.075ms |
| Rust 문서 인코딩 | 1.115 docs/s |
| 런타임 모델 파일 | 132.39MiB |
| 직렬화 인덱스 환산 | 20.30MiB/1만 문서 |
Rust 이식은 합격했다. 질의 인코딩은 온라인 경로에 적합하지만, tract 문서 인코딩은 느리므로 인덱싱 작업에서만 실행한다. 상세 수치는 평가와 Rust 이식에 있다.
이후 pentesting 실 서비스 대규모 평가셋(clean-v4, 4,630 질의)에서 프로덕션 벤치마크를 수행했습니다.
| 아키텍처 | R@4 | MRR@4 | 비고 |
|---|---|---|---|
| BM25-only (최종 선택) | 0.3885 | 0.2771 | 최고 성능, 최소 복잡도 |
| SPLADE-only | 0.2611 | 0.1865 | BM25 대비 R@4 -0.1275 |
| BM25 + SPLADE 캐스케이드 | 0.3811 | 0.2702 | BM25-only보다 낮음, 코드 +85% 증가 |
최종 판단: 대규모 운영 데이터에서 SPLADE 및 캐스케이드가 BM25-only 대비 성능 열세를 보였고, 복잡도(+1,023 LOC, 4개 강등 경로, 35.7MB 모델 자산) 대비 실익이 없어 BM25-only를 프로덕션 아키텍처로 최종 확정하고 SPLADE를 롤백/제거했습니다. 상세 분석은 프로덕션 대규모 검증에 기록되어 있습니다.
모든 Python/Rust 작업은 메모리 4GiB, CPU 2개로 제한된 Docker 안에서 실행한다.
scripts/poc.ps1 pytest -q
scripts/poc.ps1 export
scripts/rust-test.ps1 test
scripts/rust-test.ps1 bench