Repository navigation
Replies: 5 comments 3 replies
|
注意:QQ 机器人(IM)链路同样出现过‘工具成功但 QQ 端断流无正文’的情况。这说明即使排除了 UI 渲染和前端队列,底层的 Transport/Adapter 层依然无法保证 text block 的完整性。因此,这不仅仅是前端的时序竞态,更是模型输出与 DSH 截断判定之间的配合问题。 如果流生命周期的维持确实能规避此 Bug,是否意味着 DSH 在接收到 finish{stop} 时,没有留出足够的 flush 窗口去等待可能延迟到达的 text token?能否在 Adapter 层做一个实验:在收到 stop 信号后,强制增加 500-1000ms 的 Grace Period(缓冲期)再去检查是否有残留的 text block? |
|
只有 reasoning 的回复会被当成正常结束,两个适配器都只挡了"零内容块"。 DeepSeek Messages 路由: pi-ai 路由: 也就是说你在第 3 点提的 P0 目前没有实现: 关于 500–1000ms 的 Grace Period,这个实验可以做,但它救不回正文。 能落地的形状还是在判定层:把 "331K 隐形 payload"我没有你的日志,无法在这里下结论;能对照的是同一请求的 |
|
补充跨模型自污染证据(Context Pollution across models)。 来源:session-30d6,seq 25491–25522,同一会话连续区间,已脱敏(抹去 senderId / sessionId / message id / reasoning signature / 记忆快照正文)。time 为日志内部相对毫秒时间戳,非日历时间。 关键事件表: seq 25491 user "又能说出来了,再写一遍完整的?" 三句结论: 1、换模型前 deepseek-flash 连炸两次(25494 / 25504),换到 deepseek-v4-pro 后(25522)仍然只吐 reasoning、零 text,以 stop 被判为 completed —— 两个不同权重模型在同一段历史下复现同一退化模式,触发条件不在模型权重,而在共同读到的那段被污染的历史。 2、污染源正是前面这些 reasoning-only 畸形回复:判定层只挡"零内容块"(translate.ts:149 的 blocks.size===0、stream.ts:99 的 content.length===0),没挡住 reasoning-only,被当成功写进 history 又喂给下一个模型,形成跨模型的自我复制。 3、 |
|
跨模型复现说明值得检查共享的历史与请求组装,但还不能单独排除模型或长上下文本身的影响。重放时可以固定模型和生成参数,仅改变那几条 reasoning-only 历史,并记录变换后实际发送的 prompt token 数,保留完整的 tool-call/tool-result 配对。否则删除消息后恢复了正文,也可能只是长度下降,不能直接证明“污染”是唯一根因。 我们在 SinapsData 开发 Sinaps Studio,关注智能体编排和活动监控。排查这类问题时,我更关心每次调用实际使用的模型、usage 和有效输出类型是否能关联到同一个请求,而不是界面上的 completed。你计划在请求组装后记录脱敏的配置摘要和请求标识吗?这样跨模型重放就能按同一口径对账。 |
|
补充:判定层修复已实测,行为变化如下(2026-11-12) 按前面结论(finish.kind === 'stop' 且无 text 且无 tool-call → 退化完成),我在本地给 adapter 打了同形补丁,并重启验证。结果分两层:
代码块 attempt #1 → retry EMPTY_RESPONSE
同一时段(11-11 22:40 → 11-12 01:00)连续 8 轮全空,而 11-11 19:25 那一轮正常(408 字)。近两天 98 个 turn:正常 18 / 空 78 / 错误 2。所以不是「历史锁死」,是高频劣化 + 偶发正常。 结论:判定层修复能阻止新的污染,但不能让已有的坏历史恢复。已存在的 181 条 reasoning-only(11-05 至 11-11,其中 11-11 的 32 条离尾部最近只有 9 条、落在压缩保留区)仍在 surface 上。这部分只能靠新会话或等 compaction 处理,不动日志。 reasoning-only 的累积与压缩的实际效果
这张表说明三件事: -污染是累积的,不是一次性事件。11-08 到 11-11 每天新增 32–52 条。 |
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
「2026-11-10 更正:第一层『331K 隐形 Payload』已收回,实际是 surface 重建的超集效应(重建 1.5M vs usage 634K,比值 2.4),不是请求里混入了内容。判定层的结论不变。」
概述
这是对 #11338 讨论(Turn ends normally but the assistant message has no text block)的跟进。与 #11338 报告的 reasoning + tool-call 组合不同,我隔离出了更严重的场景:纯 reasoning 块,无正文,无工具调用,且 finish 正常结束。针对 DeepSeek Flash 在 700K+ 上下文时,UI 频繁出现“思考完毕但无正文”的静默失败现象,我抓取并深度分析了包含 54 次连续失败(turn 1026–1096)的完整会话日志(seq 24296)。
这并非单一的模型 Bug,而是一组在超长上下文下相互耦合、自我放大的系统性缺陷。以下是基于实测数据的根因剖析:
一、 第 1 层根因:331K 隐形 Payload 挤压上下文 (物理诱因)
这是目前最确凿的数据证据(参考 dsh-context 插件 1.3B 耗时统计截图):
现象:在某次请求中,模型实际 Input 高达 713.0k tokens。然而,将前端可见的系统提示词、工具定义、历史对话、Agent 状态等所有构成项进行拆解相加,总和仅为 ~381.2k tokens。
差值:存在 331K tokens 的“隐形 Payload” 在每次 Prefill 时被强行塞入模型上下文。
隐患:虽然当前 KV Cache 命中率高达 99.97% 掩盖了延迟,但这 331K 的隐性开销极大地挤压了模型对有效上下文的注意力机制空间。当上下文越过 500K 阈值时,这种过度负荷极大概率是诱发模型底层状态机退化的物理诱因。
二、 第 2 层根因:Reasoning → Text 通道切换失效 (直接病因)
在 54 次连续失败中,流日志(Stream Logs)展现出完全一致的微观时序:
时序异常:模型发出 END:reasoning 到接收到 finish{stop} 信号,间隔仅为 0–2ms。
块结构缺失:所有失败 Case 均表现为 START:reasoning -> reasoning_delta -> END:reasoning -> finish{stop}。模型完全没有发出 <|end▁of▁thinking|> 特殊 token,也没有尝试触发 START:text。
模型“自白”矛盾:在 Reasoning 的最后,模型甚至已经明确计划了正文输出(如:“篇幅 150 字。写。不要说教...我该回什么?”),但在执行阶段却未能完成通道切换,直接抛出了原生的 end_turn。
三、 第 3 层根因:Harness 判定失效与“上下文自污染” (故障放大器)
为何失败率会从偶发飙升至 100%(71轮内连炸52次)? 数据指向了一个死循环机制:
防御机制失效:DSH 的 translate.ts 中,只要流中出现过 reasoning block 即视为“有内容”,导致这些只有思考没有正文的畸形回复被标记为 completed。
上下文自污染(Self-Pollution):这些空内容的 assistant 消息被原样写入了后续轮次的历史记录。
死循环形成:在 700K 的超长上下文中,模型在前序轮次看到了自己“只思考不回答”的畸形模式,并在 Attention 机制中被强化。这导致在 turn 1038、1050 等带工具调用的回合中,工具执行本身是成功的,唯独最后一步生成总结正文时,彻底崩溃,复现了“思考即结束”的畸形模式。
附加线索:
流调度时序竞态:当 DSH 界面显示“后台任务运行中”时,模型大概率能正常输出正文。推测后台任务维持了 SSE 流的生命周期,阻止了过快的 end_turn 终止,给了 Transport 层 flush text block 的窗口。此外在 IM (QQ) 链路中,出现过 DSH 显示工具成功但 QQ 端断流无正文的情况。
建议修复与排查方向
针对上述三层根因,提出以下建议:
修复 Harness 判定逻辑 (P0):
在 mapStopReason 或 Assembler 层增加校验:当 finish.kind === 'stop' 且无 text block 且无 tool_call 时,强制判定为 EMPTY_RESPONSE,阻止空回复被标记为完成并写入历史。
切断“上下文自污染”:
一旦触发上述错误判定,绝对禁止将仅有 reasoning 的 assistant 消息存入 History。在重试时,可考虑用显式 System 提示词代替该条空历史。
排查“隐形 Payload”来源:
需要排查 DSH 框架内部(尤其是 Agent 子智能体网络、动态工具定义、长短期记忆等模块)是否存在无限制的 Token 堆叠。建议在 Prefill 前加入总 Input 的熔断机制,当隐形开销过大时强制降级。
empty-response-cases.csv

empty-response-streams-public.md
empty-response-usage.csv
session-30d6.json
All reactions