使用Hugging Face DialoGPT模型遇警告及生成幻觉问题求助
解决DialoGPT的padding警告与重复生成问题
问题根源
- Padding警告:Decoder-only架构(如DialoGPT)要求左padding,若仅在初始化后修改
padding_side,配置可能未完全生效;且DialoGPT默认未定义pad_token,需手动绑定为eos_token才能让左padding正常工作。 - 重复生成(幻觉):默认
generate采用贪心搜索策略,极易导致输出重复,需通过采样参数调整随机性并添加重复惩罚。
修复代码与说明
1. 正确初始化Tokenizer
在加载tokenizer时直接指定左padding,并绑定pad_token:
from transformers import AutoModelForCausalLM, AutoTokenizer import torch # 初始化时直接配置padding_side,确保生效 tokenizer = AutoTokenizer.from_pretrained( "microsoft/DialoGPT-medium", padding_side='left' ) # DialoGPT无默认pad_token,绑定为eos_token以支持padding tokenizer.pad_token = tokenizer.eos_token model = AutoModelForCausalLM.from_pretrained("microsoft/DialoGPT-medium")
2. 优化生成参数解决重复问题
调整model.generate的参数,开启采样并添加重复惩罚:
chat_history_ids = None for step in range(5): new_user_input = input(">> User:") new_user_input_ids = tokenizer.encode( new_user_input + tokenizer.eos_token, return_tensors='pt' ) # 拼接对话历史 bot_input_ids = torch.cat([chat_history_ids, new_user_input_ids], dim=-1) if step > 0 else new_user_input_ids # 优化生成逻辑,避免重复输出 chat_history_ids = model.generate( bot_input_ids, max_length=1000, pad_token_id=tokenizer.eos_token_id, do_sample=True, # 开启采样模式,替代贪心搜索 temperature=0.7, # 控制生成随机性,0.5-1.0平衡连贯与多样 top_p=0.9, # 核采样,仅考虑概率前90%的token repetition_penalty=1.2 # 对已生成token施加惩罚,降低重复概率 ) # 解码并打印回复 response = tokenizer.decode( chat_history_ids[:, bot_input_ids.shape[-1]:][0], skip_special_tokens=True ) print(f"DialoGPT: {response}")
关键修改点
- Tokenizer配置:在
from_pretrained阶段直接传入padding_side='left',确保底层配置生效;绑定pad_token是左padding正常工作的必要条件。 - 生成策略调整:通过
do_sample=True开启采样,搭配temperature和top_p控制输出多样性,repetition_penalty直接抑制重复内容生成。
内容的提问来源于stack exchange,提问作者Baraa Zaid
相关产品推荐
相关产品推荐

