AI에게 우리 회사 규정이나 최신 뉴스를 물어보면 모르거나 지어냅니다. 학습 데이터에 없기 때문이죠. RAG(Retrieval-Augmented Generation, 검색 증강 생성)는 이 문제를 '오픈북 시험'으로 해결합니다. 시험(질문) 때 교과서(내 문서)에서 관련 페이지를 찾아 보여주고 답하게 하는 겁니다.
RAG 파이프라인 전체 그림
RAG의 5단계 (이번 레슨은 1~2단계)
- 로드(Load): PDF, 웹페이지 등에서 텍스트를 읽어 들입니다
- 분할(Split): 긴 문서를 검색하기 좋은 조각(청크)으로 자릅니다
- 저장(Embed + Store): 조각을 숫자 벡터로 바꿔 벡터스토어에 저장합니다
- 검색(Retrieve): 질문과 관련된 조각을 찾아옵니다
- 생성(Generate): 찾은 조각을 프롬프트에 넣어 답을 만듭니다
1단계: 문서 로더
로더(Loader)는 다양한 형식의 파일을 랭체인 표준 문서(Document) 객체로 바꿔주는 스캐너입니다. PDF, 웹페이지, 워드, 노션, 유튜브 자막까지 수백 종의 로더가 준비되어 있습니다.
PDF와 웹페이지 읽어 들이기
# pip install langchain-community pypdf beautifulsoup4 먼저 설치
from langchain_community.document_loaders import PyPDFLoader, WebBaseLoader
# PDF 로더: 페이지마다 Document 객체 하나씩 생성
pdf_loader = PyPDFLoader('company_rules.pdf')
pdf_docs = pdf_loader.load()
print(len(pdf_docs)) # 페이지 수
print(pdf_docs[0].page_content[:200]) # 첫 페이지 내용 미리보기
print(pdf_docs[0].metadata) # {'source': 'company_rules.pdf', 'page': 0}
# 웹 로더: URL의 본문 텍스트를 긁어옵니다
web_loader = WebBaseLoader('https://ko.wikipedia.org/wiki/인공지능')
web_docs = web_loader.load()
모든 Document에는 page_content(본문)와 metadata(출처, 페이지 번호 등)가 있습니다. metadata는 나중에 'AI 답변의 출처 표시'에 쓰이므로 소중히 다뤄야 합니다.
2단계: 텍스트 스플리터로 청킹
100페이지 문서를 통째로 AI에게 주면 비용도 크고 정확도도 떨어집니다. 그래서 문서를 '청크(chunk)'라는 조각으로 자릅니다. 김밥을 한 줄 통째로 먹지 않고 한입 크기로 썰어 먹는 것과 같습니다. 핵심은 '의미가 잘리지 않게' 써는 것입니다.
RecursiveCharacterTextSplitter로 자르기
# pip install langchain-text-splitters
from langchain_text_splitters import RecursiveCharacterTextSplitter
splitter = RecursiveCharacterTextSplitter(
chunk_size=1000, # 청크 하나의 최대 글자 수
chunk_overlap=200, # 인접 청크끼리 겹치는 글자 수
)
# 문단 -> 문장 -> 단어 순으로 자연스러운 경계를 찾아 자릅니다
chunks = splitter.split_documents(pdf_docs)
print(f'{len(pdf_docs)}페이지가 {len(chunks)}개 청크가 되었습니다')
print(chunks[0].page_content[:100])
chunk_overlap(겹침)이 왜 필요할까요? 문장이 청크 경계에서 뚝 잘리면 앞뒤 맥락이 사라집니다. 겹침을 두면 잘린 부분의 문맥이 양쪽 청크에 모두 보존됩니다. 책 페이지를 넘길 때 마지막 줄을 다시 한 번 읽는 것과 비슷합니다.
| 문서 종류 | 추천 chunk_size | 이유 |
|---|---|---|
| FAQ, 짧은 규정 | 300~500자 | 질문-답변 단위가 짧음 |
| 일반 문서, 매뉴얼 | 800~1200자 | 문단 2~3개가 한 맥락 |
| 논문, 법률 문서 | 1500~2000자 | 긴 맥락 유지 필요 |
청크 크기에 정답은 없습니다. chunk_size=1000, chunk_overlap=200에서 시작해 검색 품질을 보며 조절하세요. 검색 결과가 맥락 없이 뚝뚝 끊겨 보이면 크기를 키우고, 엉뚱한 내용이 섞여 오면 줄이는 식입니다.
한국어 문서는 영어보다 같은 글자 수에 더 많은 정보가 담깁니다. 영어 기준 가이드(chunk_size 1000)를 그대로 쓰기보다 조금 작게(600~800) 시작하는 것도 좋은 전략입니다.