本文范围:只讲清
logprobs是什么、有什么用。
先看名字
logprobs可以拆成两部分:log:对数。probs:probabilities,概率。- 合起来就是
把普通概率换成对数形式来记录。
- 为什么要换一种形式:
- 模型是个
概率服务, 把模型写一句话想成连续经过很多岔路口。 - 假设前三步选中某个词的概率分别是
80%、70%、60%,这条完整路线的概率就要计算0.8 × 0.7 × 0.6。 - 句子越长,需要相乘的数字越多,最后的结果很快就会小到难以计算。
- 模型是个
log像换了一本更好算的账本:- 把
连续相乘变成连续相加。 - 概率关系没有变,只是换成更适合计算机累计的写法。
- 把
普通 API 结果告诉我模型选了什么;
logprobs还告诉我模型选得有多坚定。
可以联想到以前做可比价时的对数变换:它不改变原来的大小关系,而是把跨度很大的数换成更容易比较和计算的尺度。
一次请求和一次返回
- 任务:让 DeepSeek 判断一条用户反馈是正面还是负面。
bash
支付按钮点了三次都没反应,钱却扣了。- 请求:
logprobs: true:返回最终标签的对数概率。top_logprobs: 20:同时返回最可能的候选标签。
json
{
"model": "deepseek-v4-flash",
"thinking": {"type": "disabled"},
"messages": [
{
"role": "system",
"content": "把用户反馈分成 positive 或 negative,只返回标签。"
},
{
"role": "user",
"content": "支付按钮点了三次都没反应,钱却扣了。"
}
],
"temperature": 0,
"logprobs": true,
"top_logprobs": 20,
"max_tokens": 3
}- 返回(只展示相关字段):
message.content:DeepSeek 最终选择的标签。logprobs.content:这个标签及其它候选标签的对数概率。
json
{
"model": "deepseek-v4-flash",
"choices": [
{
"message": {
"content": "negative"
},
"logprobs": {
"content": [
{
"token": "negative",
"logprob": -0.083,
"top_logprobs": [
{
"token": "negative",
"logprob": -0.083
},
{
"token": "positive",
"logprob": -2.813
}
]
}
]
}
}
]
}- 这一去一回:
message.content = negative- 告诉我 DeepSeek 最终选了
负面。
- 告诉我 DeepSeek 最终选了
negative的logprob = -0.083- 转成
普通概率大约是92%。
- 转成
positive的logprob = -2.813- 转成
普通概率大约是6%。
- 转成
logprob越接近0,模型越偏向这个候选。
- 应用怎样使用:
- 普通返回值只给我
negative。 - 打开
logprobs后,我还能看到 DeepSeek 明显更偏向negative,而不是在两个标签之间犹豫。 - 如果两个标签的分数很接近,就交给人复核。
- 普通返回值只给我
只记住一个边界
模型选得坚定,不等于模型选得正确。
- 容易判断错的反馈:
bash
终于能付款了。- 为什么仍然可能错:
- 这句话可能是正面,也可能是在讽刺。
- 即使 DeepSeek 给出很高的分数,也可能因为缺少上下文而判断错。
logprobs的边界:- 可以帮助系统决定
自动处理还是人工复核。 - 不能证明一句话客观上一定是正面或负面。
- 可以帮助系统决定
考考你
logprobs 是什么?
它是模型生成 Token 时的对数概率,表示模型对不同候选有多偏向。
为什么要把普通概率换成对数概率?
一句话的概率需要把每个 Token 的概率连续相乘,句子越长,数字越小。取对数后,连续相乘可以变成连续相加,计算机更容易稳定计算。
它和普通返回值有什么区别?
普通返回值告诉我模型选了什么;logprobs 还告诉我模型选得有多坚定。
高 logprobs 能证明结果正确吗?
不能。它只表示模型更确定,模型仍然可能坚定地判断错。