본문으로 건너뛰기

© 2026 Molayo

Zenn헤드라인2026. 06. 10. 08:23

RAG의 이미지 검색에서 CLIP rerank를 제거했더니, rerank할 전제 조건 자체가 사라져 있었다

요약

RAG 시스템에서 검색 백엔드를 SearXNG에서 Tavily로 변경한 후, CLIP을 이용한 rerank 과정이 불필요해진 사례를 다룹니다. 검색(Retrieval) 단계의 정밀도가 높아지면 후속 단계인 rerank가 해결해야 할 노이즈 자체가 사라질 수 있음을 보여줍니다.

핵심 포인트

  • 검색 엔진의 품질 향상은 후속 rerank 단계의 필요성을 제거할 수 있음
  • CLIP rerank는 검색 결과의 문맥 이탈 노이즈를 보정하는 패치 역할을 수행함
  • 검색 쿼리의 정밀도가 높아지면 rerank 모델의 변별력이 낮아질 수 있음

지난번, RAG에서 막혔을 때 검색 결과가 아니라 검색 쿼리(Query) 측면을 살펴보는 이야기에 대해 썼습니다.

이번에는 그 후속 이야기입니다.

검색 쿼리를 정돈하더라도, 검색 결과의 품질을 유지하기 위해 rerank를 넣고 싶어질 때가 있습니다.

저도 한때는 검색을 통해 가져온 이미지 후보들을 CLIP으로 rerank 하곤 했습니다.

지금은 그것을 제거했습니다.

이 글은 그 "넣었다가, 제거한" 이야기입니다.

다만, 단순히 CLIP을 제거했다는 이야기가 아닙니다.

retrieval(검색)의 정밀도가 높아지면, 후속 단계인 rerank가 해결하던 문제 자체가 사라지는 경우가 있습니다.

이번에 일어난 일이 바로 그것이었습니다.

왜 처음에 CLIP을 넣었는가

이전의 이미지 검색 백엔드(Backend)는 SearXNG였습니다.

여기서 한 가지 문제가 발생하고 있었습니다.

예를 들어 tech casual과 같은 쿼리를 던지면, 패션 이미지가 아니라 tech 계열의 아이콘이나 관계가 옅은 이미지들이 섞여 들어옵니다.

tech라는 단어에 끌려 문맥에서 벗어난 후보들이 상위에 올라오는 것입니다.

패션의 시각적 예시가 필요한데 기술 계열의 아이콘이 반환됩니다.

이것은 곤란합니다.

그래서 CLIP을 도입했습니다.

렌더링된 검색 쿼리를 CLIP의 텍스트 측 임베딩(Embedding)으로 만들고, 이미지 후보를 CLIP의 이미지 측 임베딩으로 만들어 유사도(Similarity)로 rerank 하는 방식입니다.

문맥에서 벗어난 이미지는 순위를 낮추고, 패션 이미지는 상위로 올립니다.

이때 CLIP은 제 역할을 제대로 수행하고 있었습니다.

벗어난 후보를 걸러낸다는 의미에서는 효과가 있었습니다.

백엔드를 Tavily로 변경했다

그 후, 이미지 검색의 백엔드를 Tavily로 변경했습니다.

이는 CLIP 때문이 아니라 다른 이유 때문이었습니다.

검색 전체를 Tavily로 통합해 나가는 흐름의 일부였습니다.

그리고 여기서 조금 이상한 일이 일어났습니다.

CLIP의 similarity 스코어를 살펴보니, 상위 후보들이 대부분 0.3 근처에서 비슷비슷하게 나열되어 있었습니다.

candidate 1: 0.31
candidate 2: 0.30
candidate 3: 0.30
...

이러면 rerank를 해도 순위가 거의 바뀌지 않습니다.

CLIP이 랭킹 신호를 거의 내보내지 않고 있는 것입니다.

'어라, 이거 일 안 하고 있잖아?'

