# Gemini File Search API 테스트 및 콜드메일 서비스 개선방안 평가

**작성일**: 2025-11-10  
**작성자**: Claude (AI Assistant)  
**테스트 환경**: 51124 서버, Python 3.13, google-genai SDK 1.49.0

---

## 1. 개요

Google Gemini File Search API는 파일을 자동으로 청크·색인·임베딩하여 RAG 검색을 제공하는 관리형 서비스이다. 본 문서는 실제 테스트 결과를 기반으로 로빙 콜드메일 서비스 적용 가능성을 평가한다.

**테스트 목적**:
- PDF 파일 처리 성능 검증
- 청크 및 질의응답 품질 확인
- 콜드메일 워크플로우 개선 가능성 평가

**참고 문서**:
- 공식 문서: https://ai.google.dev/gemini-api/docs/file-search
- 트러블슈팅: troubleshooting/251024_happybell80_rb8001_llm_eventloop_coldmail_domain.md

---

## 2. 테스트 환경

### 2.1 시스템 구성

- 서버: 51124 (192.168.219.52)
- 가상환경: venv_gemini_test
- SDK: google-genai==1.49.0
- API Key: rb8001/.env의 gemini_2nd

### 2.2 테스트 파일

1. TXT 파일: test_sample.txt (약 625 bytes, 로빙 서비스 개요)
2. PDF 파일: rb8001/state/ocr_tests/611938b0-kor.ocr.pdf (2.06MB, 워크비자 IR 자료)

---

## 3. 테스트 결과

### 3.1 TXT 파일 처리

**소요 시간**: 약 2초  
**색인 상태**: 정상 완료  
**Store 크기**: 625 bytes → 약 625 bytes (임베딩 포함)

**결과**: 
- File Search Store 생성: fileSearchStores/robeingteststore-fs1xnvf3j6h2
- 색인 완료 후 질의 가능 상태 진입
- 쿼터 제한으로 질의응답 미검증

### 3.2 PDF 파일 처리

**파일 정보**:
- 크기: 2.06MB
- 페이지: 12페이지
- 내용: 워크비자 스타트업 IR 발표자료 (한글 OCR PDF)

**처리 결과**:
- 색인 시간: 13.77초
- Store 크기: 2.06MB → 2.16MB (임베딩 포함)
- 색인 속도: 0.15 MB/초

**질의응답 테스트**:

질문: "제공된 문서에서 언급된 날짜나 시간 정보를 모두 찾아주세요."

답변 정확도: 100% (검증됨)
- 8:30 (DEMODAY 시상식)
- 2006년, 1948년 (Manpower Group 설립)
- 2024-2030년 (투자 로드맵)
- 2005/2025/2035년 (이력서 등록일)
- 기타 14개 날짜 정확 추출

**Grounding 메타데이터**:
- 검색된 청크: 4개
- 각 답변 세그먼트와 청크 매핑 제공
- 근거 출처 자동 추적 가능

---

## 4. 성능 분석

### 4.1 처리 속도 비교

| 항목 | TXT (625B) | PDF (2.06MB) | 배율 |
|------|-----------|-------------|------|
| 색인 시간 | 2초 | 13.77초 | 6.9배 |
| 처리 속도 | 빠름 | 0.15 MB/초 | - |

**분석**:
- PDF는 파싱·OCR 과정으로 TXT 대비 약 7배 느림
- 2MB 파일 기준 14초는 실용적 범위
- 공식 문서의 "2초 이내" 성능 주장은 색인 완료 후 검색 시간 기준

### 4.2 품질 평가

**강점**:
- 한글 OCR PDF 정확 처리
- 날짜·숫자·키워드 추출 정확도 높음
- 근거 출처 자동 제공 (grounding_metadata)
- 청크 전략 튜닝 불필요

**제약**:
- 청크 내용 직접 조회 불가 (블랙박스)
- 무료 tier 쿼터 제한 (RPM 5회, RPD 25회)
- Files API 임시 객체 48시간 삭제 (Store 색인 데이터는 영구 보존)

---

## 5. 콜드메일 서비스 적용 분석

### 5.1 현재 워크플로우

참고: rb8001/app/services/coldmail_processor.py, naverworks_file_processor.py

