어디살지 POC chat-v2 — 3-tier 테스트 체계 설계

개별 (T1) · 시나리오 (T2) · 통합 후 (T3) · 현재 stack 유지 (Groq + OpenRouter + Qdrant) · 2026-05-19
TL;DR — 3-tier로 평가 흐름 단순화
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 todoT1.3 BM25 + T1.5 리랭커 hard-neg 셋 + T1.6 Qdrant filter 정량화
Tier 2 · 시나리오3/5 통과 · 1 warn · 1 todoT2.2 멀티턴 3턴 회복 + T2.5 holdout 분할
Tier 3 · 통합 후0/5 통과 · 5 todoMirror sync 통합 PoC 시작 후 활성

관련 리포트