如何使用HuggingFace的Vicuna模型生成符合预期的问答回复?
解决Vicuna模型通过HuggingFace代码调用生成质量不佳的问题
核心原因
Vicuna是基于LLaMA的对话微调模型,训练时依赖固定的对话角色格式区分用户指令与模型回复。直接输入问题文本时,模型会将其视为续写内容而非问答任务指令,导致输出偏离预期。
解决方案:使用标准对话Prompt格式
Vicuna v1.3的标准对话格式需明确区分USER和ASSISTANT角色:
USER: [你的问题/任务指令] ASSISTANT:
该格式与chat.lmsys.org GUI使用的prompt逻辑一致,能触发模型的问答能力而非续写模式。
修改后的完整代码示例
from transformers import LlamaTokenizer, AutoModelForCausalLM # 加载分词器与模型 tokenizer = LlamaTokenizer.from_pretrained("lmsys/vicuna-7b-v1.3", legacy=False) # 为LlamaTokenizer设置pad token(默认无pad token,用eos token替代) tokenizer.pad_token = tokenizer.eos_token model = AutoModelForCausalLM.from_pretrained("lmsys/vicuna-7b-v1.3") # 构建符合要求的Prompt input_text = """USER: In one sentence, describe what happened in this video transcript: Hey everyone, hope you're having a nice day. I'm looking forward to playing piano later, but how are you all? Ha ha, that's nice. Ok, let's get started. This is one of my favorite songs. Oh yeah that sounds fun. ASSISTANT:""" # 编码输入 input_ids = tokenizer(input_text, return_tensors="pt", padding=True) # 生成回复,优化生成参数提升质量 out = model.generate( **input_ids, max_new_tokens=100, temperature=0.7, # 控制输出随机性,0.7为常用合理值 top_p=0.9, do_sample=True, eos_token_id=tokenizer.eos_token_id, pad_token_id=tokenizer.pad_token_id ) # 解码输出并跳过特殊标记 result = tokenizer.decode(out[0], skip_special_tokens=True) print(result)
额外注意事项
- 模型类型选择正确:Vicuna属于因果语言模型(Causal LM),使用
AutoModelForCausalLM是正确的,AutoModelForSeq2SeqLM适用于Encoder-Decoder结构模型,不适合Vicuna。 - 生成参数优化:
temperature控制输出随机性,top_p控制采样范围,do_sample=True能让输出更自然,避免生硬重复。 - 显存优化:7B模型显存占用较高,可添加
load_in_4bit=True参数启用4位量化,降低显存需求:model = AutoModelForCausalLM.from_pretrained("lmsys/vicuna-7b-v1.3", load_in_4bit=True)
内容的提问来源于stack exchange,提问作者Marina W.
相关产品推荐
相关产品推荐

