首页 / 文档 / 上下文管理

上下文管理

为什么长会话的费用会非线性增长,以及如何将历史记录控制在有限范围内。

API 是无状态的。每轮都会重新发送整个对话,因此输入 token 会随着对话记录增长 — 此后每次调用的成本也会随之增加。

问题的增长规律

一个包含 N 轮、每轮大约新增 T 个 token 的对话,总计消耗的输入 token 量约为 N²T/2,而不是 NT。会话长度翻倍,输入费用就大约变为四倍。这就是为什么一个前十分钟感觉便宜的智能体,运行一小时后会让人对费用感到吃惊。

四种有效模式

模式方法权衡
滑动窗口保留最近 K 轮,丢弃其余内容完全丢失早期上下文
持续更新的摘要定期用模型生成的摘要替换较早的对话轮次需要额外调用一次;保留要点
每个任务开启新会话话题变化时重新开始无需额外成本,而且通常是正确的做法
外部化将状态保存在文件或数据库中,仅加载当前步骤所需的内容工作量最大,效果最好

总结较早的对话轮次

def compact(history, keep=6):
    class="s">""class="s">"Replace everything but the last `keep` turns with one summary turn."class="s">""
    if len(history) <= keep:
        return history
    old, recent = history[:-keep], history[-keep:]
    summary = summarise(old)          class=class="s">"c"># one cheap Haiku call
    return [{class="s">"role": class="s">"user", class="s">"content": fclass="s">"Summary of earlier discussion: {summary}"}] + recent

使用低成本模型进行摘要。这是压缩任务,不是推理任务。

工具结果通常是问题根源

在智能体工具中,为互不相关的任务开启新会话,是成本最低的一项优化。在 Claude Code 中,对应的操作是 /clear.