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
- backend
- frontend
- dfs
- 완전탐색
- Algorithm
- modbus
- 파이썬
- javascript
- javascirpt
- OpenAI
- chroma
- typescript
- InfluxDB
- React
- python
- DP
- VectoreStore
- retriever
- MCP
- 코딩테스트
- AI
- Two Pointer
- 스택/큐
- BFS
- heapq
- 프로그래머스
- queue
- rag
- LLM
- 알고리즘
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 프로젝트 #0] 초기 세팅 #1: Node, Python, Vite 기반 모노레포 환경 설명 (0) | 2025.09.14 |
---|---|
[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 |