首页 > 开源 > Token 预算管理:长对话不崩溃的秘密

Token 预算管理:长对话不崩溃的秘密

OSChina资讯 2026-08-10 19:47 1 阅读 查看原文

本文来自 AI Helper 项目的真实工程实践。AI Helper 是一个开源的 Chrome 智能助手扩展,采用 ReAct 推理循环架构,内置 44 个工具,支持多轮工具调用和复杂任务拆解。

问题:多轮推理的 Token 雪崩

ReAct 架构的核心是"推理-行动-观察"循环。每一轮循环,AI 调用工具、拿到结果、把结果追加到消息历史中。一个复杂任务可能需要 5-10 轮甚至更多轮的工具调用。

随着循环次数增加,消息历史呈线性膨胀,但每次请求的 Token 消耗呈平方级增长。因为每一轮新请求都必须携带全部历史消息,而历史消息中又包含上一轮的工具返回结果——这些结果往往是大段 JSON、网页源码或日志文本。

举例来说:一个 3 轮工具调用的任务,假设每轮工具返回约 2000 Token,那么第 3 轮请求的上下文就包含了 6000 Token 的工具结果 + 推理文本,实际发送给模型的 Token 数远超有效信息量。

Token 雪崩的三大危害

  • 成本失控:按 Token 计费的 API 调用,多轮推理的账单会指数级上升。
  • 延迟恶化:输入 Token 越多,模型首字延迟越高,用户等待时间成倍增加。
  • 上下文污染:早期工具返回的无关噪声会干扰模型后续推理,降低任务成功率。

解决方案:上下文压缩与摘要替代

AI Helper 的工程实践中,我们采用了 分层上下文管理策略,核心思路是:不把原始工具结果直接塞进历史,而是先压缩、再摘要、最后按需引用

第一层:工具结果截断

对工具返回的原始内容设置硬性上限(如 2000 字符),超出部分直接截断,并用占位符标记。这能阻止单次工具调用产生过大的上下文。

第二层:语义摘要缓存

每轮工具调用结束后,立即用轻量模型对结果生成一段 50-100 Token 的语义摘要,存入缓存。后续轮次的消息历史中,只保留摘要,不保留原文。

// 伪代码示例:工具结果压缩
const rawResult = await callTool(toolName, args);
const summary = await summarize(rawResult, maxTokens = 80);
conversationHistory.push({
  role: "tool",
  content: summary,  // 替代原始大段文本
  rawRef: cache.put(rawResult)  // 原始结果存缓存,按需取用
});

第三层:按需回溯引用

当模型在后续推理中明确需要某个工具结果的细节时(通过特殊指令触发),系统才从缓存中取出原始结果,临时注入当前请求。这样既保证了信息可用性,又避免了全量历史携带。

效果与收益

经过上述优化,AI Helper 在 8 轮工具调用的复杂任务中,总 Token 消耗降低约 62%,首字延迟降低 41%,任务成功率反而提升了 7%(因为上下文噪声减少)。

这套方案的核心启发是:不要盲目追求无损记忆,而是用有损摘要 + 按需恢复来打破 Token 线性膨胀。对于多轮 Agent 应用,这比单纯扩大模型上下文窗口更经济、更高效。