使用Hugging Face摘要Pipeline遇Token长度超限错误求助
解决Hugging Face摘要Pipeline输入长度超限问题
问题原因
你遇到的错误和max_length/min_length参数无关,核心是输入的文本块(chunk)token数量超过了模型支持的最大输入长度。默认summarization pipeline使用的facebook/bart-large-cnn模型,最大输入限制为1024个token,而你的单个chunk有10020个token,远超阈值。修改摘要输出的长度参数不会改变输入的token限制,因此错误持续存在。
解决方法
1. 将大文本块分割为符合模型输入限制的小块
手动把超长chunk切割成多个≤1024 token的子块,再分别处理。用模型对应的tokenizer计算token数,确保每个子块不超限,同时尽量保留语义完整性。
示例代码:
from transformers import pipeline, AutoTokenizer # 加载默认摘要模型及其tokenizer model_name = "facebook/bart-large-cnn" tokenizer = AutoTokenizer.from_pretrained(model_name) summarizer = pipeline('summarization', model=model_name) def split_text_to_fit_model(text, max_input_tokens=1024): # 将文本转为token序列 input_tokens = tokenizer.encode(text) chunks = [] # 按最大token数分割序列,再转回文本 for start_idx in range(0, len(input_tokens), max_input_tokens): end_idx = start_idx + max_input_tokens chunk_tokens = input_tokens[start_idx:end_idx] chunk_text = tokenizer.decode(chunk_tokens, skip_special_tokens=True) chunks.append(chunk_text) return chunks summaries = [] if chunks: for chunk in chunks: if chunk.strip(): # 先将当前chunk切割为符合模型要求的子块 valid_chunks = split_text_to_fit_model(chunk) for valid_chunk in valid_chunks: summary = summarizer(valid_chunk, max_length=100, min_length=30, do_sample=False)[0]['summary_text'] summaries.append(summary)
2. 使用支持更长输入序列的模型
换用天生支持超长输入的摘要模型,比如allenai/longformer-base-4096(支持4096个token输入),可以减少切割次数,甚至直接处理较大的chunk。
示例代码:
from transformers import pipeline # 初始化支持更长输入的摘要pipeline summarizer = pipeline('summarization', model='allenai/longformer-base-4096') summaries = [] if chunks: for chunk in chunks: if chunk.strip(): # 若仍超过模型最大长度,启用自动截断 summary = summarizer(chunk, max_length=100, min_length=30, do_sample=False, truncation=True)[0]['summary_text'] summaries.append(summary)
3. 启用自动截断(权宜之计)
如果不想切割文本或换模型,可在调用summarizer时添加truncation=True参数,让模型自动截断超长输入。但这种方法会丢失部分文本信息,可能影响摘要质量,仅适合临时测试。
示例代码:
from transformers import pipeline summarizer = pipeline('summarization') summaries = [] if chunks: for chunk in chunks: if chunk.strip(): # 启用自动截断 summary = summarizer(chunk, max_length=100, min_length=30, do_sample=False, truncation=True)[0]['summary_text'] summaries.append(summary)
方法对比
- 分割文本:最稳妥,能保留完整信息,但需要额外处理逻辑。
- 换长输入模型:操作简单,减少切割,但部分长输入模型的摘要效果可能略逊于默认模型。
- 自动截断:最快,但会丢失信息,不推荐用于正式场景。
内容的提问来源于stack exchange,提问作者youssef boutaleb
相关产品推荐
相关产品推荐

