会话管理教程

intermediate
## 什么是会话 在 OpenClaw 中,**会话(Session)** 是智能体与用户之间的一次完整对话。每个会话拥有独立的上下文——智能体在一个会话中记住的内容不会自动出现在另一个会话中。 你可以把会话想象成聊天软件里的"对话窗口": - 每个对话窗口有自己的聊天记录 - 切换窗口后,之前的对话内容不会混在一起 - 关闭窗口后,聊天记录仍然保存在本地 会话是 OpenClaw 上下文管理的基本单位。理解会话机制,能帮助你更好地控制智能体的行为和资源消耗。 ## 会话存储位置 OpenClaw 将所有会话数据存储在本地文件系统中,使用 JSONL(JSON Lines)格式。 ### 存储目录结构 ``` ~/.openclaw/agents//sessions/ ├── .jsonl ├── .jsonl ├── .jsonl └── ... ``` 每个 `.jsonl` 文件就是一个会话,文件中的每一行是一条消息记录(JSON 格式)。 ### 查看会话文件 ```bash # 查看会话目录 ls ~/.openclaw/agents/default/sessions/ # 查看某个会话的内容(每行一条消息) cat ~/.openclaw/agents/default/sessions/.jsonl # 统计会话数量 ls ~/.openclaw/agents/default/sessions/ | wc -l ``` ### JSONL 格式说明 每条消息记录包含以下关键字段: ```json { "role": "user", "content": "你好,帮我写一个 Python 脚本", "timestamp": "2025-01-15T10:30:00Z" } ``` ```json { "role": "assistant", "content": "好的,我来帮你写一个 Python 脚本...", "timestamp": "2025-01-15T10:30:05Z", "tokens": { "input": 150, "output": 320 } } ``` JSONL 格式的优势: - **追加写入**:新消息直接追加到文件末尾,不需要重写整个文件 - **流式读取**:可以逐行读取,不需要一次性加载整个会话 - **易于调试**:纯文本格式,可以直接用文本编辑器查看 ## 会话 ID 和路由 ### 会话 ID 的生成规则 会话 ID 由**渠道(Channel)** 和**联系人(Contact)** 的组合决定: ``` 会话 ID = 渠道类型 + 渠道标识 + 联系人标识 ``` 例如: - Telegram 用户 `@alice` 的会话 → `telegram:bot123:alice` - WhatsApp 用户 `+86138xxxx` 的会话 → `whatsapp:myphone:8613800001111` - WebChat 匿名用户的会话 → `webchat:default:anonymous-abc123` ### 路由机制 当一条消息到达 Gateway 时,OpenClaw 按以下步骤确定会话: 1. **识别渠道**:消息来自哪个渠道(Telegram、WhatsApp、WebChat 等) 2. **识别联系人**:消息来自哪个用户(用户 ID、手机号等) 3. **查找会话**:根据渠道 + 联系人组合查找已有会话 4. **创建或复用**:如果找到已有会话则继续对话,否则创建新会话 这意味着: - 同一个用户在同一个渠道上,始终使用同一个会话 - 同一个用户在不同渠道上,使用不同的会话 - 不同用户在同一个渠道上,各自有独立的会话 ### 多智能体路由 如果你配置了多个智能体,会话路由还会考虑 Bindings 规则: ```json { "agents": { "list": [ { "id": "work-agent", "bindings": [ { "channel": "telegram", "peer": "@alice" } ] }, { "id": "personal-agent", "bindings": [ { "channel": "whatsapp" } ] } ] } } ``` 在这个配置中: - Telegram 上 `@alice` 的消息路由到 `work-agent` - WhatsApp 上所有消息路由到 `personal-agent` - 每个智能体有自己独立的会话目录 ## 会话压缩(Compaction) ### 为什么需要压缩 每次智能体回复时,都需要把整个会话历史发送给 AI 模型。随着对话越来越长,会出现两个问题: 1. **超出上下文窗口**:模型有 Token 上限(如 128K),超长对话会被截断 2. **成本增加**:发送的 Token 越多,API 费用越高 会话压缩(Compaction)就是解决这个问题的机制——当对话太长时,自动将早期对话总结为一段摘要,释放上下文空间。 ### 压缩的工作原理 ``` 压缩前: [消息1] [消息2] [消息3] ... [消息50] [消息51] [消息52] ↑ 上下文快满了 压缩后: [摘要:消息1-50的总结] [消息51] [消息52] ↑ 上下文空间充足 ``` 压缩过程: 1. OpenClaw 检测到上下文使用率超过阈值(通常 70-80%) 2. 自动将早期消息发送给模型,生成一段总结摘要 3. 用摘要替换原始消息,大幅减少 Token 数量 4. 最近的消息保持原样,确保对话连贯性 ### 压缩配置 在 `~/.openclaw/openclaw.json` 中配置压缩行为: ```json { "compaction": { "enabled": true, "threshold": 0.75, "keepRecent": 10 } } ``` | 参数 | 说明 | 默认值 | |------|------|--------| | `enabled` | 是否启用自动压缩 | `true` | | `threshold` | 上下文使用率触发阈值 | `0.75`(75%) | | `keepRecent` | 压缩时保留最近的消息数 | `10` | ### 压缩的影响 压缩后,智能体对早期对话的记忆会变成"概括性"的: - ✅ 记得讨论过什么主题 - ✅ 记得关键的结论和决定 - ❌ 可能忘记具体的措辞和细节 - ❌ 可能忘记中间的推理过程 如果你需要智能体记住某些重要信息,建议使用 Memory 系统(长期记忆)而不是依赖会话历史。 ## 会话修剪(Pruning) ### 为什么需要修剪 随着时间推移,会话文件会越来越多,占用磁盘空间。会话修剪(Pruning)用于删除旧的、不再需要的会话文件。 ### 修剪策略 OpenClaw 支持按时间修剪会话: ```bash # 删除 30 天前的会话 openclaw sessions prune --older-than 30d # 删除 7 天前的会话 openclaw sessions prune --older-than 7d # 预览将被删除的会话(不实际删除) openclaw sessions prune --older-than 30d --dry-run ``` ### 修剪注意事项 - 修剪是**不可逆**的,删除后无法恢复 - 建议先用 `--dry-run` 预览,确认无误后再执行 - 修剪不会影响正在进行的会话 - 如果某些会话很重要,可以手动备份 `.jsonl` 文件 ```bash # 备份重要会话 cp ~/.openclaw/agents/default/sessions/important-session.jsonl ~/backup/ ``` ## CLI 会话管理命令 OpenClaw 提供了一组 CLI 命令来管理会话。 ### 查看会话列表 ```bash # 列出所有会话 openclaw sessions list # 列出指定智能体的会话 openclaw sessions list --agent work-agent # 以表格形式显示 openclaw sessions list --format table ``` 输出示例: ``` Session ID Agent Channel Last Active telegram:bot123:alice default telegram 2 hours ago whatsapp:myphone:8613800001111 default whatsapp 1 day ago webchat:default:anonymous-abc123 default webchat 3 days ago ``` ### 查看会话历史 ```bash # 查看某个会话的对话历史 openclaw sessions history # 只看最近 20 条消息 openclaw sessions history --limit 20 # 以 JSON 格式输出 openclaw sessions history --format json ``` ### 修剪旧会话 ```bash # 删除 30 天前的会话 openclaw sessions prune --older-than 30d # 预览将被删除的会话 openclaw sessions prune --older-than 30d --dry-run # 删除指定智能体的旧会话 openclaw sessions prune --older-than 14d --agent work-agent ``` ### 会话统计 ```bash # 查看会话统计信息 openclaw sessions stats # 输出示例: # Total sessions: 42 # Active (last 7 days): 8 # Disk usage: 12.3 MB # Oldest session: 2024-12-01 ``` ## 多渠道会话隔离 OpenClaw 的会话是按**渠道 + 联系人**隔离的。这意味着同一个人在不同渠道上与智能体的对话是完全独立的。 ### 隔离示例 假设用户 Alice 同时使用 Telegram 和 WhatsApp 与你的智能体对话: ``` Telegram 会话(telegram:bot123:alice): Alice: 帮我分析这份销售报告 Agent: 好的,我来看看这份报告... WhatsApp 会话(whatsapp:myphone:alice): Alice: 今天天气怎么样? Agent: 让我查一下天气... ``` 两个会话完全独立: - Telegram 会话中的"销售报告"上下文不会出现在 WhatsApp 会话中 - WhatsApp 会话中的"天气"话题不会影响 Telegram 会话 - 两个会话可以同时进行,互不干扰 ### 隔离的好处 1. **上下文清晰**:每个渠道的对话主题不会混淆 2. **隐私保护**:不同渠道的对话内容互相隔离 3. **灵活使用**:可以在不同渠道处理不同类型的任务 ### 跨渠道共享信息 如果你希望智能体在不同渠道之间共享某些信息,可以使用 Memory 系统: ``` # 在 Telegram 中 Alice: 记住我的邮箱是 alice@example.com # 智能体将信息写入 MEMORY.md(长期记忆) # 在 WhatsApp 中 Alice: 我的邮箱是什么? # 智能体从 MEMORY.md 中读取,跨渠道获取信息 ``` Memory 是跨会话、跨渠道的持久化存储,而会话只在单个渠道内有效。 ## /new 和 /reset 命令 ### /new — 开始新会话 在任何渠道中发送 `/new` 命令,可以结束当前会话并开始一个全新的会话: ``` 用户: /new Agent: 好的,已开始新会话。之前的对话上下文已清除。 ``` 使用场景: - 当前话题已经结束,想聊一个全新的话题 - 会话上下文太长,想从头开始 - 智能体"记混了",想重置上下文 `/new` 的效果: - 创建一个新的会话 ID - 旧会话的 `.jsonl` 文件保留在磁盘上 - 新会话从空白上下文开始(但 Memory 和 SOUL.md 仍然生效) ### /reset — 重置当前会话 `/reset` 与 `/new` 类似,但有细微区别: ``` 用户: /reset Agent: 会话已重置。 ``` `/reset` 的效果: - 清除当前会话的对话历史 - 保持同一个会话 ID - 相当于"清空聊天记录" ### /new vs /reset 对比 | 特性 | /new | /reset | |------|------|--------| | 会话 ID | 创建新 ID | 保持原 ID | | 旧对话记录 | 保留在磁盘 | 被清除 | | 上下文 | 全新开始 | 全新开始 | | Memory | 仍然生效 | 仍然生效 | | SOUL.md | 仍然生效 | 仍然生效 | 一般来说: - 想保留旧对话记录用 `/new` - 想彻底清理用 `/reset` ## 实用技巧 ### 1. 定期修剪旧会话 设置一个定时任务,自动清理旧会话: ```bash # 添加 cron 任务,每周日凌晨清理 30 天前的会话 openclaw cron add "0 0 * * 0" "openclaw sessions prune --older-than 30d" ``` ### 2. 监控会话磁盘使用 ```bash # 查看会话目录大小 du -sh ~/.openclaw/agents/*/sessions/ # 查看最大的会话文件 ls -lhS ~/.openclaw/agents/default/sessions/ | head -10 ``` ### 3. 导出重要会话 ```bash # 导出会话为可读格式 openclaw sessions history --format json > my-session-backup.json ``` ### 4. 调整压缩阈值 如果你发现智能体经常"忘记"之前的对话内容,可以提高压缩阈值: ```json { "compaction": { "threshold": 0.85, "keepRecent": 20 } } ``` 这会让压缩更晚触发,保留更多原始消息,但会增加 Token 消耗。 ## 小结 会话是 OpenClaw 上下文管理的核心机制: - 每个对话是一个独立的会话,存储为 JSONL 文件 - 会话 ID 由渠道 + 联系人组合决定,确保多渠道隔离 - 压缩(Compaction)自动总结长对话,释放上下文空间 - 修剪(Pruning)删除旧会话,释放磁盘空间 - `/new` 开始新会话,`/reset` 重置当前会话 - 跨渠道信息共享需要使用 Memory 系统 理解会话机制,能帮助你更好地控制智能体的上下文、优化 Token 消耗、管理磁盘空间。 #会话管理 #Session #压缩机制 #会话隔离 #龙虾技能库