---
date: 2025-11-15
author: admin
tags: [embedding, ko-sroberta, intent-runtime, evaluation]
refs:
  - DOCS/300_architecture/330_백엔드_PostgreSQL_ChromaDB_Vector_Memory.md
  - DOCS/300_architecture/370_임베딩_서비스_분리_아키텍처.md
  - DOCS/plans/251017_intent_analysis_improvement_plan.md
---

# Ko-SRoBERTa 임베딩 전환 사전 검증

## 1. 배경
- **2025-11-22 업데이트**: 8515 `skill-embedding`이 ko-sroberta(multitask) 768d로 배포됨. 기존 384d 가정은 더 이상 유효하지 않으며, 384d 컬렉션과 혼용 시 차원 불일치가 발생하므로 [251122_happybell80_chromadb_dimension_mismatch.md] 참고.
- Intent/runtime 고도화 계획(251017 문서)과 Vector Memory 아키텍처(330번 문서)에서는 한국어 특화 SentenceTransformer 채택을 고려하고 있어, Ko-SRoBERTa(multitask, 768d)를 후보 모델로 선정했다.
- 실제 전환 전, 의도 분류·콜드메일 IR·SemanticIntentClassifier 흐름에서 정량 비교가 필요해 본 리포트를 작성했다.

## 2. 테스트 항목
| 구분 | 데이터/방법 | 스크립트 |
|------|-------------|----------|
| Intent 제로샷 성능 | `tests/data/intent_eval_samples.json`, `tests/data/intent_eval_challenge.json`, multi-centroid(동적) | `scripts/run_intent_semantic_eval.py` |
| Coldmail IR Retrieval | 신규 `tests/data/coldmail_ir_eval.json` (쿼리/청크) | `scripts/run_embedding_retrieval_eval.py` |
| SemanticIntentClassifier Top-1 | `SemanticIntentClassifier` vs ST 버전 | `scripts/run_semantic_classifier_eval.py` (PYTHONPATH=. ) |
| Latency 벤치 | 동일 스크립트에서 평균/95p 지연 측정 | (상기 스크립트에 포함) |

## 3. 결과 요약
### 3.1 Intent Evaluation (challenge set 28문장, 14 intents)
| 모델 | Multi-centroid Acc. | Registry-only Acc. |
|------|---------------------|--------------------|
| skill-embedding (384d) | **53.6%** | 21.4% |
| Ko-SRoBERTa (768d) | **75.0%** | 60.7% |

### 3.2 Coldmail IR Retrieval (5 쿼리)
| 모델 | Top-1 정확도 | 평균 지연 |
|------|--------------|-----------|
| skill-embedding | 80.0% | 8.6ms |
| Ko-SRoBERTa | 100.0% | 42.0ms |

### 3.3 SemanticIntentClassifier (YAML registry, 95 샘플)
| 모델 | Top-1 정확도 | 평균 지연 |
|------|--------------|-----------|
| skill-embedding | 35.8% | 9.1ms |
| Ko-SRoBERTa | 51.6% | 40.9ms |

## 4. 해석
- Ko-SRoBERTa는 모든 실험에서 정확도 우위(+15~25pt)이나, 추론 지연이 4~5배 증가하고 벡터 차원도 2배(768d)라 pgvector/Chroma 재설계가 필요하다.
- 콜드메일 IR 쿼리에서 특히 차이가 컸으며(80→100%), 의도 분류 challenge에서도 21pt 향상.
- latency·메모리 증가는 [370번 문서]의 서비스 레벨설정과 충돌하므로, 전면 교체보다는 “고정밀 파이프라인 전용 Ko-SRoBERTa 서비스” 전략이 현실적이다.

## 5. 다음 단계 제안
1. **PoC 서비스 분리**: `skill-embedding-highres`와 같은 신규 FastAPI 서비스에 Ko-SRoBERTa 로드 → 실시간 경로 중 고정밀만 opt-in (환경변수 `HIGHRES_EMBED_URL`).
2. **pgvector/Chroma 마이그레이션 계획**: 768d 스키마, dual-write 기간 정의 ([330 문서] 절차 참조).
3. **Batch 재임베딩 도구**: `seed_intent_runtime.py`, coldmail RAG 업로드 파이프라인에 “재임베딩 모드” 추가.
4. **지속적인 벤치**: 본 리포트 스크립트를 CI/리서치 파이프에 편입해 모델 업데이트 시 회귀를 감시.

테스트 로그는 `scripts/run_*` 출력 그대로 남겨두었으며, 상세 결과는 작업일(2025-11-15) terminal 로그 참고. Ko-SRoBERTa 전환 시 추가 문서 업데이트가 필요하다.

## 6. 2025-11-15 오후 - 일정 intent 복구 및 768d 전체 마이그레이션
- `rb8001/chroma_db`를 완전히 초기화 후 Ko-SRoBERTa 768차원 기준으로 재생성하여 `Collection expecting 384` 오류 제거.
- `scripts/seed_intent_runtime.py`가 pgvector `intent_prototypes`에 **UPSERT** 하도록 수정 → 모든 intent description 임베딩을 768d로 다시 채움.
- `scripts/seed_calendar_event_samples.py`에 일정 표현 27건(대구 창경 심사, “일정관리 해줄래?” 등) 추가하고 Version=2 centroid를 재계산.
- `app/memory/embedding_client.HTTPEmbeddingFunction`/`EmbeddingClient`가 numpy 배열을 순수 리스트로 변환하도록 보강 → SemanticIntentClassifier가 더 이상 ValueError 없이 동작.
- `app/brain/decision_engine`에 SemanticIntentClassifier 기반 fallback을 추가하고 `intent_thresholds`의 `calendar_event` 임계값을 0.4/0.05로 조정, 실서비스에서도 embedding 기반 일정 의도 분류가 활성화됨.
- “일정 요청 → ㅇㅇ” 흐름에 대한 TDD를 추가해 Affirmation(`ㅇㅇ`, `네` 등)이 자동으로 `calendar_approval` intent로 승격되도록 approval 로직을 확장.
- 검증:
  - `PYTHONPATH=. python3 scripts/run_semantic_classifier_eval.py --dataset tests/data/intent_eval_samples.json --encoders skill` → accuracy **67.4%**, avg 25.9 ms.
  - 신규 `tests/data/intent_eval_calendar.json` 10문장 기준 accuracy **100%**, avg 25.0 ms.
  - `PYTHONPATH=. pytest tests/test_intent_entity_skill_comprehensive.py -k intent_classification_coverage` → 22 testcases all pass, 일정 문장 2건도 `calendar_event` 판정.
- 남은 TODO: coldmail/vector 데이터 재임베딩 자동화, SemanticIntentClassifier threshold를 운영 모니터링에 노출.
