RAG 시스템의 리랭커, 인코더를 넘어 디코더로!

안녕하세요, 개발자 여러분! AI 시대에 살아남는 것을 넘어 AI를 '공급'하는 개발자가 되기 위한 여정, 오늘 뉴런데브에서는 RAG(Retrieval Augmented Generation) 시스템의 핵심 구성 요소 중 하나인 리랭커(Reranker)에 대해 깊이 파고들어 보겠습니다.
특히, 기존 인코더 기반 리랭커의 한계점을 짚어보고, 왜 우리가 디코더 기반 리랭커로 나아가야 하는지 명확하게 설명해 드릴게요.

1. RAG 시스템의 기본적인 흐름과 리랭커의 역할

RAG 시스템은 사용자 질의에 답변하기 위해 다음과 같은 기본적인 흐름을 가집니다.

  • 사용자 질의 임베딩: 사용자의 질문(예: "LLM의 토크나이저를 설명해 줘")이 들어오면, 이 질문은 임베딩(Embedding) 과정을 통해 숫자의 배열, 즉 벡터로 변환됩니다.
    이 벡터의 차원(숫자의 개수)이 클수록 더 많은 의미를 내포할 수 있으며, 이는 모델의 성능과 직결됩니다.
    임베딩은 코사인 유사도 계산을 위해 정규화 과정을 거치는데, 이는 벡터의 크기를 통일하여 순수하게 각도상의 유사도만을 비교할 수 있게 해줍니다.

  • 벡터 DB 검색: 임베딩된 사용자 질의 벡터를 벡터 DB에 넣어 유사한 문서를 검색합니다. 이 과정에서 N개의 검색 결과가 나오는데, 각 결과는 질의와의 유사도 점수와 함께 제공됩니다.

  • 리랭킹 (Reranking): 여기서 리랭커의 역할이 중요해집니다.
    벡터 DB에서 나온 N개의 검색 결과는 단순 유사도만을 기반으로 하므로, 실제 질의 의도와는 다소 거리가 있는 문서나 중복된 내용이 포함될 수 있습니다.
    리랭커는 이 N개의 결과를 다시 평가하여, 질의와 더 관련성이 높은 X개의 문서만 추출하고 나머지는 버리는 역할을 합니다.

  • 프롬프트 증강 및 최종 답변 생성: 리랭커를 통해 추출된 X개의 정보를 시스템 프롬프트에 추가하고, 사용자 질의와 함께 LLM(Large Language Model)에 전달하여 최종 답변을 생성합니다.

2. 인코더 기반 리랭커의 문제점: 왜 한계에 부딪히는가?

기존 리랭커는 주로 크로스 인코더(Cross Encoder) 모델을 사용했습니다.
크로스 인코더는 쿼리와 패시지(문서 내용)를 함께 입력받아 유사도 점수를 출력하는 방식으로 학습됩니다.
이는 학습 방법론을 의미하며, 보통 리랭커로 사용하기 위해 특별히 학습된 모델들입니다.
예를 들어, MS에서 공개한 마르코 패시지 랭킹(MARCO Passage Ranking) 데이터셋이 이러한 학습에 널리 활용됩니다.

하지만 인코더 기반 리랭커는 다음과 같은 치명적인 문제점을 가지고 있습니다.

  • 높은 호출 비용 및 속도 저하: N개의 검색 결과가 있다면, 인코더 기반 리랭커는 N번만큼 개별적으로 호출되어야 합니다.
    이는 비용과 처리 속도 면에서 큰 부담이 됩니다.
    검색 결과가 40개라면 40번, 100개라면 100번을 호출해야 하는 것이죠.

  • 통합적인 판정 불가: 인코더는 쿼리와 패시지를 개별적으로 비교하기 때문에, 문서 간의 중복 내용이나 상대적 중요성을 파악하기 어렵습니다.
    예를 들어, 거의 비슷한 내용의 청크가 여러 개 나왔을 때, 인코더는 이들을 개별적으로 평가하여 모두 상위 랭크에 올릴 수 있습니다.
    전체 검색 결과를 한 번에 고려하지 못한다는 것이 큰 단점입니다.
    메타데이터 반영이나 특정 정책(예: 정치적 내용 배제) 적용도 불가능합니다.

  • 도메인 지식 주입의 어려움: 인코더는 쿼리와 패시지 외에 다른 입력을 받지 못합니다. 즉, 프롬프트 형태로 추가적인 지시나 도메인 지식을 주입할 수 없습니다.
    특정 도메인(예: 삼성전자의 이재용 일가 관련 내용)의 중요도를 높게 평가하고 싶다면, 해당 도메인에 맞게 모델을 다시 학습시키는 수밖에 없습니다.
    이는 현실적으로 매우 번거롭고 어려운 일입니다.

  • 미국 중심의 상식 반영: 대부분의 인코더 기반 모델은 미국 중심의 데이터로 학습되었기 때문에, 유사도 평가 기준이 미국의 상식에 맞춰져 있습니다.
    독도 문제와 같이 지역적, 문화적 특수성이 반영되어야 하는 경우, 인코더 기반 리랭커는 적절하지 않은 결과를 낼 수 있습니다.

