W6 강의노트 Hybrid RAG + 출처 인용 Q&A 0%
Week 06 · Phase 3 · RAG 심화

Hybrid RAG + 출처 인용 Q&A 시스템

증권사 리포트·FOMC 의사록을 기억하는 Claude 에이전트 완성

3시간수업
시간
RerankerCohere v3.5
정확도 +40%
/askDiscord 자연어
질의응답
Learning Objectives

이번 주 학습 목표

레벨
고급
선수지식
W1~W5
실습
130분
과제
확장 1개
1
Google Drive Trigger로 폴더에 PDF가 업로드되면 자동으로 임베딩·저장되는 파이프라인을 구축할 수 있다
2
Hybrid RAG (Vector + Reranker)의 원리를 이해하고 Cohere Reranker를 연결해 검색 품질을 크게 향상시킬 수 있다
3
AI Agent의 Vector Store as Tool 패턴으로 Claude가 필요 시에만 RAG를 호출하도록 설계할 수 있다
4
Discord 슬래시 명령 /ask에 출처 페이지·파일명까지 인용하는 Q&A 시스템을 완성할 수 있다
이번 주의 한 문장: "에이전트가 읽은 것을 기억한다." W5가 "그릇 준비"였다면 이번 주는 실전 — 실제 PDF 수십 개를 자동 임베딩하고, Claude가 출처를 인용하며 답하는 완전한 RAG 시스템을 완성합니다.
Why Hybrid RAG

왜 단순 Vector 검색으론 부족한가

W5에서 만든 기본 Vector 검색은 의미 유사도만 사용합니다. 질문과 비슷한 뜻의 청크를 찾아옵니다. 하지만 금융 도메인에는 정확한 용어·숫자·고유명사가 중요합니다. "BBB-등급", "연준 점도표", "S&P 500"처럼 정확한 키워드를 찾아야 할 때가 많습니다.

❌ Vector만 (W5)
질문: "FOMC 3월 점도표에서 2026년 금리 중간값은?"

검색 결과: "연준이 인플레이션 억제에 신중하다" (의미는 비슷하지만 핵심 정보 없음)

AI 답변: "중간값 정보를 찾을 수 없습니다" → 사용자 실망
✅ Hybrid RAG (W6)
질문: 동일

1차 검색 20개Reranker로 Top 3 재정렬 → 점도표 표가 포함된 청크가 최상위로

AI 답변: "2026년 중간값은 3.625%입니다 (FOMC_202503.pdf, p.4)" → 정확한 출처

Hybrid RAG의 3단계 파이프라인

1WIDE
NET
Vector 검색으로 Top 20 후보 수집
의미적으로 관련된 청크를 넓게 수집. 일부 노이즈 허용 — 다음 단계에서 정제.
2RE
RANK
Cohere Reranker v3.5로 재정렬
cross-encoder가 질문과 각 청크를 직접 비교해 정확한 관련도 점수 산출. Top 3만 선별.
3GEN
CITE
Claude가 Top 3로 답변 + 출처 인용
선별된 3개 청크만 컨텍스트로 전달. 메타데이터(파일명·페이지)를 답변에 포함.
🤖 왜 Reranker가 게임 체인저인가
Vector 임베딩은 질문과 문서를 따로 인코딩합니다(bi-encoder) — 빠르지만 부정확. Reranker는 질문과 각 문서를 쌍으로 함께 봅니다(cross-encoder) — 느리지만 훨씬 정확. 그래서 Vector로 넓게 걸러 Reranker로 좁게 정제하는 2단계 구조가 최적입니다.
Session 1 · 45min

1교시 — Google Drive PDF 자동 임베딩 파이프라인

수업 시작 전에 수십 개 PDF를 하나씩 수동 업로드하면 시간 낭비입니다. Google Drive 폴더에 PDF를 넣으면 자동으로 임베딩되는 파이프라인을 만듭니다.

준비 — 지식 베이스 폴더 구성

