본문 바로가기
최신 AI

천만 건 문서의 RAG 파이프라인 설계 방법 (할루시네이션 없이)

by 구라100단 2026. 6. 1.

대부분의 RAG 튜토리얼은 

"임베딩을 벡터 데이터베이스에 저장하고 컨텍스트를 GPT에 전달하세요."

이 정도 선에서 멈춘다. 이 아키텍처는 데모에서나 작동한다.

이는 1,000만 건 문서에 대해서는 엉망이 된다.


규모가 커지면 검색은 노이즈로 가득 차고, 레이턴시는 증가하고, 관련 없는 청크가 도처에 나타나고, 할루시네이션은 훨씬 더 통제하기 어려워진다.

프로덕션 RAG 시스템의 진짜 과제는 답변을 생성하는 것이 아니다.

올바른 정보를 일관성 있게 검색하고, 그 답변이 실제 데이터에 근거하고 있음을 증명하는 것이다.

이 글에서는 하이브리드 검색, 리랭킹, 검증 레이어, 인용 강제를 사용해서 할루시네이션을 최소화하면서 수백만 건의 문서를 처리할 수 있는 프로덕션 수준의 RAG 아키텍처를 설계한다.


기본 RAG 파이프라인이 실패하는 이유

전형적인 입문자 RAG 파이프라인은 이렇게 생겼다.

User Query
   ↓
Embedding Search
   ↓
Top K Chunks
   ↓
LLM Response

단순하다. 빠르다. 만들기 쉽다.

하지만 문서 수가 수백만 건으로 늘어나면 즉시 여러 문제가 나타난다.

  • 시맨틱 검색이 노이즈로 가득 찬다
  • 임베딩이 부분적으로 관련된 청크를 검색한다
  • 중복 컨텍스트가 프롬프트를 가득 채운다
  • 검색 레이턴시가 증가한다
  • 키워드 특화 쿼리가 실패한다
  • 모델이 약한 컨텍스트를 받기 때문에 할루시네이션이 증가한다

예를 들어보자.

"독일에서 계약직 직원에게 허용되는 휴가 일수는 얼마인가요?"

순수 벡터 검색은 이런 것들을 검색할 수 있다.

  • 직원 핸드북
  • HR 정책
  • 원격 근무 가이드
  • 복리후생 개요

...하지만 정작 정확한 계약직 정책 섹션은 검색하지 못한다.

그러면 LLM은 "빈 칸을 채우려고" 시도한다.

바로 거기서 할루시네이션이 시작된다.


엔터프라이즈 RAG의 진짜 목표

대부분의 사람들은 RAG가 LLM 답변을 개선하는 것이라고 생각한다.

하지만 현실은 이렇다.

RAG는 먼저 검색 및 정보 검색 시스템이다. LLM은 그 위에 올라가는 추론 레이어일 뿐이다.

현대 엔터프라이즈 RAG 시스템은 다음에 매우 집중한다.

  • 검색 정밀도
  • 근거(grounding)
  • 인용
  • 검증
  • 신뢰도 점수
  • 접근 제어
  • 메타데이터 필터링

모델은 절대 정보를 만들어내서는 안 된다.

시스템이 충분한 증거를 검색할 수 없다면, 응답을 거부해야 한다.


고수준 아키텍처

프로덕션 수준의 RAG 파이프라인이 일반적으로 어떻게 생겼는지 보자.

                ┌─────────────────────┐
                │   Source Systems    │
                │ PDFs, APIs, DBs     │
                └──────────┬──────────┘
                           │
                    Ingestion Pipeline
                           │
        ┌──────────────────┴──────────────────┐
        │                                     │
 Metadata Extraction                   Document Parsing
 OCR / Tables / Layout                 Chunking Strategy
        │                                     │
        └──────────────┬──────────────────────┘
                       │
                Embedding Pipeline
                       │
        ┌──────────────┴────────────────┐
        │                               │
  Vector Store                     Keyword Index
 (Semantic Search)                BM25 / Hybrid
        │                               │
        └──────────────┬────────────────┘
                       │
                Retrieval Layer
            Hybrid + Reranking
                       │
             Context Validation
                       │
                 LLM Generation
                       │
             Citation Verification
                       │
                Final Response

