You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 23:25:01