OpenClaw小龙虾上下文管理小白指南

作者: admin 分类: 评论分析 发布时间: 2026-04-02 10:46

上下文,是AI的脑容量。作为AI智能体(Agent)的小龙虾,它的脑容量取决于你接入的大模型,大模型的上下文窗口大小,就是脑容量的大小。

如何知道,或者查询大模型上下文窗口的大小?这个一般你去服务提供商的模型介绍页面,都会有对应的内容。

以阿里云百炼为例,在模型广场中随便挑一个Qwen3.5-plus模型,通过介绍页面内容可以看出,它的上下文长度(窗口)为1M(1百万),如图:

在一个对话窗口中,所有上下文加起来的内容长度,不能超过1M,这就是所谓的上下文窗口。超过这个窗口的内容,模型就看不到了,或者叫丢失了。

用生活化的场景来描述,大家可能更好理解。你人在窗口的范围内,你就能看到窗口里面的东西,越过离开了窗口范围,两边都只能看到空墙壁。

AI智能体的能力,一个是看上下文的管理,另外一个是看调用工具。当然,今年因为是马年,所以就兴起了另外一种更为全面的概念。

叫Harness Engineering(驾驭工程),不仅成为了硅谷的热词,也是最近国内AI圈子比较火的新概念名词。

Harness又被称为马具,给马套上的一整套用具,让马能正常干活。放在AI智能体身上,就是给它设计一整套系统,让智能体能更好地干活。

Harness是上下文工程的一种进化,或者叫完善。因为Harness涉及到智能体的循环、工具、协作、记忆、自主等方面的设计。

它不是指具体的某一项技术,某一项能力,某一项工程。而是给AI智能体搭建一个操作系统,一个OS底层逻辑的构建思维。

突然扯到Harness,因为这个概念大概率会成为未来AI智能体时代,绕不过的核心。大家都会去讨论这套东西,或者说它已经成为了一种能力。

拿3月31日Anthropic意外泄露的Claude Code源代码的事件来说,业内关注的是Claude Code这个AI编程智能体的Harness Engineering设计。

一个世界顶级的AI智能体,是如何搭建底层操作系统的。这对于很多正在研究和研发相关产品的公司和团队而言,具有极大的参考借鉴意义。

而不是说拿这套源代码去修修改改,套个壳变成自己的产品。俗话说授人以鱼不如授人以渔,人家的这次失误,给我们的是学会去钓鱼的机会。

回到今天的主题,上下文管理作为Harness Engineering所设计的操作系统中的一部分,对于我们玩转OpenClaw小龙虾而言,重要性也很大。

大部分小白用户是不知道有这样一套规则体系存在的,在实际养虾的过程中,经常会遇到上下文窗口爆满,不知所措的情况。

最明显的问题就是小龙虾突然失忆,忘记了几小时前的对话内容。对话进行到一半,小龙虾报错说上下文太长。

接入一些小模型,尤其是本地使用Ollama部署的小模型时,经常因为小模型本身上下文窗口太小,导致没聊几句,窗口就爆满。

经过一轮的长对话后,发现小龙虾越来越傻,回复也越来越慢,甚至开始胡言乱语,中英文混合输出。

对于以上上下文窗口爆满的情况,小龙虾的处理逻辑一般包括压缩和修剪。压缩好理解,只保留核心主题,摘要。修剪是删除工具输出的结果。

当然,这跟新开会话不是一回事,主要是面向当前的会话。而OpenClaw小龙虾的上下文管理,跟记忆系统管理是息息相关的。

如果小伙伴对OpenClaw的记忆系统还不是很了解,可以回看老马上两篇文章:OpenClaw记忆系统全面解析,打造不会失忆的小龙虾,OpenClaw小龙虾记忆系统实战小白指南。

下面老马将从OpenClaw的5层上下文管理策略,如何避免上下文溢出,以及优化你的上下文使用三个方面给大家介绍清楚。

5层上下文管理策略

第一层:会话隔离(Session Isolation)

会话隔离就是不同的渠道对话使用不同的会话,它们之间互不干扰。每个会话都是独立管理上下文,这样能够避免无关的内容占用上下文。

举个例子,你的OpenClaw小龙虾同时接入了QQ机器人和微信Clawbot机器人。此时,你正在通过这两个渠道跟小龙虾聊天。

