어디살지 POC chat-v2 — 3-tier 테스트 체계 설계
- T1 개별 (8 항목): 각 어댑터·use case 단독 측정 — 임베딩·BM25·Hybrid·리랭커·filter·의도·회상·메모리
- T2 시나리오 (5 항목): scenarios_65 + 멀티턴 + LLM Judge + 입력 다양화 + holdout
- T3 통합 후 (5 항목): /chat-v2 frontend E2E + mirror sync + 인증 통합 + 부하 + 기존 /chat 회귀
- 각 항목 = 평가셋 · 합격 기준 · 실행 명령 · 현재 결과 명시 (정량)
8
Tier 1 — 개별 테스트
5
Tier 2 — 시나리오 테스트
5
Tier 3 — 통합 후 테스트
0. 흐름 다이어그램
┌── T1 개별 (Unit) ───────────────────────────────────────────┐
│ 컴포넌트 단독 측정 — 외부 의존성 mock 또는 단발 실 API │
│ • 의도 추출 (extract_filters) │
│ • 임베딩 (cosine top-K) │
│ • BM25 (token + idf) │
│ • 매물 조회 (search_service.search variant) │
│ • 리랭커 (hard-negative 셋) │
│ • Qdrant filter (area MatchText + property_type) │
│ • 회상 (get_thread_history) │
│ • 메모리 (session.update_filters) │
└──────────────────────────┬───────────────────────────────────┘
▼
┌── T2 시나리오 (Integration) ─────────────────────────────────┐
│ POC 전체 흐름 — chat_service.handle_turn 통합 │
│ • LLM Judge 64 시나리오 (5축 R/H/N/C/E) │
│ • 멀티턴 3턴 (페르소나→조건→검색) │
│ • 복잡 멀티턴 5턴 (+회상+검색) │
│ • 입력 다양화 7 패턴 × 21 발화 │
│ • Holdout 5건 (overfitting 방지) │
└──────────────────────────┬───────────────────────────────────┘
▼
┌── T3 통합 후 (E2E + Mirror) ─────────────────────────────────┐
│ frontend /chat-v2 → 본 백엔드 thread DB mirror │
│ • Playwright E2E (SSE 스트리밍·매물 카드) │
│ • HMAC → JWT 변환 + thread import │
│ • 동시 10 사용자 부하 │
│ • 기존 /chat 페이지 회귀 │
│ • 운영 dashboard (Sentry/OTel) │
└──────────────────────────────────────────────────────────────┘
Tier 1 · 개별 (Unit) 8 항목
| ID | 대상 | 평가셋 | 합격 기준 | 실행 | 현재 |
|---|---|---|---|---|---|
T1.1 |
의도 추출 (extract_filters) |
scenarios_65 의 5축 균등 30건 (intent·life_stage·lifestyle·priority·occupation 각 6) | slot subset precision ≥ 80% · 5축 평균 ≥ 70% | python /tmp/poc_stage3_eval.py |
✅ 97.5% / 98% |
T1.2 |
임베딩 단독 (Pure dense) | 입력 다양화 7 패턴 × 21 발화 | top1 area ≥ 90% · top10 area ≥ 60% | python /tmp/poc_j02_embedding_pure.py |
✅ top1 ~100%, top10 ~64% |
T1.3 |
BM25 단독 (Kiwi 토큰 + idf) | scenarios_65 중 명시 키워드 발화 20건 | token coverage ≥ 95% · idf 분포 정상 | python -m tests.test_bm25_unit (신규) |
미작성 |
T1.4 |
매물 조회 (search_service.search) |
명시 발화 8 × 3 variant (dense/hybrid/full) | results > 0 ≥ 80% · variant 간 ranking 차이 측정 | python /tmp/poc_j03_search_variant.py |
⚠ 87.5% (area@10 43%) |
T1.5 |
리랭커 (변별력) | Hard-negative 30건 (동의어·중복 지역 합성) | rerank top1 정확도 > dense top1 (+10%p 이상) | python -m tests.test_reranker_hardneg (신규) |
셋 필요 |
T1.6 |
Qdrant filter (area·type·room·deposit·rent) | filter 5종 × 매물 100건 expected match | filter precision ≥ 95% (잘못된 매물 제외) | python -m tests.test_qdrant_filter (신규) |
⚠ area MatchText 적용 직후 |
T1.7 |
회상 (get_thread_history) |
"아까 뭐라 했지" 3턴 시뮬 × 3 시나리오 | tool 호출 정확 · 직전 user 발화 포함 | python /tmp/poc_g04_complex.py (포함) |
✅ 3/3 |
T1.8 |
메모리 (session.update_filters) |
4턴 시뮬 (페르소나→지역→조건→검색) | 마지막 turn 의 hard filter 누적 검증 | python /tmp/poc_f01_handle_turn_debug.py |
✅ filter 누적 |
Tier 2 · 시나리오 (Integration) 5 항목
| ID | 대상 | 평가셋 | 합격 기준 | 실행 | 현재 |
|---|---|---|---|---|---|
T2.1 |
LLM Judge 64 시나리오 | scenarios_65 + Excel 정답 셋 + LLM Judge 5축 (R/H/N/C/E) | 평균 ≥ 4.5/5 · 우수(≥4) 비율 ≥ 90% | python -m tests.llm_judge |
✅ 4.46/5 (92.2%) |
T2.2 |
멀티턴 3턴 (페르소나→조건→검색) | 5 시나리오 (둔산 학생·강남 직장인·분당 가족·마포 카페·도룡 연구원) | 마지막 turn results > 0 ≥ 70% | python /tmp/poc_g01_multiturn.py |
⚠ 3/5 = 60% |
T2.3 |
복잡 멀티턴 5턴 (+회상+검색) | 3 시나리오 × 5턴 — routing·retrieval·문구 종합 | routing 100% · retrieval 100% · 🥬 100% | python /tmp/poc_g04_complex.py |
✅ 12/12·3/3·15/15 |
T2.4 |
입력 다양화 7 패턴 × 21 발화 | exact / vague / paraphr / typo / eng_mix / price / area | top1 area ≥ 90% (모든 패턴) · top10 area ≥ 60% | python /tmp/poc_j02_embedding_pure.py |
✅ top1 ~100% |
T2.5 |
Holdout 5건 (overfitting 방지) | scenarios_65 중 5건 분리 — 제출 직전 1회만 평가 | train 60건 평균 대비 ≤ 0.3 격차 | python -m tests.llm_judge --holdout (신규) |
분할 필요 |
Tier 3 · 통합 후 (E2E + Mirror) 5 항목
| ID | 대상 | 평가셋 | 합격 기준 | 실행 | 현재 |
|---|---|---|---|---|---|
T3.1 |
frontend /chat-v2 E2E | Playwright spec — SSE 스트리밍 + 매물 카드 표시 + 추천 발화 | 200 OK · stage→listing→suggestion→delta→signature→done 6 이벤트 모두 수신 | npx playwright test poc-v2/chat-v2.spec.ts (신규) |
spec 작성 |
T3.2 |
Mirror sync (POC → 본 백엔드 thread DB) | POC chat 응답 N건 → 본 백엔드 POST /v1/ai/threads import |
HMAC 검증 통과 · DB row 정확 매칭 · 5초 이내 동기화 | python -m tests.test_mirror_sync (신규) |
통합 후 |
T3.3 |
인증 통합 (HMAC ↔ JWT) | POC HMAC 응답을 본 백엔드 JWT 토큰으로 변환 후 thread import | 모든 응답 무결성 검증 · 권한 escalation 차단 | python -m tests.test_auth_bridge (신규) |
미설계 |
T3.4 |
동시성·부하 (10 동시 사용자) | locust 또는 vegeta — 10 사용자 × 5턴 멀티턴 | p95 latency ≤ 3s · 에러율 ≤ 1% · POC + 본 백엔드 모두 | locust -f tests/loadtest_chat.py (신규) |
설정 필요 |
T3.5 |
기존 /chat 회귀 | 본 백엔드 GET /v1/chats/rooms + 기존 임차인 Chat 페이지 |
POC 통합 전후 응답 100% 호환 · UI 회귀 0 | npx playwright test tenant/chat.spec.ts (기존) |
통합 후 |
실행 진입점 — 한 명령으로 Tier 실행
# Tier 1 — 8 항목 (개별) make test-t1 # 또는 ./bench.sh t1 (현재 5/8 통과) ├── T1.1 의도 추출 ✅ 97.5% ├── T1.2 임베딩 단독 ✅ top1 100% ├── T1.3 BM25 단독 ⏳ 미작성 ├── T1.4 매물 조회 variant ⚠ 87.5% ├── T1.5 리랭커 hard-negative ⏳ 셋 필요 ├── T1.6 Qdrant filter ⚠ area filter 직후 ├── T1.7 회상 ✅ 3/3 └── T1.8 메모리 누적 ✅ make test-t2 # Tier 2 — 5 항목 (시나리오) (현재 4/5 통과) ├── T2.1 LLM Judge 64 ✅ 4.46/5 ├── T2.2 멀티턴 3턴 ⚠ 60% ├── T2.3 복잡 멀티턴 5턴 ✅ 100% ├── T2.4 입력 다양화 ✅ └── T2.5 Holdout ⏳ 분할 필요 make test-t3 # Tier 3 — 5 항목 (통합 후) (mirror 통합 후 활성) ├── T3.1 /chat-v2 E2E ⏳ ├── T3.2 Mirror sync ⏳ ├── T3.3 HMAC ↔ JWT ⏳ ├── T3.4 동시성 10 사용자 ⏳ └── T3.5 /chat 회귀 ⏳
합격 게이트 - 진행 흐름
| 단계 | 전제 | 합격 시 진행 |
|---|---|---|
| T1 모두 합격 | 각 컴포넌트 단독 동작 확인 | T2 진입 |
| T2 모두 합격 | POC 흐름 통합 검증 | T3 진입 (Mirror PoC 시작) |
| T3 모두 합격 | 통합 후 운영 안정성 | 운영 release |
각 tier 합격 못 하면 다음 tier 진입 금지. 회귀 시 직전 tier 로 롤백. Holdout (T2.5) 는 모든 다른 항목 합격 후 제출 직전 1회만 평가.
현재 통과 상태 종합
| Tier | 통과 | 비고 |
|---|---|---|
| Tier 1 · 개별 | 5/8 통과 · 1 warn · 2 todo | T1.3 BM25 + T1.5 리랭커 hard-neg 셋 + T1.6 Qdrant filter 정량화 |
| Tier 2 · 시나리오 | 3/5 통과 · 1 warn · 1 todo | T2.2 멀티턴 3턴 회복 + T2.5 holdout 분할 |
| Tier 3 · 통합 후 | 0/5 통과 · 5 todo | Mirror sync 통합 PoC 시작 후 활성 |
관련 리포트
- 작업 정리 + 로드맵: poc-work-status
- 컴포넌트 29 항목 전수: poc-component-eval
- 9축 평가 종합: poc-eval-suite-result
- Raw 데이터 분석: poc-raw-analysis
- 설계서: poc-search-design-2026