생성 스코어링

생성 스코어링 (Generative Scoring)

생성형 모델의 다음 토큰 확률을 이용해, 쿼리와 항목 사이의 관련성을 점수로 매길 수 있어요. 이게 /generative_scoring 엔드포인트예요. 예를 들어 "이 도시가 프랑스의 수도인가요?"라는 질문에 각 도시가 "Yes"로 답할 확률을 점수로 쓰는 식이죠. pooling 기반 Score API와 어떻게 다른지부터 알아볼게요.

출처: vLLM 공식 문서 — serving/online_serving/generative_scoring

/generative_scoring 엔드포인트는 CausalLM 모델(예: Llama, Qwen, Mistral)을 사용해 지정된 토큰 ID가 다음 토큰으로 나타날 확률을 계산해요. 각 항목(문서)은 쿼리와 연결되어 프롬프트를 형성하고, 모델은 그 프롬프트 다음 토큰으로 각 레이블 토큰이 얼마나 나올지 예측해요. 이를 통해 쿼리에 대해 항목들에 점수를 매길 수 있어요. 예를 들어 "이 도시가 프랑스의 수도인가요?"라고 물어보고 각 도시에 대해 모델이 "Yes"라고 답할 확률로 점수를 매기는 식이에요.

이 엔드포인트는 서버가 생성형 모델(태스크 "generate")로 시작되면 자동으로 사용 가능해요. cross-encoder, bi-encoder, late-interaction 모델을 쓰는 pooling 기반 Score API와는 별개예요.

요구사항:

  • label_token_ids 파라미터는 필수이며 최소 1개의 토큰 ID가 있어야 해요.
  • 레이블 토큰이 2개 주어지면 점수는 P(label_token_ids[0]) / (P(label_token_ids[0]) + P(label_token_ids[1])) (두 레이블에 대한 softmax)예요.
  • 레이블이 더 많이 주어지면 점수는 모든 레이블 토큰에 걸친 첫 레이블 토큰의 softmax 정규화 확률이에요.

동작 원리 (How it works)

  1. 프롬프트 구성: 각 항목에 대해 prompt = query + item을 만든다 (item_first=trueitem + query).
  2. Forward pass: 각 프롬프트에서 모델을 실행해 다음 토큰 logits를 얻는다.
  3. 확률 추출: 지정된 label_token_ids에 대한 logprobs를 추출한다.
  4. Softmax 정규화: 레이블 토큰에만 softmax를 적용한다 (apply_softmax=true일 때).
  5. 점수: 첫 레이블 토큰의 정규화 확률을 반환한다.

토큰 ID 찾기 (Finding Token IDs)

레이블의 토큰 ID를 찾으려면 토크나이저를 사용하세요.

from transformers import AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen3-0.6B")
yes_id = tokenizer.encode("Yes", add_special_tokens=False)[0]
no_id = tokenizer.encode("No", add_special_tokens=False)[0]
print(f"Yes: {yes_id}, No: {no_id}")

예제 (Example)

curl -X POST http://localhost:8000/generative_scoring \
  -H "Content-Type: application/json" \
  -d '{
    "model": "Qwen/Qwen3-0.6B",
    "query": "Is this city the capital of France?",
    "items": ["Paris", "London", "Berlin"],
    "label_token_ids": [9454, 2753]
  }'

여기서 각 항목은 쿼리에 이어붙어 "Is this city the capital of France? Paris", "... London" 같은 프롬프트를 형성해요. 모델은 다음 토큰을 예측하고, 점수는 "Yes"(토큰 9454) 대 "No"(토큰 2753)의 확률을 반영해요.

{
  "id": "generative-scoring-abc123",
  "object": "list",
  "created": 1234567890,
  "model": "Qwen/Qwen3-0.6B",
  "data": [
    {"index": 0, "object": "score", "score": 0.95},
    {"index": 1, "object": "score", "score": 0.12},
    {"index": 2, "object": "score", "score": 0.08}
  ],
  "usage": {"prompt_tokens": 45, "total_tokens": 48, "completion_tokens": 3}
}

더 알아보기 (Learn more)