본문 바로가기

AI·LLM 엔지니어링

LangChain RAG 구축 1편: 문서 수집·파싱·전처리 파이프라인

반응형

요약: LangChain 기반 RAG 시스템의 출발점인 문서 수집, 파싱, 정제, chunk 생성 파이프라인을 정리합니다.

대상 독자: PDF, 워드, 웹 문서를 RAG용 데이터로 변환해야 하는 개발자

핵심 키워드: LangChain RAG, 문서 파싱, 데이터 전처리, PDF 처리, RAG 파이프라인

반응형

 

LangChain 기반 RAG 시스템 구축

 LangChain 기반 RAG 시스템 구축

1편. 데이터 준비 파이프라인 구축 

기업 내부 문서를 기반으로 LLM에 질문하고 답변하도록 만드는 RAG(Retrieval-Augmented Generation) 시스템의 핵심은 바로 데이터 준비 파이프라인이다.
문서가 제대로 정리·정제되지 않으면 RAG 성능은 절대 제대로 나오지 않는다.

오늘은 실무 기준으로, 다음 흐름대로 정리한다.

✔ 문서 수집 → ✔ 전처리 → ✔ Chunking → ✔ 메타데이터 구성 → ✔ 검증


1. 전체 아키텍처 개요

아래는 내부 RAG 시스템에서 일반적으로 적용되는 데이터 준비 구조다.

[파일 수집]
 └─ 폴더/클라우드/DB/위키

[문서 정제]
 └─ PDF → 텍스트 변환
 └─ 워드, PPT, HTML 등 파싱

[문서 구조 분석]
 └─ 제목/목차/표/코드/리스트 구분

[Chunking]
 └─ 문단 기반
 └─ 레이아웃 기반
 └─ 의미 기반(semantic splitting)

[메타데이터 생성]
 └─ 출처, 제목, 페이지, 섹션, 파일명

[품질 검증]
 └─ 중복 제거
 └─ 비정상 문서 제거
 └─ 누락 확인

이 1편에서는 메인 단계인 데이터 준비 파이프라인 전체를 완성한다.


2. 문서 수집 파이프라인 설계

내부 문서는 보통 다음에서 온다:

  • 사내 서버 공유 폴더
  • Confluence / Notion / Wiki
  • DB에 저장된 HTML/텍스트
  • 기존 시스템 API
  • 메일 첨부 문서

실무 기준 정리 포인트

  • 버전이 다른 문서가 많이 들어온다 → 중복 파일 관리 필수
  • PDF 품질이 천차만별 → OCR 고려
  • PPT·한글(HWP) 같은 특수 포맷 존재

예시: 파이썬 문서 수집 코드

from pathlib import Path

def collect_files(base_path, extensions=[".pdf", ".docx", ".pptx", ".txt"]):
    files = []
    for ext in extensions:
        files.extend(Path(base_path).rglob(f"*{ext}"))
    return files

files = collect_files("./documents")
print("수집된 문서 수:", len(files))

3. 문서 변환(Parsing)

3.1 PDF 텍스트 변환

PDF는 가장 문제가 많다. 특히:

  • 스캔본 → OCR 필요
  • 표가 깨짐
  • 칼럼(column)식 레이아웃

고품질 변환을 위해 PyMuPDF를 추천한다.

import fitz

def pdf_to_text(path):
    doc = fitz.open(path)
    text = ""
    for page in doc:
        text += page.get_text("text")
    return text

3.2 DOCX 변환

from docx import Document

def docx_to_text(path):
    doc = Document(path)
    return "\n".join([p.text for p in doc.paragraphs])

4. Chunking 설계 — RAG 성능의 핵심

Chunking은 잘못하면 “LLM이 답을 못한다”, “맥락이 끊긴다” 같은 문제가 생긴다.

실무에서 가장 추천되는 방식

  1. 헤더 기반 Chunking (문서 구조 유지)
  2. 문단 기반 Chunking
  3. 의미 기반 Chunking(Semantic Split)

코드 예시: LangChain 문단 기반 split

from langchain.text_splitter import RecursiveCharacterTextSplitter

splitter = RecursiveCharacterTextSplitter(
    chunk_size=800,
    chunk_overlap=150,
    separators=["\n\n", "\n", ".", " "]
)

