Vespa Ranking — 매칭 문서 점수화와 단계 랭킹

Vespa Ranking — 매칭 문서 점수화와 단계 랭킹

Ranking(랭킹)은 질의 실행 중 매칭된 문서에 대해 수행하는 계산이에요. 스키마의 rank profiles 에 랭킹 함수로 지정합니다. first-phase 라는 특별한 함수가 매칭의 초기 rank를 정해서, 질의에 대한 응답으로 상위 k개를 고를 수 있게 해줘요.

출처: https://docs.vespa.ai/en/basics/ranking.html

 rank-profile my-rank-profile {
   first-phase {
     expression: 0.7 * bm25(text) + 0.3 * attribute(popularity)
   }
 }

랭킹 함수와 피처

랭킹 함수는 텐서 수학과 머신러닝 모델을 포함해 랭크 피처를 조합한 어떤 수학 함수든 될 수 있어요. 랭크 피처는 세 범주로 나뉩니다.

  • Document features: attribute(fieldName) — 행indexing에 attribute가 있는 문서 필드
  • Query features (inputs): query(name) — 질의와 함께 input으로 보낸 값. 텐서(스칼라가 아닌)면 랭크 프로필에 input으로 선언해야 함
  • Match features: 질의와 문서가 얼마나 잘 매칭되는지 말해주는 내장 피처 (예: bm25, closeness)

텐서인 질의 피처는 랭크 프로필에 선언돼야 해요.

 rank-profile my-rank-profile {
   inputs {
     query(user_context) tensor<float>(x[3])
   }
   first-phase {
     expression: bm25(text) + sum(query(user_context) * attribute(document_context))
   }
 }

이렇게 해서 벡터 검색의 질의 벡터 타입도 선언됩니다.

Rank Profiles

스키마는 여러 랭크 프로필을 가질 수 있고, 질의는 ranking.profile 파라미터(또는 질의 프로필)로 하나를 선택해요. 요청에 지정이 없으면 default를 쓰고, 그마저 없으면 nativeRank 피처로 기본 랭킹합니다. 내장 프로필 unranked도 항상 사용 가능한데, 순서가 중요하지 않아 랭킹이 필요 없는 질의에서 서빙 성능을 높여줘요.

rank-profile myProfile inherits default, another 처럼 상속으로 중복을 피할 수도 있어요.

단계 랭킹(Phased Ranking)

first-phase가 매칭 중 모든 문서에 적용되는 초기 랭킹이라면, 프로필은 상위 k 문서를 재랭킹(rerank) 하는 함수도 지정할 수 있어요.

 schema myapp {
   rank-profile my-rank-profile {
     first-phase {
       expression: attribute(quality) * freshness(timestamp) + bm25(title)
     }
     second-phase {
       expression: xgboost(my_xgboost_reranker)
       total-rerank-count: 1000   # Over all nodes
     }
     global-phase {
       expression: sum(onnx(my_large_onnx_model))
       rerank-count: 20
     }
   }
 }

second-phase는 콘텐츠 노드에서 로컬 데이터로 실행돼 수천 후보에 효율적이고, global-phase는 병합 후 전역 결과 집합에 대해 컨테이너 노드에서 실행되며 매우 비싸고 고품질인 최종 재랭킹에 적합해요.

ML 모델 추론

훈련 데이터에서 머신러닝으로 관련성 함수를 학습하는 게 최고 품질을 냅니다. Vespa는 분산 랭킹(first/second phase)에서 다음 형식의 ML 모델을 쓸 수 있어요.

이들은 랭크 피처로 노출되므로 다른 랭크 피처처럼 랭킹 표현식에서 바로 쓸 수 있어요.

더 알아보기