LLM & Generative AI/RAG in Practice

[LangChain RAG 구축 시리즈 Ep.11] 🔄 Retrieval QA 실습: 문서 기반 답변 구성

ygtoken 2025. 4. 5. 20:17
728x90

이 글에서는 지금까지 준비한 임베딩 + 벡터 저장소 + 검색기(Retriever)를
LLM과 연결하여, 사용자의 질문에 대해 문서 기반 답변을 생성하는 Retrieval QA 시스템을 실습합니다.


🎯 목표

  • Retriever와 LLM을 결합해 RetrievalQA 체인 구성
  • 사용자의 질문 → 관련 문서 검색 → LLM에게 전달
  • GPT 기반 응답 결과 확인

🔗 핵심 구성: RetrievalQA란?

**문서 검색기(Retriever) + 언어 모델(LLM)**을 하나의 체인으로 묶은 구조입니다.

동작 흐름:

[질문 입력]
     ↓
[문서 검색기: Retriever]
     ↓         ← VectorStore로부터 관련 문서 조회
[LLM에게 전달]
     ↓
[문서 기반 답변 생성]

🛠️ Step 1. 필요 라이브러리 로딩

from langchain.embeddings import OpenAIEmbeddings          # OpenAI 임베딩 모델
from langchain.vectorstores import Chroma                  # 벡터 저장소: Chroma
from langchain.chat_models import ChatOpenAI               # LLM 모델: GPT-3.5/4
from langchain.chains import RetrievalQA                   # Retrieval QA 체인

🧱 Step 2. ChromaDB + Retriever 준비

# ✅ 동일한 임베딩 모델 사용
embedding = OpenAIEmbeddings()

# ✅ 기존 저장된 ChromaDB에서 불러오기
vectordb = Chroma(
    persist_directory="./chroma_db",          # 벡터 데이터가 저장된 디렉토리
    embedding_function=embedding,             # 임베딩 함수
    collection_name="iceberg_tables"          # 컬렉션 이름
)

# ✅ top-k 문서 검색기 구성
retriever = vectordb.as_retriever(
    search_kwargs={"k": 2}                    # 유사한 문서 2개 반환
)

🧠 Step 3. LLM 준비 (GPT)

# ✅ GPT 모델 생성 (GPT-3.5 사용 예시)
llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0.2)
  • temperature: 답변의 다양성 조절 (0에 가까울수록 일관성 ↑)

🤖 Step 4. Retrieval QA 체인 구성

# ✅ 문서 검색기 + LLM을 연결한 체인 생성
qa_chain = RetrievalQA.from_chain_type(
    llm=llm,                                  # 사용할 언어 모델
    retriever=retriever,                      # 문서 검색기
    return_source_documents=True              # 응답 시 참조 문서도 함께 반환
)

💬 Step 5. 질문 실행

# ✅ 사용자 질문 정의
query = "상품 관련 정보를 담고 있는 테이블이 뭐야?"

# ✅ 체인 실행: 문서 검색 + LLM 응답 생성
result = qa_chain(query)

# ✅ 답변 출력
print("📣 GPT 응답:")
print(result['result'])

# ✅ 참고 문서 출력
print("\n📎 참고 문서:")
for doc in result['source_documents']:
    print(doc.page_content)

📤 예상 출력 예시

📣 GPT 응답:
상품 정보를 담고 있는 테이블은 'products'입니다. 이 테이블은 product_id, name, category 컬럼으로 구성되어 있으며, category 기준으로 파티셔닝되어 있습니다.

📎 참고 문서:
📂 테이블명: products
🧾 컬럼 목록:
- product_id (long)
- name (string)
🧩 파티션: category

📎 요약 및 핵심 정리

  • RetrievalQA는 문서 검색기 + LLM을 결합한 핵심 체인입니다.
  • 사용자의 질문은 문서 검색기로 전달되고, 검색된 내용을 바탕으로 GPT가 답변을 생성합니다.
  • 결과에는 답변뿐만 아니라 참조 문서도 함께 확인할 수 있어 신뢰도 ↑
728x90