chunks = splitter.split_text(raw_text)

5. 메타데이터 설계

메타데이터는 나중에 “출처 기반 답변”을 만들 때 반드시 필요하다.

실무에서 사용하는 메타데이터 예시

key 설명

file_name 문서 파일명
page PDF 페이지
section 제목/헤더 정보
created_at 문서 생성일
dept 소속 부서
doc_type 정책/매뉴얼/가이드 등

코드

records = []
for idx, chunk in enumerate(chunks):
    records.append({
        "text": chunk,
        "metadata": {
            "file_name": file_name,
            "page": idx,
            "section": section_name
        }
    })

6. 데이터 품질 검증

실무에서는 가장 고통스러운 단계다.

체크리스트

  • Chunk 길이가 너무 짧거나 긴 것은 제거
  • PDF 파싱 실패한 페이지는 OCR로 재처리
  • 중복 Chunk 제거 (특히 매뉴얼 PDF에서 흔함)
  • 금칙어·민감 정보 포함 여부 필터링
  • 빈 문서, 깨진 문서, HTML 태그 난입 제거

예시: 중복 제거

unique_chunks = list(set([rec["text"] for rec in records]))

7. 실전 팁 (정리)

💡 팁 1 — Chunk 크기는 600~1000자로 통일

RAG 품질에 가장 중요한 요소이다.
너무 작으면 맥락이 끊기고, 너무 크면 검색이 애매하다.


💡 팁 2 — 문서 구조를 반드시 메타데이터로 기록

“챕터 / 섹션 / 페이지” 정보가 없으면
LLM이 출처 설명을 잘 못한다.


💡 팁 3 — 문서 품질 검증을 자동화해야 한다

OCR 필요 여부, 중복, 깨짐 여부를 사람 손으로 확인하면
실제 구축 시 노동지옥이 된다.


8. 다음 편 예고

📌 2편. 임베딩 & 벡터DB 구축편

  • 어떤 임베딩 모델을 써야 하는가?
  • 벡터DB 구조 비교 (FAISS / Chroma / Weaviate / PGVector)
  • 실무에서 가장 문제 많이 발생하는 부분 해결법

 


🔖 추천 태그

#RAG #LangChain #데이터엔지니어링 #AI검색시스템
#LLM #기업AI #임베딩 #벡터DB #문서AI #데이터파이프라인

 

 

반응형
좋아요공감
공유하기
URL 복사카카오톡 공유페이스북 공유엑스 공유
통계
게시글 관리

'AI·LLM 엔지니어링' 카테고리의 다른 글

〈LangChain 기반 RAG 시스템 구축〉 3편 : RAG 성능 최적화 + 평가 지표  (0)〈LangChain 기반 RAG 시스템 구축〉 2편 : 임베딩 & 벡터DB 구축  (0)로컬 LLM 서버 구축 가이드: vLLM, GGUF, FastAPI로 사내 AI API 만들기  (0)3편 로컬 LLM 구축 가이드 – RAG 성능 최적화 + 평가 지표  (0)2편 로컬 LLM 구축 가이드 - 고성능 서버(GPU) 환경 구축 기반  (0)
2025.11.27
2025.11.27
2025.11.27
2025.11.27
2025.11.26

실무 적용 체크리스트

점검 항목운영 기준

수집 파일 저장소, 웹, 업무 시스템에서 문서 원본 확보
파싱 PDF, HTML, DOCX 등 포맷별 텍스트 추출 방식 분리
정제 헤더, 푸터, 중복 문장, 깨진 문자를 제거
추적성 문서 ID, 페이지, 섹션 metadata를 보존

자주 묻는 질문

RAG에서 전처리가 왜 중요한가요?

검색 대상 문서가 지저분하면 좋은 LLM을 써도 엉뚱한 근거를 찾아 답변 품질이 떨어집니다.

PDF 파싱은 어떤 점을 주의해야 하나요?

표, 줄바꿈, 머리말·꼬리말, 페이지 번호가 검색 품질을 방해할 수 있어 정제 규칙이 필요합니다.

LangChain을 꼭 써야 하나요?

필수는 아니지만 Loader, Splitter, Retriever 구성 요소를 빠르게 실험하기 좋아 PoC 단계에서 유용합니다.

함께 읽으면 좋은 글

반응형