어디살지 POC chat-v2 — 전수 누락 점검 (29 항목) + OpenRouter 한계

5축 컴포넌트 × 각 옵션·파라미터 vs 공식 권장 · 2026-05-19
핵심 발견 — OpenRouter wrapper 가 공식 옵션 일부 무시

1. 전수 매트릭스 — 29 항목 (5축)

#옵션·파라미터현재공식 권장등급비고
A1Qdrantarea_keywords MatchText✅ 적용FieldCondition+MatchTextDONEarea@10 ↑4배
A2Qdrantaddress PREFIX index✅ 적용한국어 부분 매칭DONE"강남" → "강남구" 매칭
A3Qdrantdeposit·rent·room_count·property_type 인덱스❌ 0개numeric/keyword 인덱스P1N 증가 시 필수
A4QdrantSparse vector (BGE-M3 native)❌ 별도 BM25dense+sparse native fusionP2현재 RRF 도 우수
A5QdrantQuantization (INT8 SQ)큰 컬렉션P3N=100 불요
A6Qdrantsearch_params.ef (runtime)recall 튜닝P2ef_construct=100 기본
A7Qdrantwith_vectors (MMR 시만)OKOK
A8Qdrantscore_threshold0.0 (env)dynamicOK0.30 → 0.0 적용
B1Gemini Embtask_type RETRIEVAL_QUERY/DOC❌ OpenRouter 무시비대칭 임베딩 ↑5-10%P0provider 직접 호출 필요
B2Gemini Emboutput_dimensionality (Matryoshka)3072 고정1024 truncateP2비용 1/3
B3Gemini Embtitle (document)문서 핵심 키워드 boostP3
B4Gemini Embbatch_size32≤100 (quota)OK
C1Cohere Rerankrank_fields=[address,description]❌ OpenRouter 미지원필드별 가중P0Cohere 직접 호출 필요
C2Cohere Rerankreturn_documents=TrueFalse디버깅 시 활성P3
C3Cohere Rerankmax_chunks_per_doc긴 문서 분할P3
D1HybridRRF k6060 표준OK
D2Hybridcandidate_pool SearchServicetop_k×3top_k×5-10P1recall ↑
D3Hybridcandidate_pool qdrant_adapter60 고정top_k 비율P2
D4HybridMMR λ0.85 (정확도 우선)0.7~0.85OK
D5Hybridreranker top_ntop_k×3OKOK
E1BM25tokenizer Kiwi✅ Kiwi 형태소한국어 적합OK
E2BM25k1, b기본 (1.5, 0.75)도메인 튜닝 가능P3
F1Groqtool_choice="required""auto"단발 sanity 모드P1tool 호출률 ↑
F2Groqparallel_tool_calls검색+회상 동시P2
F3Groqtemperature 호출별0.1~0.7 적정호출별OK
G1Agentsystem prompt (라우팅 11 분기)✅ 정교OKOK
G2Agenttool description 강화✅ 적용OKDONE"매물 보여줘" 명시
G3Agenttool 최대 3 호출OKOK
H1SessionRedis TTL (24h/90d)OKOKsession/profile 분리
H2Sessionshown_ids 자동 제외OKOK
I1관측성Sentry / OTel / Prometheus❌ 0 라이브러리sentry-sdk[fastapi]P1프로덕션 전 필수

2. OpenRouter wrapper 한계 — 직접 검증

옵션공식 (provider 직접)OpenRouter wrapper증거
Gemini task_type RETRIEVAL_QUERY vs RETRIEVAL_DOCUMENT 다른 임베딩 무시 같은 텍스트 두 호출 cosine = 1.0000
Cohere documents=dict[] + rank_fields 필드별 가중 평가 미지원 (string[] 만) HTTP 400 ZodError "expected string, received object"
Gemini output_dimensionality (Matryoshka) 128~3072 dim truncate 미검증 (옵션 보내도 응답 dim 3072 추정)

해결: P0 옵션을 실제 적용하려면 OpenRouter 우회 — Google AI Studio Gemini API key + Cohere API key 직접 사용. 어댑터 코드에 task_type 옵션 호출은 남겨둠 (OpenRouter 가 미래 지원 시 자동 활성).

3. 우선순위 매트릭스

우선항목이유예상 효과
P0시드 N=100 → 300+area×type 매물 부족이 ceilingarea@10 43% → 80%+
P0Gemini task_type — provider 직접 호출OpenRouter 무시 확인대칭 → 비대칭 임베딩 ↑5-10%
P0Cohere rank_fields — 직접 호출OpenRouter 미지원지역·의미 가중 분리
P1Qdrant payload 인덱스 (deposit/rent/room_count/property_type)filter 자주 쓰는 필드N 늘면 속도 ↑
P1SearchService candidate_pool top_k×3 → ×8RRF/Rerank 입력 풀 확대recall ↑
P1Sentry + OTel 도입관측성 0운영 가시성
P1Groq tool_choice="required" sanity env단발 tool 호출률 33%측정 정확도 ↑
P2Embedding dim 3072 → 1024 (Matryoshka)OpenRouter 검증 필요비용·메모리 1/3
P2Sparse vector (Qdrant native)현재 BM25 별도fusion 단순화
P3Cohere return_documents / max_chunks디버깅·긴 문서운영 개선
P3BM25 k1·b 튜닝도메인 최적화marginal

4. variant (dense/hybrid/full) — full 이 항상 best 인가?

variant구성지연비용유즈케이스
denseQdrant cosine top-K + MMR~150ms0대량 데이터 / 비용 민감
hybrid+ BM25 RRF~250ms0키워드 정확 매칭 필요
reranker+ Cohere rerank~400msCohere API의미 정확도 우선
fulldense + BM25 + Rerank + MMR~500msCohere API품질 최우선 (현 기본값)

측정 (8 쿼리): dense vs hybrid vs full area@10 모두 43.4% 동일 — 시드 N=100 작아 변별 미미. ceiling 도달 후엔 full이 비용·지연만 추가. 시드 N≥300 후 재측정 필요. 현 기본값 variant="full" 합리 — POC 단계 품질 우선.

5. 적용된 변경 (코드)

파일변경상태
qdrant_adapter.pyarea_keywords MatchText filter + _ensure_text_index(PREFIX)✅ 적용
.envPOC_SCORE_THRESHOLD=0.0✅ 적용
openrouter_gemini_adapter.pytask_type 옵션 호출 (provider 미지원 — no-op)⚠ 미래 호환
openrouter_cohere_adapter.pyrank_fields 시도 후 revert (ZodError 400)↺ revert

관련 리포트