这里两个渠道的会话就是隔离的,不会串门的,同时上下文各自独立。不会说你QQ机器人这边聊得多了,微信机器人这边的上下文就会受影响。

同理,不同Agent之间的会话也是隔离的,上下文一并如此。假设你除了一个叫main的主Agent之外,还另外创建了Coder、Writer两个子Agent。

三个Agent都可以单独挨个去对话,而且他们之间的会话记录跟上下文没有关联。你给main安排的任务,Coder跟Writer不知道。

因此多Agent要进行协作,就必须打通之间会话,把每条独立的电话线串起来,俗称跨会话通信,一般使用sessions_send工具去完成。

OpenClaw的会话隔离机制默认是开启的,属于核心的设计原则之一,它体现在OpenClaw.json里面的配置内容如下:

{
  "session": {
    "dmScope""per-channel-peer"  // 按渠道隔离
  }
}

以上配置内容仅供你了解知晓,并不需要你自己去设置。其中per-channel-peer就是按渠道和发送者共同隔离会话的值。

除了设置per-channel-peer模式之外,session.dmScope还有4个可选值:

根据以上表格,如果你是多Agent,多Bot机器人账号的情况下,per-account-channel-peer是可选的配置值。

当然这里老马只是拓展一下知识内容,一般情况下你保持官方默认per-channel-peer配置值即可,不需要去改动。

第二层:每日重置(Daily Reset)

每日重置是针对会话的,相当于OpenClaw每天在凌晨4点的时候,会自动帮你开启新的会话,哪怕你之前的会话窗口还没关闭,或者没通过/new命令启动过新会话。

这种重置是强制性的,能让每天的会话都是新的开始,避免昨天的历史包袱累积。类似于睡了一觉醒来,把昨天堆积的上下文都清理干净了,排空了记忆。

除了昨天的上下文记忆会整理成摘要总结,保存在每日记忆里面。其它细枝末节的东西,通通抛弃掉,可以认为是更为彻底的压缩,压到渣都不剩。

每日重置在OpenClaw.json文件中搜一下dailyAt字段,如果没有,则需要手动配置开启,具体的配置内容如下所示:

{
  "session": {
    "reset": {
      "dailyAt""04:00"  // 每天 4 点重置
    }
  }
}

你觉得凌晨4点不好,想修改一下,那随便你修改时间的配置值。开启每日重置的好处就不用说了,就是为了更好地管理你的上下文。

第三层:空闲超时重置(Idle Reset)

空闲超时重置类似于每日重置,也是针对会话空闲时间达到设定的时间值,自动清空会话的上下文,重新开启一个新会话。

OpenClaw系统默认设置的是120分钟超时,即120分钟内,你没有再跟你的小龙虾聊过天,不管是通过什么渠道,QQ机器人,微信机器人都算。

那么2个小时后,系统就会自动开启一个新的会话,之前的老会话就失效了,上下文也失效了。

这样也是为什么空闲超时重置之后,有些小伙伴会懵逼。明明刚才跟小龙虾都描述过任务的背景信息了,告诉它我电脑上有什么文件需要处理了。

怎么隔了几个小时回来再聊,它就什么都忘记了。每日重置同样如此,有小伙伴反馈是隔天小龙虾就忘记了昨天的事情。

基本上原因就是会话被重置了,重新开启了新会话,原有的上下文丢失了。而新会话没来得及加载昨天的记忆文件,或者昨天的记忆文件没保存,导致无法加载。

如果加上长期记忆文件MEMORY.md也没记录摘要重点,那就等于基本失忆了。因此优化好记忆系统很重要,记得翻看老马之前的文章多多回顾。

空闲超时重置在OpenClaw中默认没有开启,需要手动配置开启,具体的配置内容如下所示:

{
  "session": {
    "reset": {
      "idleMinutes"120  // 2 小时无活动重置
    }
  }
}

空闲超时重置老马觉得保持默认不开启也没多大关系,不然会影响当天的上下文完整度,老是隔两个小时被重置一次也挺烦的。

第四层:自动压缩(Auto-Compaction)

上下文在达到阀值时,系统会自动帮我们压缩。经常使用OpenClaw的Web UI网页控制台界面,去跟小龙虾的聊天的小伙伴就知道。

经常会有一句提示正在压缩中,这其实就是在压缩上下文。自动压缩会涉及到三个值,一个是contextTokens(已经达到的token数)。

