RAG2026-5일11차시 · Retriever 기초 실습8 / 18← 이전목차다음 →MetaContents

11차시. Retriever 기초 실습

5. 실습 ② — Top-K 실험

출처: 원본 PDF 11차시_Retriever기초실습.pdf 11~12쪽 · 쪽 그림 11쪽 12쪽

감이 아니라 눈으로 확인하며 k를 정합니다.

📝 k값별 결과 관찰

출력
def compare_k(question, ks=(1, 3, 5)):
    print(f"질문: {question}")
    print("=" * 58)
    for k in ks:
        pairs = store.similarity_search_with_relevance_scores(
            question, k=k)
        scores = [round(s, 3) for _, s in pairs]
        # 기준(0.47) 미달 조각 개수 세기
        low = 0
        for s in scores:
            if s < 0.47:
                low += 1
        print(f"k={k:<3} 점수={scores}")
        print(f"     기준 미달(0.47) 조각: {low}개")
    print()
compare_k("환불은 며칠 이내인가요?")

실행 결과
─────────────────────────────────────────────
질문: 환불은 며칠 이내인가요?
==========================================================
k=1   점수=[0.812]
      기준 미달(0.47) 조각: 0개
k=3   점수=[0.812, 0.683, 0.601]
      기준 미달(0.47) 조각: 0개
k=5   점수=[0.812, 0.683, 0.601, 0.354, 0.298]
      기준 미달(0.47) 조각: 2개     ← 노이즈 시작

💡 표에서 읽어낼 것
k=3까지는 전부 기준을 통과합니다.
k=5부터 관련 없는 조각이 섞이기 시작합니다.
k=10이면 7개가 노이즈입니다.
이 노이즈가 전부 프롬프트에 들어가서
→ 토큰 비용 3배
→ LLM이 헷갈림
→ 답변 품질 하락

👉
이 문서에는 k=3이 적절합니다. 질문 여러 개로 이 실험을 반복하면
내 문서에 맞는 k를 근거를 갖고 정할 수 있습니다.

← 이전 절11차시 · 4. 실습 ① — Retriever 만들고 비교하기다음 절 →11차시 · 6. 실습 ③ — metadata 필터로 범위 좁히기