RSS

RAG 검색 임계값을 감으로 정하면 안 되는 이유

RAG 시스템에는 검색 결과가 질문과 충분히 관련 있는지 판단하는 기준이 필요합니다. 기준이 너무 낮으면 무관한 문서를 근거로 답하고, 너무 높으면 답이 있는 질문도 “근거가 없다”고 처리합니다.

문제는 임계값에 보편적인 정답이 없다는 점입니다. 임베딩 모델, 문서 언어, 청크 길이와 문서 분야가 바뀌면 점수 분포도 달라집니다. 듀오랩스는 한국어 문서 RAG의 초기 임계값을 0.45로 정했다가 실제 질문을 측정한 뒤 0.53으로 조정했습니다.

0.45가 합리적으로 보였던 이유

코사인 유사도는 두 벡터의 방향이 얼마나 가까운지 나타냅니다. 1에 가까울수록 비슷하고, 0에 가까울수록 관련이 적다고 해석할 수 있습니다.

이 설명만 보면 0.45는 적당한 중간값처럼 보입니다. 하지만 실제 점수는 0부터 1까지 고르게 분포하지 않습니다. 임베딩 모델은 학습 방식과 언어에 따라 무관한 문장에도 비교적 높은 기본 점수를 줄 수 있습니다.

한국어 문서와 질문을 사용한 초기 측정에서는 다음과 같은 분포가 나왔습니다.

평가 집합 최상위 코사인 유사도
관련 질문 8종 0.57~0.69
무관 질문 6종 0.37~0.49

초기 임계값 0.45를 적용하면 일부 무관 질문도 검색을 통과합니다. 즉 “근거가 약하면 답하지 않는다”는 안전장치가 기대만큼 작동하지 않았습니다.

무관 질문을 반드시 넣어야 합니다

검색 품질을 평가할 때 답이 있는 질문만 사용하면 임계값을 정할 수 없습니다. 관련 질문의 점수가 높다는 사실만 알 수 있고, 무관한 질문이 어디까지 올라오는지는 알 수 없기 때문입니다.

평가 세트에는 최소한 다음 네 유형이 필요합니다.

  1. 문서에 표현까지 동일하게 있는 질문
  2. 뜻은 같지만 다른 표현을 사용한 질문
  3. 여러 문서를 조합해야 하는 질문
  4. 문서와 전혀 관계없는 질문

특히 마지막 유형은 실제 사용자 입력과 비슷하게 구성해야 합니다. 단순한 무작위 문자열보다 완성된 자연어 질문을 넣어야 임베딩 모델의 기본 유사도를 제대로 확인할 수 있습니다.

임계값은 두 분포 사이에서 정합니다

관련 질문의 최저 점수는 0.57, 무관 질문의 최고 점수는 0.49였습니다. 두 집합 사이에 여유 구간이 있었고, 임계값을 0.53으로 올렸습니다.

무관 질문          여유 구간          관련 질문
0.37 ─── 0.49   |  0.53  |   0.57 ─── 0.69

                 임계값

0.53은 다른 서비스에 그대로 복사할 값이 아닙니다. 해당 문서 집합과 임베딩 모델에서 관측된 분포를 바탕으로 선택한 값입니다.

문서가 늘거나 질문 유형이 바뀌면 분포도 달라질 수 있습니다. 운영 중에는 “근거 없음” 처리된 질문과 낮은 점수로 통과한 질문을 표본 검사해 임계값을 다시 조정해야 합니다.

최고 점수 하나만 보면 놓치는 것

최상위 코사인 점수는 간단한 차단 기준으로 유용하지만 검색 품질 전체를 설명하지는 못합니다.

  • 첫 번째 결과는 관련 있지만 두 번째부터 무관할 수 있습니다.
  • 키워드가 정확히 일치하는 문서가 의미 검색에서는 낮게 나올 수 있습니다.
  • 같은 내용을 반복한 문서가 상위 결과를 모두 차지할 수 있습니다.
  • 오래된 문서와 최신 문서가 동시에 검색될 수 있습니다.

