## 약관AI Phase 1 — 검색 품질 핵심 개선

### 프로젝트 경로 (절대경로 사용)
/home/jay/projects/insuwiki/

### 작업 개요
InsuWiki 약관AI의 검색 품질을 근본적으로 개선하는 3가지 작업.

### 담당 파일 (이 파일들만 수정할 것)
- functions/src/pdfIndexing.ts — 청킹 로직
- nextapp/src/app/api/ai/vector-search/route.ts — 검색 정밀도
- nextapp/src/lib/ai/answerValidator.ts — 출력 필터

### 작업 1: CL-1 청킹 재설계 (pdfIndexing.ts)
현재: 고정 길이 500~800자 + overlap 100자. 면책조항("다만~") 절단 위험.

변경:
1. 구조 인식 청킹: "제X조" 패턴을 조항 경계로 인식. 1개 조가 1개 청크. 2000자 초과 시 "항(①②③)" 단위 분할.
2. 패턴 5종 이상: "제X조", "①②③", "가.", "나.", "(1)(2)(3)", "1. 2. 3."
3. 단서조항 보존: "다만", "단,", "그러나", "제외한다", "적용하지 않는다", "~하지 아니한다" 등 키워드 포함 문장은 이전 문장과 동일 청크에 강제 포함.
4. Overlap 300자 양방향 확대.
5. 면책/부지급 키워드("면책", "부지급", "보장하지 아니", "보상하지 아니") 포함 시 관련 전체 열거를 하나의 청크로 강제 병합.
6. 기존 splitIntoChunks → 새 structureAwareChunk 함수. 기존은 폴백 유지.

### 작업 2: CL-5 검색 정밀도 (vector-search/route.ts)
현재: 고정 임계값 0.70/0.85.

변경:
1. 동적 임계값: productId/상품명 포함 시 0.80/0.92, 일반 쿼리 0.65/0.80.
2. 미등록 상품 사전 검증: 쿼리에서 상품명/회사명 추출 → insurance_metadata 존재 확인 → 미등록이면 즉시 "해당 상품은 등록되지 않았습니다" 반환.
3. 상품명 있으면 메타데이터 필터 우선 적용.

### 작업 3: 출력 필터 (answerValidator.ts)
추가:
1. 단정 표현 자동 치환: "보장됩니다" → "해당 조항에 따르면 보장되는 것으로 보입니다. 정확한 보장 여부는 보험사에 확인하세요" 등.
2. 개인정보 마스킹: 실명(한글 2~4자), 전화번호, 주민등록번호 → [MASKED].
3. 원문 출처 없이 결론만 있는 답변 차단.

### 주의사항
- 2팀이 인프라(ANN, 캐싱, 보안) 동시 작업 중. vector-search/route.ts 외 파일은 건드리지 말 것.
- TypeScript 타입 안전성 유지.