P1:generation_ms 把流式中段沉默计入墙钟,裸生成时间名不副实 #27
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
下游 Terminal-Bench 实测 4407 次成功调用:ttft 中位 1.63s 但慢调用 generation_ms 中位 69.4s 中 max_inter_token_ms 中位 54.9s,沉默占全部模型时间 71.3%,且与输入/输出量无关(r=0.05/-0.06)、非模型思考(reasoning_tokens 仅 129 次上报)。generation_ms 现口径=赢家 transport 完整墙钟(retry.py:335-346),流式=流读完才停表,中段沉默全额计入。根因调查与业界范式见 research-wiki/findings/2026-09-11-streaming-stall-hedging-research.md;设计草案 designs/2026-09-11-streaming-stall-design.md。方向(人类已拍板):generation_ms 口径改为墙钟−Σ(超阈值中段沉默),CallStats 增 stall_ms/stall_count 归因字段,阈值 STREAM__STALL_THRESHOLD_MS 默认 1000ms 可调。
已在 1.3.8 修复并发布(外部验证:wheel sha256 051d688b…与 dist 一致、包内含 stall 字段与净口径换算)。
行为变更(重要):
generation_ms口径重定义——1.3.7 是赢家 transport 完整墙钟(中段沉默全额计入),1.3.8 起为净生成时间 = 墙钟 − Σ(所有 >{SCOPE}__STREAM__STALL_THRESHOLD_MS(默认 1000ms,三层可调)的相邻增量 chunk 沉默),仍含 TTFT 与尾部。还原公式:墙钟 =generation_ms + stall_ms。归因字段:
CallStats.stall_ms/stall_count(None = 非流式/增量 chunk<2/无赢家,下游预算公式以stall_ms is None为分支条件);遥测表新增同两列(可空 DDL,旧行 NULL 不回填)。排除条款与边界定义见 CHANGELOG 1.3.8 行为变更段与 README 口径表。