# rb8001: 웹검색 엔티티 확정·정확도 개선 설계/적용

**날짜**: 2025-10-23  
**작성자**: admin  
**관련 파일**: `app/router/message_router.py`, `app/router/slack_handler.py`, `app/services/workflows/web_search_workflow.py`, `app/brain/decision_engine.py`

---

## 문제 요약 (로그 근거 포함)
- “이 기업 …” 질의가 오래된 기억/파일명 상수(CODE_OF_CONDUCT 등)에 끌려가 잘못된 엔티티로 검색/요약됨.  
- LangGraph 경로 예외로 폴백(/search)로 자주 떨어져 대명사 해소·CQR·rerank 미실행, LLM 기본응답 반복.
- 대표/이름 질의가 엔티티 미확정 상태에서 실행되어 잘못된 대상에 대한 답변 반복.

## 해결 설계/적용

### 1) 불확실성 기반 하이브리드 라우팅 (LLM 하니스 최신 동향)

**원칙**: 경량 NER → 불확실성 평가 → 저신뢰만 LLM 승격 → 고신뢰 즉시 실행

**구현**:
- **1차 경량 NER**: 최근 N턴(10~15분) 대화에서 한글/기업 접미사(주식회사, Inc, Corp, Ltd, Labs) 패턴 추출
- **불확실성 앙상블 스코어링**:
  - a) NER 매칭 스코어 (TF-IDF, 편집거리 기반)
  - b) 시간 감쇠 가중 (최근 턴: 1.0, 5분 이상: 0.5, 파일명/전대문자 상수: 0.0)
  - c) 후보 개수·분산도 (단일 후보 고신뢰 vs 복수 후보 저신뢰)
- **동적 임계치**: 고신뢰(>2.0) 즉시 검색, 중신뢰(1.0~2.0) LLM 승격, 저신뢰(<1.0) clarify 우선
- **비용/지연 최적화**: LLM 승격율 <30% 목표, 지연 중앙값 <500ms 유지

**학술 근거**: ACL 2024 EMNLP Industry Track - "Intent Detection in the Age of LLMs"는 SetFit 등 경량 분류기와 LLM을 불확실성 기반으로 라우팅하여 LLM 단독 대비 정확도 유지하며 지연/비용을 절반으로 절감한 사례 보고.

### 2) 맥락 축소 프롬프트 + OOS 가드레일

**그래프 파이프 강화**:
- resolve(코리퍼런스) → link(엔티티링크/신뢰도) → CQR(재작성) → search → rerank → summarize → format
- AsyncSqliteSaver(체크포인터) + thread_id/checkpoint_ns 지정, 실패 시 폴백 로깅

**맥락 축소 전략**:
- LLM 프롬프트에 **한글 기업명 후보 하위집합만 주입** (파일명/상수 블랙리스트 제외)
- 최근 10~15분 윈도우로 제한, 오래된 턴은 감쇠 가중(0.5× 이하)
- 다자 대화 시 발화자 역할·화행 정보 포함하여 라벨 공간 축소

**OOS 가드레일 (폴백 경로 동등 정책)**:
- /search 경로에서도 대명사 해소 스코어링(한글/기업접미사 가중, 파일·상수 패널티) 적용
- 저신뢰(<2) 또는 미해결 시 즉시 재질문(clarify) 반환
- **OOS 판단 앙상블**: a) NER 불확실성, b) LLM 거절/근거 점수, c) 로짓 기반 에너지 점수
- OOS 시 우회: Slack clarify 버튼 → FAQ 검색 → 상담원 연결

**학술 근거**:
- arXiv 2024 - "Intent Recognition in Multi-party Conversations"는 동적 프롬프트 축소로 라벨 공간을 줄여 성능과 비용 개선 보고
- arXiv 2024 - "Efficient Out-of-Scope Detection via Uncertainty-Driven LLM Routing"는 불확실성 기반 OOS 라우팅의 효율성 강조

### 3) Clarify UX 및 의도 발견 루프

**Clarify UX**:
- Slack 버튼으로 후보(최대 3) 제시 → 선택 즉시 재검색/응답
- 버튼 라벨: "[기업명] (최근 언급: [턴수]턴 전, 신뢰도: [스코어])"

**의도-회귀(곱씹기) 단계**:
- 실행 전 "요청-대상-행위" 삼단 체크리스트로 의도 재확인
  - 예: [요청] 이 기업 대표? [대상] 지에프솔루션? [행위] 웹검색/대표확인
- 엔티티 확정(clarify/CQR) 없이는 실행 금지, 질문 모호 시 clarify 우선

**의도 발견 루프** (신규 엔티티 패턴 자동 발견):
- 주기적(매주) OOS·clarify 실패 로그를 LLM으로 군집화·요약
- 신규 의도 후보(예: 약어 기업명, 신조어) 제안 → 운영자 승인 → 라벨셋 반영
- 반복 실패 패턴을 블랙리스트에서 화이트리스트로 전환 (점진적 학습)

**학술 근거**: arXiv 2024 - "IntentGPT: Few-shot Intent Discovery with Large Language Models"는 LLM 기반 의도 군집화·명명의 효율성 보고, 개방세계(open-world) 시나리오 대응에 유리.

### 4) 라우팅 보강

- "(기업|회사).*(이름|대표|대표이사)" 등도 웹검색 파이프로 라우팅
- 함수 호출(tool calling) 패턴: 분류 결과를 구조화된 JSON으로 반환, 백엔드 액션 연결