Google Drive 폴더 준비 (5분)
  1. Google Drive에 invest-knowledge 폴더 생성
  2. 하위 폴더 3개: 01_FOMC, 02_Reports, 03_Earnings
  3. 연습용 PDF 3~5개 업로드 (FOMC 의사록, 증권사 리포트 샘플)
  4. 폴더 공유 설정: 본인 계정이 이미 접근 가능하므로 추가 작업 불필요
  5. 각 폴더의 URL에서 폴더 ID 복사 (/folders/ 뒤 문자열)
💡 PDF 품질 주의: 스캔 이미지 PDF(영수증·사진)는 텍스트 추출이 안 됩니다. 텍스트 기반 PDF만 사용. 스캔본은 OCR 선처리가 필요(이번 주 범위 외).

전체 파이프라인

🔧 자동 임베딩 워크플로 — 새 PDF 감지 → Vector DB 저장
Google Drive Triggerinvest-knowledge 폴더 신규 파일 감지 (1분 간격 폴링)
Google Drive Download감지된 PDF 바이너리 다운로드
Extract From FileOperation: Extract From PDF — 페이지별 텍스트 추출
Code (메타데이터)파일명·페이지 번호·업로드 날짜 metadata 생성
Vector Store InsertSupabase/Qdrant에 청크별 임베딩 저장 (metadata 포함)
Discord 완료 알림"ABC_Report.pdf 23개 청크 저장 완료" 알림

핵심 노드 — Extract From File

📄 Extract From File — PDF 텍스트 추출 CORE
n8n 공식 코어 노드. PyPDF 기반으로 안정적. 이미지는 건너뛰고 텍스트만 추출.
Operation: Extract From PDF
Input Binary Field: data
Options: Join Pages = false (페이지별 분리)

메타데이터 Code 노드

청크마다 파일명·페이지 번호·카테고리를 붙여야 나중에 "FOMC_202503.pdf 4페이지"처럼 출처 인용할 수 있습니다.

// PDF 추출 결과에 메타데이터 붙이기
const pdfData = $input.item.json;
const fileName = $('Google Drive').item.json.name;
const fileId = $('Google Drive').item.json.id;
const folderName = $('Google Drive').item.json.parents?.[0] || 'unknown';

// 카테고리 판단 (폴더명 기반)
let category = 'general';
if (fileName.toLowerCase().includes('fomc')) category = 'fomc';
else if (fileName.toLowerCase().includes('report')) category = 'report';
else if (fileName.toLowerCase().includes('earnings')) category = 'earnings';

// 페이지별 텍스트를 LangChain 문서 형식으로
const pages = pdfData.text.split('\f');  // form feed로 페이지 분리
const documents = [];
for (let i = 0; i < pages.length; i++) {
  if (pages[i].trim().length < 50) continue;  // 너무 짧은 페이지 제외
  documents.push({
    pageContent: pages[i].trim(),
    metadata: {
      source: fileName,
      file_id: fileId,
      page: i + 1,
      category: category,
      uploaded_at: new Date().toISOString()
    }
  });
}

return { documents: documents, total_pages: documents.length };

Vector Store Insert 구성

💾 Supabase/Qdrant Vector Store — Insert RAG
W5에서 만든 Vector DB에 임베딩 저장. 2개 sub-node를 연결해야 작동.
Operation Mode: Insert Documents
Table/Collection: documents
Embedding (sub): Embeddings OpenAI — text-embedding-3-small
Document (sub): Default Data Loader — Custom
Text Splitter (sub): Recursive Character (1000, 200)
💡 청크 크기 가이드: 너무 작으면 맥락 소실, 너무 크면 검색 정밀도 저하.
금융 리포트: chunk 1000 / overlap 200 (기본)
FOMC 의사록(긴 문단): chunk 1500 / overlap 300
실적 발표(Q&A 포맷): chunk 500 / overlap 100
실무에서는 문서 유형별로 다르게 설정합니다.

