요약: LangChain 기반 RAG 시스템의 출발점인 문서 수집, 파싱, 정제, chunk 생성 파이프라인을 정리합니다.
대상 독자: PDF, 워드, 웹 문서를 RAG용 데이터로 변환해야 하는 개발자
핵심 키워드: LangChain RAG, 문서 파싱, 데이터 전처리, PDF 처리, RAG 파이프라인
로컬 LLM/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이 답을 못한다”, “맥락이 끊긴다” 같은 문제가 생긴다.
실무에서 가장 추천되는 방식
- 헤더 기반 Chunking (문서 구조 유지)
- 문단 기반 Chunking
- 의미 기반 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 #데이터파이프라인
'AI·LLM 엔지니어링' 카테고리의 다른 글
| 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 단계에서 유용합니다.
함께 읽으면 좋은 글
- 로컬 LLM 구축 1편: vLLM·GGUF·FastAPI
- 로컬 LLM 구축 2편: GPU 서버 사양
- 로컬 LLM 구축 3편: RAG 성능 최적화
- 로컬 LLM API 서버 구축 심화
- LangChain RAG 구축 2편: 임베딩·Vector DB
'AI·LLM 엔지니어링' 카테고리의 다른 글
| 〈LangChain 기반 RAG 시스템 구축〉 3편 : RAG 성능 최적화 + 평가 지표 (0) | 2025.11.27 |
|---|---|
| LangChain RAG 구축 2편: 임베딩 모델 선택과 Vector DB 구축 (0) | 2025.11.27 |
| 로컬 LLM 서버 구축 가이드: vLLM, GGUF, FastAPI로 사내 AI API 만들기 (0) | 2025.11.27 |
| 로컬 LLM 구축 3편: RAG 성능 최적화와 평가 지표 설계 (0) | 2025.11.27 |
| 로컬 LLM 구축 2편: GPU 서버 사양·인프라 구성 실전 가이드 (0) | 2025.11.26 |