생성 스코어링
생성 스코어링 (Generative Scoring)
생성형 모델의 다음 토큰 확률을 이용해, 쿼리와 항목 사이의 관련성을 점수로 매길 수 있어요. 이게 /generative_scoring 엔드포인트예요. 예를 들어 "이 도시가 프랑스의 수도인가요?"라는 질문에 각 도시가 "Yes"로 답할 확률을 점수로 쓰는 식이죠. pooling 기반 Score API와 어떻게 다른지부터 알아볼게요.
/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)
- 프롬프트 구성: 각 항목에 대해
prompt = query + item을 만든다 (item_first=true면item + query). - Forward pass: 각 프롬프트에서 모델을 실행해 다음 토큰 logits를 얻는다.
- 확률 추출: 지정된
label_token_ids에 대한 logprobs를 추출한다. - Softmax 정규화: 레이블 토큰에만 softmax를 적용한다 (
apply_softmax=true일 때). - 점수: 첫 레이블 토큰의 정규화 확률을 반환한다.
토큰 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}
}