生成式打分¶
/generative_scoring 端点使用 CausalLM 模型(例如 Llama、Qwen、Mistral)来计算特定 Token ID 作为下一个 Token 出现的概率。每个项目(文档)都会与查询拼接形成提示词(prompt),模型会预测在该提示词之后,每个标签 Token 作为下一个 Token 的可能性。这让您可以根据查询为项目打分 —— 例如,提问“这是法国的首都吗?”,并通过模型回答“Yes”的可能性为每个城市打分。
当服务器启动生成模型(任务为 "generate")时,此端点会自动可用。它与基于池化(pooling-based)的 Score API 是分开的,后者使用交叉编码器(cross-encoder)、双编码器(bi-encoder)或后期交互(late-interaction)模型。
要求
label_token_ids参数是必填项,且必须包含至少 1 个 Token ID。- 当提供 2 个标签 Token 时,分值等于
P(label_token_ids[0]) / (P(label_token_ids[0]) + P(label_token_ids[1]))(对这两个标签进行 softmax)。 - 当提供更多标签时,分值是第一个标签 Token 在所有标签 Token 中的 softmax 归一化概率。
工作原理¶
- 提示词构建:针对每个项目,构建
prompt = query + item(如果item_first=true则为item + query) - 前向传播:在每个提示词上运行模型以获取下一个 Token 的 Logits
- 概率提取:提取指定
label_token_ids的 Logprobs - Softmax 归一化:仅对标签 Token 应用 softmax(当
apply_softmax=true时) - 得分:返回第一个标签 Token 的归一化概率
查找 Token ID¶
要查找标签的 Token ID,请使用分词器(tokenizer)
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}")
示例¶
curl -X POST https://: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" 等提示词。模型随后预测下一个 Token,分值反映了 “Yes”(Token 9454)相对于 “No”(Token 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}
}