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

使用sentence_transformers批量生成BERT嵌入报索引越界如何解决

sentence_transformers批量编码300份文档触发IndexError: list index out of range修复方案

报错核心原因

SentenceTransformer.encode()方法的默认输入要求是原始字符串组成的列表,不需要提前手动做分词处理。你代码中传入的tokenized_docs_smaller是提前分词得到的token列表/嵌套列表结构,和模型内部预处理逻辑的输入预期不匹配,批量处理时就会触发列表索引越界错误。

修复步骤

  • 替换输入为原始文本列表
    不要传入提前分词的结果,直接传入清洗后的原始文档字符串列表即可,模型内部会自动完成分词、padding、截断等适配操作,参考修正代码:
    from sentence_transformers import SentenceTransformer
    model = SentenceTransformer('distilbert-base-nli-mean-tokens')
    # docs为原始文本列表,单个元素对应一篇文档的字符串内容
    embeddings = model.encode(docs, show_progress_bar=True)
    
  • 清洗输入的异常数据
    如果输入列表中混有None、非字符串类型元素、空值,也会触发该类索引错误,编码前先做一轮数据清洗:
    cleaned_docs = []
    for doc in raw_docs:
        # 过滤非字符串、空内容异常项
        if not isinstance(doc, str) or len(doc.strip()) == 0:
            cleaned_docs.append("")
            continue
        cleaned_docs.append(doc.strip())
    
  • 调小批处理大小
    显存/内存不足时,批量加载数据可能出现截断导致索引越界,可手动调低batch_size参数测试,默认值为32,可根据硬件情况降到16或8:
    embeddings = model.encode(
        cleaned_docs,
        show_progress_bar=True,
        batch_size=16
    )
    
  • 校验模型文件完整性
    如果以上操作都无法解决,大概率是本地缓存的模型文件损坏,删除本地缓存路径下的distilbert-base-nli-mean-tokens文件夹,重新运行代码自动下载完整模型即可。

内容的提问来源于stack exchange,提问作者Aska

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 11:24:22