💡 초보자 설명: 이 아키텍처가 잘 확장되는 이유는 검색을 단일 벡터 쿼리가 아니라 다단계 파이프라인으로 처리하기 때문이다. 각 단계가 이전 단계의 노이즈를 걸러주는 역할을 한다.


Step 1: 신뢰할 수 있는 수집 파이프라인 구축하기

1,000만 건의 문서에서 수집은 분산 시스템 문제가 된다.

문서는 다양한 곳에서 도착할 수 있다.

  • PDF
  • Google Drive
  • SharePoint
  • 데이터베이스
  • API
  • 이메일
  • 내부 툴

원본 문서는 파싱된 콘텐츠와 별도로 저장해야 한다.

전형적인 스토리지 레이아웃은 이렇다.

/documents/{tenant}/{doc_id}/raw.pdf
/documents/{tenant}/{doc_id}/parsed.json

💡 초보자 설명: {tenant}는 회사나 팀 단위를 의미한다. 여러 조직이 같은 시스템을 쓸 때 데이터를 분리하는 방법이다. {doc_id}는 각 문서의 고유 번호다.

이 구조는 다음을 가능하게 한다.

  • 재처리 (문서를 다시 파싱해야 할 때)
  • 임베딩 업그레이드 (더 좋은 임베딩 모델로 전환할 때)
  • 파서 개선 (파싱 방식을 바꿨을 때)
  • 버전 관리

S3나 GCS 같은 오브젝트 스토리지가 여기서 잘 작동한다.


Step 2: 파싱은 사람들이 생각하는 것보다 훨씬 중요하다

나쁜 파싱은 할루시네이션의 가장 큰 숨겨진 원인 중 하나다.

파서가 이런 것들을 망가뜨리면:

  • 헤딩
  • 테이블 구조
  • 목록
  • 페이지 계층
  • 서식

...임베딩이 즉시 낮은 품질이 된다.

💡 초보자 설명: PDF를 그냥 텍스트로 추출하면 표의 데이터가 뒤섞이거나, 제목과 본문이 구분되지 않는 경우가 많다. 이렇게 망가진 텍스트로 임베딩을 만들면 검색 품질이 처음부터 나빠진다.

엔터프라이즈 RAG에서 파싱은 레이아웃을 인식해야 한다.

좋은 파싱 툴들은 다음과 같다.

  • Unstructured
  • LlamaParse
  • Docling

목표는 단순히 평문 텍스트를 추출하는 것이 아니라, 시맨틱 구조를 보존하는 것이다.


Step 3: 청킹 전략이 핵심이다

대부분의 튜토리얼은 고정 크기 청킹을 사용한다.

chunk_size = 1000
overlap = 200

이것은 대부분의 경우 잘못된 방법이다.

임의의 토큰 청킹은 컨텍스트 경계를 파괴한다.

대신 시맨틱 청킹을 사용해야 한다.

청킹 기준:

  • 헤딩
  • 섹션
  • 문단
  • 주제 변화
  • 테이블 경계
  • 코드 블록

나쁜 청크 예시:

...여기서 결제 조건이 계속됩니다...

좋은 청크 예시:

섹션: 계약직 휴가 정책
계약직 직원은 연간 최대 20일의 유급 휴가를 사용할 수 있습니다.
독일 법령 제42조에 따라...

💡 왜 이게 중요한가: 좋은 청크는 그 자체만으로 의미가 완결된다. LLM이 앞뒤 문맥 없이 이 청크 하나만 봐도 올바른 답변을 낼 수 있어야 한다.

