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
'LLM & Generative AI > RAG in Practice' 카테고리의 다른 글
[LangChain RAG 구축 시리즈 Ep.13] 🧪 Stuff / MapReduce / Refine 전략 비교 (1) | 2025.04.05 |
---|---|
[LangChain RAG 구축 시리즈 Ep.12] 🧵 대화형 검색과 맥락 기억 기능 구현해보기 (1) | 2025.04.05 |
[LangChain RAG 구축 시리즈 Ep.10] 🧪 벡터 검색 결과 해석하기 (top-k, score 등) (1) | 2025.04.05 |
[LangChain RAG 구축 시리즈 Ep.09] 🗂️ ChromaDB로 벡터 저장소 구성하기 (1) | 2025.04.05 |
[LangChain RAG 구축 시리즈 Ep.08] 🧠 OpenAI Embedding 실습: JSON을 임베딩해보기 (1) | 2025.04.05 |