# 보고서: task-145.1 — 유튜브 3-Layer 요약 파이프라인 구현

> **작성자**: 헤르메스 (개발1팀장)
> **작성일**: 2026-03-03
> **팀원**: 불칸(백엔드), 아르고스(테스터)
> **작업 성격**: 구현 (방안 B 개선안)

---

## 1. 작업 내용

task-141.1 분석 보고서에서 확정된 "방안 B 개선안"에 따라 유튜브 3-Layer 요약 파이프라인을 구현.

### 구현 구조
```
[기존 유지 — 변경 없음]
crawlYoutubeChannels.ts 기존 흐름:
  자막추출 → 6섹션 요약 → Drive 업로드 → insurance_chunks → youtube_knowledge

[신규 추가 — 확장]
crawlYoutubeChannels.ts에 단계 추가:
  자막추출 후 → youtube_transcripts 청크 저장 (L3)
  6섹션 요약 완료 후 → youtube_summaries 저장 (L2, 구조화 프롬프트)

[별도 배치 — 신규]
generateYoutubeChannelInsight (새 Cloud Function):
  youtube_summaries L2 집약 → youtube_summaries L1 저장
```

### 3-Layer 정의
- **L1**: 채널별 통합 인사이트 (채널 핵심 주제, 반복 키워드, 채널 논조, 설계사 활용 가이드)
- **L2**: 영상별 구조화 요약 (핵심 주장, 관련 약관 조항, 실무 시사점, 주의사항)
- **L3**: 자막 원문 청크 (500자 단위, 50자 오버랩, 임베딩 포함)

---

## 2. 생성/수정 파일 목록

- `/home/jay/projects/insuwiki/functions/src/crawlYoutubeChannels.ts` — **수정**
  - 사유: L3 자막 청크 저장, L2 구조화 요약 저장 로직 추가
  - 변경 범위: YOUTUBE_L2_SUMMARY_PROMPT 상수 추가 (lines 65-89), chunkTranscript 함수 추가 (lines 300-316), L3 블록 추가 (lines 521-564), L2 블록 추가 (lines 669-700)
  - 기존 코드 변경: 없음 (추가만)

- `/home/jay/projects/insuwiki/functions/src/generateYoutubeChannelInsight.ts` — **신규 생성**
  - 사유: L1 채널 통합 인사이트 배치 생성 Cloud Function
  - 244 lines, onRequest 타입, gemini-2.5-flash + gemini-embedding-001 사용

- `/home/jay/projects/insuwiki/functions/src/index.ts` — **수정**
  - 사유: generateYoutubeChannelInsight export 추가
  - 변경 범위: 1줄 추가 (line 32)

- `/home/jay/projects/insuwiki/plans/plan-task-145.1.md` — **신규 생성**
  - 사유: 작업 계획서

---

## 3. 테스트 결과

- **TypeScript 빌드**: `npx tsc --noEmit` 성공 (오류 0건)
- **정적 분석 결과**:
  - insurance_chunks: 기존 저장 코드 외 신규 쓰기 없음 ✅
  - youtube_knowledge: 기존 저장 코드 변경 없음 ✅
  - 신규 youtube_transcripts: 독립 try-catch 내 저장 ✅
  - 신규 youtube_summaries: 독립 try-catch 내 저장 ✅
  - generateYoutubeChannelInsight: insurance_chunks/youtube_knowledge 접근 없음 ✅
  - index.ts: export 정상 추가 ✅

- **버그**: 발견되지 않음

---

## 4. 검토한 대안과 기각 사유

- **L3 청크를 insurance_chunks에 저장** → 기각: vector-search/route.ts가 sourceType 필터 없이 전체 검색하므로 약관 RAG 품질 오염 불가피 (task-141.1 핵심 발견)
- **L2를 youtube_knowledge에 이중 저장** → 기각: SSOT 위반, 프롬프트 개선 시 데이터 동기화 실패 위험
- **L3 청크 크기 1000자** → 기각: 임베딩 품질 저하. 500자가 의미 단위 벡터 검색에 최적
- **L1을 onSchedule로 자동 실행** → 기각: L2 누적량이 불확실한 초기 단계에서 수동 트리거(onRequest)가 안전

---

## 5. 팀장 검토 결과