더 나은 청킹이 검색 정밀도를 직접적으로 향상시킨다.


Step 4: 벡터 검색만 절대 사용하지 마라

이것이 아마도 프로덕션에서 가장 많이 저지르는 실수일 것이다.

벡터 검색 단독으로는 대규모에서 불충분하다.

왜인가?

임베딩은 시맨틱 유사성에는 탁월하지만 다음에는 약하다.

  • 정확한 키워드
  • ID
  • 법적 참조
  • 에러 코드
  • 버전 번호
  • 기술적 식별자

이런 쿼리는 순수 임베딩으로 크게 실패할 수 있다.

ERR_CONNECTION_RESET_1045

대신 프로덕션 RAG 시스템은 하이브리드 검색을 사용한다.

하이브리드 검색 아키텍처

현대 시스템은 두 가지를 결합한다.

희소 검색 (BM25)

💡 초보자 설명: BM25는 구글 검색과 비슷한 키워드 기반 검색이다. "ERR_1045"처럼 정확히 일치해야 하는 텍스트를 찾는 데 강하다.

적합한 경우:

  • 정확한 일치
  • 식별자
  • 컴플라이언스 문서
  • 기술 검색

일반적으로 사용하는 툴:

  • Elasticsearch
  • OpenSearch

밀집 검색 (임베딩)

💡 초보자 설명: 임베딩 기반 벡터 검색이다. "휴가 규정 알려줘"처럼 의미가 비슷한 것을 찾는 데 강하다. "연차", "유급 휴가", "PTO" 같이 다른 단어를 써도 찾아준다.

적합한 경우:

  • 시맨틱 의미
  • 자연어 질문
  • 개념 유사성

일반적으로 사용하는 툴:

  • Qdrant
  • Weaviate
  • Pinecone

검색 파이프라인

벡터 데이터베이스에서 직접 검색하는 대신:

User Query
    ↓
Query Rewriting
    ↓
Hybrid Search
(BM25 + Vector)
    ↓
Top 200 Candidates
    ↓
Cross-Encoder Reranker
    ↓
Top 10 Chunks
    ↓
LLM

💡 초보자 설명: 왜 200개를 검색하고 10개만 쓰는가? 처음 검색은 넓게 그물을 치는 것이다. 그다음 리랭커가 그 200개 중에서 진짜 좋은 것 10개만 골라낸다. 한 번에 10개만 정밀하게 검색하는 것보다 이 방법이 훨씬 정확하다.

이 아키텍처는 관련성을 극적으로 향상시킨다.


Step 5: 리랭킹은 필수다

규모에서 초기 검색은 노이즈로 가득하다.

좋은 임베딩도 부분적으로 관련된 결과를 반환한다.

그래서 현대 RAG 시스템은 리랭커를 사용한다.

리랭커가 점수를 매기는 것들:

  • 쿼리 관련성
  • 시맨틱 정렬
  • 문맥적 유사성

두 번째 단계 필터 역할을 한다.

인기 있는 리랭커들:

  • Cohere Rerank
  • BGE Reranker
  • Jina AI Reranker

💡 초보자 설명: 리랭커는 "두 번째 심사위원"이다. 임베딩 검색이 1차 심사로 200개를 추려내면, 리랭커가 더 정교한 기준으로 최종 10개를 선발한다. 리랭커는 쿼리와 각 청크를 쌍으로 함께 분석하기 때문에 더 정확하다.

리랭킹 없이는 관련 없는 청크가 프롬프트에 유입되기 때문에 할루시네이션 비율이 크게 증가한다.


Step 6: 메타데이터 필터링이 모든 것을 바꾼다

1,000만 건의 문서에서 메타데이터는 필수적이다.

각 청크에는 구조화된 메타데이터가 포함되어야 한다.

{
  "tenant_id": "acme",
  "department": "finance",
  "doc_type": "policy",
  "country": "germany",
  "created_at": "2026-01-01"
}