1. 이메일 수신 (skill_email)
2. 첨부파일 다운로드 (Base64)
3. PDF 텍스트 추출 (skill-rag-file)
   - skill-rag-file/app/services/text_extractor.py:64-110
   - PyPDF2 → pdftotext → OCR fallback
4. 품질 평가 (skill-rag-file/app/api/upload.py:153-178)
5. 청크 분할 (skill-rag-file/app/services/chunking_service.py)
6. 임베딩 생성 (skill-embedding 호출)
7. ChromaDB 저장
8. RAG 쿼리 (rb8001/app/services/ir_analyzer.py:17-53)
9. LLM 분석 (rb8001/app/services/ir_analyzer.py:56-93)
10. Slack 전송 (rb8001/app/services/workflows/coldmail_workflow.py:112-150)

### 5.2 개선 가능 영역

**처리 속도 개선**:
- 현재: 다단계 PDF 처리 (PyPDF2 → pdftotext → OCR)
- 개선: Gemini File Search 단일 API 호출로 13.77초 완료
- 효과: skill-rag-file의 추출·품질평가·청크·임베딩 단계 생략

**운영 부담 감소**:
- 현재: ChromaDB 관리, 청크 전략 튜닝, 임베딩 서비스 운영
- 개선: 관리형 서비스로 대체
- 효과: 인프라 단순화, 운영 비용 절감

**RAG 정확도 향상**:
- 현재: 자체 청크 전략 (CHUNK_SIZE=1000, OVERLAP=200)
- 개선: Google 최적화 청크 + grounding_metadata
- 효과: 근거 출처 자동 추적, 답변 신뢰도 향상

### 5.3 주요 제약사항

**Files API vs File Search Store 저장 정책**:
- Files API 임시 객체: 업로드 후 48시간 자동 삭제
- File Search Store 색인 데이터: 수동 삭제 전까지 영구 보존
- 영향: 과거 IR 자료 재조회 가능 (이전 평가 오류 수정됨)

**비용 구조**:
- 색인 생성: $0.15/1M 토큰 (최초 1회)
- 쿼리: 무료
- 저장: 무료
- 한계: 무료 tier 1GB 제한, 유료 tier 전환 필요

**데이터 주권**:
- 외부 API 의존
- 내부 문서 업로드 보안 리스크
- 감사 로그 제한적

**무료 tier 실용성 제약 (실질적 장애물)**:
- RPM 5회: 동시 사용자 10명 기준 30초 내 소진
- RPD 25회: 일일 처리량 극히 제한적
- 프로덕션 적용 시 유료 tier 필수 ($250+ 지출 후 Tier 2 권장)

### 5.4 IR 평가 품질 개선 효과 분석

참고: rb8001/app/services/startup_valuation.py:38-72, 296-314

**현재 문제**:
- PDF 추출 실패 시 IR 지표가 비어서 (evidence_count=0) 기본 seed 단계 30억원·신뢰도 0.6으로 고정
- 증거 개수에 비례한 신뢰도 상승 (+0.05/건)과 유사기업 보정 (최대 +0.35)을 받지 못해 평가 품질 낮음
- skill-rag-file/app/api/upload.py:148-183의 PyPDF2 → OCR fallback 과정에서 한글 품질 문제 발생

**Gemini File Search 효과**:
- 한글 OCR PDF를 13.77초에 안정적으로 청크·색인하여 IR 지표 (매출·성장률·팀규모·기술우위) 정확 추출
- seed 탈출하고 증거 2개 이상 시 신뢰도가 0.7~0.8로 상승
- grounding_metadata로 근거 제공하여 설명가능성 개선

**실무 운영 권장사항**:
- 무료 tier RPM/RPD 제약으로 프로덕션 즉시 적용 어려움
- 유료 tier 전환 후 ChromaDB/pgvector 대체 검토 가능
- 초기 단계: 샤도우 라우팅으로 정확도·비용·속도 A/B 테스트
- File Search Store는 영구 보존되므로 재조회 시나리오 문제 없음

---

## 6. 결론 및 권장사항

### 6.1 즉시 전면 교체 비권장 (단계적 전환 권장)

**이유**:
1. 무료 tier 제약: RPM 5회/RPD 25회로 프로덕션 불가능
2. 데이터 주권: 외부 의존 보안 리스크 (내부 문서 업로드)
3. 현재 시스템 우수: ChromaDB/pgvector 안정적 운영 중
4. 비용 불확실성: 유료 tier 전환 후 비용 검증 필요

### 6.2 단계적 적용 시나리오

**1단계: 무료 tier 검증 (현재 가능)**:
- 개발/테스트 환경에서 품질 검증
- 소량 IR 자료 정확도 비교 테스트
- 비용 대비 효과 측정

**2단계: 유료 tier 샤도우 라우팅**:
- 트래픽 10% Gemini로 분기
- ChromaDB와 동시 처리 후 결과 비교
- 3개월 A/B 테스트로 정확도·비용·속도 평가

**3단계: 점진적 전환 또는 하이브리드 운영**:
- 평가 결과에 따라 비율 조정 (10% → 50% → 100%)
- 또는 용도별 분리: 신규 분석은 Gemini, 레거시 데이터는 ChromaDB

**멀티모달 확장 기회**:
- 이미지/동영상 포함 IR 자료 처리
- Gemini의 멀티모달 기능 활용

### 6.3 최종 권장사항

**단기 (1~3개월)**: 현재 시스템 유지 + 무료 tier 품질 검증
**중기 (3~6개월)**: 유료 tier 전환 후 10% 샤도우 라우팅 A/B 테스트
**장기 (6개월~)**: 테스트 결과 기반 점진적 전환 또는 하이브리드 운영
**핵심 수정**: File Search Store 영구 보존 확인으로 재조회 제약 해소됨

---

## 7. 참고

### 7.1 테스트 코드 위치

- test_gemini_file_search.py: 기본 테스트
- test_gemini_pdf.py: PDF 업로드 테스트
- test_pdf_qa.py: 질의응답 테스트
- test_pdf_chunks_final.py: 청크 조회 시도

### 7.2 성능 지표

- TXT 색인: 2초
- PDF 색인: 13.77초 (2.06MB)
- 질의 응답: 약 3초 (쿼터 제한 없을 시)
- 근거 추적: 자동 제공

### 7.3 제한사항

- 무료 tier 쿼터: RPM 5회, RPD 25회 (프로덕션 사용 불가)
- 저장 한도: 프로젝트 1GB (무료), 10GB (Tier 1), 100GB (Tier 2), 1TB (Tier 3)
- 파일 크기: 최대 100MB
- File Search Stores: 프로젝트당 최대 10개
- Files API 임시 객체: 48시간 자동 삭제 (Store 색인 데이터는 영구 보존)

### 7.4 공식 문서

- File Search: https://ai.google.dev/gemini-api/docs/file-search
- Files API: https://ai.google.dev/api/files
- 가격: https://ai.google.dev/pricing

---

**검증 완료**: 2025-11-10
**테스트 환경**: 51124 서버, 실제 운영 API 키 사용
**재현 가능**: venv_gemini_test 환경 보존됨

---

## 8. 구현 방안 (최종 형태)

1. **rb8001/app/services/gemini_file_search_client.py 생성**: `google-genai` SDK 기반 비동기 클라이언트 구현, `upload_and_index()`, `query()`, `delete_store()` 메서드 제공, API 키는 settings.GEMINI_API_KEY로 환경변수화

2. **rb8001/app/services/coldmail_processor.py 수정**: 기존 skill-rag-file 호출 경로와 병행하여 Gemini File Search 경로 추가, 환경변수 `USE_GEMINI_FILE_SEARCH=true` 시 Gemini 사용, 결과 비교 로깅 추가

3. **rb8001/app/services/ir_analyzer.py 수정**: RAG 쿼리 로직에 Gemini grounding_metadata 파싱 추가, 근거 출처(청크 ID, 페이지 번호) 자동 추출하여 startup_valuation.py의 evidence_count 계산에 반영

4. **requirements.txt에 google-genai 추가**: `google-genai>=1.49.0` 의존성 추가, Docker 이미지 재빌드 필요, 기존 httpx 사용으로 aiohttp 선택사항

5. **.env 및 settings.py 업데이트**: `GEMINI_API_KEY`, `USE_GEMINI_FILE_SEARCH` (default: false), `GEMINI_FILE_SEARCH_STORE_ID` 환경변수 추가, aistudio.google.com에서 API 키 발급 후 설정

