LLM & Generative AI/RAG in Practice

[LangChain RAG 구축 시리즈 Ep.18] 💬 RetrievalQA 체인을 통해 문서 기반 답변 생성하기

ygtoken 2025. 4. 5. 21:35
728x90

이 글에서는 앞에서 구축한 **Retriever(문서 검색기)**와
OpenAI GPT 모델을 연결하여,
**문서 기반의 자동 응답 시스템(RetrievalQA Chain)**을 구성합니다.


🎯 목표

  • Retriever + LLM(OpenAI) 결합
  • 문서 기반 질문 응답 흐름 구성
  • 참조 문서와 함께 GPT 응답 출력

🛠️ Step 1. RetrievalQA 체인 구성 함수 만들기

# src/qa_chain.py

from langchain.chains import RetrievalQA              # Retrieval QA 체인 클래스
from langchain.chat_models import ChatOpenAI          # OpenAI GPT 모델
from langchain.vectorstores import Chroma             # 벡터 저장소
from langchain.embeddings import OpenAIEmbeddings     # 임베딩 모델

def create_qa_chain(db_path: str, collection_name: str, k: int = 2):
    """
    ChromaDB 기반 벡터 검색기와 GPT 모델을 연결한 QA 체인을 생성합니다.
    """

    # 1. OpenAI 임베딩 모델 초기화
    embedding = OpenAIEmbeddings()

    # 2. ChromaDB 벡터 저장소 로딩
    vectordb = Chroma(
        persist_directory=db_path,             # 벡터 저장 위치
        embedding_function=embedding,          # 동일 임베딩 모델 사용
        collection_name=collection_name        # 컬렉션 이름
    )

    # 3. 문서 검색기 생성
    retriever = vectordb.as_retriever(
        search_kwargs={"k": k}                 # top-k 설정
    )

    # 4. GPT 모델 초기화 (gpt-3.5-turbo 사용 예시)
    llm = ChatOpenAI(
        model_name="gpt-3.5-turbo",            # 사용할 LLM 모델명
        temperature=0.2                        # 응답의 일관성 유지
    )

    # 5. Retrieval QA 체인 생성
    qa_chain = RetrievalQA.from_chain_type(
        llm=llm,                               # 연결할 GPT 모델
        retriever=retriever,                   # 문서 검색기
        return_source_documents=True           # 참조 문서 함께 반환
    )

    # 6. 완성된 QA 체인 반환
    return qa_chain

💬 Step 2. 사용자 질문을 통한 QA 실행

# main.py

from src.qa_chain import create_qa_chain  # QA 체인 생성 함수 불러오기

# ✅ ChromaDB 경로 및 컬렉션 이름 설정
db_path = "chroma_db"
collection_name = "iceberg_tables"

# ✅ QA 체인 생성
qa = create_qa_chain(db_path, collection_name, k=2)

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

# ✅ QA 체인 실행
result = qa(query)  # 또는 result = qa.run(query)도 가능

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

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

📤 출력 예시

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

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

✅ GPT는 벡터 검색된 문서를 기반으로 신뢰성 있는 답변을 생성하게 됩니다.


💡 옵션: Temperature 조절로 응답 다양성 조절

# 모델 생성 시 설정
llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0.7)

 

Temperature  설명
0.0 ~ 0.3 응답이 일관되고 정제됨 (사실 중심)
0.7 ~ 1.0 보다 창의적이지만, 답이 불안정할 수 있음

📎 요약 및 핵심 정리

  • RetrievalQA는 문서 검색기(Retriever) + GPT 모델을 하나로 연결한 체인입니다.
  • 사용자의 질문 → 관련 문서 검색 → LLM 응답 생성의 전체 흐름이 구성됩니다.
  • 참조 문서를 함께 출력함으로써 답변의 근거를 확인할 수 있습니다.
728x90