3,000페이지 이상의 질문에 5초 이내로 답변하는 n8n 기반 RAG 파이프라인 구축기
요약
n8n을 활용하여 3,000페이지 이상의 방대한 문서를 대상으로 5초 이내에 답변하는 RAG 파이프라인 구축 사례를 소개합니다. OpenAI 임베딩과 Supabase pgvector를 결합하여 비용과 지연 시간을 최적화한 아키텍처를 다룹니다.
핵심 포인트
- n8n 기반의 노코드/로우코드 오케스트레이션 활용
- 의미론적 단위를 유지하는 문단 기반 청킹 전략
- Supabase pgvector를 이용한 효율적인 유사도 검색
- 전체 컨텍스트 전송 대비 비용 및 지연 시간 대폭 절감
3주 전, 저는 매번 모든 데이터를 LLM (Large Language Model)에 보내지 않고도 방대한 문서 코퍼스 (Corpus)를 쿼리할 수 있는 방법이 필요했습니다. 그 해답은 RAG (Retrieval-Augmented Generation, 검색 증강 생성) 파이프라인이었습니다. 하지만 저는 별도로 관리해야 하는 Python 스크립트가 아니라, n8n 내부에서 이를 구축하고 싶었습니다.
제가 최종적으로 결정한 아키텍처와 각 결정의 이유를 소개합니다.
문제 상황
저는 Google Drive에 흩어져 있는 3,000페이지 이상의 문서를 보유하고 있었습니다. 저는 Claude가 이 문서들에 대해 정확하게 답변하기를 원했습니다. 즉, 환각 (Hallucination)을 일으키지 않고, 문맥 (Context)을 놓치지 않으며, 컨텍스트 윈도우 (Context Window) 제한으로 인해 타임아웃이 발생하지 않아야 했습니다.
매 쿼리마다 3,000페이지 전체를 Claude에게 보내는 것은 실행 불가능했습니다. 비용, 지연 시간 (Latency), 그리고 컨텍스트 제한 때문에 불가능했습니다.
해결책: 임베딩 (Embedding)을 벡터 데이터베이스 (Vector Database)에 저장하고, 쿼리 시점에 관련 있는 청크 (Chunk)만 검색한 다음, 그 청크들을 Claude에게 전달하는 것입니다.
기술 스택
- n8n (self-hosted) — 오케스트레이션 (Orchestration) 레이어
- Google Drive — 문서 소스
- OpenAI text-embedding-3-small — 임베딩 모델
- Supabase pgvector — 벡터 저장소 및 유사도 검색 (Similarity Search)
- Claude Sonnet — 답변 생성
인제스션 파이프라인 (Ingestion Pipeline)
이 워크플로우는 한 번(또는 문서가 추가될 때마다) 실행됩니다:
Google Drive Trigger
→ Split Into Chunks (1500 tokens, 200 overlap)
→ OpenAI Embeddings
...
청킹 (Chunking) 단계는 먼저 문단 경계에 따라 텍스트를 분할한 다음, 글자 수로 대체하는 Code 노드입니다. 이는 단순한 글자 수 분할보다 의미론적 단위 (Semantic Units)를 더 잘 유지해 줍니다.
// 청킹 로직 (단순화됨)
const chunks = [];
const paragraphs = text.split(/\n\n+/);
...
쿼리 파이프라인 (Query Pipeline)
이것은 사용자의 모든 질문에 대해 실행됩니다:
Webhook (question input)
→ OpenAI Embeddings (질문을 임베딩)
→ Supabase RPC match_documents (벡터 유사도 검색)
...
Supabase 유사도 검색은 사용자 정의 함수를 사용합니다:
CREATE OR REPLACE FUNCTION match_documents(
query_embedding vector(1536),
match_threshold float,
...
결과
- 지연 시간 (Latency): 3,000페이지 말뭉치(Corpus)에 대해 엔드 투 엔드(End-to-end) 5초 미만
- 정확도 (Accuracy): 전체 컨텍스트 (Full-context) 접근 방식보다 현저히 높음 — Claude가 관련 청크(Chunks)만 확인
- 비용 (Cost): 쿼리당 약 $0.002 (임베딩 (Embedding) + Claude Sonnet)
- 유지보수 (Maintenance): 제로. n8n 워크플로우(Workflow)는 Supabase의 무료 티어에서 실행됨.
내가 다르게 시도했을 것들
하이브리드 검색 (Hybrid search): pgvector의 코사인 유사도 (Cosine similarity)만으로는 정확한 키워드 일치를 놓칠 수 있습니다. BM25 레이어 (키워드 검색)를 추가하고 점수를 결합하면 특정 용어 쿼리에 대한 재현율 (Recall)을 높일 수 있습니다. Supabase는 이제 이를 기본적으로 지원합니다.
리랭킹 (Reranking): 검색 (Retrieval) 후, Claude에 전달하기 전에 리랭커 모델 (예: Cohere Rerank)을 실행하면 답변 품질이 향상됩니다. 특히 청크들이 주제 면에서 유사할 때 효과적입니다.
메타데이터 필터링 (Metadata filtering): 문서 유형, 날짜, 출처를 메타데이터 컬럼으로 저장하세요. 사용자가 문서 유형을 지정할 때 벡터 검색 (Vector search) 전에 필터링을 수행하면 검색 시간을 절반으로 줄일 수 있습니다.
n8n 템플릿
저는 다음을 포함하여 즉시 가져올 수 있는 n8n 워크플로우로 패키징했습니다:
- 완전한 인제스션 (Ingestion) 파이프라인
- 오류 처리가 포함된 쿼리 (Query) 파이프라인
- Supabase 스키마 (Schema) SQL
- 설정 가이드
Gumroad에서 이용 가능합니다: "RAG Pipeline n8n Supabase" 검색
전체 워크플로우 JSON을 원하시거나 Supabase 설정에 대해 궁금한 점이 있다면 아래에 댓글을 남겨주세요.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기