
Mistral 等基于 Transformer 的因果语言模型,其 embed_tokens 层仅接受整数型 torch.Tensor(形状为 [batch_size, seq_len])作为 token ID 输入;直接传入 BatchEncoding 或 Python 列表会报错,需通过 return_tensors='pt' 显式指定 tokenizer 输出张量。
mistral 等基于 transformer 的因果语言模型,其 `embed_tokens` 层仅接受整数型 `torch.tensor`(形状为 `[batch_size, seq_len]`)作为 token id 输入;直接传入 `batchencoding` 或 python 列表会报错,需通过 `return_tensors='pt'` 显式指定 tokenizer 输出张量。
在微调或推理过程中,若需手动访问 Mistral 模型的词嵌入层(即 model.model.embed_tokens),必须确保输入数据严格满足 PyTorch nn.Embedding 层的接口规范:输入必须是 dtype 为 torch.long 的二维张量,且每个元素为有效词汇表索引(0 ≤ id 。
如你所见,tokenizer("Hello world") 默认返回 BatchEncoding 对象(含 input_ids, attention_mask 等字典字段),而 tokenizer(...).input_ids 是 Python 列表,均不被 nn.Embedding 接受。错误信息 argument 'indices' must be Tensor, not list 和 not BatchEncoding 清晰指出了类型不匹配问题。
✅ 正确做法是:在调用 tokenizer 时显式设置 return_tensors='pt',该参数会自动将 input_ids 转换为 torch.LongTensor,并保持 batch 维度(即使单句也会变为 [1, seq_len]):
# ✅ 正确:返回 torch.Tensor,可直接送入 embed_tokens
inputs = tokenizer("Hello world", return_tensors="pt").to(model.device)
embedded = model.model.embed_tokens(inputs.input_ids) # shape: [1, seq_len, hidden_size]
print(f"Input IDs shape: {inputs.input_ids.shape}") # e.g., torch.Size([1, 4])
print(f"Embedding output shape: {embedded.shape}") # e.g., torch.Size([1, 4, 4096])
⚠️ 注意事项:
- 设备一致性:务必调用 .to(model.device) 将 token IDs 移至模型所在设备(如 'cuda:0'),否则会因设备不匹配引发 RuntimeError;
- dtype 验证:return_tensors='pt' 默认生成 torch.int64(即 torch.long),符合 embedding 层要求,无需额外 .long() 转换;
- 批量处理:若处理多条文本,tokenizer([...], return_tensors='pt') 会自动 padding 并返回统一长度的张量,适合批量化嵌入计算;
-
特殊 token 处理:Mistral 使用
(BOS)和(EOS)标记,add_bos_token=True 和 add_eos_token=True 已在初始化中启用,确保 input_ids 包含完整起止符。
? 进阶提示:若需对长序列做分块嵌入或自定义位置编码前处理,建议封装为函数以复用逻辑:
def get_embeddings(texts, model, tokenizer, device=None):
if isinstance(texts, str):
texts = [texts]
inputs = tokenizer(
texts,
return_tensors="pt",
padding=True,
truncation=True,
max_length=512
).to(device or model.device)
return model.model.embed_tokens(inputs.input_ids)
# 使用示例
embs = get_embeddings(["Hello world", "How are you?"], model, tokenizer)
print(f"Batch embedding shape: {embs.shape}") # [2, max_seq_len, 4096]
总结而言,return_tensors='pt' 不仅是解决当前报错的最简方案,更是 Hugging Face 生态中与模型层交互的标准实践——它保障了数据类型、设备、维度三重一致性,是构建可靠 LLM 工具链的基础环节。










