设置max_new_tokens后Huggingface LLM输出仍中断,如何获取完整结果?
解决模型输出提前中断的方案
以下是针对starchat-alpha模型输出提前中断问题的具体修复方法:
1. 强制生成至指定token数再终止
模型可能在生成过程中自发输出EOS token导致提前停止,可通过禁用EOS终止信号,确保生成满指定token数:
def infer(self, input_text, token_count): inputs = self.tokenizer.encode(input_text, return_tensors="pt").to(device) outputs = self.model.generate( inputs, max_new_tokens=token_count, pad_token_id=self.tokenizer.eos_token_id, eos_token_id=None # 忽略EOS提前终止逻辑 ) return self.tokenizer.decode(outputs[0])[len(input_text):]
注:此方法会保证输出达到指定token长度,但可能导致结尾不够自然,适合需强制完整输出的场景。
2. 避免超出模型上下文窗口限制
starchat-alpha的最大上下文窗口为8192 token,若输入prompt的token数加上生成token数超出此限制,模型会强制截断输出。需在代码中加入长度校验:
def infer(self, input_text, token_count): inputs = self.tokenizer.encode(input_text, return_tensors="pt").to(device) input_token_len = inputs.size(1) max_context_len = self.model.config.max_position_embeddings # 计算允许的最大生成token数,防止超出上下文上限 allowed_token_count = max_context_len - input_token_len token_count = min(token_count, allowed_token_count) outputs = self.model.generate( inputs, max_new_tokens=token_count, pad_token_id=self.tokenizer.eos_token_id ) return self.tokenizer.decode(outputs[0])[len(input_text):]
3. 调整生成策略提升输出完整性
采样模式下的随机性可能导致模型提前终止,改用贪婪搜索或降低温度参数,增强生成的确定性:
def infer(self, input_text, token_count): inputs = self.tokenizer.encode(input_text, return_tensors="pt").to(device) outputs = self.model.generate( inputs, max_new_tokens=token_count, pad_token_id=self.tokenizer.eos_token_id, do_sample=False, # 启用贪婪搜索,按概率最高的token生成 temperature=0.0 # 完全禁用随机性 ) return self.tokenizer.decode(outputs[0])[len(input_text):]
4. 优化prompt指令明确性
将prompt中的“输出最多300词”替换为更具引导性的指令,明确要求模型完成逻辑:
请完成以下代码与注释,保证逻辑完整,最多生成300个token:
[你的输入内容]
明确的“完成逻辑”指令比单纯的字数限制更能引导模型生成完整内容。
5. 校验EOS/PAD token配置一致性
确保tokenizer的pad_token与eos_token配置一致,避免因配置错误导致生成中断:
def __init__(self): self.tokenizer = AutoTokenizer.from_pretrained(checkpoint) self.model = AutoModelForCausalLM.from_pretrained(checkpoint, device_map='auto') # 若pad_token未设置,将其与eos_token对齐 if self.tokenizer.pad_token is None: self.tokenizer.pad_token = self.tokenizer.eos_token
内容的提问来源于stack exchange,提问作者Nikhil Verma
相关产品推荐
相关产品推荐