"고장 난" 것이 아니라 "문제가 사라져 있었다"

여기서 처음에는 이렇게 생각했습니다.

'CLIP이 고장 난 건가?'
'모델 로딩이 잘못되었나?'

하지만 후보 자체를 보고 생각이 바뀌었습니다.

Tavily는 애초에 문맥에서 벗어난 이미지를 반환하지 않았던 것입니다.

tech casual에서 tech 아이콘이 섞여 들어오는 그 문제가 발생하지 않고 있었습니다.

즉, CLIP의 스코어가 비슷비슷했던 것은 CLIP이 고장 났기 때문이 아니었습니다.

CLIP이 걸러내야 할 "벗어난 후보"가 처음부터 후보에 들어있지 않았던 것입니다.

rerank 대상의 품질이 높아진 결과, rerank의 차례가 사라지고 있었습니다.

CLIP은 고장 나지 않았습니다.

CLIP이 해결하던 문제가 사라졌을 뿐입니다.

retrieval이 좋아지면, rerank의 일이 사라질 수 있다

여기서 일어난 일은 CLIP에 국한된 이야기만이 아닙니다.

retrieval의 정밀도가 높아지면, 후속 단계인 rerank가 해결하던 문제가 사라질 수 있습니다.

rerank는 검색 결과의 순서를 개선하기 위한 계층(Layer)입니다.

하지만 실제로는 검색 결과에 섞인 노이즈를 후속 단계에서 보정하는 패치(Patch)로서 도입되는 경우도 있습니다.

이번 CLIP rerank도 그러했습니다.

SearXNG 시절에는 이미지 검색 후보에 패션 문맥에서 벗어난 이미지가 섞여 있었습니다.

그래서 CLIP으로 rerank 할 의미가 있었습니다.

하지만 Tavily로 바꾼 뒤에는 애초에 문맥에서 벗어난 후보가 거의 들어오지 않게 되었습니다.

그러자 CLIP이 열심히 순위를 낮춰야 할 후보가 없어집니다.

rerank 구현은 돌아가고 있습니다.

하지만 rerank가 풀어야 할 문제는 사라졌습니다.

이 상태로 rerank를 남겨두어도 품질 개선이라기보다는 그저 의식(Ritual)에 불과하게 됩니다.

'어라, rerank가 대체 어디에 효과가 있는 거지?'

'rerank 필요 없네. 확실히 알겠어.'

필요했던 것은 rerank를 믿는 것이 아니라, rerank가 아직 일을 하고 있는지 관측하는 것이었습니다.

patch는 토대가 좋아지면 불필요해진다

이것은 조금 흥미로운 구조였습니다.

CLIP는 SearXNG의 약점에 대한 patch (패치)였습니다.

문맥에서 벗어난 이미지가 섞이는 문제가 있었기에, 그 위에 CLIP을 얹어서 보정하고 있었습니다.

하지만 토대를 Tavily로 바꾸자, 보정해야 할 대상 자체가 사라졌습니다.

즉, CLIP이 "틀렸던" 것이 아닙니다.

어느 시점에는 분명히 필요했습니다.

그리고 토대가 좋아짐에 따라 불필요해진 것입니다.

SearXNG 시대:
문맥에서 벗어난 이미지가 섞임
→ CLIP으로 걸러냄 (효과가 있었음)
...

고장 나서 제거한 것이 아니라, 해결하던 문제가 사라졌기에 제거했습니다.

이 차이는 제거 여부를 판단할 때 매우 중요했습니다.

동작하는 것과 효과가 있는 것은 다르다

만약 CLIP의 similarity (유사도) score (점수)를 보고 있지 않았다면, 아마 제거하지 않았을 것입니다.

CLIP의 rerank (재순위화) 단계는 코드상으로는 동작하고 있었습니다.

에러도 발생하지 않습니다.

처리도 통과합니다.

이미지도 반환됩니다.

겉보기에는 제대로 동작하고 있습니다.

