超窗请求怎么处理
输入超过上下文窗口时,不同服务的处理方式并不一致:直接拒绝并返回错误、把输入从某一端截断,或者先做摘要压缩再送进模型。三种做法对业务的影响完全不同,必须在入口统一策略,行为才可预期;放任不管的话,用户会看到时而报错、时而回答残缺。
基本信息
| 适用平台 | 自托管推理服务与前置网关 |
|---|---|
| 判定依据 | 提示词 token 数加上输出预留不超过模型窗口 |
| 常见策略 | 拒绝并报错、截断、摘要压缩 |
| 执行位置 | 入口网关先做校验,避免引擎接无效请求 |
入口长度校验(示意)
入口长度校验(示意)
ids = tok.encode(prompt)
limit = max_model_len - max_tokens # 给输出留出空间
if len(ids) > limit:
ids = ids[-limit:] # 从尾部保留,截法按业务选择
prompt = tok.decode(ids)典型使用场景
- 长文档问答:先检索再拼接,把材料控制在窗口内
- 多轮对话:历史轮次按策略裁剪或摘要
- 批量任务:超长样本单独标记,走另一条处理路径
- 评测:先确认评测集的长度分布,避免因截断让结论失真
- 容量核算:窗口开得越大,能同时服务的请求数越少
策略与风险对照
| 策略 | 适用场景 | 风险 |
|---|---|---|
| 拒绝并报错 | 输入质量优先的接口 | 调用方必须处理错误码 |
| 从尾部截断 | 问题集中在末尾的任务 | 丢掉关键前文会答非所问 |
| 从头部截断 | 指令在前、材料在后的任务 | 可能丢掉系统提示与约束 |
| 摘要压缩 | 对语义完整度要求高的任务 | 引入额外调用与延迟 |
网关统一做 token 级校验能减少无效请求打进引擎:超窗请求会白耗一轮预填充之后才报错。
截断方向要按任务选:指令在前就保头部,问题或结论在末尾就保尾部,没有通用答案。
把策略写进接口文档:超窗时是报错还是截断,要让调用方知道,否则线上行为不可预期。