# Google Cloud 기반 Vector RAG 구축 가이드

"순수 RAG" 즉, **Vector Search** 기반의 고도화된 시스템을 Google Cloud Platform(GCP)에서 구축하기 위한 가이드입니다.

## 1. 핵심 구글 서비스 (필요한 도구들)

고도화된 RAG를 구축하려면 다음 Vertex AI 서비스들을 조합해야 합니다.

| 단계 | 역할 | Google 서비스명 | 설명 |
| :--- | :--- | :--- | :--- |
| **두뇌 (LLM)** | 답변 생성 | **Vertex AI Gemini** | 최종 답변을 작성하는 생성형 AI 모델 (Flash/Pro) |
| **번역기 (Embedding)** | 텍스트 → 숫자 변환 | **Vertex AI Embeddings** | 문서를 AI가 이해하는 숫자(Vector)로 변환 (`text-embedding-004`) |
| **저장소 (DB)** | 숫자 검색 (Vector DB) | **Vertex AI Vector Search** | 수억 개의 벡터 중 가장 유사한 것을 0.1초 내에 찾는 엔진 |
| **저장소 (Raw)** | 원본 파일 저장 | **Cloud Storage (GCS)** | Notion에서 추출한 텍스트/JSON 파일을 저장하는 공간 |

---

## 2. 구축 과정 (Step-by-Step)

### Phase 1: 데이터 파이프라인 구축 (Data Ingestion)
매일 밤 또는 주기적으로 문서를 최신화하는 자동화 시스템입니다.

1.  **Notion 데이터 추출**:
    *   Python 스크립트(Cloud Functions)가 Notion API를 호출해 모든 페이지를 텍스트로 가져옵니다.
    *   데이터를 500~1000자 단위로 자릅니다(Chunking).
2.  **임베딩 생성 (Embedding)**:
    *   자른 텍스트 조각들을 **Vertex AI Embeddings API**에 보냅니다.
    *   API가 각 조각을 768차원(혹은 그 이상)의 숫자 배열(Vector)로 변환해 줍니다.
3.  **Vector DB 적재**:
    *   변환된 Vector와 원본 텍스트 ID를 **Vertex AI Vector Search** 인덱스에 업로드(Upsert)하여 저장합니다.

### Phase 2: 검색 및 답변 시스템 (RAG Application)
실제 사용자가 채팅할 때 일어나는 실시간 프로세스입니다.

1.  **질문 임베딩**:
    *   사용자: "SaaS 용어가 뭐야?"
    *   시스템: 이 질문을 **Embeddings API**에 보내 숫자로 변환합니다.
2.  **유사도 검색 (Retrieval)**:
    *   시스템: 변환된 숫자를 **Vector Search**에 던져 "가장 거리가 가까운(의미가 비슷한) 문서 조각 5개 줘"라고 요청합니다.
    *   Vector Search: Notion에 없는 단어라도 의미가 비슷하면 찾아냅니다. (예: 'SaaS' ↔ '클라우드 소프트웨어')
3.  **답변 생성 (Generation)**:
    *   시스템: 찾아낸 문서 조각 5개 + 사용자 질문을 모아 **Gemini**에게 보냅니다.
    *   Gemini: 근거 자료를 바탕으로 정확한 답변을 작성합니다.

---

## 3. (참고) 더 쉬운 방법: Vertex AI Agent Builder
위 과정을 일일이 개발하기 부담스럽다면, Google의 완전 관리형 서비스인 **Vertex AI Agent Builder (구 Search & Conversation)**를 사용할 수 있습니다.

*   **방식**: Notion 데이터(PDF/HTML 등)를 Google Cloud Storage에 넣고 "이거 검색기 만들어줘"라고 클릭 몇 번 하면, **위의 1~3번 과정(임베딩, 벡터 DB, 검색 로직)을 구글이 알아서 처리**해 줍니다.
*   **추천**: 개발 리소스가 부족하고 빠른 구축이 필요하다면 이 방식이 효율적입니다. "순수 RAG"를 직접 코딩으로 제어하고 싶다면 위의 Vector Search 방식을 씁니다.
