Open Llama设置temperature参数无效,生成内容重复如何解决?
问题:Open Llama设置temperature后生成内容仍完全相同
我尝试使用Open Llama,设置非零temperature参数来生成给定提示词的多个不同续写,代码如下:
import re import torch from transformers import LlamaTokenizer, LlamaForCausalLM model_path = 'openlm-research/open_llama_3b_v2' tokenizer = LlamaTokenizer.from_pretrained(model_path) model = LlamaForCausalLM.from_pretrained(model_path, torch_dtype=torch.float16, device_map='auto') text = 'Once upon a time ' text_tokenized_for_llm = tokenizer(text, return_tensors="pt").input_ids for i in range(25): result = model.generate(input_ids=text_tokenized_for_llm, max_new_tokens=6, temperature=2) text = tokenizer.decode(result[0]) print('->' + text + '<-')
但运行程序后,所有续写内容完全相同:
-><s>Once upon a time 100 years ago,<- -><s>Once upon a time 100 years ago,<- -><s>Once upon a time 100 years ago,<- (...)
原因及解决方法
核心原因:未启用随机采样模式
model.generate()默认使用贪婪搜索,此时temperature参数会被直接忽略,模型每次都会选择概率最高的token序列,因此生成结果完全一致。必须显式设置do_sample=True,才能让温度参数生效,开启随机采样逻辑。次要问题:重复使用初始输入(可选调整)
你的代码中,每次生成都依赖提前tokenized好的初始提示text_tokenized_for_llm——如果需求是基于同一个初始提示生成不同续写,这没问题;如果是想基于上一次的生成结果继续续写,需要每次更新输入的token_ids。
修改后的代码
import torch from transformers import LlamaTokenizer, LlamaForCausalLM model_path = 'openlm-research/open_llama_3b_v2' tokenizer = LlamaTokenizer.from_pretrained(model_path) model = LlamaForCausalLM.from_pretrained(model_path, torch_dtype=torch.float16, device_map='auto') # 初始提示 prompt = 'Once upon a time ' input_ids = tokenizer(prompt, return_tensors="pt").input_ids.to(model.device) for i in range(25): # 关键:添加do_sample=True启用随机采样,temperature参数才会生效 result = model.generate( input_ids=input_ids, max_new_tokens=6, temperature=2.0, do_sample=True, # 可选:搭配top_p增强多样性,或设置seed控制随机性 # top_p=0.95, # seed=torch.randint(0, 1000, (1,)).item() ) # 跳过特殊token,让输出更干净 generated_text = tokenizer.decode(result[0], skip_special_tokens=True) print(f'->{generated_text}<-')
补充说明
temperature=2.0属于较高温度,生成内容的随机性很强,可能出现逻辑混乱的情况,可根据需求调整到0.5-1.5区间,平衡多样性与合理性。- 搭配
top_p参数(如top_p=0.95)可以限制采样的候选token范围,避免生成完全无意义的内容。 - 若需要固定随机性以复现结果,可设置固定的
seed值;若需要每次完全随机,可每次生成不同的seed或不指定。
内容的提问来源于stack exchange,提问作者user983447
相关产品推荐
相关产品推荐