이제 검색이 더 스마트해진다.

💡 초보자 설명: 메타데이터 없이는 1,000만 건 전체에서 찾는다. 메타데이터가 있으면 "독일 부서의 2025년 이후 계약직 정책 문서"만 검색한다. 검색 범위가 수백만 분의 일로 줄어드는 것이다.

독일 2025년 이후 계약직 정책

전체 말뭉치를 검색하는 대신, 필터를 먼저 적용한다.

이것이 정밀도를 대폭 향상시키고 할루시네이션을 줄인다.


Step 7: 컨텍스트 압축

대형 컨텍스트 윈도우는 검색 문제를 해결하지 못한다.

100개의 청크를 GPT에 던져 넣으면 보통 답변 품질이 떨어진다.

💡 초보자 설명: 사람도 책 100권을 동시에 보면서 질문에 답하기 어렵다. LLM도 마찬가지다. 관련 있는 정보만 잘 정제해서 주는 것이 훨씬 효과적이다.

프로덕션 시스템은 생성 전에 컨텍스트를 압축한다.

검색된 청크들
      ↓
중복 제거
      ↓
관련성 필터링
      ↓
컨텍스트 압축
      ↓
구조화된 컨텍스트

이것이 프롬프트를 집중적이고 근거 있게 유지한다.


Step 8: 근거 기반 프롬프팅

절대 이런 프롬프트를 사용하지 마라.

질문에 답하세요.

대신 제약된 프롬프트를 사용한다.

제공된 컨텍스트만을 사용해서 답하세요.
만약 답을 찾을 수 없다면 다음과 같이 말하세요:
"지식 베이스에서 이 정보를 찾을 수 없습니다."

💡 이것이 왜 효과적인가: 모델에게 "모른다"고 말할 수 있는 명시적인 출구를 제공하는 것이다. 이 단 하나의 변경으로 할루시네이션을 크게 줄일 수 있다. LLM은 지시를 따르도록 훈련되어 있기 때문에, 명확한 제약을 주면 그것을 지키려 한다.

이 한 가지 변경만으로도 할루시네이션이 크게 줄어든다.


Step 9: 인용 강제

엔터프라이즈 시스템에서는 점점 더 검증 가능한 답변이 요구된다.

모든 응답에는 인용이 포함되어야 한다.

계약직의 휴가 한도는 20일입니다.
[문서-182, 섹션 4.2]

증거가 없다면:

  • 답변을 거부한다
  • 응답을 보류한다
  • 추가 정보를 요청한다

모델은 근거 없는 주장을 절대 만들어내서는 안 된다.

💡 초보자 설명: 인용은 단순히 사용자를 위한 것이 아니다. 시스템이 스스로 "이 정보는 어디서 왔는가"를 추적하게 만드는 메커니즘이다. 인용할 수 없으면 말하지 않는 것이 원칙이다.


Step 10: 검증 레이어 추가하기

이것이 고급 RAG 시스템이 데모와 차별화되는 지점이다.

생성 후에 검증 모델을 실행한다.

파이프라인:

LLM 답변
    ↓
검증 모델
    ↓
근거 있음 / 근거 없음

검증기가 확인하는 것들:

  • 근거 없는 주장
  • 인용 불일치
  • 조작된 사실
  • 누락된 증거

💡 초보자 설명: 검증 모델은 "팩트체커"다. LLM이 답변을 생성하면, 다른 모델이 그 답변과 검색된 문서들을 비교해서 "이 주장이 실제로 문서에 있는가?"를 확인한다. 이 검증기는 가볍고 빠른 모델을 사용하면 된다.

이것이 할루시네이션을 극적으로 줄인다.


Step 11: 에이전틱 RAG

복잡한 엔터프라이즈 질문은 종종 여러 번의 검색 단계가 필요하다.

기존 방식:

한 번 검색 → 생성

현대 시스템:

계획 → 검색 → 검증 → 추론

