수백 페이지에 달하는 PDF 문서, 규정집, 매뉴얼을 읽고 사용자의 질문에 해당 문서 구절을 출처로 인용하여 정확히 답변하는 PDF RAG 시스템을 제작합니다.
1. PDF RAG 전문 용어 사전 (Glossary)
- PyPDF / pdfplumber: PDF 파일 내부의 텍스트 레이아웃, 이미지, 표 데이터를 문자열로 파싱하는 파이썬 라이브러리입니다.
- RecursiveCharacterTextSplitter: 줄바꿈(`
), 마침표(.`), 띄어쓰기를 순차적으로 파악하여 의미 단락이 끊기지 않게 분할하는 청킹 도구입니다.
- Overlap Size: 분할된 청크 간에 일정한 문장(예: 100자)을 겹쳐 배치하여 청크 경계에서 문맥 손실이 발생하는 것을 방지하는 기술입니다.
2. PDF 파싱 및 RAG 질의응답 시스템 파이썬 구현
from pypdf import PdfReader
from openai import OpenAI
client = OpenAI()
def process_pdf_and_ask(pdf_filepath, user_question):
# 1. PDF 파일 텍스트 전체 추출
reader = PdfReader(pdf_filepath)
raw_text = ""
for idx, page in enumerate(reader.pages):
raw_text += f"
--- [Page {idx+1}] ---
" + page.extract_text()
# 2. 프롬프트 컨텍스트에 PDF 문맥 주입
prompt = f"""
너는 제공된 PDF 문서의 내용을 기반으로 질문에 사실만을 답변하는 문서 분석관이야.
문서에 존재하지 않는 정보라면 절대로 거짓으로 답변하지 말고 "제공된 PDF 문서에 해당 내용이 존재하지 않습니다"라고 답변해 줘.
[PDF 문서 컨텍스트]
{raw_text[:4000]} # 토큰 초과 방지 슬라이싱
[사용자 질문]
{user_question}
"""
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": prompt}],
temperature=0.0
)
return response.choices[0].message.content
# 실행 예제
print(process_pdf_and_ask("company_rules.pdf", "연차 사용 시 며칠 전에 신청해야 하나요?"))
3. 자주 묻는 질문 (Q&A)
Q. PDF 내 표(Table)나 그래프 데이터도 RAG가 잘 읽나요?
A. 단순 텍스트 추출기를 쓰면 표의 행과 열이 뭉개져 엉뚱한 수치를 읽을 수 있습니다. 표가 많은 문서의 경우 pdfplumber로 표 구조를 마크다운 테이블 형태(|---|---|)로 파싱하거나 멀티모달 LLM 비전 모델로 이미지 그대로 전달하는 방식을 써야 합니다.