用 Transformers 的 generate 续写文本时,控制新增 token 上限,并在输出里剔除输入提示,可以避免把整个提示误存成“新生成的内容”。下面使用 GPT-2 的单条英文续写说明参数和核对方法;它是基础语言模型的接口练习,不是聊天或事实问答评测。
固定环境与英文基础模型
在独立 Python 环境安装 transformers==4.57.1 和 PyTorch。CPU 环境可执行 python -m pip install torch==2.6.0 --index-url https://download.pytorch.org/whl/cpu。首次运行下载公开模型文件;网络、磁盘、内存不足时先解决环境问题。

GPT-2 模型卡标注英文基础语言模型、MIT 许可,并解释生成内容可能不真实且存在偏差。本篇示例未执行该检查点的实际模型生成,没有提供生成文本、运行耗时或硬件效果数据。提示句是人为编写的接口演示素材。
限制新增 token,再按 ID 切出续写
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM
checkpoint = "openai-community/gpt2"
tokenizer = AutoTokenizer.from_pretrained(checkpoint)
model = AutoModelForCausalLM.from_pretrained(checkpoint)
model.eval()
prompt = "A helpful software tutorial should"
inputs = tokenizer(prompt, return_tensors="pt")
input_len = inputs["input_ids"].shape[1]
new_limit = 32
if input_len + new_limit > model.config.n_positions:
raise ValueError("输入与预留输出超过该 GPT-2 配置的长度范围")
with torch.inference_mode():
output_ids = model.generate(
**inputs,
max_new_tokens=new_limit,
do_sample=False,
num_beams=1,
pad_token_id=tokenizer.eos_token_id,
)
new_ids = output_ids[0, input_len:]
assert torch.equal(output_ids[0, :input_len], inputs["input_ids"][0])
assert len(new_ids) <= new_limit
print("输入 token:", input_len)
print("新增 token:", len(new_ids))
print("续写:", tokenizer.decode(new_ids, skip_special_tokens=True))
Generation API说明,max_new_tokens 只约束新生成的 token;max_length 对这里的 decoder-only 模型包含输入提示与生成结果。不要同时设两个上限来表达不同意思,本例只设置新增上限。
返回的 ID 序列包含提示,所以先记录输入 token 的长度,再按这个长度切片。不要按提示字符串的字符数切 token,也不要用字符串替换删除提示;分词、空格和解码格式可能使这两种做法删错内容。本代码只适用于单条输入的 GPT-2,不直接套到 encoder-decoder 模型或有填充的多条批量生成。
看 token 数和停止条件,判断是不是跑通
验证方法是两条断言通过、输出前缀 ID 与输入一致、新增 token 数不超过 32,再查看续写是否与输入主题相连。32 是 token 上限,不保证 32 个英文词或汉字,也不保证回答一定完整。模型遇到结束 token 可以提前停止,因此少于上限本身不是失败。
代码选择 do_sample=False、num_beams=1 的贪心路径。若要尝试随机采样,按 生成策略指南启用 do_sample=True,再设置适合任务的 temperature 或 top_p。不采样时不要期待调整 temperature 改变这个贪心决策。
出现空输出、截断或提示重复时怎么查
- 文本为空:先打印新增 ID,而不是只看跳过特殊 token 后的字符串;若模型立刻生成结束 token,就需要核对提示、模型和生成配置。
- 达到上限却没写完:查看任务是否需要更大输出预算,并同时检查模型总长度范围;无限加大上限不是修复方案。
- 输出包含整个输入:看是否解码了全部
output_ids,按照本例只解码new_ids。 - 生成错误事实或重复句:这属于内容质量问题,长度断言不能解决。不能把接口跑通当作事实可靠。
本例为没有 pad token 的 GPT-2 单条输入指定 eos ID 作为生成时的 pad ID,没有新增词表项;它不是适用于所有模型的配置。读者下一步应换成一条短英文提示,先保留断言核对输出范围,再用真实任务样本检验生成内容。聊天模型需要按自己的模板准备输入,不能把 GPT-2 的裸提示当作统一聊天协议。
Ai菜鸟网。发布者:AI小管家,转载请注明出处:https://www.alyyhw.com/30451.html