---
id: wiki-2026-0508-notebooklm-research-workflow
title: NotebookLM Research Workflow
category: 10_Wiki/Topics
status: verified
canonical_id: self
aliases: [NotebookLM, Google NotebookLM, Source-Grounded RAG, Audio Overview]
duplicate_of: none
source_trust_level: A
confidence_score: 0.9
verification_status: applied
tags: [notebooklm, rag, research, gemini, audio-overview, claude-projects]
raw_sources: []
last_reinforced: 2026-05-10
github_commit: pending
tech_stack: { language: Python, framework: Gemini API/Anthropic API }
---

## 한 줄
Google NotebookLM은 사용자가 업로드한 문서에만 grounded된 RAG 도구로, 인용/Audio Overview/Mind Map 기능을 통한 연구 워크플로우에 최적화되어 있다.

## 핵심
- **Source-grounded**: 업로드 소스 외부 지식 사용 안 함. Hallucination ↓, citation 강제.
- **Source 한도 (2026)**: Plus 300 sources / 무료 50 sources, 소스당 500K 단어.
- **출력 형식**: 답변(인용 footnote), Briefing Doc, Study Guide, FAQ, Timeline, **Audio Overview** (NPR 풍 팟캐스트 2-speaker), **Video Overview**, Mind Map.
- **모델**: Gemini 2.5 (2026 기본).
- **워크플로우**: 수집(PDF/Web/YouTube/Slides/Drive) → 정리(Notebook) → 질의 → 합성(Briefing/Mind Map) → 외부 공유(Audio/링크).
- **대안**: Claude Projects (200K context, file upload, citations), ChatGPT Knowledge, Perplexity Spaces.

## 💻 패턴

```python
# 1) Gemini API로 NotebookLM 유사 source-grounded QA
import google.generativeai as genai
genai.configure(api_key="...")

def grounded_qa(sources: list[str], question: str) -> str:
    sys = ("Answer ONLY from the provided sources. "
           "Cite as [S1], [S2]. If unsupported, say 'Not in sources'.")
    ctx = "\n\n".join(f"[S{i+1}]\n{s}" for i, s in enumerate(sources))
    model = genai.GenerativeModel("gemini-2.5-pro", system_instruction=sys)
    return model.generate_content(f"{ctx}\n\nQ: {question}").text
```

```python
# 2) Claude Projects 스타일 (Anthropic SDK + prompt caching)
from anthropic import Anthropic
client = Anthropic()

def claude_grounded(sources: list[dict], question: str):
    blocks = []
    for s in sources:
        blocks.append({
            "type": "document",
            "source": {"type": "text", "media_type": "text/plain", "data": s["text"]},
            "title": s["title"],
            "citations": {"enabled": True},
            "cache_control": {"type": "ephemeral"},
        })
    blocks.append({"type": "text", "text": question})
    return client.messages.create(
        model="claude-opus-4-7",
        max_tokens=2000,
        system="Answer only from provided documents; use citations.",
        messages=[{"role": "user", "content": blocks}],
    )
```

```python
# 3) PDF → 청크 → 자체 source-grounded RAG
import fitz  # pymupdf
def load_pdf_chunks(path, chunk_chars=4000):
    doc = fitz.open(path)
    text = "\n".join(p.get_text() for p in doc)
    return [text[i:i+chunk_chars] for i in range(0, len(text), chunk_chars)]
```

```python
# 4) Mind Map 생성 (LLM JSON 출력)
PROMPT = """Build a mind map from sources. Output JSON:
{"root": "topic", "children": [{"name": "...", "children": [...]}]}"""
```

```python
# 5) Audio Overview 자체 구현 (TTS 2-speaker)
# 1) LLM으로 대화 스크립트 생성  2) ElevenLabs/OpenAI TTS로 음성 합성
SCRIPT_PROMPT = """Write an NPR-style 8-minute dialogue between
Host A (curious) and Host B (expert) on these sources. Format:
A: ...\nB: ...\nA: ...\nKeep accurate to sources only."""
```

```python
# 6) YouTube transcript ingest (NotebookLM 유사)
# pip install youtube-transcript-api
from youtube_transcript_api import YouTubeTranscriptApi
def yt_text(video_id, lang=("en", "ko")):
    tr = YouTubeTranscriptApi.get_transcript(video_id, languages=lang)
    return " ".join(seg["text"] for seg in tr)
```

```python
# 7) 인용 검증 (LLM 응답의 [S?] 매칭 확인)
import re
def check_citations(answer: str, n_sources: int):
    cites = set(int(m.group(1)) for m in re.finditer(r"\[S(\d+)\]", answer))
    valid = all(1 <= c <= n_sources for c in cites)
    return {"cites": cites, "valid": valid, "uncited_paragraphs":
            [p for p in answer.split("\n\n") if not re.search(r"\[S\d+\]", p)]}
```

## 결정 기준

| 상황 | 도구 |
|---|---|
| 50+ 논문 합성 + 팟캐스트 공유 | NotebookLM |
| 코드/IDE 통합 + 긴 컨텍스트 분석 | Claude Projects |
| 빠른 ad-hoc 웹 리서치 | Perplexity / ChatGPT Search |
| 사내 기밀 자료 + 자체 호스팅 | 자체 RAG (LangChain/LlamaIndex) |
| 다국어 강의 자료 학습 | NotebookLM (Audio Overview 다국어) |

## 🔗 Graph
- 부모: [[RAG]]
- 인접: [[Gemini]], [[Citation]]

## 🤖 LLM 활용
- 소스 → Briefing Doc → Mind Map → Audio Script 자동 체이닝.
- 인용 누락 paragraph 자동 검출.
- 다국어 소스 통합 시 언어별 답변 정렬.

## ❌ 안티패턴
- 외부 지식 끌어오는 일반 LLM처럼 사용 (NotebookLM 강점 무시).
- 너무 큰 단일 소스 업로드 (500K 단어 한도 + 검색 효율 ↓).
- Audio Overview를 사실 검증 없이 그대로 공유.
- citation footnote 제거 후 재유통.

## 🧪 검증
- 답변의 모든 주장이 인용 footnote 보유.
- spot-check: 인용된 source 위치에 해당 사실 실재.
- 외부 ground truth 없이는 NotebookLM 결과를 단독 진실로 채택 X.

## 🕓 Changelog
- 2026-05-08 Phase 1 자동 생성
- 2026-05-10 Manual cleanup — house style 적용