예시:

"2025년 컴플라이언스 업데이트 이후 공급업체 결제 정책이 어떻게 변경됐나요?"

이것은 다음을 필요로 할 수 있다.

  1. 정책 버전들을 검색한다
  2. 개정사항을 비교한다
  3. 차이점을 요약한다
  4. 참조를 검증한다

💡 초보자 설명: 이것은 사람 연구원이 일하는 방식과 같다. 한 문서만 보고 답하지 않는다. 여러 문서를 찾아보고, 비교하고, 검증한 다음 종합적인 답변을 낸다. AI도 그렇게 할 수 있도록 만드는 것이 에이전틱 RAG다.

이것이 에이전틱 검색이 유용해지는 지점이다.


권장 프로덕션 스택

강력한 오픈소스 프로덕션 스택은 이렇게 구성할 수 있다.

레이어 툴

문서 수집 Unstructured, LlamaParse, Docling
벡터 스토어 Qdrant, Weaviate, Pinecone
키워드 검색 Elasticsearch, OpenSearch
리랭커 Cohere Rerank, BGE Reranker
LLM GPT-4, Claude, Llama 3
오케스트레이션 LangChain, LlamaIndex
모니터링 LangSmith, Arize AI
스토리지 AWS S3, Google GCS

이 아키텍처는 엔터프라이즈 워크로드에 잘 확장된다.


팀들이 저지르는 가장 큰 실수들

1. 벡터 검색만 사용하기

하이브리드 검색이 거의 항상 더 낫다.

2. 나쁜 청킹

임의의 토큰 청킹은 시맨틱 구조를 파괴한다.

3. 리랭킹 없음

임베딩 검색 단독으로는 너무 노이즈가 많다.

4. 거대한 프롬프트

더 많은 컨텍스트가 더 좋은 답변을 의미하지 않는다.

5. 검증 레이어 없음

검증 없이는 할루시네이션이 보이지 않게 된다.

6. 응답 거부 로직 없음

때로는 올바른 답변이 이것이다.

모르겠습니다.

프로덕션 시스템은 반드시 이것을 지원해야 한다.

💡 초보자 설명: "모르겠습니다"라고 말하는 것이 틀린 답변을 자신 있게 말하는 것보다 훨씬 낫다. 의료, 법률, 금융 시스템에서는 이것이 특히 중요하다. 이것을 "abstention(응답 거부)"이라고 부른다.


할루시네이션 제로를 실제로 달성할 수 있는가?

완전히는 아니다.

LLM은 확률적 시스템이다.

하지만 다음을 결합함으로써 할루시네이션을 극히 드물게 만드는 아키텍처를 구축할 수 있다.

하이브리드 검색
+ 리랭킹
+ 메타데이터 필터
+ 근거 기반 프롬프팅
+ 인용 강제
+ 검증 레이어
+ 응답 거부 로직

그것이 현대 엔터프라이즈 RAG 시스템이 실제로 하는 일이다.


마무리

RAG에 대한 가장 큰 오해는 그것이 LLM 문제라는 것이다.

그것은 정보 검색 문제다.

소규모에서는 단순 벡터 검색이 충분히 잘 작동한다.

엔터프라이즈 규모에서는 검색 아키텍처가 모든 것이 된다.

오늘날 신뢰할 수 있는 AI 시스템을 구축하는 기업들은 단순히 GPT에 임베딩을 추가하는 것이 아니다.

그들은 다음을 구축하고 있다.

  • 분산 검색 시스템
  • 검증 파이프라인
  • 근거 레이어
  • 인용 엔진
  • 에이전틱 추론 워크플로우

왜냐하면 프로덕션 AI 시스템에서는 이것이 진실이기 때문이다.

검색 품질이 답변 품질을 결정한다.

그리고 최고의 RAG 시스템은 이것을 선호하도록 설계된다.

자신 있게 틀린 답변보다 "모르겠습니다" 를.