推理与采样策略
为什么每次回答不一样?
LLM 每次生成的过程:
1. 计算下一个词的概率分布(词表中各Token的概率)
2. 采样:按概率随机抽一个词
3. 将该词加入输入,重复上述过程
由于第2步是随机的,所以结果可能不同,不保证每次都不同。
---
nanoGPT 的生成代码
@torch.no_grad()
def generate(self, idx, max_new_tokens, temperature=1.0, top_k=None):
for _ in range(max_new_tokens):
# 截断到 block_size
idx_cond = idx if idx.size(1) <= self.config.block_size else idx[:, -self.config.block_size:]
# 前向传播,获取 logits
logits, _ = self(idx_cond)
logits = logits[:, -1, :] / temperature # 只取最后一步,除以温度
# Top-k 过滤
if top_k is not None:
v, _ = torch.topk(logits, min(top_k, logits.size(-1)))
logits[logits < v[:, [-1]]] = -float('Inf')
# Softmax → 概率
probs = F.softmax(logits, dim=-1)
# 采样
idx_next = torch.multinomial(probs, num_samples=1)
idx = torch.cat((idx, idx_next), dim=1)
return idx
---
Temperature(温度)
控制概率分布的"尖锐程度":
Temperature = 0.1(低温):概率集中在最高分的词,概率更集中,但仍可能随机采样且不保证正确
Temperature = 1.0(默认):原始概率分布,平衡
Temperature = 2.0(高温):概率分布更均匀,输出随机、创意
直觉类比:
历史参数示例,未经法律正确性验证:
---
Top-k 采样
只从概率最高的 k 个词中采样,排除长尾低概率词。
k=1:贪心解码(最确定,但容易重复)
k=50:一个可选示例,并非所有GPT-2实现的默认值
k=全量:等同于纯采样
---
Top-p(Nucleus)采样
从概率累计达到 p 的最小词集合中采样。
p=0.9:取概率和达到 90% 的最少词汇集合
自适应性更好:置信度高时集合小(接近贪心),置信度低时集合大(更随机)。
---
历史API示意(未作当前接口兼容验证,不是本项目执行入口)
# 法律文书生成(精确、保守)
response = client.messages.create(
model="claude-opus-4-6",
temperature=0.3,
top_p=0.9,
...
)
# 法律研究头脑风暴(发散思维)
response = client.messages.create(
model="claude-opus-4-6",
temperature=0.8,
...
)
---
相关页面
来源
本轮核查来源与限制(2026-09-17)
只修本轮明确列出的陈述,不将旧页整篇升级为已验证。themis_only为本地保存和禁止外发的兼容标记,不代表本地模型推理。