LLM & Generative AI/RAG in Practice

[LangChain RAG 구축 시리즈 Ep.20] 🧪 RetrievalQA Chain 성능 최적화 전략 (top-k, score threshold)

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

이 글에서는 RetrievalQA 또는 ConversationalRetrievalChain의 성능을 높이기 위한
검색 튜닝 기법을 정리합니다.
특히 top-k 조정, score_threshold 필터링을 중심으로 다룹니다.


🎯 목표

  • top-k로 검색 결과 개수 조절
  • score_threshold로 유사도 기준 필터링
  • search_type을 이용해 다양한 검색 방식 실험

📦 검색 튜닝이 필요한 이유

문제 상황 원인
불필요한 문서가 답변에 포함됨 top-k가 너무 큼
관련 없는 답변이 생성됨 유사도 기준 없음
응답 속도 저하 과도한 문서 입력으로 LLM이 느려짐

➡️ 이를 해결하기 위해 검색기의 파라미터 조정이 필요합니다.


🔧 Step 1. Retriever 구성 시 top-k 설정

retriever = vectordb.as_retriever(
    search_kwargs={"k": 1}  # 가장 유사한 문서 1개만 반환
)

✅ k 값이 작을수록 정확도↑, 속도↑, 하지만 정보 손실 가능
✅ k 값이 클수록 정보량↑, 하지만 GPT 응답이 산만해질 수 있음


🧪 Step 2. score_threshold로 유사도 필터링

retriever = vectordb.as_retriever(
    search_kwargs={
        "k": 5,                      # 최대 5개 검색
        "score_threshold": 0.3      # 유사도 0.3 이하인 경우만 포함 (낮을수록 더 유사)
    }
)

score_threshold는 일부 VectorStore에서만 지원합니다.
Chroma에서는 .similarity_search_with_score()를 사용할 경우 직접 필터링할 수 있습니다.


💬 실전 코드 예시 (Chroma + score 출력)

# Chroma 검색 결과에 점수 포함 (manual filtering 가능)

results = vectordb.similarity_search_with_score("상품 테이블은 뭐야?", k=3)

# 결과 출력
for i, (doc, score) in enumerate(results):
    print(f"[{i+1}] 점수: {score:.4f}")           # 유사도 거리 값 (낮을수록 유사)
    print(doc.page_content + "\n")

✅ 유사도는 Cosine Distance 기반이며
0.0 ~ 0.3 범위는 매우 유사한 문서로 간주됩니다.


⚙️ Step 3. 다양한 검색 타입 실험하기

retriever = vectordb.as_retriever(
    search_type="similarity",                   # 기본값: 유사도 기반 검색
    search_kwargs={"k": 3}
)

 

search_type 설명
"similarity" 가장 유사한 순으로 정렬
"mmr" Maximal Marginal Relevance: 다양성과 유사도 균형 조절
retriever = vectordb.as_retriever(
    search_type="mmr",                          # 다양한 문서 포함
    search_kwargs={"k": 4, "lambda_mult": 0.8}  # 다양성 조절 계수
)

📎 요약 및 핵심 정리

  • top-k는 반환 문서 수를 조절하는 핵심 파라미터입니다.
  • score_threshold를 활용하면 불필요한 문서를 걸러낼 수 있습니다.
  • search_type을 통해 정확도 또는 다양성 중심 검색 방식 선택이 가능합니다.
  • 성능 최적화를 위해선 데이터 성격에 맞게 실험과 조정이 필수입니다.
728x90