如何让Salesforce/codegen-350M-mono本地生成结果与API一致?
解决Salesforce/codegen-350M-mono本地生成文本过短的问题
核心调整方案
1. 修复attention_mask缺失问题
本地输出的警告明确提示未设置attention_mask,这会导致模型生成逻辑不稳定。修改输入处理代码,补充该参数:
# 替换原input_ids生成代码 inputs = tokenizer(text, return_tensors="pt") input_ids = inputs["input_ids"].to(device) attention_mask = inputs["attention_mask"].to(device)
后续在model.generate中传入attention_mask参数。
2. 调整生成参数以延长输出并匹配API逻辑
默认的generate方法采用greedy搜索模式,且生成长度受限,容易过早终止在return语句。需添加以下关键参数:
max_new_tokens:指定最大生成新token数,设置为50及以上保证足够长度do_sample:启用采样模式,替代greedy搜索,避免过早停止temperature:调整生成随机性,非0值会让输出更灵活(API通常使用此类设置)top_p:核采样,控制生成内容的多样性
修改后的生成调用代码:
generated_ids = model.generate( input_ids, attention_mask=attention_mask, max_new_tokens=50, temperature=0.7, top_p=0.95, do_sample=True, pad_token_id=tokenizer.eos_token_id )
3. 显式指定pad_token_id
虽然代码已设置tokenizer.pad_token = tokenizer.eos_token,但在generate中显式指定该参数可彻底消除警告并避免潜在异常。
完整修改代码
import datasets from transformers import AutoModelForCausalLM, AutoTokenizer checkpoint = "Salesforce/codegen-350M-mono" device = "cpu" tokenizer = AutoTokenizer.from_pretrained(checkpoint) tokenizer.pad_token = tokenizer.eos_token model = AutoModelForCausalLM.from_pretrained(checkpoint, trust_remote_code=True).to(device) text = """def round_to_multiple(num, mult): \"\"\"Rounds to nearest multiple of another number.\"\"\" """ # 生成包含attention_mask的输入 inputs = tokenizer(text, return_tensors="pt") input_ids = inputs["input_ids"].to(device) attention_mask = inputs["attention_mask"].to(device) # 调整生成参数 generated_ids = model.generate( input_ids, attention_mask=attention_mask, max_new_tokens=50, temperature=0.7, top_p=0.95, do_sample=True, pad_token_id=tokenizer.eos_token_id ) print(tokenizer.decode(generated_ids[0], skip_special_tokens=True))
参数微调建议
- 若需要更长输出,可增大
max_new_tokens(如设为100) - 若希望生成更严谨的代码,可降低
temperature(如设为0.3) - 若追求更多样的输出,可提高
temperature并调整top_p值
内容的提问来源于stack exchange,提问作者matsuo_basho
相关产品推荐
相关产品推荐