### 5) 시간 감쇠·윈도우 제한

- 메모리/최근 대화 검색은 최신 N개·최근 T분(10~15분) 윈도우로 제한
- 오래된 기억은 감쇠 가중(0.5× 이하), 파일명/전대문자 상수 토큰은 기본 제외

## 정확도/표현
- 확신도 낮은 경우: “재질문/보류(출처 부족)”로 응답.  
- 요약/포맷: ‘출처:’ 블록에 상위 3개 제목+URL 표준 표기.

### 대답 정확도(자신감) 평가 로직
- 신뢰도 특징: (a) 근거 커버리지(출처 수·다양성) (b) 엔티티 일치도(질의 엔티티↔결과 타이틀/본문) (c) 최신성(KST 기준 타임스탬프) (d) NLI(출처→응답 정합).  
- 스코어 산출·캘리브레이션: 위 특징을 0–1로 정규화해 가중 합산→ECE/Brier로 보정; 임계 미만은 재질문/보류 라벨 부여.  
- 반성적 리라이트: 응답 말미에 “가정/근거/시간/확신도”를 메타로 요약하여 과장 금지, 불확실 영역은 분리 표기.

## 검증/모니터링

### 테스트 (로컬)
- 엔티티 우선순위·clarify·그래프 경로 안정화 검증
- 불확실성 스코어링 시뮬레이션 (다양한 턴 간격·파일명 혼입 시나리오)

### 로그
- `[WebSearch] CAND entity`: 후보 엔티티 목록 및 스코어
- `Pronoun resolved`: 대명사 해소 결과 (원본 → 확정 엔티티)
- `Fallback /search`: LangGraph 예외 시 폴백 경로 진입
- Clarify 버튼 액션 로그: 사용자 선택 엔티티 및 턴 인덱스

### 핵심 지표 (LLM 하니스 운영 모니터링)
1. **인스코프 성능**:
   - 웹검색 성공률 (정확한 엔티티로 검색 완료)
   - Clarify 비율 (전체 요청 대비 재질문 비율)
   - 폴백 비율 (LangGraph 실패 → /search 경로 진입 비율)

2. **OOS/불확실성 관련**:
   - OOS 리콜 (실제 엔티티 미확정 중 OOS로 판단한 비율)
   - LLM 승격율 (경량 NER 저신뢰 → LLM 승격 비율, 목표 <30%)
   - 에이전트 전환율 (clarify 실패 → FAQ/상담원 연결 비율)

3. **지연/비용**:
   - 평균 지연 (응답 시간 중앙값, 목표 <500ms)
   - LLM 토큰 비용 (맥락 축소로 절감 효과 측정)

4. **정확도/신뢰도**:
   - 응답 확신도 (ECE/Brier Score, 캘리브레이션 품질)
   - 엔티티 충돌율 (후보 복수 시 잘못된 선택 비율)
   - 의도 드리프트 (라벨 분포·문체 변화 추적)

### A/B 실험
- 불확실성 임계치 (1.0 vs 1.5 vs 2.0) 비교
- 맥락 윈도우 (5분 vs 10분 vs 15분) 성능 측정
- LLM 프롬프트 템플릿 변경 (라벨 공간 축소 전략)

### 휴먼 인 더 루프
- Clarify 실패 티켓을 주간 단위 어노테이션
- 신규 엔티티 패턴 승인 (의도 발견 루프 운영자 검토)

## 교훈

### 기본 원칙
- 엔티티 미확정 상태의 실행 금지, 재질문→확정→실행으로 느린 경로라도 안정성 우선
- 오래된 기억/파일 토큰은 강한 패널티, 최신/한글 기업명·기업 접미사 가중으로 현실적 후보를 우선

### LLM 하니스 최신 동향 적용 (2024-2025)
1. **하이브리드 라우팅의 효율성**:
   - 경량 분류기 + LLM 불확실성 기반 라우팅은 정확도 유지하며 지연/비용을 절반으로 절감
   - LLM 단독 사용보다 실용적, 동적 임계치로 SLA 충족 가능

2. **맥락 축소와 라벨 공간 관리**:
   - 프롬프트에 전체 히스토리 주입은 비효율, 윈도우 제한 + 필터링으로 토큰 비용 절감
   - 라벨 공간 확대 시 OOS 성능 저하 → 하위집합 동적 생성이 핵심

3. **개방세계(Open-World) 대응**:
   - 사전 정의 라벨만으론 한계, 의도 발견 루프로 신규 패턴을 점진적 학습
   - LLM 군집화·명명은 빠른 부트스트랩에 유리, 도메인 특화는 미세조정 병행

4. **불확실성 앙상블이 OOS 탐지 핵심**:
   - 단일 지표(NER 스코어, LLM 신뢰도)보다 앙상블이 강건
   - OOS 리콜 모니터링 필수, 에이전트 전환율로 실효성 측정

5. **휴먼 인 더 루프의 중요성**:
   - 자동화된 의도 발견·드리프트 감지도 운영자 검토 없이는 품질 저하
   - 주기적 어노테이션과 A/B 실험으로 정책 검증 필수

### 참고 문헌
- ACL 2024 EMNLP Industry Track: "Intent Detection in the Age of LLMs"
- arXiv 2024: "Efficient Out-of-Scope Detection via Uncertainty-Driven LLM Routing"
- arXiv 2024: "Intent Recognition in Multi-party Conversations"
- arXiv 2024: "IntentGPT: Few-shot Intent Discovery with Large Language Models"

---