contextWindow(上下文窗口数),reserveTokens(预留的安全token数)。一般来说contextTokens要大于contextWindow减去reserveTokens。

如果把contextWindow比作一个杯子,那上下文窗口就是一个杯子的容量,比如是1000毫升。contextTokens是已经喝了的水量,比如是850毫升。

reserveTokens是预留的安全水量,防止水倒得过满溢出来,比如是200毫升。当已喝的水量 (850毫升) > 杯子容量 (1000毫升) – 安全水量 (200毫升)时,即850毫升 > 800毫升。

此刻就触发到了自动压缩的阀值,该倒掉一些旧水了,该压缩一些旧的上下文了,不然杯子里的水就要溢出来了。

可能这里小伙伴还没反应过来,还不能理解,怎么已喝的水量大于800毫升就得压缩上下文了。很简单,咱们把已喝水量,换成往空杯子里倒水。

空杯子,即上下文窗口,contextWindow是1000毫升,对不对。安全水量是不变的,还是200毫升。当杯子里面倒了850毫升的contextTokens了,那是不是就达到800毫升自动压缩的阀值了,这样估计更好理解。

自动压缩机制在OpenClaw中是默认开启的,当你的上下文快满时,就会自动压缩旧的会话,具体的配置内容如下所示:

{
  "agents": {
    "defaults": {
      "compaction": {
        "mode""safeguard",      // 保护模式
        "model""claude-sonnet-4" // 用更好的模型压缩
      }
    }
  }
}

我们看上面配置内容中的mode模式,默认是safeguard保护模式,即在必要时自动压缩。必要时压缩分为三个档位,轻度、中度、重度。

轻度是指上下文窗口使用率已达到50-70%时,触发轻度警告,系统会压缩最早的对话,保留最近20-30条。

中度是指上下文窗口使用率已达到70-90%时,触发中度警告,系统会压缩后,总结旧对话写入记忆文件。

重度是指上下文窗口使用率已达到90%以上时,触发重度警告,系统会进行紧急压缩,只保留最近5-10条对话和关键记忆。

这个值也可以设置成auto自动模式,即达到阀值时自动压缩。此外还有manual模式,就是手动触发,需要你手动输入命令/compact进行压缩。

第五层:记忆持久化(Memory Persistence)

记忆持久化,就是在压缩上下文之前,提前将重要信息写入记忆文件,整个过程跟自动流水线作业差不多,不需要你人工去干预的。

系统检测到即将压缩上下文了,马上提醒小龙虾保存重要信息到记忆文件,小龙虾开始写入MEMORY.md或memory/YYYY-MM-DD.md。然后开始执行上下文压缩,下次会话时,再从记忆文件读取关键信息。

记忆文件再次啰嗦一下,一般保存的路径是.openclaw\workspace目录下,主要文件有MEMORY.md长期记忆文件,以及子目录memory下的2026-04-01.md的日常记忆文件。

如何避免上下文溢出

避免上下文溢出的情况,我们一般会用到四个技巧,分别是使用压缩命令,开启新会话,利用记忆系统保存关键信息,定期清理旧会话。

其它的机制咱们就不讨论了,因为前面的5层的上下文管理策略,也算是系统默认自带的,防止上下文溢出的方式,虽然有些默认没开启,但你可以选择是否开启。

1、合理使用/compact命令

假设当前会话窗口中,对话的次数已经超过了50轮次,这已经算是一个长对话了,此时,就可以输入/compact命令,手动压缩一下上下文。

或者你已经完成了一个项目阶段,一个任务的阶段,在准备开始新话题之前,同样可以运行/compact命令,好处是避免上下文之间有交集,对接下来的新项目和新任务产生干扰。

2、使用/new开启全新会话

当你需要清空当前会话历史,开启一个全新的对话窗口,不想保留任何上下文的时候,输入/new命令即可。

还有一种极端的情况,由于OpenClaw的Web UI网页控制台体验较差。有可能会遇到一直提示正在自动压缩上下文,整个页面卡住很长时间。

这时可以试试直接运行/new命令开启新会话,摆脱这种页面长时间假死的状态。

3、利用记忆系统保存关键信息

这个技巧也算是一种好习惯,当你遇到一些重要的信息时,多习惯性地跟小龙虾说一句,把这段内容,或者这句话,写入到长期记忆中。

