LeanX

실전 ④: 사내 문서 Q&A 봇

문서를 청크로 나눠 벡터스토어에 색인하는 준비 워크플로우와, 질문을 임베딩으로 변환해 관련 청크를 검색한 뒤 AI가 답변하는 질문 워크플로우 두 개를 조합하면, 사내 문서를 기반으로 정확하게 답하는 RAG Q&A 봇을 만들 수 있습니다.

회사 내규, 제품 매뉴얼, 회의록이 수백 개인데 '우리 환불 정책이 뭐였더라?'라는 질문에 AI가 정확하게 답하려면 어떻게 해야 할까요? 일반 챗봇에게 모든 문서를 외워 달라고 할 수는 없습니다. 이때 쓰는 기법이 RAG(Retrieval-Augmented Generation, 검색 증강 생성)입니다. AI가 답하기 전에 도서관 사서처럼 관련 문서를 먼저 찾아온 뒤 그것만 읽고 대답하는 구조입니다.

RAG 시스템: 색인(인덱싱)과 질문 두 파이프라인

① 인덱싱 — 문서를 넣을 때 한 번

  • 파일 업로드
  • 청킹 잘게 쪼갬
  • 임베딩 숫자 변환
  • 벡터DB 저장

② 질문 — 물어볼 때마다

  • 질문
  • 질문 임베딩 같은 모델
  • 유사 청크 검색 의미 기반 벡터DB 🗄 (공유)
  • LLM 답변 찾은 내용만 읽고

인덱싱과 질문 파이프라인에 반드시 '같은 임베딩 모델'을 써야 검색이 맞습니다. 두 파이프라인은 아래에 매달린 같은 벡터DB를 공유합니다. RAG는 오픈북 시험과 같습니다 — AI가 처음부터 외우는 대신, 시험 때 책을 펴서 찾아보는 방식입니다.

RAG의 두 단계: 색인과 검색

RAG 시스템은 두 단계로 나뉩니다. 첫 번째는 색인(Indexing) 단계입니다. 문서를 잘게 나누고(청킹, Chunking), 각 조각을 숫자 벡터로 변환(임베딩, Embedding)해 벡터 데이터베이스(Vector Store)에 저장합니다. 두 번째는 검색(Retrieval) 단계입니다. 사용자의 질문을 같은 방식으로 벡터로 바꿔 저장된 청크 중 의미적으로 가장 가까운 것들을 꺼내고, 그것을 AI의 프롬프트에 함께 넣어 답변을 생성합니다. 요리에 비유하면 색인은 식재료를 냉장고에 정리하는 것, 검색은 요리에 필요한 재료를 냉장고에서 꺼내는 것입니다.

RAG 시스템 전체 구조 (워크플로우 2개)

[워크플로우 A: 문서 색인 — 한 번 또는 문서 갱신 시]
Webhook 또는 Google Drive Trigger
  → Default Data Loader (파일 읽기)
  → Recursive Character Text Splitter (청킹)
  → Embeddings OpenAI (벡터 변환)
  → Vector Store (Supabase / Pinecone / Qdrant에 저장)

[워크플로우 B: Q&A — 질문마다 실행]
Chat Trigger (질문 수신)
  → AI Agent
      도구: Vector Store Tool (관련 청크 검색)
      모델: Chat Model
      메모리: Simple Memory

1단계: 문서 색인 워크플로우 만들기

