deepseek-ai / DeepSeek-V2

DeepSeek-V2: A Strong, Economical, and Efficient Mixture-of-Experts Language Model
MIT License
3.6k stars 153 forks source link

如何让模型能够回答完问题自动停止 #60

Open hensiesp32 opened 4 months ago

hensiesp32 commented 4 months ago

我在对deepseekv2-lite进行问答推理时,发现模型输出必须达到max-new-token的数量才会停止回答。我如何让模型回答完问题就自动停止,而不继续输出其他不相关的回答呢?下面是我的一个例子:

config = AutoConfig.from_pretrained(args.model_name, trust_remote_code = True)
config._attn_implementation = "flash_attention_2"
model = AutoModelForCausalLM.from_pretrained(args.model_name,
                                                    torch_dtype = torch.float16,
                                                    device_map = 'auto',
                                                    trust_remote_code = True)
  tokenizer = AutoTokenizer.from_pretrained(args.model_name, trust_remote_code=True)
  model.generation_config = GenerationConfig.from_pretrained(args.model_name)
  model.generation_config.pad_token_id = model.generation_config.eos_token_id
  text = "世界上最高山是哪座?不要回答其他内容。"
  messsages = [{"role":"user",
                "content":text}]
  inputs = tokenizer.apply_chat_template(messsages,add_generation_prompt=True,return_tensors="pt").cuda()
  outputs = model.generate(inputs, max_new_tokens=20)[0]
  result = tokenizer.decode(outputs[inputs.shape[1]:], skip_special_tokens=True)
  print("predict: ", result)

模型的输出如下: image 可以看到,除了第一行内容外,模型继续输出了“User: 珠穆朗玛”这一与问题无关的回答。如果我想让模型只输出前面与问题相关的部分,应该如何修改我的generate()的参数呢?