跳到内容

生成式打分

/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 归一化概率。

工作原理

  1. 提示词构建:针对每个项目,构建 prompt = query + item(如果 item_first=true 则为 item + query
  2. 前向传播:在每个提示词上运行模型以获取下一个 Token 的 Logits
  3. 概率提取:提取指定 label_token_ids 的 Logprobs
  4. Softmax 归一化:仅对标签 Token 应用 softmax(当 apply_softmax=true 时)
  5. 得分:返回第一个标签 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}
}