使用Hugging Face文本生成模型(GALACTICA/OPT)出现重复文本的问题咨询
文本生成模型输出重复问题的解决方法
核心问题分析
你遇到的长文本重复问题,主要源于默认生成策略(贪心采样)易陷入局部最优,且缺少重复抑制参数,导致模型不断复用已生成内容。结合你测试的GALACTICA和OPT模型,可通过以下参数调整解决:
具体优化方案
添加重复惩罚参数
在model.generate()中加入repetition_penalty(建议值1.1-1.5),降低模型重复生成已有文本的概率。修改后的GALACTICA代码示例:from transformers import AutoTokenizer, OPTForCausalLM tokenizer = AutoTokenizer.from_pretrained("facebook/galactica-1.3b") model = OPTForCausalLM.from_pretrained("facebook/galactica-1.3b", device_map="auto") input_text = "The benefits of deadlifting\n\n" input_ids = tokenizer(input_text, return_tensors="pt").input_ids.to("cuda") outputs = model.generate( input_ids, new_doc=False, top_p=0.7, max_length=1000, repetition_penalty=1.2, # 新增重复惩罚参数 do_sample=True # 开启采样模式,避免贪心采样的重复问题 ) print(tokenizer.decode(outputs[0]))启用采样策略并调整温度
默认贪心采样(do_sample=False)会每次选择概率最高的token,极易引发重复。开启do_sample=True后,搭配temperature(建议值0.8-1.0)调整随机性,同时可结合top_k限制候选token范围。修改OPT模型的生成代码:from transformers import GPT2Tokenizer, OPTForCausalLM model = OPTForCausalLM.from_pretrained("facebook/opt-350m") tokenizer = GPT2Tokenizer.from_pretrained("facebook/opt-350m") prompt = "The benefits of deadlifting can be listed as below:" inputs = tokenizer(prompt, return_tensors="pt") # Generate generate_ids = model.generate( inputs.input_ids, max_length=800, do_sample=True, temperature=0.9, top_k=50, repetition_penalty=1.2 ) print(tokenizer.batch_decode(generate_ids, skip_special_tokens=True, clean_up_tokenization_spaces=False)[0])禁止重复n元组
添加no_repeat_ngram_size=2(或3),让模型避免生成重复的2元/3元短语,从根源阻断短文本重复:outputs = model.generate( input_ids, new_doc=False, top_p=0.7, max_length=1000, no_repeat_ngram_size=2, do_sample=True )模型与prompt优化
- 小参数模型(如OPT-350m)长文本生成能力有限,可尝试同系列更大参数模型(如OPT-1.3B);
- 优化prompt结构,加入具体引导,比如将prompt改为:"The benefits of deadlifting include multiple aspects: 1. Muscular development: ",给模型明确的输出框架,减少重复概率。
内容的提问来源于stack exchange,提问作者Furkan Gözükara
相关产品推荐
相关产品推荐