比如:我常用的编程语言是Python,数据库是PostgreSQL,请记住。像这样就是手动让小龙虾利用记忆系统保存关键信息的方法。在上下文没被自动压缩前,手动做的一个动作。跟记忆持久化不一样,人家是自动的。

4、定期清理旧会话

首先通过输入下面的命令,查看会话列表:

openclaw sessions list

再使用以下命令,预览和执行清理旧会话:

# 预览将要清理的会话
openclaw sessions cleanup --dry-run
# 执行清理
openclaw sessions cleanup --enforce

如果你觉得每次都要手动输入命令去操作太麻烦,那可以在OpenClaw.json里面添加下面的配置内容,设置成自动清理。

当然,手动去修改配置文件,添加配置会比较容易出错。你可以用自然语言跟小龙虾说,帮我设置一下配置文件,自动清理旧会话的机制。30天后自动清理,最多只保留500个会话,会话文件最多占用100mb磁盘空间。

那么以上自然语言对应的配置内容,就如下面的json内容所示,其实意思都是一样的:

{
  "session": {
    "maintenance": {
      "mode""enforce",
      "pruneAfter""30d",      // 30 天后清理
      "maxEntries"500,        // 最多保留 500 个会话
      "maxDiskBytes""100mb"   // 最多占用 100MB 磁盘
    }
  }
}

优化你的上下文使用

优化上下文使用属于相对比较高阶一点的配置,一般小伙伴们用不上,上面介绍的5层上下文管理策略,以及避免上下文溢出的技巧,已经足够了。

还想进一步优化的话,就会涉及到多模型的接入,调整预留的token数,启用会话修剪,自定义压缩提示词这四个方面。

一、使用更好的模型进行压缩

以前你压缩上下文的效果比较差,容易丢失重要信息,导致压缩之后,记忆没了,多半原因是使用了参数量较小的小模型。

小模型去负责压缩上下文是不行的,得使用大模型压缩。尤其是在本地使用Ollama部署的小伙伴,绝大部分都是部署的小模型,硬件限制了。

大模型没几个家里有矿的,有那么多高端显卡部署得起来。因此,小模型可以用于日常对话,大模型用来压缩上下文,彼此配合。

这就会涉及到多模型接入,对此不了解的小伙伴,可以回看老马之前的文章:OpenClaw接入多个模型实现自动手动切换配置。

使用小模型对话,日常还比较省token,反正大多数是部署在本地跑的。用大模型压缩上下文,质量高,能够保留关键信息到记忆文件中,总而言之就是成本更低,性价比高。其配置文件内容如下:

{
  "agents": {
    "defaults": {
      "model""ollama/llama3.1:8b",  // 日常用小模型
      "compaction": {
        "model""openrouter/anthropic/claude-sonnet-4-6"  // 压缩用大模型
      }
    }
  }
}

二、调整预留token数

还记得老马上文中提到的喝水的例子么,reserveTokens是安全水量,也就是预留的token数,可以稍微设置多一些,假设比200毫升多100毫升。

预留太少,就很容易导致水溢出来,tokens溢出来,这个例子就不再重复介绍了。其配置文件的内容如下所示:

{
  "agents": {
    "defaults": {
      "compaction": {
        "reserveTokens"32768,    // 预留 32k tokens
        "keepRecentTokens"40000  // 保留最近 40k tokens
      }
    }
  }
}

从上面配置内容可以看出,reserveTokens预留的是32k的tokens,即32000tokens,以上配置内容需要你手动去修改配置文件进行设置。

一般来说,小模型(假设是8B),可以预留16K(16384)tokens。中模型(假设70B),预留32K(32768)。大模型(假设220B),预留64K(65536)tokens。

三、启用会话修剪

会话修剪上文中提过一嘴,修剪后能够保留对话的主干,主要信息,去除掉过长的工具输出内容,节省大量的token。

像小龙虾在调用工具时,输出的一些内容基本对用户来讲是没有多大意义的,它只需要知道调用哪个工具,完成什么样任务这些重点就行了。因此可以把无意义的上下文内容修剪掉,其配置文件内容如下:

{
  "agents": {
    "defaults": {
      "pruning": {
        "enabled"true,
        "maxToolOutputTokens"2000  // 工具输出最多 2k tokens
      }
    }
  }
}