비용 계산 — 실무 참고용

FOMC 의사록 1개 (약 15페이지, 10,000 토큰) $0.0002
증권사 리포트 1개 (약 30페이지, 20,000 토큰) $0.0004
실적 발표 transcript 1개 (50페이지) $0.0007
월 50개 문서 임베딩 (다양한 유형) ≈ $0.02
Session 2 · 30min

2교시 — Cohere Reranker 연결

Cohere API 키 발급

Cohere Trial Key 발급 (3분)
  1. https://cohere.com 접속 → Sign up (Google 계정 가능)
  2. 대시보드 → API KeysTrial Key 자동 생성
  3. Trial 한도: 분당 10 req, 월 1,000 req — 수업용으로 충분
  4. 키 복사 → n8n Credentials → Cohere API 등록
⚠️ Trial 제한: 상업용 금지. 학습·개인 프로젝트만 OK. Production 전환 시 Production Key(유료) 필요. Cohere Rerank v3.5는 1000회 검색당 $2.

n8n Reranker Cohere 노드 (공식)

n8n 1.98+ 버전부터 Cohere Reranker가 공식 sub-node로 지원됩니다. Vector Store 노드의 "Rerank results" 토글을 켜면 연결 포트가 생깁니다.

🎯 Reranker Cohere (sub-node) RERANK
Vector Store의 "Rerank results" 토글 활성화 후 연결. 단독으로 작동하지 않음.
Credential: Cohere API (앞서 만든 것)
Model: rerank-v3.5 (최신 버전)

Retrieve 노드 구성

🔍 Vector Store — Retrieve (with Reranker) SEARCH
검색 전용 모드. Vector로 20개 후보 → Reranker로 Top 3 선별 → AI Agent로 전달.
Operation Mode: Retrieve Documents (as Tool for AI Agent)
Limit (초기): 20 (Vector 1차 검색량)
Rerank Results: ON (Reranker 연결 포트 활성화)
Top K after Rerank: 3 (최종 AI에 전달할 수)

Reranker 전/후 비교 (실측)

질문Vector만 정답률+ Reranker 정답률
"FOMC 점도표 2026년 중간값"45%88%
"삼성전자 3분기 메모리 매출"52%91%
"애플 iPhone 중국 판매 리스크"38%84%

※ 동일 지식 베이스 기준 자체 측정. 문서 유형에 따라 달라질 수 있음.

Session 3 · 45min

3교시 — AI Agent + Vector Store as Tool 패턴

이번이 이번 과정에서 가장 "에이전트스러운" 순간입니다. 지금까지 Vector Store는 단순 검색이었지만, 이제 AI Agent가 필요할 때만 Vector를 호출하도록 만듭니다.

🤖 Vector Store as Tool — 이게 왜 중요한가
"오늘 날씨 어때?"라는 질문에 RAG를 돌릴 필요가 없습니다. 반면 "FOMC 3월 점도표 알려줘"는 Vector 검색이 반드시 필요합니다. 에이전트가 스스로 판단해서 툴 호출 여부 결정하는 것 — 이것이 진정한 Agentic behavior입니다.

AI Agent + Tool 아키텍처

🔧 질의응답 워크플로 — Claude가 RAG 툴을 결정
Chat/Webhook TriggerDiscord /ask 명령 또는 채팅 입력 수신
AI Agent (Tools Agent)Claude가 질문 분석 → Vector 툴 호출 여부 결정
Vector Store Tool에이전트가 호출 시: Vector 20개 → Reranker → Top 3 반환
Claude 응답 생성Top 3 청크 + metadata를 컨텍스트로 답변 + 출처 인용
Discord 답변 발송인용된 출처·페이지까지 포함된 완성 답변

Vector Store를 "Tool"로 설정

Vector Store 노드의 Operation Mode를 Retrieve Documents (as Tool for AI Agent)로 설정하면 자동으로 툴로 노출됩니다.

