Rerank 사용 모범 사례

Rerank 사용 모범 사례 (Best Practices)

Rerank 엔드포인트의 성능을 최적화하기 위한 팁을 알아볼 거예요. 문서 수, 문서당 토큰 수, 쿼리당 토큰 수에 대한 제약을 다룬답니다.

출처: 문서

성능 최적화

다음 표에서 Rerank v4.0, v3.5, v3.0에서 최상의 성능을 얻기 위한 권장 사항을 확인할 수 있어요.

Constraint Minimum Maximum Default Value
Number of Documents 1 10,000 N/A
Max Number of Chunks 1 N/A 1
Number of Tokens per Document 1 N/A (see belowfor more info) N/A
Number of Tokens per Query 1 2048 N/A

문서 청킹 (Document Chunking)

Cohere의 Rerank 모델은 특정한 절차에 따라 문서를 청크로 나누는데, 그 과정은 대략 다음과 같아요.

  • 컨텍스트 윈도우를 가져옵니다;
  • 예약된 토큰(reserved tokens)을 뺍니다 (예약 토큰 수는 모델마다 달라요)

rerank-v4.0 ('pro'와 'fast' 모두)의 경우, 모델은 문서를 32,764-토큰 청크로 나눠요 (이는 컨텍스트 길이 32,768에서 4개의 특수 예약 토큰을 뺀 값이에요). 예를 들어 쿼리가 100 토큰이고 문서가 100,000 토큰이라면, 문서는 다음과 같은 청크로 나뉘게 돼요.

  1. relevance_score_1 = <padding_tokens, query[0,99], document[0,32663]>
  2. relevance_score_2 = <padding_tokens, query[0,99], document[32664,65327]>
  3. relevance_score_3 = <padding_tokens, query[0,99], document[65328,97990]>
  4. relevance_score_4 = <padding_tokens, query[0,99], document[97991,99999]>
  5. relevance_score = max(relevance_score_1, relevance_score_2, relevance_score_3, relevance_score_4)

참고 (Note)

컨텍스트 길이 32,768은 대략 ~48-50페이지에 해당하므로, 보통 업로드하는 대부분의 문서보다 길어요. 즉 rerank-v4.0 모델은 문서 전체를 살펴본 뒤 순위를 매기게 돼요.

rerank-v3.5와 rerank-v3.0의 경우 과정은 동일하지만 문서를 4093-토큰 청크로 나눠요. 예를 들어 쿼리가 100 토큰이고 문서가 10,000 토큰이라면, 다음과 같은 청크로 나뉘게 돼요.

  1. relevance_score_1 = <padding_tokens, query[0,99], document[0,3992]>
  2. relevance_score_2 = <padding_tokens, query[0,99], document[3993,7985]>
  3. relevance_score_3 = <padding_tokens, query[0,99], document[7986,9999]>
  4. relevance_score = max(relevance_score_1, relevance_score_2, relevance_score_3)

청킹 방식을 더 세밀하게 제어하고 싶다면 직접 문서를 청크로 나누는 것을 권장해요.

최대 문서 수 (Max Number of Documents)

rerank-v4.0-pro, rerank-v4.0-fast, rerank-v3.5, rerank-v3.0 모델을 사용할 때 한 번에 10,000개가 넘는 문서를 전달하려고 하면 엔드포인트가 오류를 던져요. 엔드포인트에 전달할 수 있는 최대 문서 수는 다음 부등식으로 계산돼요: Number of documents * max_chunks_per_doc >10,000.

Number of documents * max_chunks_per_doc 값이 10,000을 초과하면 엔드포인트는 오류를 반환해요. 기본적으로 rerank 모델의 max_chunks_per_doc은 1로 설정돼 있어요.

쿼리 (Queries)

rerank-v4.0 모델 ('pro'와 'fast' 모두)은 32,768 토큰의 컨텍스트 길이로 훈련됐어요. 모델은 이 한도에 대해 계산할 때 *쿼리(query)*와 *문서(document)*를 모두 고려하며, 쿼리는 전체 컨텍스트 길이의 최대 절반까지 차지할 수 있어요. 즉 쿼리가 16,384 토큰보다 크다면, 첫 16,384 토큰으로 잘려나가요 (나머지 16,384는 문서에 쓰여요).

rerank-v3.5와 rerank-v3.0 모델은 4096 토큰의 컨텍스트 길이로 훈련됐기 때문에 과정은 동일하지만 계산이 달라요. 쿼리가 2048 토큰보다 크다면 첫 2048 토큰으로 잘려나가요 (나머지 2048은 문서에 쓰여요).

구조화된 데이터 지원 (Structured Data Support)

rerank-v4.0-pro, rerank-v4.0-fast, rerank-v3.5, rerank-v3.0 모델은 YAML 문자열 목록으로 포맷된 구조화된 데이터의 재정렬을 지원해요. 긴 문서 문자열은 잘려나가기 때문에 키(key)의 순서가 특히 중요하다는 점에 유의해 주세요. 딕셔너리에서 YAML 문자열을 만들 때는 순서를 유지하도록 해야 해요. Python에서는 yaml.dump를 사용할 때 sort_keys=False를 설정해서 순서를 유지할 수 있어요.

예시:

import yaml

docs = [
    {
        "Title": "How to fix a dishwasher",
        "Author": "John Smith",
        "Date": "August 1st 2023",
        "Content": "Fixing a dishwasher depends on the specific problem you're facing. Here are some common issues and their potential solutions:....",
    },
    {
        "Title": "How to fix a leaky sink",
        "Date": "July 25th 2024",
        "Content": "Fixing a leaky sink will depend on the source of the leak. Here are general steps you can take to address common types of sink leaks:.....",
    },
]

yaml_docs = [yaml.dump(doc, sort_keys=False) for doc in docs]

결과 해석하기 (Interpreting Results)

Rerank API 엔드포인트에서 가장 중요한 출력은 응답 객체에 노출된 절대 순위(rank)예요. 점수는 쿼리에 의존적이라서, 보내는 쿼리와 구절(passages)에 따라 더 높거나 낮을 수 있어요.

관련성 점수는 [0, 1] 범위로 정규화돼요. 1에 가까운 점수는 쿼리와의 관련성이 높음을, 0에 가까운 점수는 관련성이 낮음을 나타내요. 이는 순위 매기기(ranking) 목적으로 사용되지만, 실제 숫자를 해석할 때는 주의해야 해요. 관련성 점수가 0.9109375인 문서가 관련성 점수 0.04421997인 문서보다 두 배 더 관련성이 있다고 단정할 수는 없어요.

점수에 대한 임계값(threshold)을 정해 문서가 관련성 있는지 여부를 판단하려면 다음 과정을 따르는 것을 권장해요.

  • 도메인에서 대표적인 쿼리 30-50개 집합 Q=[q_0, … q_n]을 선택합니다.
  • 각 쿼리에 대해 여러분의 특정 사용 사례에서 경계선상으로 관련성이 있다고 간주되는 문서를 하나씩 제공하고, (query, document) 쌍의 목록 sample_inputs=[(q_0, d_0), …, (q_n, d_n)]을 만듭니다.
  • sample_inputs의 모든 튜플을 루프에서 rerank 엔드포인트에 전달하고, 관련성 점수 sample_scores=[s0, ..., s_n]을 모읍니다.

sample_scores의 평균은 관련성 없는 문서를 걸러내기 위한 임계값을 정할 때 참고 기준으로 사용할 수 있어요.

더 알아보기 (Learn more)