"message": "400 length of prompt_tokens (185509) must be less than max_seq_len (98304).", "status": 400, "error": { "code": 20015, "message": "length of prompt_tokens (185509) must be less than max_seq_len (98304).", "data": null }, "code": 20015 }
时间: 2025-05-22 09:45:52 浏览: 63
### 解决方案
当遇到 `prompt_tokens` 超过 `max_seq_len` 限制错误(代码 20015),可以采取以下措施:
#### 动态调整 `max_tokens`
对于不同复杂度的问题,应动态调整 `max_tokens` 的值。简单问题可设置较小的 `max_tokens`(如 50-100),而复杂问题则需增大其范围至 300-500 或更高[^1]。
#### 修改 `max_length` 参数
如果提示符长度接近或超过了模型允许的最大序列长度,则可能会触发类似的错误。此时可以通过增加 `max_length` 来缓解这一情况。然而需要注意的是,直接提高此参数可能带来内存占用过高或其他性能下降的风险。因此建议优先尝试使用 `max_new_tokens` 替代 `max_length` 设置[^2]。
#### 数据筛选与预处理
针对已有的大规模数据集(例如 allenai/tulu-3-sft-mixture 中约900k条记录),应当先对其进行采样并利用合适的tokenizer(比如 meta-llama/Llama-3.1-8B)完成tokenization操作后再做进一步过滤。具体做法是保留那些总长度不超过设定阈值(即此处提到的 max_seq_length = 1024)的有效样本,其余不符合条件者予以剔除[^4]。
#### 自定义文本长度评估逻辑
有时即使经过初步截断仍无法完全规避越界现象发生,这时就需要引入更加精确细致的方法去重新衡量每一个候选片段的真实尺寸表现如何。为此我们或许得构建专属版 get_text_length 函数来进行深入分析判断[^3]。
#### 正确配置 Labels 数组
最后,在准备训练所需标签时记得妥善处置无关区域内的数值项使之成为固定常量(-100),特别是填充部分更要如此安排以免干扰最终成果质量;另外考虑到实际应用需求还可以适当留取少量 padding tokens 方便后续推导过程提早终止[^5]。
```python
def preprocess_data(data, tokenizer, max_seq_length):
processed_data = []
for item in data:
inputs = tokenizer(item['text'], truncation=True, max_length=max_seq_length, return_tensors='pt')
labels = inputs.input_ids.clone()
labels[inputs.attention_mask == 0] = -100
# Optionally keep one padding token at the end of each sequence.
last_non_padding_idx = (labels != -100).nonzero(as_tuple=True)[1].max().item() + 1
if last_non_padding_idx < labels.size(1) - 1:
labels[last_non_padding_idx:] = -100
processed_data.append({
'input_ids': inputs.input_ids.squeeze(),
'attention_mask': inputs.attention_mask.squeeze(),
'labels': labels.squeeze()
})
return processed_data
```
阅读全文
相关推荐
















