Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | ||||||
| 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| 9 | 10 | 11 | 12 | 13 | 14 | 15 |
| 16 | 17 | 18 | 19 | 20 | 21 | 22 |
| 23 | 24 | 25 | 26 | 27 | 28 | 29 |
| 30 |
Tags
- dfs
- VectoreStore
- javascirpt
- docker
- python
- LLM
- ansible
- DP
- BFS
- queue
- heapq
- turbo
- 알고리즘
- Infra
- jenkins
- 파이썬
- 프로그래머스
- monorepo
- modbus
- Algorithm
- frontend
- CI/CD
- build
- rag
- AI
- OpenAI
- React
- javascript
- Two Pointer
- typescript
Archives
- Today
- Total
DM Log
[AI 실습 #3] PDF 단일 파일 RAG 만들기 본문
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")
[코드 설명]
- PyPDFLoader: PDF를 LanChain 문서 객체로 변환
- RecursiveCharacterTextSplitter: 문서를 일정 길이로 잘라서 검색 최적화
- OpenAIEmbeddings: 텍스트 → 벡터 변환
- Chroma: 벡터 저장소, 유사 문서 검색 담당
- RetrievalQA: 검색된 문서를 LLM 입력에 넣어 답변 생성
- 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 서버에서 외부 클라이언트가 호출할 수 있는 함수
'개발공부 > AI' 카테고리의 다른 글
| [AI 실습 #4] 다중 PDF RAG 확장하기 (0) | 2025.09.13 |
|---|---|
| [AI 실습 #2] MCP 소개와 FastMCP 실습 (0) | 2025.09.13 |
| [AI 실습 #1] Chroma 실습: 벡터DB를 활용한 문서 검색 (0) | 2025.09.13 |
| [AI 개념 및 이해 #5] RAG: 검색과 생성을 결합하는 기술 (0) | 2025.09.07 |
| [AI 개념 및 이해 #4] LangChain: LLM 오케스트레이션 프레임워크 (0) | 2025.09.07 |