그래서 실제 답변에 넣을 근거는 유사도뿐 아니라 키워드 순위, 문서 중복, 수정일과 공개 상태를 함께 고려해야 합니다.

오래된 문서가 정답으로 선택된 이유

검색 결과에 최신 문서와 오래된 문서가 함께 들어왔을 때 답변 모델은 자동으로 최신 문서를 알아내지 못했습니다. 모델에 전달한 근거에는 본문만 있었고 수정일이 없었기 때문입니다.

두 문서는 모델 입장에서 동일한 권위를 가진 텍스트였습니다. 프롬프트에 “최신 기준을 따르라”고 적어도 어떤 문서가 최신인지 알려주지 않으면 지시를 수행할 수 없습니다.

근거 형식을 다음처럼 바꿨습니다.

[문서 제목]
수정일: 2026-07-28
상태: 현재 기준
본문: ...

그리고 값이 충돌하면 최근 문서를 우선하되 이전 기준도 구분해 설명하도록 했습니다. 이후 비교한 모델들은 최신 근거를 선택할 수 있었습니다.

점수와 메타데이터는 서로 다른 문제를 풉니다

임계값은 “이 문서가 질문과 관련 있는가”를 판단합니다. 수정일과 상태는 “관련 문서 중 무엇을 우선해야 하는가”를 판단합니다.

두 문제를 하나의 유사도 점수로 해결하려 하면 검색 결과가 불안정해집니다.

판단 필요한 정보
질문과 관련 있는가 임베딩·키워드 점수
최신 기준인가 수정일·문서 상태
사용자가 볼 수 있는가 공개 범위·권한
같은 내용을 반복하는가 문서 ID·청크 위치

좋은 RAG 검색은 높은 점수의 문장을 모으는 작업이 아니라, 서로 다른 판단 기준을 단계별로 적용하는 작업입니다.

운영 체크리스트

  • 관련 질문과 무관 질문의 점수 분포를 모두 측정했나요?
  • 임계값의 근거가 숫자로 기록되어 있나요?
  • 임베딩 모델이나 청크 전략을 바꾼 뒤 다시 측정했나요?
  • 근거에 수정일과 문서 상태가 포함되나요?
  • 중복 청크가 답변 근거를 독점하지 않나요?
  • 낮은 점수로 통과한 실제 질문을 정기적으로 검토하나요?
  • 근거가 약할 때 추측하지 않고 답변을 중단하나요?

듀오랩스가 보는 관점

RAG의 임계값은 설정 파일에 적는 숫자 하나지만, 그 숫자의 근거는 평가 데이터에서 나와야 합니다. 감으로 정한 값은 평상시에는 멀쩡해 보이다가 무관한 질문에서 잘못된 근거를 자신 있게 제시하게 만듭니다.

검색 점수의 분포를 측정하고, 날짜와 상태 같은 메타데이터를 함께 제공하면 작은 답변 모델도 훨씬 안정적으로 동작합니다. 모델을 키우기 전에 검색기가 무엇을 넘기고 있는지부터 확인해야 합니다.

다음 글에서는 애플리케이션 코드가 정상인데 운영에서만 스트리밍과 전체 화면 UI가 깨졌던 문제를 다룹니다.

문서 RAG 구축기 시리즈

  1. 27B보다 2.4B가 더 나았던 문서 RAG 모델 선택기
  2. 문서 RAG를 관리자와 공개 서비스에 함께 붙인 구조
  3. RAG 검색 임계값을 감으로 정하면 안 되는 이유
  4. 로컬에서는 정상인데 운영에서만 깨진 AI 스트리밍
  5. 내부 문서를 공개 AI에 연결할 때 필요한 안전장치
  6. 데스크톱 AI 화면을 모바일에서 과감히 제거한 이유
  7. 배포 문서 한 줄이 AI 기능 전체를 막을 뻔한 이유