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

使用Hugging Face Transformers生成摘要时末尾句子截断问题求助

解决Hugging Face Transformers文本摘要末尾截断问题

你的核心问题出在自定义停止条件的实现错误以及停止逻辑不合理,另外还有generate参数的搭配问题,以下是具体修正方案:

1. 修复自定义停止条件的实现

你当前用lambda包装普通函数的方式不符合StoppingCriteria的要求,必须继承transformers.StoppingCriteria类并实现__call__方法。同时原逻辑只要生成文本中出现句号就停止,会导致中途截断,应该判断生成的完整文本末尾是否包含句子结束标记(如.、!、?)。

修正后的停止条件代码:

from transformers import StoppingCriteria, StoppingCriteriaList

class SentenceEndStoppingCriteria(StoppingCriteria):
    def __call__(self, input_ids, scores, **kwargs):
        # 解码当前生成的文本
        generated_text = tokenizer.decode(input_ids[0], skip_special_tokens=True)
        # 判断末尾是否是句子结束标记
        return generated_text.endswith(('.', '!', '?'))

stopping_criteria = StoppingCriteriaList([SentenceEndStoppingCriteria()])

2. 优化generate参数配置

除了修复停止条件,还需要调整generate的参数避免截断:

  • 确保max_length足够大,同时设置min_length避免生成过短文本
  • 若使用beam搜索,early_stopping=True可以让模型在满足停止条件时及时停止,无需设为False
  • 检查tokenizer的pad_token是否设置,部分模型默认pad_token为None,需要指定为eos_token

调整后的generate调用:

# 若tokenizer无pad_token,先设置
if tokenizer.pad_token is None:
    tokenizer.pad_token = tokenizer.eos_token

inputs = tokenizer(texto, return_tensors="pt", padding=True, truncation=True).input_ids
outputs = model.generate(
    inputs,
    max_length=1000,
    min_length=50,  # 根据需求调整最小长度
    stopping_criteria=stopping_criteria,
    num_beams=3,
    no_repeat_ngram_size=2,
    early_stopping=True,
    pad_token_id=tokenizer.pad_token_id
)

summary = tokenizer.decode(outputs[0], skip_special_tokens=True)
print(summary)

3. 更简便的替代方案:使用stop_sequences参数

如果不需要复杂的停止逻辑,可以直接用stop_sequences参数指定停止标记,无需自定义StoppingCriteria:

inputs = tokenizer(texto, return_tensors="pt", padding=True, truncation=True).input_ids
outputs = model.generate(
    inputs,
    max_length=1000,
    min_length=50,
    stop_sequences=['.', '!', '?'],  # 遇到这些标记就停止
    num_beams=3,
    no_repeat_ngram_size=2,
    early_stopping=True,
    pad_token_id=tokenizer.pad_token_id
)

summary = tokenizer.decode(outputs[0], skip_special_tokens=True).rstrip('.!?')  # 移除末尾的停止标记

额外检查点

  • 确认输入文本没有被过度截断:调整tokenizer的truncation参数或max_length,确保输入完整
  • 部分模型本身的生成特性:有些摘要模型会倾向于生成简洁文本,若需要更完整的句子,可以尝试调整temperature参数(如设为0.7)增加生成多样性

内容的提问来源于stack exchange,提问作者Flix Francisco Enrquez Romero

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 13:07:12