하지만 score를 보면, 랭킹에 대한 기여도가 거의 없었습니다.

동작하는 것과 효과가 있는 것은 다릅니다.

이 부분을 혼동하면, "동작하니까 남겨두자"라며 불필요한 부품을 계속 떠안게 됩니다.

score를 관측할 수 있는 상태로 만들어 두었기에, 효과가 없다는 것을 알아챌 수 있었습니다.

관측이 없었다면, "어렴풋이 rerank를 하고 있는" 상태 그대로 알아채지 못한 채 남겨두었을 것입니다.

로컬 모델을 하나 덜어낼 수 있었다

CLIP을 제거하자, 부수적인 것들도 사라졌습니다.

CLIP의 text model (텍스트 모델)과 image model (이미지 모델).

그것들을 로드하기 위한 로컬의 model cache (모델 캐시).

모델 다운로드 관련 번거로움.

이것들이 한꺼번에 필요 없게 되었습니다.

패션의 시각적 예시를 반환한다는 기능은 변하지 않았습니다.

하지만 그 기능을 뒷받침하기 위해 떠안고 있던 로컬 모델이 하나 사라졌습니다.

수행하는 일은 같지만, 떠안고 있는 것은 줄었습니다.

이것은 제거 판단에 있어 기분 좋은 부류였습니다.

이로써 구성이 다시 조금 가벼워졌습니다.

Docker를 제거하고, Vector DB를 제거하고, 이번에는 CLIP rerank도 제거했습니다.

처음에는 인프라 수족관 같았던 local stack (로컬 스택)도, 조금씩 수조 정도의 크기로 돌아온 느낌이 듭니다.

보세요, 또 LLM 이야기를 하고 있지 않습니다.

무엇이든 지우면 되는 것은 아니다

다만, 이것이 "로컬 모델은 필요 없다"는 뜻은 아닙니다.

CLIP이 효과가 없었던 이유는, Tavily가 문맥에 맞는 이미지를 반환하게 되었기 때문입니다.

만약 향후에 다른 백엔드를 사용하게 되어 다시 문맥에서 벗어난 이미지가 섞이게 된다면, rerank는 다시 필요해질지도 모릅니다.

그때는 다시 넣으면 됩니다.

여기서 한 일은 "로컬 모델을 폐지하는 것"이 아닙니다.

score를 관측하여 현재 구성에서는 효과가 없음을 확인하고, 제거한 것입니다.

그뿐입니다.

토대가 바뀌면 판단도 다시 바뀝니다.

요약

이미지 후보의 rerank에 CLIP을 사용하던 시기가 있었습니다.

SearXNG가 문맥에서 벗어난 이미지를 반환하는 경우가 있어, 이를 걸러내기 위해 도입했습니다.

그때는 효과가 있었습니다.

하지만 Tavily로 바꾸자 CLIP의 score가 평준화되었습니다.

후보를 살펴보니, 벗어난 이미지는 애초에 들어오지 않고 있었습니다.

CLIP은 고장 나지 않았습니다.

CLIP이 해결하던 문제가 사라졌을 뿐입니다.

동작하는 것과 효과가 있는 것은 다릅니다.

score를 관측할 수 있었기에 효과가 없다는 것을 알아챌 수 있었습니다.

그리고 제거했습니다.

patch는 토대가 좋아지면 불필요해집니다.

그때 제거할 수 있느냐는 관측을 하고 있느냐에 따라 결정됩니다.

retrieval (검색)의 품질이 변하면, 후속 단계인 rerank의 의미도 변합니다.

따라서 rerank는 한 번 도입하면 고정하는 것이 아닙니다.

현재의 retrieval이 무엇을 반환하고 있으며, rerank가 무엇을 개선하고 있는가.

그 부분을 계속해서 관측할 필요가 있습니다.

Discussion

AI 자동 생성 콘텐츠

본 콘텐츠는 Zenn AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0