Skip to content

输出预留(output headroom)按最大输出能力全额预留,输入预算被砍半,75% 强制压缩过早触发 #207

Description

@ranxianglei

模型:qwen3.8-27b (vllm)

问题

reserveOutputHeadroom 按模型注册表登记的最大输出能力(ctx.model.maxTokens)全额预留输出预算,而不是按请求实际配置/使用的 max_tokens。当 maxTokens 占窗口比例大时,有效输入预算被大幅砍掉,kernel 的 75% 强制压缩阈值相对完整窗口在很低的位置就触发。

复现 / 证据

会话 01a02d90-17b6-7ca7-b22a-a5170c2f9098,模型 qwen3.8-27b(contextWindow=262144,models.json maxTokens=131072):

[overflow-selfheal] event=output-headroom before=262144 after=131072 maxOutput=131072
[turn] tokens=98900 pct=34.42 limit=131072 nudge=active nudgeReason=OVER-LIMIT T1: max effective pending 65437, usage 75%
[nudge-injected] voice=emergency ... text=⚠️ Context limit reached — compress now
  • 有效 limit = 262144 − 131072 = 131072(砍半)
  • kernel usage = 98900/131072 = 75.45% ≥ 0.75(maxContextLimitPct)→ 强制 nudge
  • 用户看到的 pct = 90222/262144 = 34.4%(相对完整窗口)—— 两个口径不同,所以看起来"才 30% 就强制压缩"

代码位置

影响

  • qwen3.8-27b:256K 窗口只剩 128K 输入预算,75% 阈值在完整窗口 ~34% 处触发
  • 同窗口 int4 版(maxTokens=32K)只砍 12.5% —— 行为随模型配置差异巨大
  • 实际回复很少用到 128K 输出,全额预留偏保守

可能的方向

  1. 预留量取 min(model.maxTokens, 请求实际配置的 max_tokens),或设一个上限(如窗口的 25%)
  2. maxContextLimitPct 相对完整窗口计算,而不是砍过后的 limit
  3. 至少在 nudge 文案里说明有效 limit 已被输出预留砍过,避免误导模型/用户

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingenhancementNew feature or request

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions