Transformers用tokenizer对齐输入长度
批量文本长度不一致时,Transformers 的 tokenizer 可以在编码阶段统一输入形状:用 padding 补齐短文本,用 truncation 截断过长文本,再用 max_length 指定上限或固定长度。最常用的批处理写法是 tokenizer(texts, padding=True, truncation=True, return_tensors="pt"),它会返回形状一致的 input_ids 和 attention_mask。
官方地址:https://huggingface.co/docs/transformers/
如果目标是“同一批能组成张量”,先使用padding=True, truncation=True;如果目标是“每批都固定为同一长度”,再改用padding="max_length", max_length=N。补齐不会增加真实语义,截断却会丢掉超出上限的 token,所以两者要分开判断。
先弄清三个长度参数
padding 决定短序列补到哪里:True 或 "longest" 补到当前批次最长序列,"max_length" 补到 max_length 或 tokenizer 的模型上限,False 则不补齐。truncation 决定长序列是否裁剪;默认不裁剪,启用后才会按照 max_length 或模型最大输入长度截短。
max_length 同时是补齐和截断的目标长度,但只有配合相应策略时才生效。只写 max_length=128,并不会自动让一个批次变成 128;需要显式写出 padding="max_length" 或 truncation=True。
批量输入优先使用最长样本对齐
不要求每批固定长度时,推荐先让 tokenizer 找到当前批次的最长序列,再把较短序列补齐,同时把超过模型上限的内容截掉:
from transformers import AutoTokenizer
# 使用与模型配套的 tokenizer,避免词表和特殊 token 不一致
tokenizer = AutoTokenizer.from_pretrained("distilbert-base-uncased")
texts = [
"Transformers 可以把文本编码成模型输入。",
"批量样本长度可能不同,因此需要补齐。",
]
# 当前批次补到最长样本;过长文本按模型上限截断
batch = tokenizer(
texts,
padding=True,
truncation=True,
return_tensors="pt",
)
# input_ids 和 attention_mask 的第一维都对应批次大小
print(batch["input_ids"].shape)
print(batch["attention_mask"].shape)
这里的 padding=True 等价于当前批次的 "longest"。如果只传入一条文本,通常不会因为“批内对齐”额外补到模型上限;需要固定长度时,应使用下一节的写法。

需要固定长度时同时指定 max_length
分类模型、静态批处理或需要稳定张量形状的推理服务,通常会把目标长度写死。此时要同时打开固定长度补齐和截断:
max_length = 128
# 先截断超过 128 的 token,再把短样本补到 128
fixed_batch = tokenizer(
texts,
padding="max_length",
truncation=True,
max_length=max_length,
return_tensors="pt",
)
# 两个字段的形状都应包含固定的 128
print(fixed_batch["input_ids"].shape)
print(fixed_batch["attention_mask"].shape)
固定长度的代价是:短文本会增加 padding token,长文本会丢掉超出 max_length 的内容。对于成批推理,若样本长度差异很大,也可以先按长度分桶,再在桶内使用 padding=True,减少无效补齐。

