블로그+IT노하우

[파이썬 실험] RAG 개념과 GPT-3.5로 PDF 요약 실습하기

살찐용 2025. 5. 15. 00:23

퇴근 후, 조용히 취미처럼 파이썬을 끄적인다.
오늘은 오랜만에 기술적인 탐구를 해보고 싶어서,
AI 시스템과 협업해 샘플 코드를 완성했고,
그 과정을 기록으로 남겨두려 한다.

요즘은 정보 분석 과정에서 AI 모듈의 도움을 받는 흐름이 일반화되고 있다.
나도 그런 흐름에 맞춰 실험을 진행해봤는데,
AI와 대화하며 설계했던 내용이 놀랍게도
요즘 자주 언급되는 RAG (Retrieval-Augmented Generation) 구조와
일치한다는 걸 알게 되었다. 


RAG란?

간단히 말해,
외부 데이터 소스에서 정보를 불러와 텍스트 생성 모델(GPT 등)에 연결하는 기술이다.
→ 보고서, 문서, DB 같은 실질적 자료를 기반으로
AI가 보다 정확한 응답을 생성할 수 있도록 돕는 구조다.


이번 실습 내용

  • PDF 문서의 표지 정보에서 원하는 답을 자연어로 질문해 받아오기
  • LangChain을 활용한 문서 청킹, 임베딩, 벡터화, GPT 연결
  • GPT-3.5-Turbo(OpenAI API) 기반 질문 응답 처리

환경 구성 요약

  • LLM 모델: OpenAI GPT-3.5-Turbo (사용량 $25 테스트용으로 선결제함)
    한때 채굴용으로 RTX3090을 사용하던 경험상,
    고성능 GPU를 장시간 돌리는 건
    전기세, 열, 관리 비용까지 고려했을 때 결코 가볍지 않다.
    GPT-3.5-Turbo를 몇 달 써보고 월평균 $35 이하로 유지된다면,
    로컬 모델 구축보다 효율적일 수 있다.
    지금은 **“성능보단 관리와 효율의 시대”**일지도 모른다.
  • 벡터DB: FAISS
  • 임베딩 모델: sentence-transformers/all-MiniLM-L6-v2
  • 문서 청킹: RecursiveCharacterTextSplitter
  • 문서 로더: LangChain의 PyPDFLoader
  • 질문 예시: “이 보고서는 어떤 기업의 무슨 년도 무슨 보고서인가요?”

 주의사항

  • OpenAI API 키는 반드시 발급받고,
    시스템 환경변수(예: .bashrc 또는 .env)에 등록해야 한다.
    *윈도우는 윈도우 시스템변수
  • 설치 라이브러리와 키 세팅 방법은 추후 따로 포스팅할 예정!

🧪 실행 코드

from langchain.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.vectorstores import FAISS
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.chat_models import ChatOpenAI
from langchain.chains import RetrievalQA
import os
# 1. PDF 파일 경로
pdf_path = "./REPORT/2025_11013_KT밀리의서재_분기보고서 공시뷰어 새창.pdf"

# 2. PDF 로드
loader = PyPDFLoader(pdf_path)
documents = loader.load()

# 3. 청킹
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=100)
docs = text_splitter.split_documents(documents)

# 4. 임베딩 모델 준비 (sentence-transformers)
embedding_model = HuggingFaceEmbeddings(model_name="sentence-transformers/all-MiniLM-L6-v2")

# 5. 벡터 저장소 생성
vectorstore = FAISS.from_documents(docs, embedding_model)

# 6. LLM 연결 (OpenAI GPT 사용)
#llm = OpenAI(temperature=0, model_name="gpt-3.5-turbo")  # OpenAI API key 필요

llm = ChatOpenAI(
    model="gpt-3.5-turbo",
    temperature=0,
    openai_api_key=os.getenv("OPENAI_API_KEY")
)

# 7. 질의 응답 체인 구성
qa_chain = RetrievalQA.from_chain_type(
    llm=llm,
    retriever=vectorstore.as_retriever(),
    return_source_documents=True
 
)

# 8. 질문 실행
query = "이 보고서는 어떤 기업의 무슨 년도 무슨 보고서인가요?"
#response = qa_chain.run(query)
response = qa_chain.invoke(query)







#print("✅ AI 응답:", response)
print("✅ AI 응답:", response["result"])

마무리 한 줄

기술은 어렵지만,
이렇게 하나하나 실험하고 기록하면 언젠가는 내 것이 된다.
이번 실습도 그 과정 중 하나였다.