# task-829.1: InsuWiki AI 노드 연결 — Phase 1-B 임베딩 유사도 추천

## 배경
- Phase 0 (보안 기초) + Phase 1-A (정적 매칭) 완료 (task-820.1)
- insurance_terms 1,192건 시딩 + config 문서 생성 완료 (task-827.1)
- Go/No-Go 게이트 PASS: precision 100% (965/965)
- **Phase 1-B 진행 승인됨**

## 프로젝트 경로
- InsuWiki: `/home/jay/projects/insuwiki/`
- 체크리스트: `/home/jay/workspace/memory/plans/insuwiki-ai-linking/checklist.md`
- 계획서: `/home/jay/workspace/memory/plans/insuwiki-ai-linking/plan.md`

## Phase 1-B 작업 범위

### 1. content_hash 필드 추가
- 문서 콘텐츠 변경 감지용 SHA-256 해시
- Firestore 문서 스키마에 `content_hash: string` 필드 추가
- 문서 저장/수정 시 자동 계산

### 2. embedding_hash 불일치 감지 → lazy 재생성
- content_hash 변경 시에만 embedding 재생성 (불필요한 API 호출 방지)
- 기존 insurance_chunks의 Gemini embedding 활용
- embedding_hash 필드로 최신 여부 판단

### 3. Firestore Vector Search 쿼리 구현
- Gemini embedding 기반 유사도 검색
- 코사인 유사도 사용
- minSimilarity 임계값: 0.75 (config에서 외부화)

### 4. 정적 매칭 + 임베딩 결과 병합
- method 필드로 구분: "static" vs "embedding"
- 정적 매칭 결과 우선, 임베딩은 보완적 추천
- 중복 제거 (같은 문서가 양쪽에서 나올 경우 높은 confidence 유지)
- maxLinksPerDoc 상한 적용 (config/aiLinking에서 읽기)

### 5. 신뢰도 UI 업데이트
- RelatedDocsSidebar.tsx 수정
- method별 아이콘/라벨 구분 (정적 매칭 vs 임베딩)
- confidence 수치 표시
- config 외부화 (하드코딩 제거)

### 6. 검증
- precision@5 수동 검증 (50건 샘플)
- 목표: 70%+
- 정적 매칭 대비 추가 발견률(recall 개선) 확인

## 기존 코드 참조
- `functions/src/staticMatching.ts` — 정적 매칭 Cloud Function
- `src/components/RelatedDocsSidebar.tsx` — 추천 UI
- `scripts/evaluate-static-matching.ts` — 평가 스크립트 (Phase 1-B용 확장 필요)
- `scripts/seedInsuranceTerms.ts` — 용어 시딩 스크립트
- `scripts/seed-ai-linking-config.ts` — config 시딩

## 검증 기준
- [ ] content_hash 자동 계산 정상 동작
- [ ] embedding 재생성이 content_hash 변경 시에만 트리거
- [ ] Vector Search 쿼리 정상 반환 (latency < 2초)
- [ ] 정적+임베딩 병합 결과에 중복 없음
- [ ] UI에서 method별 구분 표시
- [ ] precision@5 ≥ 70% (50건 수동 검증)
- [ ] 기존 정적 매칭 기능 regression 없음

## 보고
- 완료 시 `/home/jay/workspace/memory/reports/task-829.1.md` 작성
- `.done` 파일 생성: `/home/jay/workspace/memory/events/task-829.1.done`

## task-timer
- 완료 시: `python3 /home/jay/workspace/memory/task-timer.py end task-829.1`