让长度适配批处理粒度
某些硬件或编译路径更适合长度为 8、16 等倍数的张量。tokenizer 支持用 pad_to_multiple_of 把补齐目标向上取整,但它不是截断上限:
# 当前批次先按最长样本确定目标,再向上补到 8 的倍数
aligned_batch = tokenizer(
texts,
padding=True,
truncation=True,
pad_to_multiple_of=8,
return_tensors="pt",
)
# 这里检查的是最终宽度,不把“倍数补齐”误当成 max_length
width = aligned_batch["input_ids"].shape[-1]
print(width, width % 8)
如果你既要固定最大长度,又要倍数对齐,可以显式设置 padding="max_length"、max_length 和 pad_to_multiple_of;前提是目标长度与倍数关系合理。不要为了追求整齐,把 max_length 设得远大于模型允许的输入范围。
用 attention_mask 判断补齐位置
input_ids 保存 token id,attention_mask 表示哪些位置参与注意力计算。常见 tokenizer 会让真实 token 对应 1、padding 位置对应 0,但具体 padding 侧仍应以 tokenizer 配置为准。检查字段时不要只看 input_ids 的宽度:
# 打印一条样本的 token id 和掩码,观察补齐区域
ids = batch["input_ids"][0].tolist()
mask = batch["attention_mask"][0].tolist()
print("ids:", ids)
print("mask:", mask)
# 掩码长度应与 token id 长度一致,才能逐位置对应
assert len(ids) == len(mask), "input_ids 与 attention_mask 长度不一致"
如果模型报输入长度超限,优先检查是否启用了 truncation;如果张量无法堆叠,检查是否对一整个列表传入 tokenizer,或者是否遗漏了 padding。如果结果比预期长,确认是否把 padding=True 误认为了固定长度补齐。
常见问题
padding=True 和 padding="max_length" 有什么区别?
前者只补到当前批次最长样本,后者补到指定的 max_length 或模型上限。前者通常更省计算,后者更适合需要稳定 shape 的场景。
只有 truncation=True 可以吗?
可以,它会限制过长输入,但短文本仍可能长度不同;要把一批样本直接组成张量,通常还要打开 padding。
为什么设置 max_length 后长度没有变成这个数?
因为 max_length 是目标值,不是单独的开关。固定长度需要 padding="max_length",而超长样本还需要 truncation=True。
小结
把 Transformers 输入长度对齐,可以按三个问题选择参数:只求批内可堆叠就用 padding=True, truncation=True;需要固定宽度就加 padding="max_length", max_length=N;需要硬件友好的倍数就再考虑 pad_to_multiple_of。最后同时查看 input_ids 和 attention_mask,才能确认补齐和真实 token 的边界。
Transformers处理多模态输入批次
- 上一篇
- Transformers处理多模态输入批次
- 下一篇
- Transformers datasets流式读取训练数据
-
- 科技周边 · 人工智能 | 31分钟前 | 人工智能 · 流式输出 Transformers TextIteratorStreamer streaming
- Transformers streaming逐步输出生成文本
- 340浏览 收藏
-
- 科技周边 · 人工智能 | 31分钟前 | 人工智能 · CLIP softmax 候选标签 logits_per_image 零样本分类
- CLIP候选标签变化后概率为什么跟着变
- 210浏览 收藏
-
- 科技周边 · 人工智能 | 49分钟前 |
- Transformers pipeline快速完成文本分类
- 211浏览 收藏
-
- 科技周边 · 人工智能 | 15小时前 |
- Transformers 怎样用 repetition_penalty 缓解重复输出
- 124浏览 收藏
-
- 科技周边 · 人工智能 | 15小时前 | 模型迁移 Transformers tokenizer save_pretrained
- Transformers save_pretrained 怎样保存可迁移模型
- 268浏览 收藏
-
- 科技周边 · 人工智能 | 16小时前 | pipeline device Transformers device_map 推理设备
- Transformers pipeline 怎样指定推理设备
- 212浏览 收藏
-
- 科技周边 · 人工智能 | 16小时前 | python · 人工智能 · 并行处理 index Hugging Face Datasets Datasets shard num_shards contiguous
- Datasets shard 怎样切分数据集做并行处理
- 417浏览 收藏
-
- 科技周边 · 人工智能 | 16小时前 | 人工智能 · 显存 Transformers 量化模型 bitsandbytes device_map
- Transformers 量化加载时如何选择 device_map
- 280浏览 收藏
-
- 科技周边 · 人工智能 | 16小时前 | python · Transformers TextIteratorStreamer 流式生成 AsyncTextIteratorStreamer StoppingCriteria
- Transformers streamer 怎样处理生成停止信号
- 198浏览 收藏
-
- 科技周边 · 人工智能 | 16小时前 | map Datasets batch_size batched 批量映射
- Datasets map 的 batched 参数怎样改变函数输入
- 279浏览 收藏
-
- 科技周边 · 人工智能 | 16小时前 |
- Transformers GenerationConfig 保存生成参数与复用配置的方法
- 161浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- PubMedQA
- 深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
- 1037次使用
-
- H2O EvalGPT
- H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
- 1035次使用
-
- LMArena
- LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
- 1178次使用
-
- HELM
- 深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
- 1139次使用
-
- MMBench
- MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
- 981次使用
-
- Go encoding.TextMarshaler 怎样让自定义类型支持文本编码
- 2026-10-14 435浏览
-
- Go regexp.Regexp AppendText 怎样保留正则表达式文本
- 2026-10-24 454浏览
-
- Go uuid 怎样生成 v4 UUID 并转换为文本
- 2026-10-25 380浏览
-
- CodeGeeX for Jetbrains IDEs正式上线!
- 2023-01-17 284浏览
-
- 技术阿里云实现ocr批量图片和pdf文件表格图片转换excel文档/支持票据图片提取/普通图片文字提取处理
- 2023-01-18 387浏览
