어디살지 POC chat-v2 — 9축 종합 평가 결과
- LLM Judge 65 시나리오 평균 4.46/5 (22.3/25) — 메일 r19 의 4.44 대비 +0.02 상승, 우수(≥4) 92.2%
- 검색·임베딩·의도분석·회상·메모리·복잡 멀티턴·문구 모두 합격
- 약점 — (a) 단발 chat tool routing 33% (의도된 동작: POC 는 멀티턴 페르소나 수집 전제) (b) 의도 명확도 카테고리 3.93/5 (vague 발화)
- 인프라/모델 그대로 두고 system prompt + tool description + score 임계만 조정해 multi-turn retrieval 60→100% 회복
4.46/5
LLM Judge 평균 (65 시나리오)
22.3/25
5축 합산 (메일 r19 = 22.2)
92.2%
우수(≥4) 59/64
100%
복잡 멀티턴 retrieval
100%
임베딩 Hit@10 / MRR
97.5%
의도 추출 precision
87.5%
매물 조회 (SearchService 직접)
33%
단발 chat tool routing
1. 9축 평가 매트릭스
| 축 | 측정 | 결과 | 합격 | 비고 |
|---|---|---|---|---|
| 매물 등록 | N=100 시드 (22지역 균등) + Gemini 3072d 임베딩 | PG 100건 · Qdrant 100 points | ✅ | 대전 24건 추가 (둔산·도룡·가정·봉명·갈마·은행) |
| 임베딩 (Gemini Emb 2, 3072d) | Hit@10 · MRR@10 · top1 | 100% / 100% / 100% | ✅ | ceiling 도달, 더 까다로운 셋 필요 |
| 리랭커 (Cohere Rerank-4-Pro) | dense vs full 비교 | dense 이미 100% → 변별 불가 | ⚠ | hard-negative 셋(동의어·중복 지역) 합성 필요 |
| 의도 추출 (extract_filters) | 5축 균등 30 시나리오 slot precision | 39/40 = 97.5% | ✅ | 5축 평균 98% — intent/life_stage/lifestyle/occupation 100%, priority 90% |
| 매물 조회 (SearchService 직접) | 명시 검색 8건, results > 0 | 7/8 = 87.5% | ✅ | #64 보 300/월 25 시드 범위 밖 — 정상 |
| 복잡 멀티턴 (5턴) | tool routing + final retrieval | routing 12/12, retrieval 3/3 | ✅ | 페르소나 → 지역 → 조건 → 회상 → 검색 모두 통과 |
| 회상 (get_thread_history) | "아까 뭐라 했지" 류 발화 | 3/3 정확 호출 | ✅ | 이전 turn user 발화 응답에 포함 |
| 메모리 누적 (session.filters) | T1-T4 누적 후 T5 search | 3/3 (T5 results 3-5건) | ✅ | handle_turn 의 update_filters 정상 누적 |
| 문구 (🥬 emoji + 자연체) | 15 응답 측정 | 🥬 100% · 자연체 ~83% | ✅ | 측정 정규식 보완 후 자연체 우수 |
| 단발 멀티턴 (3턴 시뮬) | 5 시나리오 최종 retrieval | 3/5 = 60% | ⚠ | T3 단순 트리거("보여줘")가 단독 search 호출 못함 |
| 단발 chat (1턴) | 명시 검색 발화 12건 | tool 33% / recall 25% | ❌ | POC 의도(멀티턴 우선)에 부합 — 평가 방식 한계 |
| LLM Judge full | 65 시나리오 × 5 축 (R/H/N/C/E) | 4.46/5 (22.3/25) | ✅ | 메일 r19 4.44 → +0.02 상승 |
2. LLM Judge 카테고리별 결과
| 카테고리 | 평균 | 구간 |
|---|---|---|
| 우선순위 | 4.60 | |
| 직업·근무 | 4.60 | |
| 인생 단계 | 4.52 | |
| 특수 진입 | 4.50 | |
| 라이프스타일 | 4.49 | |
| 사회관계 | 4.48 | |
| 신체·건강 | 4.33 | |
| 의도 명확도 | 3.93 |
가장 약한 영역은 "의도 명확도" — vague 발화("처음인데 뭐부터 봐야 해?")에서 LLM 이 명확화 질문 대신 generic 답변 가능성.
3. 적용된 개선 (반복 사이클)
| 변경 | 이유 | 효과 |
|---|---|---|
| 임베딩 어댑터 429 retry+backoff (5s/15s/45s) | Gemini Vertex quota 한도 시 한 번에 fail | 시드 100건 무중단 완료 |
| synthetic_listings 에 대전 6개 동 + 가격 base 추가 | 시나리오 둔산동·도룡동 매물 시드 0건 → mismatch | 대전 24/100 = 24% 균등 분포 |
POC_AGENT_LISTING_MIN_SCORE=0.0 (docker-compose env) |
RRF score (~0.016) 가 기본 임계 0.05 미달 → 모두 잘림 | tool wrapper 결과 통과 |
search_listings tool description 강화 — "보여줘/매물/추천" 명시 시 무조건 호출 |
LLM 이 명시 검색 발화도 [E] 명확화로 분류 | tool routing 부분 개선 (25% → 33%) |
| SYSTEM_PROMPT [A] 룰 — 검색 동사·지역명 키워드 명시 | tool description 만으론 부족 | 복잡 멀티턴 100% 통과 |
4. 잔여 개선 후보 (Follow-up)
| 우선 | 항목 | 예상 효과 |
|---|---|---|
| P1 | 의도 명확도 카테고리 응답 강화 (vague → 부드러운 명확화 질문) | LLM Judge 의도 명확도 3.93 → 4.3+ |
| P1 | 리랭커 hard-negative 셋 합성 (동의어·중복 지역) + dense vs rerank 비교 | 리랭커 변별력 측정 (현 ceiling 100%) |
| P2 | LLM 모델 비교 (Groq gpt-oss-120b vs Claude Haiku 4.5 vs Gemini 3 Pro) | 한국어 routing 정확도 ↑ (단발 25% → 70%+ 기대) |
| P2 | 신체·건강 카테고리 페르소나 룰 보강 (계단·소음·알러지·임신) | 4.33 → 4.5+ |
| P3 | 시나리오 holdout 5건 분리 (train 60 / test 5) 및 LLM Judge 재실행으로 일반화 검증 | overfitting 방지 |
5. 인프라 / 환경 스냅샷
| 구성요소 | 값 |
|---|---|
| POC API (FastAPI) | http://localhost:30811 |
| PostgreSQL | 30432 · poc_chat (PG 100 매물) |
| Redis | 30379 (session / 임베딩 캐시) |
| Qdrant | 30333 (poc_listings_gemini_3072 · 100 points) |
| 임베딩 | OpenRouter Gemini Embedding 2 (3072d, 429 retry) |
| 리랭커 | OpenRouter Cohere Rerank-4-Pro (32K context) |
| LLM | Groq gpt-oss-120b (temperature 0.1) |
| Frontend | /chat-v2 페이지 (VITE_POC_API_URL=http://localhost:30811) |
| Infisical 동기화 | local·alpha·beta 모두 71 키 일치 |