从上面的配置内容中可以看出,maxToolOutputTokens就是设定工具在被调用时,最多能输出多少tokens的内容,超出的直接修剪掉。同样的,以上配置内容需要你手动去修改配置文件进行设置。

四、自定义压缩提示词

自定义的压缩提示词其实是一句Prompt提示词,老马贴出来仅供大家参考,要不要去手动在配置文件设置,看大家的需求。

如果配置了,它就相当于给自动压缩加多了一句提示词,让自动压缩有了行为的指导,压缩的标准,如下所示:

{
  "agents": {
    "defaults": {
      "compaction": {
        "prompt""总结对话内容,重点关注:1、关键技术决策 2、待解决的问题 3、行动项和待办事项 4、对未来工作重要的背景信息"
      }
    }
  }
}

属于定制化个性化地去压缩内容,保留对你比较重要的信息,忽略无关紧要的细节。这句Prompt提示词不是固定死的,你可以根据老马上面提供的示例,按你的要求去进一步修改。

常见问题解答

Q1: 为什么小龙虾总是忘记我说的话?

可能原因:

1. 上下文窗口太小(如8k/16k)

2. 压缩上下文太过于激进

3. 没有使用记忆系统

解决方案:

{
  "agents": {
    "defaults": {
      "model""claude-sonnet-4",  // 换大上下文模型
      "compaction": {
        "reserveTokens"32768     // 增加预留空间
      },
      "memorySearch": {
        "enabled"true            // 启用记忆搜索
      }
    }
  }
}

Q2: 如何查看当前上下文使用情况?

使用命令

openclaw status

输出示例

Session: agent:main:main
Model: claude-sonnet-4
Context45,230 / 200,000 tokens (22.6%)
Input12,345 tokens
Output8,234 tokens

Q3: 压缩上下文后小龙虾变得傻傻的怎么办?

可能原因:

压缩时摘要丢失了关键信息

解决方案:

方案1:改进自定义压缩提示词

{
  "compaction": {
    "prompt""详细总结以下内容,保留所有技术细节、代码片段、决策原因"
  }
}

方案2:使用更好的压缩模型

{
  "compaction": {
    "model""claude-opus-3"  // 用更好的模型压缩
  }
}

方案3:延迟压缩

{
  "compaction": {
    "reserveTokens"65536  // 增加预留,延迟压缩触发
  }
}

Q4: 如何让小龙虾记住跨会话的信息?

想要记住跨会话的信息内容,那就得使用记忆系统了。

步骤1:确保记忆功能的配置已经设置启用

{
  "agents": {
    "defaults": {
      "memorySearch": {
        "enabled"true,
        "provider""local"
      }
    }
  }
}

步骤2:重要信息会自动保存到MEMORY.md长期记忆文件。

步骤3:当开启新会话时,小龙虾会去自动读取长期记忆文件。

Q5: 上下文窗口总是很快满了,怎么办?

首先进行一下诊断,看看上下文老是很快爆满的原因是什么。

步骤1:检查模型上下文窗口

openclaw status

一般来说,你设置的模型上下文窗口,一定要跟模型服务提供商介绍的上下文长度是一致的,这样才是正确的设置。

步骤2:查看是什么占用了那么多上下文

(1)如果是系统提示词太长了,那说明你默认加载的SOUL.md、AGENTS.md之前设置得太复杂,写得太多了,需要简化一下。

(2)如果是调用的工具输出内容过长,那就得启用上文中提到的会话修剪,把工具输出的最多tokens数值,设置得小一些。

(3)如果是历史对话太长,已经经过了几十上百论对话了,但是还没有触发到自动压缩的阀值,或者说阀值中预留安全tokens设置太小,那就需要调整一下阀值的设置。

Q6: 可以手动编辑会话文件吗?

可以是可以,但是有破坏会话记录.jsonl文件格式的风险存在,而且像一般的删除旧的会话记录,不必要去编辑sessions.json文件,使用以下命令即可:

# 安全清理
openclaw sessions cleanup --enforce
# 手动重置会话
/new

好了,以上就是今天的分享,欢迎关注、点赞、转发一键三连。有任何问题和需求,请在评论区留言,回见!

对了,老马最近刚创建了一个AI学习交流群,有兴趣进群的小伙伴可以添加老马微信号:immajiabin,添加好友时备注:进群(不备注不通过)。

 

如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

Protected by WP Anti Spam