인공지능 - Langchain을 활용한 질문 응답 시스템 구축 (벡터 DB와 GPT 모델 결합)

2 분 소요

Langchain을 활용한 질문 응답 시스템 구축 (벡터 DB와 GPT 모델 결합)

🧠 LangChain으로 문서 기반 질문 응답 시스템 만들기

PDF 문서를 검색 가능한 LLM 지식으로 바꾸는 첫 걸음

LLM(GPT 같은 대형 언어 모델)은 아주 똑똑하지만, “기억력”은 짧습니다.
즉, 모델이 미리 학습한 데이터 외에 최신 문서특정 기관의 내부 자료에 대한 질문에는 답하기 어렵습니다.

이 문제를 해결하려면?
문서를 직접 검색해서 모델에게 전달하는 구조, 즉 RAG(Retrieval-Augmented Generation)가 필요합니다.

이번 글에서는 LangChain을 이용해 다음과 같은 구조를 구현합니다:

PDF 문서 → 텍스트 분할 → 벡터화 → 벡터 DB 저장 → 검색 → GPT 응답 생성

🛠️ 실습 목표

  • ✅ PDF 문서를 불러와 텍스트로 변환하고
  • ✅ 적절한 단위로 쪼개고
  • ✅ 임베딩을 통해 벡터화하고
  • ✅ FAISS 벡터 데이터베이스에 저장한 후
  • ✅ 사용자의 질문을 받아 관련 문서를 검색하고
  • ✅ GPT로부터 최종 응답을 생성합니다.

1. 🔧 기본 환경 설정

import os
import warnings
from dotenv import load_dotenv
from openai import OpenAI

warnings.filterwarnings("ignore", category=UserWarning)
load_dotenv(dotenv_path='openapi_key.env')  # API 키 로드
api_key = os.getenv("OPENAI_API_KEY")
client = OpenAI(api_key=api_key)

.env 파일에 저장된 OpenAI 키를 불러와 GPT 모델을 사용할 준비를 합니다.


2. 📄 문서 불러오기 및 텍스트 분할

from langchain.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from glob import glob

def create_vector_db():
    alldoc = []
    for path in glob('./test_source/*.pdf'):
        loader = PyPDFLoader(path)
        documents = loader.load()
        splitter = RecursiveCharacterTextSplitter(chunk_size=700, chunk_overlap=20)
        chunks = splitter.split_documents(documents)
        alldoc.extend(chunks)

    return alldoc
  • PyPDFLoader: PDF에서 텍스트 추출
  • Text Splitter: 텍스트를 모델이 이해하기 쉬운 작은 단위로 나눕니다 (토큰 초과 방지)

3. 🔢 벡터화 및 FAISS 인덱싱

from langchain_openai import OpenAIEmbeddings
from langchain.vectorstores import FAISS

docs = create_vector_db()
embedding_model = OpenAIEmbeddings()
vector_db = FAISS.from_documents(docs, embedding_model)
  • 각 텍스트 조각은 OpenAI 임베딩 모델로 변환되어 벡터로 바뀝니다.
  • 이 벡터들을 FAISS DB에 저장하면 질문에 가장 가까운 문서를 빠르게 검색할 수 있습니다.

4. 🤖 질문 → 검색 → 응답 생성

from langchain.chains import RetrievalQA
from langchain_openai import ChatOpenAI

gpt = ChatOpenAI(model='gpt-3.5-turbo', temperature=0)
retriever = vector_db.as_retriever()
qa_chain = RetrievalQA.from_chain_type(llm=gpt, chain_type='stuff', retriever=retriever)
  • RetrievalQA: 검색 + 생성 자동 조합 체인
  • chain_type='stuff': 검색된 문서들을 그대로 GPT에 붙여서 전달하는 가장 단순한 방식

5. 📥 질문하고 답 받아보기

query = '2021년 서울시 창업지원 사업에 대한 예산은 얼마인가?'
result = qa_chain.invoke({'query': query})
print("답변:", result['result'])

GPT가 벡터 검색을 통해 찾아낸 문서 내용을 바탕으로 질문에 대해 정확하게 응답합니다.


📌 이 실습으로 이해할 수 있는 것들

이해 항목 설명
✅ 문서 검색 기반 응답 생성 단순 GPT 사용을 넘어, 외부 문서 기반으로 응답을 만드는 구조 학습
✅ 벡터 DB의 필요성 문서가 많을 때도 빠르고 정확한 검색을 위한 FAISS 벡터 검색
✅ LangChain 구성 흐름 문서 로딩 → 분할 → 임베딩 → 검색 → 응답까지의 체인 구축 이해

✅ 마무리

이 글에서 우리는 LangChain, FAISS, OpenAI를 활용해
PDF 문서를 검색 가능한 LLM 지식 기반으로 바꾸는 구조를 구현했습니다.

이 시스템은 다음 단계로 확장할 수 있습니다:

  • 대화형 응답 (ConversationalRetrievalChain)
  • 다양한 파일 형식(JSON, CSV 등) 지원
  • 검색 품질 향상을 위한 reranker 도입

다음 글에서는 이 시스템을 대화형으로 확장하는 방법, 즉
금액만 알려줘” 같은 문맥을 기억하는 응답 시스템으로 발전시켜보겠습니다! 🚀

댓글남기기