OpenChronicle 会话切割原理详解:3 条规则精准定义你的工作上下文边界
【免费下载链接】OpenChronicle项目地址: https://gitcode.com/gh_mirrors/op/OpenChronicle
OpenChronicle 是一个开源的本地优先 AI Agent 记忆系统,它通过"会话切割"(Session Cutting)机制,用 3 条简单规则精准定义你的工作上下文边界:空闲 5 分钟、切换无关应用 3 分钟、超时 2 小时。掌握这 3 条规则,你就能理解 AI 记忆是如何把零碎屏幕活动压缩成"一段专注工作"的。
为什么 AI 记忆需要"会话切割"?
想象你让 AI 助手回答"我今天上午做了什么?"。如果它拿到的是一整天的屏幕截图流水账,它要么答不出来,要么答得很混乱。
OpenChronicle 的思路是:人记住的从来不是"每一分钟在干嘛",而是一段段有边界的专注工作——开会、写代码、查资料。所以它先做的事,就是把连续的工作流切成一个个"会话"(Session),每个会话对应一段完整的工作上下文。
会话切割是整个记忆管道的灵魂:切割得准,后续的 AI 压缩(reducer)和事实提取(classifier)才能写出高质量记忆;切割得太碎或太黏,记忆质量直接崩塌。
规则细节可查官方文档:docs/session.md。
3 条切割规则逐一拆解
3 条规则全部实现在 src/openchronicle/session/manager.py 的SessionManager.check_cuts()中,每 30 秒检查一次。
规则 1:硬切割 —— 空闲 5 分钟,立即收工
规则:只要连续 5 分钟(gap_minutes,默认值)没有任何值得捕获的屏幕事件,会话就在最后一个事件的时间点结束。
# manager.py 核心判断逻辑(简化示意) gap = (now - last_event_time).total_seconds() if gap > gap_minutes * 60: end_session(at=last_event_time) # 结束在"停下那一刻",而非"回来那一刻"💡设计巧思:你午休 2 小时回来,会话结束时间记在"你去午休前",而不是"你回来时"。因为空档本身不是工作,记忆的时钟应该在停工那一刻停下。
规则 2:软切割 —— 无关应用专注 3 分钟,智能识别
规则:当你切换到一个无关应用并专注超过 3 分钟(soft_cut_minutes,默认值),会话结束。
但这里有个关键例外——"频繁切换保护":如果你在最近 2 分钟内先后使用过 ≥2 个不同应用,系统就认为你正在做"多应用协作"(比如 IDE 写代码 + 终端看日志 + 浏览器查文档),此时软切割不触发。
# 频繁切换检测:最近 2 分钟内出现过 ≥2 个应用,则豁免软切割 recent_apps = {bundle for ts, bundle in recent_switches if ts >= now - 2min} is_frequent_switching = len(recent_apps) >= 2⚠️ 新手常踩的坑:以为"切到浏览器看文档 3 分钟就会被切断"。只要你是频繁切换(IDE、终端、浏览器之间来回跳),这个保护机制会让会话稳稳保持活跃。
规则 3:超时 —— 2 小时封顶,防止会话失控
规则:任何会话只要存活超过 2 小时(max_session_hours,默认值),无论你是否还在活跃操作,都会被强制切掉。
这是一张安全网:防止深夜挂机、忘记切走窗口等场景造出一个"永不结束"的巨型会话,也顺便把一次超长专注拆成 AI 更容易消化的两块。
切割如何执行:事件 + 定时器双驱动
一个容易误解的点:切割不是"等人来问"才发生的。它由两条路径驱动(见 src/openchronicle/session/tick.py):
| 驱动路径 | 触发时机 | 负责检测 |
|---|---|---|
事件回调on_event() | 每次捕获到新屏幕事件 | 记录时间、检测应用切换 |
定时巡检check_cuts() | 每 30 秒(tick_seconds) | 空闲间隙、超时、软切割 |
为什么要 30 秒巡检?因为空闲和超时恰恰发生在"没有新事件"的时候——只有定时器才能发现"已经 5 分钟没动静了"。
会话切割后会发生什么?
- 会话行标记为
ended,写入本地 SQLite 的sessions表; - 异步 reducer 把该会话的时间块压缩成一条带时间范围的记忆条目,追加到当天的
event-YYYY-MM-DD.md; - 分类器提取其中的持久事实(项目、工具、人物偏好等)写入长期记忆文件。
完整流程图可见:docs/architecture.md。
会话切割参数怎么调?一张表搞定
所有参数在config.toml的[session]段(详见 docs/config.md):
[session] gap_minutes = 5 # 硬切割:空闲超过 5 分钟即结束 soft_cut_minutes = 3 # 软切割:无关应用专注超过 3 分钟 max_session_hours = 2 # 超时:2 小时强制切断遇到切割"手感不对"?对照官方调优表:
| 症状 | 调哪个参数 |
|---|---|
| 多应用专注工作被切得太碎 | soft_cut_minutes调大(3 → 5),或保持不动——频繁切换保护已覆盖多数场景 |
| 闲了之后会话切得太晚,记忆跨了太久 | gap_minutes调小(5 → 3) |
| 一次深度工作超 2 小时被拦腰斩断 | max_session_hours调大(2 → 4) |
| 感觉切割反应慢 | tick_seconds调小(30 → 10),检查本身只是算术,成本可忽略 |
如何验证切割效果?
不需要看代码,两个轻量入口就够了:
- 看日志:
~/.openchronicle/logs/session.log会记录每次切割决策,例如session hard cut: idle for 6 min (>5 min)、session soft cut: app xxx for 3 min。 - 手动兜底:运行
openchronicle writer run,它会补齐所有待处理的会话并触发分类——这就是每晚 23:55 安全网走同一条代码路径,随时可安全执行(幂等设计)。
另外,23:55 的每日安全网会强制结束未关闭的会话并处理崩溃残留,保证"会话永远活不过打开它的那个进程"。
总结
OpenChronicle 的会话切割用 3 条朴素规则解决了 AI 记忆最核心的边界问题:
- 硬切割(空闲 5 分钟)——在"停工那一刻"收笔,午休不混进工作时间;
- 软切割(无关应用 3 分钟 + 频繁切换保护)——切换任务就切会话,但多应用协作不误伤;
- 超时(2 小时封顶)——安全网兜底,会话永失控不了。
规则全部集中在 src/openchronicle/session/manager.py,行为有完整单元测试覆盖(tests/test_session_manager.py)。想深入 AI 记忆管道全貌,继续阅读 docs/architecture.md 和 docs/writer.md 即可。
【免费下载链接】OpenChronicle项目地址: https://gitcode.com/gh_mirrors/op/OpenChronicle
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考