Qwen Code 改进建议

April 5, 2026 · View on GitHub

核心洞察:随着大模型推理能力(如 o1-preview 或包含 <thinking> 链的模型)的增强,模型在正式输出前进行的长篇大论“内部思考(Chain of Thought)”对维持其后续几步工具调用的上下文状态至关重要。如果在一轮工具调用后直接扔掉上一轮的 Thinking 块,大模型会瞬间“断片”,忘记自己为什么决定执行刚才那个工具。但反之,如果一直保留这些动辄几万 Token 的 Thinking 块,会话的上下文不仅会极速膨胀导致 API 费用失控,还会将正常代码挤出上下文窗口。Claude Code 利用极其精妙的**“活跃保留 + 空闲清理”**状态机,完美解决了长效推理与 Context 成本之间的矛盾;而 Qwen Code 目前在此类精细的上下文垃圾回收(GC)上尚未布局。

返回 改进建议总览

一、思维链带来的甜蜜烦恼

1. Qwen Code 现状:非黑即白的保留策略

目前在 Qwen Code 中,如果大模型输出了一大段“思考过程”,系统要么把它和最终答案一起原封不动地永远保留在对话历史里,要么就在解析完工具调用后立刻把它删掉。

  • 痛点一(上下文截断):如果保留,一个分析复杂 Bug 的思考块可能长达 8000 Token。聊了几轮之后,用户的 128K 窗口就被这些过时的“内心戏”塞满了,导致真正重要的最新文件代码被挤爆报错。
  • 痛点二(推理断层):如果在每次工具调用后立刻删掉思考块。大模型在连续执行“读文件 -> 写脚本 -> 运行测试”的 3 步连招时,到了第 2 步,它会完全忘记第 1 步读完文件后自己做出的判断(“由于 A 函数过时了,我打算用 B 函数代替”),导致第 2 步的行为极其诡异。

2. Claude Code 解决方案:生命周期感知的垃圾回收

在 Claude Code 的底层对话持久化(services/SessionMemory/)与上下文压缩引擎中,他们引入了一个时间维度的清理策略。

机制一:工具调用链内“誓死保卫” (Active Retention)

当 Agent 处于连续自主执行阶段(比如它自己决定发起了 4 次工具调用,中途没有让人类干预),这被称为一个“活跃链(Active Chain)”。 在这期间,大模型产生的所有 <thinking> 块都将被原封不动地传递给下一轮 API 调用。这保证了模型拥有极其稳定且连贯的短期记忆。

机制二:1小时空闲后“静默蒸发” (Idle Cleanup)

大模型在完成任务后,人类可能去喝了杯咖啡,1 个小时后才回来提出新的需求。 此时,之前任务的详细思考过程对当下的新任务已经毫无价值。 系统在检测到两次交互之间的 空闲间隔(Idle Time)超过 1 小时,或者缓存的 TTL(Time-To-Live)到期时,会静默启动清理例程。 它会从历史 Message 数组中,将所有过期的 thinking 内容节点剥离(Evict),仅保留最近的 1 轮 Thinking 作为状态锚点

机制三:不可逆闩锁 (Latch Mechanism) 防止缓存破坏

这是一个终极的极客优化: 为了充分利用 API 厂商提供的 Prompt Cache 功能,一旦历史上的 Thinking 块被清理,它会触发一个布尔值的“锁(Latch)”。 这个锁保证了这些被删除的块永远不可能再被恢复或重新填充。因为如果在后续的某次渲染中,由于某些奇怪的代码逻辑又把历史数据插了回去,会导致大模型 API 判断前缀(Prefix)发生了改变,从而瞬间击穿高达几万 Token 的缓存层(Cache Miss),让请求既慢又贵。

二、Qwen Code 的改进路径 (P1 优先级)

让 Agent 既能长考不忘,又能自我收纳不占空间。

阶段 1:标注与追踪 Thinking 块

  1. 确保大模型返回的(或者系统约定的)思维链内容能够被结构化地解析为独立的 MessagePart(如 type: 'thinking')。
  2. 在该数据结构上附加一个时间戳 createdAt

阶段 2:开发空闲垃圾回收器 (Garbage Collector)

  1. packages/core/src/services/ 创建 contextGC.ts
  2. 设定常量 IDLE_CLEANUP_THRESHOLD_MS = 60 * 60 * 1000 (1 小时)。
  3. 在每次用户按下回车发起新请求前,执行预检: 如果当前时间距离最后一次 assistant 消息的生成时间超过了上述阈值,则将历史数组中除了最后一条之外的所有 thinking 块全部移除。

阶段 3:缓存保护契约

在底层的序列化模块确保:如果由于 GC 导致消息数组发生变化,必须产生一个全新的不可变快照,并且该动作必须伴随打印一条隐秘的调试日志 [Context GC: Cleared outdated thinking blocks to save tokens],让高级开发者知晓系统正在默默帮他省钱。

三、改进收益评估

  • 实现成本:小。核心是数组遍历与时间戳比较,代码量不足 100 行。
  • 直接收益
    1. 巨额成本节约:在持续几天的长期对话中,至少能省下数百万没必要的输入 Token 费用,极大减轻了开发者的账单焦虑。
    2. 根除推理断层:相比于粗暴的“按长度截断(Truncate)”,基于语义(只清理旧思考,不清理旧工具结果)的压缩对维持 AI 智商的作用是决定性的。