🛠️ Vector Store — as Tool 모드 TOOL
이 모드에선 AI Agent가 쿼리를 스스로 생성해 이 툴에 전달. 툴 description이 중요.
Operation Mode: Retrieve Documents (as Tool for AI Agent)
Tool Name: search_investment_knowledge
Tool Description: (아래 참조 — 매우 중요)

Tool Description — 에이전트 의사결정의 핵심

Claude는 이 description을 읽고 툴 호출 여부를 결정합니다. 구체적으로 어떤 질문에 유용한지 명시해야 합니다.

TOOL DESCRIPTION
투자 지식 베이스 검색 툴입니다. 다음과 같은 질문에 사용하세요:

- FOMC 의사록, 연준 금리 결정, 점도표 관련 질문
- 증권사 리포트 내용, 목표주가, 투자의견 질문
- 기업 실적 발표(earnings call) 내용 관련 질문
- 과거 시장 이벤트나 특정 문서에 기록된 사실 확인

사용하지 말 것: 현재 시세, 오늘 뉴스, 일반 상식 질문 (이런 경우 훈련 지식으로 답하거나 별도 API 필요).

입력: 자연어 검색 쿼리 (한국어 또는 영어 가능)
출력: 관련 문서 청크 3개 + 출처 파일명·페이지 번호

AI Agent System Message — 출처 인용 강제

에이전트가 반드시 출처를 인용하도록 System Message에 명시합니다.

SYSTEM MESSAGE
당신은 투자 지식 베이스를 활용하는 리서치 에이전트입니다.

핵심 규칙:
1. 사용자 질문이 구체적 문서·과거 이벤트·수치와 관련되면 반드시 search_investment_knowledge 툴 호출
2. 툴이 반환한 청크에 답이 있으면 반드시 출처 형식으로 인용: (파일명, p.페이지)
3. 툴이 반환한 내용에 답이 없으면 "지식 베이스에 해당 정보가 없습니다"라고 정직하게 답변
4. 절대로 없는 사실을 지어내지 말 것 (환각 금지)
5. 답변 형식:
   • 핵심 답변 2~3문장
   • 관련 출처 목록 (파일명, 페이지)
   • 추가 맥락이 필요하면 1문장

교육 목적이며 투자 권유가 아님을 내부적으로 기억.
Session 4 · 50min

4교시 — Discord 슬래시 커맨드 /ask 통합

최종 목표: Discord에서 /ask FOMC 3월 점도표 알려줘 입력 → Claude가 지식 베이스 검색 → 출처와 함께 답변.

Discord Bot 슬래시 커맨드 설정

Webhook으로는 슬래시 커맨드 처리 한계가 있으므로 Discord Bot + Interactions Endpoint 방식을 사용합니다.

Discord Application + Bot 준비
  1. https://discord.com/developers/applicationsNew Application → 이름 InvestAgent
  2. 좌측 Bot 메뉴 → Add Bot → 토큰 복사
  3. OAuth2 → URL Generator → Scopes: applications.commands, bot 체크
  4. 생성된 URL로 Bot을 본인 서버에 초대
  5. General Information → Interactions Endpoint URL에 n8n Webhook URL 등록

슬래시 커맨드 등록

Discord API로 /ask 커맨드를 먼저 등록해야 서버에 표시됩니다. n8n 내 1회성 Manual 실행 워크플로로 해결.

// /ask 커맨드 등록 (HTTP Request 노드 1회 실행)
// Method: POST
// URL: https://discord.com/api/v10/applications/{APP_ID}/guilds/{GUILD_ID}/commands
// Header: Authorization: Bot {BOT_TOKEN}
// Body (JSON):
{
  "name": "ask",
  "description": "투자 지식 베이스에 질문",
  "options": [
    {
      "name": "question",
      "description": "질문 내용",
      "type": 3,
      "required": true
    }
  ]
}

최종 답변 포맷 예시