3. 디코더 기반 리랭커의 등장: 인코더의 한계를 극복하다!

인코더 기반 리랭커의 이러한 문제점들을 극복하기 위해, 우리는 디코더 기반 리랭커로 눈을 돌려야 합니다.
디코더 모델은 인코더보다 느릴 것이라는 오해가 있지만, 오히려 훨씬 더 유연하고 강력한 리랭킹 기능을 제공합니다.

  • 효율적인 호출: 디코더는 긴 컨텍스트 입력을 지원합니다.
    예를 들어, GPT-4o 같은 최신 모델은 128K(A4 용지 50장 분량)의 컨텍스트를 한 번에 처리할 수 있습니다.
    이는 N개의 검색 결과를 한 번의 호출로 모두 입력하여 랭킹을 매길 수 있다는 의미입니다.
    여러 번 호출할 필요가 없어 비용과 속도 면에서 훨씬 효율적입니다.

  • 프롬프트를 통한 완벽한 제어: 디코더는 프롬프트를 통해 상세한 지시와 정책을 전달할 수 있습니다.
    "중복된 내용은 생략한다", "정치적인 문제는 배제한다" 와 같은 구체적인 명령을 통해 리랭킹 과정에 적극적으로 개입할 수 있습니다.
    이는 도메인 지식 주입이 어렵던 인코더의 한계를 완벽하게 해소합니다.

  • 작은 모델로도 충분한 성능: 비용이 부담되거나 로컬 환경에서 사용해야 하는 경우, 4K, 16K, 32K 등 확장된 컨텍스트를 지원하는 작은 파라미터의 디코더 모델(예: 겟마 3 4B)을 활용할 수 있습니다.
    이러한 모델들은 VRAM 사용량이 적어 일반 PC에서도 구동 가능하며, 짧은 출력을 할 때는 충분히 좋은 성능을 보여줍니다.

  • 최신 AI 기술 반영: 버트(BERT) 기반의 인코더 모델은 다소 정체되어 있는 반면, 디코더 기반 모델들은 지속적으로 발전하고 있습니다.
    따라서 최신 모델을 활용하는 디코더 기반 리랭커가 인코더 기반 리랭커보다 더 좋은 성능을 기대할 수 있습니다.

LLM 리랭커 프롬프트 예시

너는 RAG 검색 결과를 재정렬하는 고정밀 판단자 역할을 수행해야 합니다.
입력으로 주어진 쿼리와 RAG 검색 결과 문서들(1에서 N)을 비교해서,
쿼리와 의미적으로 관련이 깊은 순서대로 문서 번호를 나열해 주세요.

**평가 지침:**
- 같은 유형의 문서가 여러 개 있으면 더 좋은 것만 선택하고 나머지는 제외합니다.
- 쿼리의 의도를 파악하여 의도에 직접적으로 응답하는 문서를 더 우선순위로 평가합니다.
- 문장 길이, 디테일보다는 내용의 적합성을 더 우선시합니다.
- 정치적인 내용은 배제합니다. (추가 지시 예시)

**입력 포맷:**
쿼리: [사용자 질의]
문서 1: [문서 내용 1]
문서 2: [문서 내용 2]
...
문서 N: [문서 내용 N]

**출력 포맷:**
관련 문서 번호: [번호, 번호, ...]

결론: AI 시대, 우리는 '공급자'가 되어야 합니다.

개발자 여러분, AI 시대에 단순히 코파일럿이나 ChatGPT를 '잘 쓰는' 사용자로 머물러서는 안 됩니다. 우리는 AI를 '만드는' 공급자가 되어야 합니다.
이는 LLM을 이용한 시스템을 구축하고, 그 핵심이 되는 신경망(모델)의 동작 원리를 이해하며, 필요하다면 직접 모델을 튜닝할 수 있는 능력을 갖춰야 한다는 의미입니다.

RAG 시스템에서 리랭커는 단순한 부가 기능이 아니라, 사용자가 진정으로 원하는 답변을 제공하기 위한 필수적인 단계입니다.
인코더 기반 리랭커의 한계를 명확히 인지하고, 디코더 기반 리랭커의 강력한 유연성과 성능을 적극적으로 활용하여 더 정교하고 사용자 친화적인 RAG 시스템을 구축하시길 바랍니다.

profile
꾸준히, 의미있는 사이드 프로젝트 경험과 문제해결 과정을 기록하기 위한 공간입니다.

0개의 댓글