- **불칸 (백엔드)**: 1차 검토 통과, 수정 사항 없음.
  - L3: chunkTranscript 함수 정확, batch.set 패턴 적절, 중복 체크 포함
  - L2: 기존 6섹션 summary를 입력으로 재활용하여 추가 자막 호출 불필요 (효율적)
  - L1: onRequest 구조, L2 최소 3개 체크, 기존 L1 타임스탬프 비교 로직 정확
  - 3개 서브태스크 모두 기존 코드에 영향 없이 독립적으로 추가됨 확인

- **아르고스 (테스터)**: 1차 검토 통과, 수정 사항 없음.
  - TypeScript 빌드 오류 0건
  - 기존 insurance_chunks/youtube_knowledge 흐름 무변경 확인
  - 모든 신규 코드가 독립 try-catch로 격리됨 확인

---

## 6. 셀프 QC

### 6-1. 이 변경이 다른 파일에 영향을 미치는가?
crawlYoutubeChannels.ts의 기존 코드는 일체 변경하지 않았다. 신규 코드 블록(L3, L2)은 기존 흐름 완료 후 독립적으로 실행되며, try-catch로 격리되어 실패해도 기존 기능에 영향 없다. vector-search/route.ts는 insurance_chunks만 검색하며 youtube_transcripts/youtube_summaries를 참조하지 않으므로 영향 없다.

### 6-2. 이 로직의 엣지 케이스는 무엇인가?
- 자막 없는 영상: hasTranscript=false이므로 L3 저장 자동 스킵. L2는 6섹션 요약(제목+설명 기반) 기반으로 생성되므로 동작함.
- 매우 긴 자막(30분+): 청크 수 60~70개, Firestore batch 500개 제한 내. 임베딩 처리 약 60~70초 추가.
- L2 Gemini 호출 실패: try-catch 내에서 에러 로깅 후 기존 흐름 정상 종료.
- L1 생성 시 L2가 0~2개: 스킵 처리 (최소 3개 필요).

### 6-3. 이 구현이 작업 지시와 정확히 일치하는가?
task-144.1 지시서의 4개 Phase를 모두 구현:
- Phase 1(L3): youtube_transcripts 청크 저장 ✅
- Phase 2(L2): youtube_summaries L2 저장 + 환각 방지 프롬프트 ✅
- Phase 3(L1): generateYoutubeChannelInsight 배치 함수 ✅
- Phase 4(통합 테스트): 빌드 성공 + 기존 흐름 무변경 확인 ✅
핵심 원칙(insurance_chunks 오염 금지, 6섹션 무변경, 이중 저장 금지) 모두 준수.

### 6-4. 에러 처리와 보안은 확인했는가?
모든 신규 코드 블록은 독립 try-catch로 에러 격리. Gemini API 호출은 기존 withBackoff 패턴으로 지수 백오프 적용. 환경변수(GEMINI_API_KEY) 미설정 시 조기 반환. 사용자 입력은 없으므로 인젝션 위험 없음. Firestore 문서 데이터에 민감 정보 없음.

### 6-5. 테스트가 모든 경로를 커버하는가?
TypeScript 빌드(정적 타입 검증)와 코드 정적 분석으로 주요 경로 커버. 런타임 통합 테스트(실제 Firestore + Gemini API)는 배포 후 수동 검증 필요 — generateYoutubeChannelInsight는 onRequest이므로 HTTP 호출로 테스트 가능.

---

## 7. 수정기록 로그

| 시간 | 작업자 | 내용 |
|------|--------|------|
| 2026-03-03 00:55 | 헤르메스 | 작업 시작, 계획서 작성 |
| 2026-03-03 00:56 | 불칸 | L3 청크 저장 로직 구현 (crawlYoutubeChannels.ts) |
| 2026-03-03 00:56 | 불칸 | L2 구조화 요약 저장 로직 구현 (crawlYoutubeChannels.ts) |
| 2026-03-03 00:56 | 불칸 | L1 배치 함수 생성 (generateYoutubeChannelInsight.ts) + index.ts export |
| 2026-03-03 00:58 | 아르고스 | TypeScript 빌드 검증 + 정적 분석 → 전체 통과 |
| 2026-03-03 00:59 | 헤르메스 | 결과 통합 검토, 보고서 작성 |

---

*작성: 헤르메스 (개발1팀장) / 2026-03-03*
*팀원: 불칸(백엔드), 아르고스(테스터)*