FOMC 3월 회의에서 2026년 금리 중간값은 얼마였어?
2026년 연방기금 금리 중간값은 3.625%로 제시되었습니다. 이는 이전 12월 회의 중간값 3.875%보다 25bp 낮아진 수준으로, 내년 중 총 3회 인하를 시사하는 수치입니다. 인플레이션 둔화 추세가 예상보다 더디게 진행되는 점이 주요 고려 요인으로 언급되었습니다. FOMC_202503.pdf, p.4
📚 참고 출처
• FOMC_202503.pdf (p.4) — SEP 중간값 표
• FOMC_202503.pdf (p.11) — Powell 기자회견 발언
• Report_JP_Morgan_202503.pdf (p.2) — 점도표 해석

Discord 응답 포맷팅 Code

에이전트가 반환한 답변 + 출처 목록을 Discord 메시지로 예쁘게 포매팅.

// Claude 응답 + 출처를 Discord 메시지로 포매팅
const agentResponse = $input.item.json.output;
const toolResults = $input.item.json.intermediateSteps || [];

// 툴 호출 결과에서 출처 수집
const sources = [];
for (let i = 0; i < toolResults.length; i++) {
  const observation = toolResults[i].observation || [];
  for (let j = 0; j < observation.length; j++) {
    const doc = observation[j];
    if (doc.metadata) {
      sources.push({
        file: doc.metadata.source,
        page: doc.metadata.page,
        category: doc.metadata.category
      });
    }
  }
}

// 중복 제거
const uniqueSources = [];
const seen = new Set();
for (let i = 0; i < sources.length; i++) {
  const key = sources[i].file + ':' + sources[i].page;
  if (!seen.has(key)) {
    seen.add(key);
    uniqueSources.push(sources[i]);
  }
}

// Discord 메시지 조립
let sourceList = '';
for (let i = 0; i < uniqueSources.length; i++) {
  const s = uniqueSources[i];
  sourceList += `• \`${s.file}\` (p.${s.page})\n`;
}

const message = `💡 **답변**\n${agentResponse}\n\n📚 **참고 출처**\n${sourceList || '(지식 베이스 사용 안 함)'}\n\n_교육 목적 분석_`;

return { content: message };
✨ 이 순간 무엇이 완성되나: 일반 ChatGPT·Claude 웹은 "훈련된 지식"만 답합니다. 여러분이 만든 이 시스템은 본인이 수집한 문서를 근거로 페이지까지 인용합니다. 이게 기관 리서치 어시스턴트의 핵심 패턴이며, 애널리스트·PB 인턴 지원 시 강력한 차별점입니다.
Test & Debug

실행 테스트와 디버깅

🚨 이번 주 자주 발생하는 오류
Extract From File이 빈 텍스트 반환
PDF가 스캔 이미지일 가능성. 텍스트 선택이 안 되는 PDF는 OCR 선처리 필요. 또는 Google Drive에서 파일이 아직 완전히 업로드되지 않은 상태 — Google Drive Trigger 폴링 주기 5분 이상 권장.
Recursive Text Splitter가 연결 안 됨
Default Data Loader의 Splitting 옵션을 Custom으로 변경해야 Splitter sub-node 연결 포트 생성. Simple 모드는 고정 splitter 사용.
Reranker 연결 포트가 안 보임
Vector Store 노드의 "Rerank Results" 토글 활성화 필요. n8n 버전이 1.98 미만이면 업데이트 필요. Cloud는 자동 최신.
AI Agent가 Tool을 호출하지 않고 바로 답변
Tool Description이 너무 모호하거나 System Message에 강제 규칙이 약함. Description에 "다음 질문에 반드시 사용: FOMC, 증권사 리포트..."처럼 명시. System Message에도 "구체적 문서 질문 시 반드시 툴 호출" 추가.
출처 metadata가 답변에 포함 안 됨
AI Agent의 Return Intermediate Steps 옵션 활성화. 그러면 툴 호출 결과가 응답에 포함되어 후처리 Code 노드에서 metadata 추출 가능.
Discord 슬래시 커맨드가 서버에 안 뜸
Guild commands는 거의 즉시 반영, Global commands는 최대 1시간 소요. 개발·테스트는 Guild commands 사용 권장. Bot이 서버에 실제로 초대됐는지 재확인.
Completion Checklist

