首页 教程 分类 Skills下载 关于
ZH EN JA KO
高级用法

OpenClaw上下文修剪与缓存TTL策略

· 10 分钟

前言

AI 模型的上下文窗口是有限的。即使是最先进的模型,上下文窗口也不过几十万 Token。当对话持续进行、消息不断累积时,如何管理上下文就成了一个至关重要的问题。OpenClaw 提供了一套精细的上下文修剪(Context Pruning)机制,结合基于 TTL(Time-To-Live)的缓存策略,在保证对话质量的同时最大化地节省 Token 消耗。

本文将详细解析这套机制的原理和配置方法。

上下文管理的挑战

在长对话中,直接将所有历史消息作为上下文传递给模型会面临几个问题:

  1. Token 成本飙升:每次 API 调用都会发送全部历史,输入 Token 费用线性增长
  2. 上下文溢出:超过模型窗口限制后请求直接失败
  3. 噪声干扰:过早的消息可能与当前话题无关,反而干扰模型判断
  4. 延迟增加:输入 Token 越多,模型首次响应的时间越长

OpenClaw 通过多层修剪策略系统性地解决这些问题。

修剪策略层级

OpenClaw 的上下文修剪分为四个层级,从粗到细依次执行:

原始消息历史
    ↓
Layer 1: 消息数量限制(maxMessages)
    ↓
Layer 2: Token 数量限制(maxTokens)
    ↓
Layer 3: TTL 时间衰减(cache TTL)
    ↓
Layer 4: 智能压缩(compaction)
    ↓
最终上下文 → 发送给模型

Layer 1:消息数量限制

最基础的策略,限制保留的最大消息数:

{
  agents: {
    "my-agent": {
      context: {
        // 最多保留50条消息
        maxMessages: 50,
        // 按频道类型差异化
        channelOverrides: {
          dm: { maxMessages: 80 },
          group: { maxMessages: 20 }
        }
      }
    }
  }
}

超出限制时,最旧的消息会被丢弃(但仍保留在 JSONL 文件中,不会物理删除)。

Layer 2:Token 数量限制

更精确的控制,基于实际 Token 数:

{
  agents: {
    "my-agent": {
      context: {
        // 上下文最大Token数(不含系统提示词)
        maxTokens: 16000,
        // 为模型回复预留的Token数
        reservedOutputTokens: 4000,
        // Token计算方式
        tokenCounter: "tiktoken"  // 精确计算
      }
    }
  }
}

OpenClaw 会从最新的消息开始往回计算 Token,当累计超过 maxTokens 时停止,丢弃更早的消息。

Layer 3:TTL 时间衰减(核心特性)

这是 OpenClaw 最独特的上下文管理策略。基于消息的时间戳,对不同"年龄"的消息施加不同的保留策略:

{
  agents: {
    "my-agent": {
      context: {
        ttl: {
          enabled: true,
          // TTL 规则(从近到远)
          rules: [
            {
              // 最近5分钟内的消息:全部保留
              maxAge: "5m",
              keep: "all"
            },
            {
              // 5分钟-1小时的消息:保留最近20条
              maxAge: "1h",
              keep: 20
            },
            {
              // 1-6小时的消息:保留最近10条
              maxAge: "6h",
              keep: 10
            },
            {
              // 6-24小时的消息:仅保留摘要
              maxAge: "24h",
              keep: "summary"
            },
            {
              // 超过24小时的消息:不包含在上下文中
              maxAge: "inf",
              keep: "none"
            }
          ]
        }
      }
    }
  }
}

TTL 策略的设计思想

人类对话有一个天然的时间衰减特性:5 分钟前的对话内容几乎都是相关的,1 小时前的可能部分相关,昨天的对话大概率已经换了话题。TTL 策略正是模拟了这种自然衰减。

keep 选项说明

含义
"all" 保留该时间段内的所有消息
数字 保留该时间段内最近的 N 条消息
"summary" 将该时间段的消息压缩为一段摘要
"none" 完全不包含该时间段的消息

Layer 4:智能压缩

当 TTL 规则指定 keep: "summary" 时,OpenClaw 会自动对该时间段的消息执行智能压缩:

{
  agents: {
    "my-agent": {
      context: {
        compaction: {
          enabled: true,
          // 压缩使用的模型(可以用更便宜的模型)
          model: "gpt-4o-mini",
          // 摘要的最大Token数
          summaryMaxTokens: 512,
          // 压缩提示词
          summaryPrompt: "请将以下对话内容压缩为简洁的摘要,保留关键信息和用户偏好:",
          // 缓存压缩结果
          cacheSummary: true,
          // 摘要缓存TTL
          summaryCacheTTL: "1h"
        }
      }
    }
  }
}

缓存机制详解

上下文缓存

OpenClaw 会缓存已经构建好的上下文,避免每次请求都重新计算:

{
  agents: {
    "my-agent": {
      context: {
        cache: {
          enabled: true,
          // 缓存失效条件
          invalidateOn: [
            "new_message",     // 有新消息时失效
            "config_change"    // 配置变更时失效
          ],
          // 缓存存储方式
          storage: "memory",   // memory / redis
          // 最大缓存条目数
          maxEntries: 1000
        }
      }
    }
  }
}

Prompt 缓存(Provider 级别)

部分 AI 提供商支持 Prompt Caching(如 Anthropic、OpenAI),OpenClaw 会自动利用这一特性:

{
  agents: {
    "my-agent": {
      context: {
        providerCache: {
          enabled: true,
          // 系统提示词设为可缓存(因为它很少变化)
          cacheSystemPrompt: true,
          // 将最近N条消息标记为可缓存前缀
          cacheableMessageCount: 10
        }
      }
    }
  }
}

Prompt Caching 可以将重复的上下文前缀的费用降低最多 90%,非常适合系统提示词较长的场景。

实际配置示例

个人助手(长对话、深度记忆)

{
  context: {
    maxMessages: 100,
    maxTokens: 32000,
    ttl: {
      enabled: true,
      rules: [
        { maxAge: "30m", keep: "all" },
        { maxAge: "4h", keep: 30 },
        { maxAge: "24h", keep: "summary" },
        { maxAge: "inf", keep: "none" }
      ]
    },
    compaction: { enabled: true, summaryMaxTokens: 1024 }
  }
}

客服机器人(短对话、快速响应)

{
  context: {
    maxMessages: 30,
    maxTokens: 8000,
    ttl: {
      enabled: true,
      rules: [
        { maxAge: "10m", keep: "all" },
        { maxAge: "1h", keep: 10 },
        { maxAge: "inf", keep: "none" }
      ]
    }
  }
}

群聊机器人(高频消息、低上下文需求)

{
  context: {
    maxMessages: 15,
    maxTokens: 4000,
    ttl: {
      enabled: true,
      rules: [
        { maxAge: "5m", keep: "all" },
        { maxAge: "30m", keep: 5 },
        { maxAge: "inf", keep: "none" }
      ]
    }
  }
}

监控与调优

查看上下文使用情况

# 查看某Agent的上下文统计
openclaw agent stats my-agent --context

# 输出示例:
# 当前会话数: 45
# 平均上下文Token: 8,234
# 最大上下文Token: 28,102
# 压缩执行次数: 12
# 缓存命中率: 73%

上下文使用告警

{
  monitoring: {
    alerts: [{
      name: "context-overflow-warning",
      condition: "context_tokens > maxTokens * 0.9",
      action: "log_warning"
    }]
  }
}

小结

上下文管理是 AI Agent 运营中最影响成本和质量的环节之一。OpenClaw 的四层修剪策略——消息数限制、Token 限制、TTL 时间衰减和智能压缩——为你提供了从粗到细的精确控制。其中 TTL 时间衰减策略是 OpenClaw 的独特设计,它模拟了人类对话的自然时间衰减特性,在保证近期上下文完整性的同时大幅降低了远期消息的 Token 消耗。结合 Prompt 缓存和上下文缓存机制,你可以在不影响对话质量的前提下,显著优化 Token 成本。

OpenClaw 是开源免费的个人AI助手,支持 WhatsApp、Telegram、Discord 等多平台接入