문서 색인 워크플로우

  1. 새 워크플로우에 Webhook 트리거를 추가합니다. 처음에는 Manual Trigger로 시작해도 됩니다.
  2. 뒤에 Default Data Loader 노드를 추가합니다. Data Type을 Binary로 설정하고, 업로드할 파일 데이터가 넘어오는 바이너리 키를 지정합니다. PDF, DOCX, TXT 등을 지원합니다.
  3. 다음으로 Recursive Character Text Splitter 노드를 연결합니다. Chunk Size는 500~1000자, Chunk Overlap은 100~200자 정도가 일반적인 출발점입니다. 청크가 너무 작으면 문맥이 끊기고, 너무 크면 관련 없는 내용이 섞입니다.
  4. Vector Store 노드를 추가합니다. n8n은 Supabase Vector Store, Pinecone, Qdrant, In-Memory Vector Store 등을 지원합니다. 입문용으로는 설치가 필요 없는 Pinecone(무료 티어 제공)이 편리합니다.
  5. Vector Store 노드의 Embedding 소켓에 Embeddings OpenAI 노드를 연결하고 OpenAI Credential을 설정합니다. 모델은 text-embedding-3-small로도 충분합니다.
  6. Vector Store 노드의 Operation을 Insert Documents로 설정합니다.
  7. 테스트 PDF를 준비해 Manual Trigger로 실행하고, Vector Store에 청크가 저장되는지 확인합니다.

2단계: Q&A 워크플로우 만들기

Q&A 워크플로우

  1. 새 워크플로우에 Chat Trigger(When chat message received) 노드를 추가합니다.
  2. AI Agent 노드를 연결하고, Chat Model 소켓에 OpenAI Chat Model 또는 Anthropic Claude를 붙입니다.
  3. AI Agent 노드의 Tools 소켓을 눌러 Vector Store Tool을 추가합니다. 1단계와 동일한 Vector Store와 Embeddings 노드를 연결합니다. 이 도구가 에이전트의 도서관 검색 기능이 됩니다.
  4. Vector Store Tool의 description 필드에 언제 이 도구를 써야 하는지 명확히 적습니다. 예: '사내 문서에서 정보를 찾아야 할 때 반드시 이 도구를 먼저 사용한다'.
  5. AI Agent의 System Message(시스템 프롬프트)에 아래 예시처럼 문서 기반 답변 지침을 작성합니다.
  6. Memory 소켓에 Simple Memory를 추가해 대화 맥락을 유지합니다.
  7. 테스트 채팅창에서 색인한 문서 내용을 묻는 질문을 보내 답변이 오는지 확인합니다.

RAG Q&A 봇 시스템 프롬프트

당신은 사내 문서 검색 도우미입니다. 질문에 답하기 전에 반드시 제공된 벡터 검색 도구를 사용해 관련 문서를 먼저 찾아야 합니다.

[답변 규칙]
- 검색된 문서 내용만 근거로 답합니다. 문서에 없는 내용은 지어내지 마세요.
- 답변 끝에 "(출처: 문서명 또는 섹션)" 형태로 근거를 표시합니다.
- 관련 문서를 찾지 못했거나 내용이 불분명하면 "해당 정보를 문서에서 찾지 못했습니다. 담당자에게 문의해 주세요"라고 솔직하게 답합니다.
- 답변은 간결하게 핵심만 3~5문장으로 정리합니다.

청크 크기(Chunk Size)는 문서 유형에 따라 조절하세요. 계약서·법률 문서처럼 조항이 자기완결적인 문서는 크게(800~1200자), FAQ처럼 짧은 Q&A 형식은 작게(200~400자)가 좋습니다. 나쁜 검색 결과의 80%는 청킹 전략 문제입니다.

색인 워크플로우는 문서가 바뀔 때마다 다시 실행해야 합니다. 오래된 문서가 벡터 스토어에 남아 있으면 AI가 구버전 정보로 답할 수 있습니다. 문서를 갱신할 때는 기존 청크를 삭제(delete by metadata)하고 다시 색인하는 절차를 함께 만들어 두세요.

RAG 패턴은 사내 문서 봇뿐 아니라 제품 매뉴얼 지원, 법률 문서 검색, 고객 FAQ 자동화에도 그대로 쓸 수 있습니다. 색인 파이프라인과 검색 파이프라인을 분리해 유지하면, 문서가 수천 개로 늘어나도 구조를 그대로 유지할 수 있습니다.