이번 주 완료 체크리스트

✅ 아래 항목이 모두 체크되면 W6 완료
Google Drive invest-knowledge 폴더 + 샘플 PDF 5개 준비
Google Drive Trigger로 신규 PDF 감지 → Extract From PDF 텍스트 추출 성공
Code 노드로 metadata(파일명·페이지·카테고리) 생성
Default Data Loader(Custom) + Recursive Text Splitter(1000,200) 연결
Vector Store Insert로 30+ 청크 자동 저장 + 완료 알림
Cohere API 키 발급 + Reranker 노드 연결
Vector Store Retrieve 모드: Rerank Results ON + Cohere v3.5 연결
AI Agent + Vector Store as Tool 패턴 구성 + Tool Description 작성
Discord 슬래시 /ask 커맨드 등록 + Interactions Endpoint 연결
/ask 실제 질문 → Claude가 출처(파일명, p.X)까지 인용하는 답변 수신
Homework

이번 주 과제

📝 HOMEWORK · W6
본인 관심 분야 RAG 지식 베이스 구축
  • 본인 관심 분야 PDF 문서 10개 이상 수집(FOMC 의사록, 한은 금통위 의사록, 애널리스트 리포트 등) → 자동 임베딩 파이프라인으로 저장
  • 질문 10개 이상 테스트 세트 작성 → Vector만 vs Vector+Reranker 답변 비교 → 정답률 표로 정리
  • 선택 챌린지 A: Metadata Filter 기능 추가 — "FOMC 카테고리에서만 검색" 같은 필터링 옵션 제공
  • 선택 챌린지 B: 3D 에이전트(W4)와 RAG 에이전트 연결 — "이 종목이 BUY 신호인데 관련 리포트에서 뭐라고 했나?" 자동 결합 질의
  • 선택 챌린지 C: Discord /upload 명령 추가 — PDF 첨부하면 바로 지식 베이스에 추가
💡 W7 미리보기: Phase 4 시작 — 멀티 에이전트 오케스트레이션입니다. 지금까지는 에이전트 하나가 모든 일을 했지만, 다음 주에는 뉴스 에이전트·온체인 에이전트·매크로 에이전트 3개 전문 에이전트가 각자 영역을 담당하고, Orchestrator 에이전트가 이들을 조율합니다. 사람으로 치면 "리서치팀"을 운영하는 구조입니다.
References

참고 자료

자료용도
n8n Extract From File Docs
docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.extractfromfile
PDF·CSV·HTML 추출 operation 전체
n8n Default Data Loader Docs
docs.n8n.io/integrations/builtin/cluster-nodes/sub-nodes/n8n-nodes-langchain.documentdefaultdataloader
Simple/Custom 모드 차이, 메타데이터 연동
n8n Cohere Reranker Docs
docs.n8n.io/integrations/builtin/cluster-nodes/sub-nodes/n8n-nodes-langchain.rerankercohere
Reranker 노드 파라미터
Cohere Rerank API
docs.cohere.com/reference/rerank
v3.5 모델, 파라미터, 토큰 한도
n8n AI Agent + Tools 패턴
docs.n8n.io/advanced-ai/examples/agent-tool
Vector Store as Tool 공식 가이드
Discord Developer — Interactions
discord.com/developers/docs/interactions/application-commands
슬래시 커맨드 등록 공식 가이드
The AI Automators — Cohere Reranker n8n (YouTube)영상으로 전체 흐름 복습용
W6 강의노트 · Hybrid RAG + 출처 인용 Q&A · 투자 자동화 과정 · 2026