QA场景下,如何使GenerateMixin的generate方法仅输出生成的tokens?
只返回生成tokens的实现方式
在Hugging Face生态中,你提到的通过pipeline对象的
call方法传入return_full_text=False,是QA等场景下仅返回模型生成内容的标准做法,能直接过滤掉提示token对应的文本。至于
GenerateMixin.generate方法,它本身没有直接对应return_full_text的参数——作为底层生成方法,它默认返回包含提示+生成内容的完整token序列。如果要实现仅保留生成的tokens,需要手动做后续处理,步骤如下:- 用模型对应的tokenizer对提示文本编码,得到
input_ids,其长度就是提示部分的token数量。 - 从
generate返回的sequences结果中,截取提示token长度之后的部分,再用tokenizer解码这部分token即可。
- 用模型对应的tokenizer对提示文本编码,得到
示例代码:
from transformers import AutoTokenizer, AutoModelForCausalLM # 加载模型和分词器 tokenizer = AutoTokenizer.from_pretrained("your-model-name") model = AutoModelForCausalLM.from_pretrained("your-model-name") prompt = "请解释什么是Transformer模型?" # 编码提示文本 inputs = tokenizer(prompt, return_tensors="pt") # 调用底层generate方法 outputs = model.generate(**inputs) # 提取仅生成的内容 prompt_token_count = inputs["input_ids"].shape[1] generated_tokens = outputs[0][prompt_token_count:] generated_text = tokenizer.decode(generated_tokens, skip_special_tokens=True) print(generated_text)
简单来说,Pipeline封装了截取逻辑,用起来更便捷;而generate方法更偏向底层灵活调用,需要手动处理才能得到纯生成内容。
内容的提问来源于stack exchange,提问作者Nasheed Yasin
相关产品推荐
相关产品推荐

