DM Log

[AI 실습 #3] PDF 단일 파일 RAG 만들기 본문

개발공부/AI

[AI 실습 #3] PDF 단일 파일 RAG 만들기

Dev. Dong 2025. 9. 13. 16:04

PDF 문서에서 답변 받기

 

  • PDF 문서를 기반으로 질문에 답변하는 RAG 서버 구축
  • 사내 문서 / 연구 자료 / 메뉴얼 같은 PDF 파일을 AI 질의 응답 시스템에 활용 가능

환경 준비

1. 필수 라이브러리 설치

pip install langchain langchain-community langchain-openai chromadb pypdf mcp

 

2. OpeanAI API Key 설정

export OPENAI_API_KEY="your_api_key_here"   # macOS/Linux
setx OPENAI_API_KEY "your_api_key_here"     # Windows PowerShell

 

또는 코드 상단에

import os
os.environ["OPENAI_API_KEY"] = "your_api_key_here"

PDF RAG 서버 구축

import os
import logging
from mcp.server.fastmcp import FastMCP
from langchain_community.vectorstores import Chroma
from langchain_community.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.chains import RetrievalQA
from langchain_openai import ChatOpenAI, OpenAIEmbeddings

# 로그 설정
logging.basicConfig(level=logging.INFO)

# MCP 서버 인스턴스 생성
mcp = FastMCP("PDF-RAG")

# 분석할 PDF 파일 경로
PDF_PATH = "sample.pdf"

# PDF 로드
loader = PyPDFLoader(PDF_PATH)
pages = loader.load()

# 문서 분할 (500자, 50자 overlap)
splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
docs = splitter.split_documents(pages)

# 임베딩 & LLM 초기화
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
llm = ChatOpenAI(model="gpt-4o")

# Chroma 벡터스토어 생성
vectorstore = Chroma.from_documents(docs, embeddings)

# RAG 체인 생성
qa_chain = RetrievalQA.from_chain_type(
    llm=llm,
    retriever=vectorstore.as_retriever()
)

# MCP 도구 등록
@mcp.tool()
def ask_pdf(query: str) -> str:
    """PDF 내용을 기반으로 질문에 답변합니다."""
    logging.info(f"Received query: {query}")
    return qa_chain.run(query)

# 서버 실행
if __name__ == "__main__":
    mcp.run(transport="stdio")

 

[코드 설명]

  1. PyPDFLoader: PDF를 LanChain 문서 객체로 변환
  2. RecursiveCharacterTextSplitter: 문서를 일정 길이로 잘라서 검색 최적화
  3. OpenAIEmbeddings: 텍스트 → 벡터 변환
  4. Chroma: 벡터 저장소, 유사 문서 검색 담당
  5. RetrievalQA: 검색된 문서를 LLM 입력에 넣어 답변 생성
  6. MCP Tool 등록: ask_pdf 함수가 외부 MCP 클라이언트에서 호출 가능

[실행 방법]

1. pdf_rag.py로 저장

2. 실행:

python pdf_rag.py

 

3. MCP 클라이언트에서 연결 후:

/mcp ask_pdf query="질문?"

→ PDF 파일 내용을 기반으로 답변 출력

(부록) 용어 정리

  • PyPDFLoader: PDF 문서를 LangChain 문서 객체로 로드
  • Splitter: 긴 텍스트를 일정 단위로 분리
  • Chroma: 로컬 벡터 DB
  • RetrievalQA: 검색 + 답변 생성 체인
  • MCP Tool: MCP 서버에서 외부 클라이언트가 호출할 수 있는 함수